Revert "serv_rssclient.c: style update"
authorArt Cancro <ajc@citadel.org>
Thu, 5 Jan 2023 23:02:36 +0000 (18:02 -0500)
committerArt Cancro <ajc@citadel.org>
Thu, 5 Jan 2023 23:02:36 +0000 (18:02 -0500)
This reverts commit 76a0f8571de023fe6bd20390174a2302e0a0b982.

1087 files changed:
citadel/server/modules/rssclient/serv_rssclient.c
webcit-ng/static/index.html
webcit-ng/static/js/main.js
webcit/.cvsignore [new file with mode: 0644]
webcit/.gitignore [new file with mode: 0644]
webcit/COPYING [new file with mode: 0644]
webcit/Makefile.in [new file with mode: 0644]
webcit/README.txt [new file with mode: 0644]
webcit/acinclude.m4 [new file with mode: 0644]
webcit/addressbook_popup.c [new file with mode: 0644]
webcit/auth.c [new file with mode: 0644]
webcit/autocompletion.c [new file with mode: 0644]
webcit/availability.c [new file with mode: 0644]
webcit/bbsview_renderer.c [new file with mode: 0644]
webcit/blogview_renderer.c [new file with mode: 0644]
webcit/bootstrap [new file with mode: 0755]
webcit/calendar.c [new file with mode: 0644]
webcit/calendar.h [new file with mode: 0644]
webcit/calendar_tools.c [new file with mode: 0644]
webcit/calendar_view.c [new file with mode: 0644]
webcit/config.guess [new file with mode: 0755]
webcit/config.rpath [new file with mode: 0755]
webcit/config.sub [new file with mode: 0755]
webcit/configure.ac [new file with mode: 0644]
webcit/context_loop.c [new file with mode: 0644]
webcit/cookie_conversion.c [new file with mode: 0644]
webcit/crypto.c [new file with mode: 0644]
webcit/dav.h [new file with mode: 0644]
webcit/dav_delete.c [new file with mode: 0644]
webcit/dav_get.c [new file with mode: 0644]
webcit/dav_main.c [new file with mode: 0644]
webcit/dav_options.c [new file with mode: 0644]
webcit/dav_propfind.c [new file with mode: 0644]
webcit/dav_put.c [new file with mode: 0644]
webcit/dav_report.c [new file with mode: 0644]
webcit/downloads.c [new file with mode: 0644]
webcit/event.c [new file with mode: 0644]
webcit/feed_generator.c [new file with mode: 0644]
webcit/fmt_date.c [new file with mode: 0644]
webcit/gettext.c [new file with mode: 0644]
webcit/graphics.c [new file with mode: 0644]
webcit/html2html.c [new file with mode: 0644]
webcit/http_datestring.c [new file with mode: 0644]
webcit/ical_dezonify.c [new file with mode: 0644]
webcit/ical_subst.c [new file with mode: 0644]
webcit/iconbar.c [new file with mode: 0644]
webcit/icontheme.c [new file with mode: 0644]
webcit/inetconf.c [new file with mode: 0644]
webcit/install-sh [new file with mode: 0755]
webcit/js/.jshintrc [new file with mode: 0644]
webcit/jsonview_renderer.c [new file with mode: 0644]
webcit/listsub.c [new file with mode: 0644]
webcit/locate_host.c [new file with mode: 0644]
webcit/mailview_renderer.c [new file with mode: 0644]
webcit/mainmenu.c [new file with mode: 0644]
webcit/marchlist.c [new file with mode: 0644]
webcit/messages.c [new file with mode: 0644]
webcit/messages.h [new file with mode: 0644]
webcit/missing [new file with mode: 0755]
webcit/mkinstalldirs [new file with mode: 0755]
webcit/msg_renderers.c [new file with mode: 0644]
webcit/netconf.c [new file with mode: 0644]
webcit/nogz-mimetypes.txt [new file with mode: 0644]
webcit/notes.c [new file with mode: 0644]
webcit/openid.c [new file with mode: 0644]
webcit/packageversion [new file with mode: 0644]
webcit/paging.c [new file with mode: 0644]
webcit/paramhandling.c [new file with mode: 0644]
webcit/paramhandling.h [new file with mode: 0644]
webcit/po/webcit/Makefile.in [new file with mode: 0644]
webcit/po/webcit/ar.po [new file with mode: 0644]
webcit/po/webcit/bg.po [new file with mode: 0644]
webcit/po/webcit/create-pot.sh [new file with mode: 0755]
webcit/po/webcit/cs.po [new file with mode: 0644]
webcit/po/webcit/da.po [new file with mode: 0644]
webcit/po/webcit/de.po [new file with mode: 0644]
webcit/po/webcit/el.po [new file with mode: 0644]
webcit/po/webcit/en_GB.po [new file with mode: 0644]
webcit/po/webcit/es.po [new file with mode: 0644]
webcit/po/webcit/et.po [new file with mode: 0644]
webcit/po/webcit/fi.po [new file with mode: 0644]
webcit/po/webcit/fr.po [new file with mode: 0644]
webcit/po/webcit/he.po [new file with mode: 0644]
webcit/po/webcit/hu.po [new file with mode: 0644]
webcit/po/webcit/it.po [new file with mode: 0644]
webcit/po/webcit/kk.po [new file with mode: 0644]
webcit/po/webcit/ko.po [new file with mode: 0644]
webcit/po/webcit/nl.po [new file with mode: 0644]
webcit/po/webcit/pl.po [new file with mode: 0644]
webcit/po/webcit/pt_BR.po [new file with mode: 0644]
webcit/po/webcit/ro.po [new file with mode: 0644]
webcit/po/webcit/ru.po [new file with mode: 0644]
webcit/po/webcit/sl.po [new file with mode: 0644]
webcit/po/webcit/sv.po [new file with mode: 0644]
webcit/po/webcit/tr.po [new file with mode: 0644]
webcit/po/webcit/webcit.pot [new file with mode: 0644]
webcit/po/webcit/zh.po [new file with mode: 0644]
webcit/preferences.c [new file with mode: 0644]
webcit/preferences.h [new file with mode: 0644]
webcit/pushemail.c [new file with mode: 0644]
webcit/roomchat.c [new file with mode: 0644]
webcit/roomlist.c [new file with mode: 0644]
webcit/roomops.c [new file with mode: 0644]
webcit/roomops.h [new file with mode: 0644]
webcit/roomtokens.c [new file with mode: 0644]
webcit/roomviews.c [new file with mode: 0644]
webcit/scripts/get_ical_data.sh [new file with mode: 0755]
webcit/scripts/get_ical_data__template.sed [new file with mode: 0644]
webcit/scripts/mk_module_init.sh [new file with mode: 0755]
webcit/serv_func.c [new file with mode: 0644]
webcit/sieve.c [new file with mode: 0644]
webcit/siteconfig.c [new file with mode: 0644]
webcit/sitemap.c [new file with mode: 0644]
webcit/smtpqueue.c [new file with mode: 0644]
webcit/sockets.c [new file with mode: 0644]
webcit/sockets.h [new file with mode: 0644]
webcit/static.c [new file with mode: 0644]
webcit/static/.gitignore [new file with mode: 0755]
webcit/static/authmethods.js [new file with mode: 0644]
webcit/static/builder.js [new file with mode: 0644]
webcit/static/citadel-logo.gif [new file with mode: 0644]
webcit/static/controls.js [new file with mode: 0644]
webcit/static/ctdldragdrop.js [new file with mode: 0644]
webcit/static/datepicker-dev.js [new file with mode: 0644]
webcit/static/dragdrop.js [new file with mode: 0644]
webcit/static/edit.gif [new file with mode: 0755]
webcit/static/effects.js [new file with mode: 0644]
webcit/static/favicon.ico [new file with mode: 0644]
webcit/static/fineuploader.js [new file with mode: 0755]
webcit/static/instant_messenger.html [new file with mode: 0644]
webcit/static/loading.gif [new file with mode: 0755]
webcit/static/mobile.js [new file with mode: 0644]
webcit/static/modal.js [new file with mode: 0644]
webcit/static/nanotree.js [new file with mode: 0644]
webcit/static/palette.htm [new file with mode: 0644]
webcit/static/processing.gif [new file with mode: 0755]
webcit/static/prototype.js [new file with mode: 0644]
webcit/static/roomchat_unload.html [new file with mode: 0644]
webcit/static/roomops.js [new file with mode: 0644]
webcit/static/scriptaculous.js [new file with mode: 0644]
webcit/static/slider.js [new file with mode: 0644]
webcit/static/sound.js [new file with mode: 0644]
webcit/static/styles/PIE.htc [new file with mode: 0644]
webcit/static/styles/banner.css [new file with mode: 0644]
webcit/static/styles/blog.css [new file with mode: 0644]
webcit/static/styles/box.css [new file with mode: 0644]
webcit/static/styles/content.css [new file with mode: 0644]
webcit/static/styles/datepicker.css [new file with mode: 0644]
webcit/static/styles/fineuploader.css [new file with mode: 0644]
webcit/static/styles/global.css [new file with mode: 0644]
webcit/static/styles/iconbar.css [new file with mode: 0644]
webcit/static/styles/iconbaricns.css [new file with mode: 0644]
webcit/static/styles/iconbarpiconly.css [new file with mode: 0644]
webcit/static/styles/ie_lte8.css [new file with mode: 0644]
webcit/static/styles/login.css [new file with mode: 0644]
webcit/static/styles/message.css [new file with mode: 0644]
webcit/static/styles/mobile.css [new file with mode: 0644]
webcit/static/styles/modal.css [new file with mode: 0644]
webcit/static/styles/navbar.css [new file with mode: 0644]
webcit/static/styles/rss_browser.css [new file with mode: 0644]
webcit/static/styles/rte.css [new file with mode: 0644]
webcit/static/styles/service.css [new file with mode: 0644]
webcit/static/styles/webcit-tinymce.css [new file with mode: 0644]
webcit/static/styles/webcit.css [new file with mode: 0644]
webcit/static/summaryview.js [new file with mode: 0644]
webcit/static/t/addressbook/list.html [new file with mode: 0644]
webcit/static/t/addressbook/list_entry.html [new file with mode: 0644]
webcit/static/t/addressbook/namelist.html [new file with mode: 0644]
webcit/static/t/addressbook/namelist_button.html [new file with mode: 0644]
webcit/static/t/addressbook/namelist_entry.html [new file with mode: 0644]
webcit/static/t/addressbook/popup.html [new file with mode: 0644]
webcit/static/t/aide/display_aliases.html [new file with mode: 0644]
webcit/static/t/aide/display_generic_cmd.html [new file with mode: 0644]
webcit/static/t/aide/display_generic_result.html [new file with mode: 0644]
webcit/static/t/aide/display_ignetconf.html [new file with mode: 0644]
webcit/static/t/aide/display_inetconf.html [new file with mode: 0644]
webcit/static/t/aide/display_logstatus.html [new file with mode: 0644]
webcit/static/t/aide/display_logstatus_line.html [new file with mode: 0644]
webcit/static/t/aide/display_menu.html [new file with mode: 0644]
webcit/static/t/aide/display_serverrestart.html [new file with mode: 0644]
webcit/static/t/aide/display_serverrestart_page.html [new file with mode: 0644]
webcit/static/t/aide/display_serverrestart_page_do.html [new file with mode: 0644]
webcit/static/t/aide/display_sitewide_config.html [new file with mode: 0644]
webcit/static/t/aide/edituser/add.html [new file with mode: 0644]
webcit/static/t/aide/edituser/box_select.html [new file with mode: 0644]
webcit/static/t/aide/edituser/detailview.html [new file with mode: 0644]
webcit/static/t/aide/edituser/section.html [new file with mode: 0644]
webcit/static/t/aide/edituser/select.html [new file with mode: 0644]
webcit/static/t/aide/floorconfig.html [new file with mode: 0644]
webcit/static/t/aide/global_config.html [new file with mode: 0644]
webcit/static/t/aide/ignetconf/add.html [new file with mode: 0644]
webcit/static/t/aide/ignetconf/display_confirm_delete.html [new file with mode: 0644]
webcit/static/t/aide/ignetconf/edit_node.html [new file with mode: 0644]
webcit/static/t/aide/ignetconf/section.html [new file with mode: 0644]
webcit/static/t/aide/inet/aliases.html [new file with mode: 0644]
webcit/static/t/aide/inet/clamav.html [new file with mode: 0644]
webcit/static/t/aide/inet/dirnames.html [new file with mode: 0644]
webcit/static/t/aide/inet/fallbackhosts.html [new file with mode: 0644]
webcit/static/t/aide/inet/masqdomains.html [new file with mode: 0644]
webcit/static/t/aide/inet/notify.html [new file with mode: 0644]
webcit/static/t/aide/inet/rbldns.html [new file with mode: 0644]
webcit/static/t/aide/inet/section.html [new file with mode: 0644]
webcit/static/t/aide/inet/smarthosts.html [new file with mode: 0644]
webcit/static/t/aide/inet/spamass.html [new file with mode: 0644]
webcit/static/t/aide/restart.html [new file with mode: 0644]
webcit/static/t/aide/serverrestart/box.html [new file with mode: 0644]
webcit/static/t/aide/serverrestart/box_page.html [new file with mode: 0644]
webcit/static/t/aide/serverrestart/box_page_do.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/submit.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_access.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_autopurger.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_directory.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_general.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_imap.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_indexing.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_pop3.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_pushmail.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_setting.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tab_smtp.html [new file with mode: 0644]
webcit/static/t/aide/siteconfig/tzsection.html [new file with mode: 0644]
webcit/static/t/aide/usermanagement.html [new file with mode: 0644]
webcit/static/t/authpopup_finished.html [new file with mode: 0644]
webcit/static/t/box/begin.html [new file with mode: 0644]
webcit/static/t/box/begin_1.html [new file with mode: 0644]
webcit/static/t/box/begin_2.html [new file with mode: 0644]
webcit/static/t/box/begin_nt.html [new file with mode: 0644]
webcit/static/t/box/end.html [new file with mode: 0644]
webcit/static/t/confirmlogoff.html [new file with mode: 0644]
webcit/static/t/dav/propfind_groupdav.xml [new file with mode: 0644]
webcit/static/t/dav/propfind_groupdav_floorlist.xml [new file with mode: 0644]
webcit/static/t/dav/propfind_groupdav_floorlist_onefloor.xml [new file with mode: 0644]
webcit/static/t/dav/propfind_groupdav_roomlist.xml [new file with mode: 0644]
webcit/static/t/dav/propfind_groupdav_roomlist_oneroom.xml [new file with mode: 0644]
webcit/static/t/dav/propfind_top.xml [new file with mode: 0644]
webcit/static/t/dav/propfind_upper_dirs.xml [new file with mode: 0644]
webcit/static/t/display_main_menu.html [new file with mode: 0644]
webcit/static/t/display_message.html [new file with mode: 0644]
webcit/static/t/edit/markdown_epic.html [new file with mode: 0644]
webcit/static/t/edit/message.html [new file with mode: 0644]
webcit/static/t/edit/message/attachments_pane.html [new file with mode: 0644]
webcit/static/t/edit/message/json_attlist.js [new file with mode: 0644]
webcit/static/t/edit/message/section_attach_list.js [new file with mode: 0644]
webcit/static/t/edit/message/upl_att.js [new file with mode: 0644]
webcit/static/t/empty.html [new file with mode: 0644]
webcit/static/t/files.html [new file with mode: 0644]
webcit/static/t/files/graphicsupload.html [new file with mode: 0644]
webcit/static/t/files/picview.js [new file with mode: 0644]
webcit/static/t/files/section_onefile.html [new file with mode: 0644]
webcit/static/t/files/section_onefile_picview.html [new file with mode: 0644]
webcit/static/t/floors.html [new file with mode: 0644]
webcit/static/t/floors_edit_one.html [new file with mode: 0644]
webcit/static/t/get_logged_in.html [new file with mode: 0644]
webcit/static/t/head.html [new file with mode: 0644]
webcit/static/t/ical/attachment/display.html [new file with mode: 0644]
webcit/static/t/ical/attachment/display_attendees.html [new file with mode: 0644]
webcit/static/t/ical/attachment/display_conflict.html [new file with mode: 0644]
webcit/static/t/iconbar.html [new file with mode: 0644]
webcit/static/t/iconbar/edit.html [new file with mode: 0644]
webcit/static/t/iconbar/save.html [new file with mode: 0644]
webcit/static/t/iconbar/user.css [new file with mode: 0644]
webcit/static/t/json/floor.html [new file with mode: 0644]
webcit/static/t/json/floors.html [new file with mode: 0644]
webcit/static/t/json/lkra.html [new file with mode: 0644]
webcit/static/t/json/room.html [new file with mode: 0644]
webcit/static/t/json/roomflr.html [new file with mode: 0644]
webcit/static/t/knrooms.html [new file with mode: 0644]
webcit/static/t/knrooms_rooms.html [new file with mode: 0644]
webcit/static/t/listsub/display.html [new file with mode: 0644]
webcit/static/t/listsub/subscribeable_rooms.html [new file with mode: 0644]
webcit/static/t/load_attachments.html [new file with mode: 0644]
webcit/static/t/loggedinas.html [new file with mode: 0644]
webcit/static/t/login.html [new file with mode: 0644]
webcit/static/t/logout.html [new file with mode: 0644]
webcit/static/t/mail_vnoteitem.html [new file with mode: 0644]
webcit/static/t/mailsummary_json.html [new file with mode: 0644]
webcit/static/t/mailsummary_json_section.html [new file with mode: 0644]
webcit/static/t/menu/advanced_roomcommands.html [new file with mode: 0644]
webcit/static/t/menu/basic_commands.html [new file with mode: 0644]
webcit/static/t/menu/change_pw.html [new file with mode: 0644]
webcit/static/t/menu/your_info.html [new file with mode: 0644]
webcit/static/t/menubar.html [new file with mode: 0644]
webcit/static/t/msg/confirm_move.html [new file with mode: 0644]
webcit/static/t/msg/confirm_move_one_targetroom.html [new file with mode: 0644]
webcit/static/t/msg_listselector_bottom.html [new file with mode: 0644]
webcit/static/t/msg_listselector_top.html [new file with mode: 0644]
webcit/static/t/msg_listview.html [new file with mode: 0644]
webcit/static/t/navbar.html [new file with mode: 0644]
webcit/static/t/newstartpage.html [new file with mode: 0644]
webcit/static/t/no_new_msgs.html [new file with mode: 0644]
webcit/static/t/openid_manual_create.html [new file with mode: 0644]
webcit/static/t/paging.html [new file with mode: 0644]
webcit/static/t/paging/anchor.html [new file with mode: 0644]
webcit/static/t/paging/failed_hook.html [new file with mode: 0644]
webcit/static/t/paging/now.html [new file with mode: 0644]
webcit/static/t/preferences.html [new file with mode: 0644]
webcit/static/t/prefs/box.html [new file with mode: 0644]
webcit/static/t/prefs/pushemail.html [new file with mode: 0644]
webcit/static/t/prefs/section_icontheme_select.html [new file with mode: 0644]
webcit/static/t/prefs/section_msg_handle_select.html [new file with mode: 0644]
webcit/static/t/prefs/section_msg_sender_from_select.html [new file with mode: 0644]
webcit/static/t/prefs/section_msg_sender_name_select.html [new file with mode: 0644]
webcit/static/t/readinfo.html [new file with mode: 0644]
webcit/static/t/richedit.html [new file with mode: 0644]
webcit/static/t/room/create.html [new file with mode: 0644]
webcit/static/t/room/create_blog.html [new file with mode: 0644]
webcit/static/t/room/display_private.html [new file with mode: 0644]
webcit/static/t/room/edit.html [new file with mode: 0644]
webcit/static/t/room/edit/alias_domainname.html [new file with mode: 0644]
webcit/static/t/room/edit/alias_removal.html [new file with mode: 0644]
webcit/static/t/room/edit/digestrecp_removal.html [new file with mode: 0644]
webcit/static/t/room/edit/editroom.html [new file with mode: 0644]
webcit/static/t/room/edit/er_config_tab_room_option_list.html [new file with mode: 0644]
webcit/static/t/room/edit/listrecp_removal.html [new file with mode: 0644]
webcit/static/t/room/edit/participate_removal.html [new file with mode: 0644]
webcit/static/t/room/edit/pop3client_removal.html [new file with mode: 0644]
webcit/static/t/room/edit/rssclient_removal.html [new file with mode: 0644]
webcit/static/t/room/edit/select_alias.html [new file with mode: 0644]
webcit/static/t/room/edit/shared_room_add.html [new file with mode: 0644]
webcit/static/t/room/edit/shared_room_removal.html [new file with mode: 0644]
webcit/static/t/room/edit/submit.html [new file with mode: 0644]
webcit/static/t/room/edit/tab_access.html [new file with mode: 0644]
webcit/static/t/room/edit/tab_admin.html [new file with mode: 0644]
webcit/static/t/room/edit/tab_config.html [new file with mode: 0644]
webcit/static/t/room/edit/tab_expire.html [new file with mode: 0644]
webcit/static/t/room/edit/tab_feed.html [new file with mode: 0644]
webcit/static/t/room/edit/tab_listserv.html [new file with mode: 0644]
webcit/static/t/room/edit/tab_share.html [new file with mode: 0644]
webcit/static/t/room/edit/username_list.html [new file with mode: 0644]
webcit/static/t/room/edit_info.html [new file with mode: 0644]
webcit/static/t/room/info_status_json.html [new file with mode: 0644]
webcit/static/t/room/result_json.html [new file with mode: 0644]
webcit/static/t/room/select_targetfloor.html [new file with mode: 0644]
webcit/static/t/room/view_picture.html [new file with mode: 0644]
webcit/static/t/room/zap_entry.html [new file with mode: 0644]
webcit/static/t/room/zap_this.html [new file with mode: 0644]
webcit/static/t/room/zapped_list.html [new file with mode: 0644]
webcit/static/t/roombanner.html [new file with mode: 0644]
webcit/static/t/roomchat.html [new file with mode: 0644]
webcit/static/t/searchomatic.html [new file with mode: 0644]
webcit/static/t/section_mailsummary.html [new file with mode: 0644]
webcit/static/t/section_mailsummary_m.html [new file with mode: 0644]
webcit/static/t/select_messageindex.html [new file with mode: 0644]
webcit/static/t/select_messageindex_all.html [new file with mode: 0644]
webcit/static/t/sieve/add.html [new file with mode: 0644]
webcit/static/t/sieve/display.html [new file with mode: 0644]
webcit/static/t/sieve/display_one.html [new file with mode: 0644]
webcit/static/t/sieve/display_one_script.html [new file with mode: 0644]
webcit/static/t/sieve/empty.html [new file with mode: 0644]
webcit/static/t/sieve/list.html [new file with mode: 0644]
webcit/static/t/sieve/list_select_one.html [new file with mode: 0644]
webcit/static/t/sieve/none.html [new file with mode: 0644]
webcit/static/t/sieve/roomlist.html [new file with mode: 0644]
webcit/static/t/sieve/script_select.html [new file with mode: 0644]
webcit/static/t/start_of_new_msgs.html [new file with mode: 0644]
webcit/static/t/summary/page.html [new file with mode: 0644]
webcit/static/t/trailing.html [new file with mode: 0644]
webcit/static/t/user/edit_bio.html [new file with mode: 0644]
webcit/static/t/user/list.html [new file with mode: 0644]
webcit/static/t/user/list_section.html [new file with mode: 0644]
webcit/static/t/user/show.html [new file with mode: 0644]
webcit/static/t/vcard/edit.html [new file with mode: 0644]
webcit/static/t/vcard/edit/email.html [new file with mode: 0644]
webcit/static/t/vcard/edit/one_email.html [new file with mode: 0644]
webcit/static/t/vcard/list.html [new file with mode: 0644]
webcit/static/t/vcard/list/cell_end.html [new file with mode: 0644]
webcit/static/t/vcard/list/empty.html [new file with mode: 0644]
webcit/static/t/vcard/list/head.html [new file with mode: 0644]
webcit/static/t/vcard/list/internal_error.html [new file with mode: 0644]
webcit/static/t/vcard/list/item.html [new file with mode: 0644]
webcit/static/t/vcard/list/name.txt [new file with mode: 0644]
webcit/static/t/vcard/list/row_end.html [new file with mode: 0644]
webcit/static/t/vcard/list/row_start.html [new file with mode: 0644]
webcit/static/t/vcard/list/section_end.html [new file with mode: 0644]
webcit/static/t/vcard/list/section_start.html [new file with mode: 0644]
webcit/static/t/vcard/msg_display.html [new file with mode: 0644]
webcit/static/t/vcard/msg_display/email.html [new file with mode: 0644]
webcit/static/t/vcard/msg_display/one_email.html [new file with mode: 0644]
webcit/static/t/vcard/msg_display/phone.html [new file with mode: 0644]
webcit/static/t/view_blog/comment.html [new file with mode: 0644]
webcit/static/t/view_blog/comment_box.html [new file with mode: 0644]
webcit/static/t/view_blog/newer_posts.html [new file with mode: 0644]
webcit/static/t/view_blog/older_posts.html [new file with mode: 0644]
webcit/static/t/view_blog/post.html [new file with mode: 0644]
webcit/static/t/view_blog/show_commentlink.html [new file with mode: 0644]
webcit/static/t/view_blog/show_no_comments.html [new file with mode: 0644]
webcit/static/t/view_blog/sitemap.xml [new file with mode: 0644]
webcit/static/t/view_json/message.js [new file with mode: 0644]
webcit/static/t/view_json/message_inline_attach.js [new file with mode: 0644]
webcit/static/t/view_json/message_list_attach.js [new file with mode: 0644]
webcit/static/t/view_mailq/footer.html [new file with mode: 0644]
webcit/static/t/view_mailq/footer_empty.html [new file with mode: 0644]
webcit/static/t/view_mailq/footer_listonly.html [new file with mode: 0644]
webcit/static/t/view_mailq/header.html [new file with mode: 0644]
webcit/static/t/view_mailq/message.html [new file with mode: 0644]
webcit/static/t/view_mailq/message_bearer.html [new file with mode: 0644]
webcit/static/t/view_mailq/recipient.html [new file with mode: 0644]
webcit/static/t/view_mailq/table.html [new file with mode: 0644]
webcit/static/t/view_message.html [new file with mode: 0644]
webcit/static/t/view_message/inline_attach.html [new file with mode: 0644]
webcit/static/t/view_message/list_attach.html [new file with mode: 0644]
webcit/static/t/view_message/print.html [new file with mode: 0644]
webcit/static/t/view_message/replyquote.html [new file with mode: 0644]
webcit/static/t/view_message/wikiedit.html [new file with mode: 0644]
webcit/static/t/view_message_edit.html [new file with mode: 0644]
webcit/static/t/view_submessage.html [new file with mode: 0644]
webcit/static/t/viewomatic.html [new file with mode: 0644]
webcit/static/t/vnoteitem.html [new file with mode: 0644]
webcit/static/t/who.html [new file with mode: 0644]
webcit/static/t/who/active_smtpsessions.html [new file with mode: 0644]
webcit/static/t/who/activesmtpsessions_one.html [new file with mode: 0644]
webcit/static/t/who/bio.html [new file with mode: 0644]
webcit/static/t/who/box_list_static.html [new file with mode: 0644]
webcit/static/t/who/edit.html [new file with mode: 0644]
webcit/static/t/who/iconbar.html [new file with mode: 0644]
webcit/static/t/who/iconbar_section.html [new file with mode: 0644]
webcit/static/t/who/list_static_header.html [new file with mode: 0644]
webcit/static/t/who/section.html [new file with mode: 0644]
webcit/static/t/who/summary.html [new file with mode: 0644]
webcit/static/t/who/summary_section.html [new file with mode: 0644]
webcit/static/t/wiki/empty.html [new file with mode: 0644]
webcit/static/t/wiki/history.html [new file with mode: 0644]
webcit/static/t/wiki/history_inner.html [new file with mode: 0644]
webcit/static/t/wiki/pagelist.html [new file with mode: 0644]
webcit/static/t/wiki/pagelist_inner.html [new file with mode: 0644]
webcit/static/table.js [new file with mode: 0644]
webcit/static/unittest.js [new file with mode: 0644]
webcit/static/util.js [new file with mode: 0644]
webcit/static/wclib.js [new file with mode: 0644]
webcit/static/wcpref.js [new file with mode: 0644]
webcit/static/webcit_icons/8paint16.gif [new file with mode: 0644]
webcit/static/webcit_icons/aol-32x32.gif [new file with mode: 0644]
webcit/static/webcit_icons/blank.gif [new file with mode: 0644]
webcit/static/webcit_icons/bubble.gif [new file with mode: 0644]
webcit/static/webcit_icons/bubble_filler.gif [new file with mode: 0644]
webcit/static/webcit_icons/citadel-button-32x32.gif [new file with mode: 0644]
webcit/static/webcit_icons/closewindow.gif [new file with mode: 0644]
webcit/static/webcit_icons/collapse.gif [new file with mode: 0644]
webcit/static/webcit_icons/delete.gif [new file with mode: 0644]
webcit/static/webcit_icons/down_pointer.gif [new file with mode: 0644]
webcit/static/webcit_icons/error.gif [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/abort.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/account.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/activeuser.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/addcontact.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/attachement.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/back.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/blog.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/calendar.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/chat.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/check.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/config.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/contact.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/delete.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/draft.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/email.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/file.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/forward.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/login.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/logout.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/network.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/nextroom.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/note.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/pen.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/pencil.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/read.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/readallmsg.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/refresh.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/room.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/rss.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/search.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/setup.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/skiproom.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/summary.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/task.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/taskday.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/ungoto.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/16x16/user.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/abort.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/account.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/activeuser.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/addcontact.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/attachement.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/back.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/blog.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/calendar.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/chat.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/check.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/config.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/contact.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/delete.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/draft.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/email.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/feed.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/file.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/forward.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/login.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/logout.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/network.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/nextroom.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/note.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/pen.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/pencil.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/readallmsg.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/refresh.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/room.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/search.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/setup.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/skiproom.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/summary.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/task.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/taskday.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/ungoto.png [new file with mode: 0644]
webcit/static/webcit_icons/essen/32x32/user.png [new file with mode: 0644]
webcit/static/webcit_icons/expand.gif [new file with mode: 0644]
webcit/static/webcit_icons/google-32x32.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/activeuser_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/addevent_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/addnewcontact_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/advanpage2_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/advanpage2_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/bgcolor.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/blackdot.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/body-background.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/bold.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/calarea_16x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/calarea_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/calarea_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/centre.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/chatrooms_16x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/chatrooms_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/chatrooms_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/citadelchat_16x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/citadelchat_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/citadelchat_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/citadelchat_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/copy.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/cut.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/diskette_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/enternewnote_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/folder_closed.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/folder_open.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/gradient_background.jpg [new file with mode: 0644]
webcit/static/webcit_icons/old/hr.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/hyperlink.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/image.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/inactiveuser_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/indent.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/italic.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/justifyfull.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/lastnode.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/left_just.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/line.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/list.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/logoff_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/markngo_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/minus.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/minus_last.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/minus_last_no_root.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/minus_no_root.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/minus_nolines.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/monthview2_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/newmess2_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/newmess3_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/nextdate_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/numbered_list.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/outdent.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/page.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/page16x16.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/paste.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/pixel.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/plus.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/plus_last.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/plus_last_no_root.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/plus_no_root.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/plus_nolines.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/prevdate_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/privatemess_16x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/privatemess_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/privatemess_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/readallmess3_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/redo.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/right_just.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/rss_16x.png [new file with mode: 0644]
webcit/static/webcit_icons/old/savecontact_16x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/savecontact_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/savecontact_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/skipthisroom_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/spellcheck.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/square.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/storenotes_16x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/storenotes_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/storenotes_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/summscreen_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/summscreen_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/t.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/t_no_root.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/taskday2_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/taskmanag_16x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/taskmanag_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/taskmanag_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/taskmanag_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/textcolor.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/underline.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/undo.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/ungoto2_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/usermanag_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/usermanag_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/viewcontacts_16x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/viewcontacts_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/viewcontacts_32x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/viewcontacts_48x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/viewnotes_24x.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/week_view.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/white.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/xml_button.gif [new file with mode: 0644]
webcit/static/webcit_icons/old/year_view.gif [new file with mode: 0644]
webcit/static/webcit_icons/openid-32x32.gif [new file with mode: 0644]
webcit/static/webcit_icons/openid-small.gif [new file with mode: 0644]
webcit/static/webcit_icons/resizecorner.png [new file with mode: 0644]
webcit/static/webcit_icons/resizegrippy.gif [new file with mode: 0644]
webcit/static/webcit_icons/sort_none.gif [new file with mode: 0644]
webcit/static/webcit_icons/throbber.gif [new file with mode: 0644]
webcit/static/webcit_icons/up_pointer.gif [new file with mode: 0644]
webcit/static/webcit_icons/yahoo-32x32.gif [new file with mode: 0644]
webcit/static/zapduplicates.js [new file with mode: 0644]
webcit/subst.c [new file with mode: 0644]
webcit/subst.h [new file with mode: 0644]
webcit/summary.c [new file with mode: 0644]
webcit/sysdep.c [new file with mode: 0644]
webcit/sysmsgs.c [new file with mode: 0644]
webcit/tabs.c [new file with mode: 0644]
webcit/tasks.c [new file with mode: 0644]
webcit/tiny_mce/langs/bg.js [new file with mode: 0644]
webcit/tiny_mce/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/langs/el.js [new file with mode: 0644]
webcit/tiny_mce/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/langs/et.js [new file with mode: 0644]
webcit/tiny_mce/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/langs/it.js [new file with mode: 0644]
webcit/tiny_mce/langs/zh-cn.js [new file with mode: 0644]
webcit/tiny_mce/license.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/css/advhr.css [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/js/rule.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/rule.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/css/advimage.css [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/image.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/img/sample.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/js/image.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/css/advlink.css [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/js/advlink.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/link.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/advlist/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlist/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autolink/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autolink/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autoresize/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autoresize/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/bbcode/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/bbcode/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/contextmenu/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/contextmenu/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/emotions.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-cool.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-cry.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-embarassed.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-frown.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-innocent.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-kiss.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-laughing.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-sealed.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-smile.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-surprised.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-undecided.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-wink.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/img/smiley-yell.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/js/emotions.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/example/dialog.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/example/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/example/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/example/img/example.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/example/js/dialog.js [new file with mode: 0644]
webcit/tiny_mce/plugins/example/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/example/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/example_dependency/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/example_dependency/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/css/fullpage.css [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/fullpage.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/js/fullpage.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullpage/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/fullscreen.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/template.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/layer/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/layer/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/legacyoutput/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/legacyoutput/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/lists/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/lists/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/css/media.css [new file with mode: 0644]
webcit/tiny_mce/plugins/media/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/js/embed.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/js/media.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/media/media.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/media/moxieplayer.swf [new file with mode: 0644]
webcit/tiny_mce/plugins/nonbreaking/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/nonbreaking/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/noneditable/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/noneditable/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/pagebreak/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/pagebreak/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/js/pastetext.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/js/pasteword.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/pastetext.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/pasteword.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/example.html [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/jscripts/embed.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/preview.html [new file with mode: 0644]
webcit/tiny_mce/plugins/print/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/css/searchreplace.css [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/js/searchreplace.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/searchreplace.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/spellchecker/css/content.css [new file with mode: 0644]
webcit/tiny_mce/plugins/spellchecker/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/spellchecker/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/spellchecker/img/wline.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/style/css/props.css [new file with mode: 0644]
webcit/tiny_mce/plugins/style/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/js/props.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/style/props.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/tabfocus/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/tabfocus/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/cell.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/table/css/cell.css [new file with mode: 0644]
webcit/tiny_mce/plugins/table/css/row.css [new file with mode: 0644]
webcit/tiny_mce/plugins/table/css/table.css [new file with mode: 0644]
webcit/tiny_mce/plugins/table/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/js/cell.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/js/merge_cells.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/js/row.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/js/table.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/merge_cells.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/table/row.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/table/table.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/template/blank.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/template/css/template.css [new file with mode: 0644]
webcit/tiny_mce/plugins/template/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/js/template.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/template/template.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/visualchars/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/visualchars/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/wordcount/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/wordcount/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/abbr.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/acronym.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/attributes.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/cite.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/css/attributes.css [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/css/popup.css [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/del.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/ins.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/js/abbr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/js/acronym.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/js/attributes.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/js/cite.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/js/del.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/js/element_common.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/js/ins.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/plugins/xhtmlxtras/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/anchor.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/charmap.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/color_picker.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/editor_template.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/editor_template_src.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/image.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/colorpicker.jpg [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/flash.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/icons.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/iframe.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/pagebreak.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/quicktime.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/realmedia.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/shockwave.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/trans.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/video.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/img/windowsmedia.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/js/about.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/js/anchor.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/js/charmap.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/js/color_picker.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/js/image.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/js/link.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/js/source_editor.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/bg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/bg_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/cs_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/da_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/de_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/el.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/el_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/en_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/es_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/et.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/et_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/fi_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/fr_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/hu_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/it.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/it_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/zh-cn.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/zh-cn_dlg.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/link.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/shortcuts.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/default/content.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/default/dialog.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/default/img/buttons.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/default/img/items.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/default/img/menu_check.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/default/img/progress.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/default/img/tabs.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/default/ui.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/highcontrast/content.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/highcontrast/dialog.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/highcontrast/ui.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/o2k7/content.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/o2k7/dialog.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/o2k7/ui.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/o2k7/ui_black.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/source_editor.htm [new file with mode: 0644]
webcit/tiny_mce/themes/simple/editor_template.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/editor_template_src.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/img/icons.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/bg.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/el.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/et.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/it.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/langs/zh-cn.js [new file with mode: 0644]
webcit/tiny_mce/themes/simple/skins/default/content.css [new file with mode: 0644]
webcit/tiny_mce/themes/simple/skins/default/ui.css [new file with mode: 0644]
webcit/tiny_mce/themes/simple/skins/o2k7/content.css [new file with mode: 0644]
webcit/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png [new file with mode: 0644]
webcit/tiny_mce/themes/simple/skins/o2k7/ui.css [new file with mode: 0644]
webcit/tiny_mce/tiny_mce.js [new file with mode: 0644]
webcit/tiny_mce/tiny_mce_popup.js [new file with mode: 0644]
webcit/tiny_mce/tiny_mce_src.js [new file with mode: 0644]
webcit/tiny_mce/utils/editable_selects.js [new file with mode: 0644]
webcit/tiny_mce/utils/form_utils.js [new file with mode: 0644]
webcit/tiny_mce/utils/mctabs.js [new file with mode: 0644]
webcit/tiny_mce/utils/validate.js [new file with mode: 0644]
webcit/useredit.c [new file with mode: 0644]
webcit/utils.c [new file with mode: 0644]
webcit/utils.h [new file with mode: 0644]
webcit/vcard_edit.c [new file with mode: 0644]
webcit/webcit.c [new file with mode: 0644]
webcit/webcit.h [new file with mode: 0644]
webcit/webserver.c [new file with mode: 0644]
webcit/webserver.h [new file with mode: 0644]
webcit/who.c [new file with mode: 0644]
webcit/wiki.c [new file with mode: 0644]

index 66d0d13a056c20cb5ebf341c5cc7bfbc74c7e580..8021ebdba484e34e7836b84423d322c5a04e3374 100644 (file)
@@ -1,11 +1,18 @@
-// Bring external RSS and/or Atom feeds into rooms.  This module implements a
-// very loose parser that scrapes both kinds of feeds and is not picky about
-// the standards compliance of the source data.
-//
-// Copyright (c) 2007-2023 by the citadel.org team
-//
-// This program is open source software.  Use, duplication, or disclosure
-// is subject to the terms of the GNU General Public License, version 3.
+/*
+ * Bring external RSS and/or Atom feeds into rooms.  This module implements a
+ * very loose parser that scrapes both kinds of feeds and is not picky about
+ * the standards compliance of the source data.
+ *
+ * Copyright (c) 2007-2022 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 3.
+ *
+ * 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.
+ */
 
 #include <stdlib.h>
 #include <unistd.h>
@@ -58,6 +65,7 @@ struct rssurl *rsstodo = NULL;
 
 
 // This handler is called whenever an XML tag opens.
+//
 void rss_start_element(void *data, const char *el, const char **attribute) {
        struct rssparser *r = (struct rssparser *)data;
        int i;
@@ -96,6 +104,7 @@ void rss_start_element(void *data, const char *el, const char **attribute) {
 
 
 // This handler is called whenever an XML tag closes.
+//
 void rss_end_element(void *data, const char *el) {
        struct rssparser *r = (struct rssparser *)data;
        StrBuf *encoded_field;
@@ -265,7 +274,9 @@ void rss_end_element(void *data, const char *el) {
 
 
 // This handler is called whenever data appears between opening and closing tags.
-void rss_handle_data(void *data, const char *content, int length) {
+//
+void rss_handle_data(void *data, const char *content, int length)
+{
        struct rssparser *r = (struct rssparser *)data;
 
        if (r->CData == NULL) {
@@ -277,7 +288,9 @@ void rss_handle_data(void *data, const char *content, int length) {
 
 
 // Feed has been downloaded, now parse it.
-void rss_parse_feed(StrBuf *Feed, struct rssroom *rooms) {
+//
+void rss_parse_feed(StrBuf *Feed, struct rssroom *rooms)
+{
        struct rssparser r;
 
        memset(&r, 0, sizeof r);
@@ -292,7 +305,9 @@ void rss_parse_feed(StrBuf *Feed, struct rssroom *rooms) {
 
 
 // Add a feed/room pair into the todo list
-void rssclient_push_todo(char *rssurl, char *roomname) {
+//
+void rssclient_push_todo(char *rssurl, char *roomname)
+{
        struct rssurl *r = NULL;
        struct rssurl *thisone = NULL;
        struct rssroom *newroom = NULL;
@@ -321,7 +336,9 @@ void rssclient_push_todo(char *rssurl, char *roomname) {
 
 
 // pull one feed (possibly multiple rooms)
-void rss_pull_one_feed(struct rssurl *url) {
+//
+void rss_pull_one_feed(struct rssurl *url)
+{
        CURL *curl;
        CURLcode res;
        StrBuf *Downloaded = NULL;
@@ -354,7 +371,9 @@ void rss_pull_one_feed(struct rssurl *url) {
 
 
 // We have a list, now download the feeds
-void rss_pull_feeds(void) {
+//
+void rss_pull_feeds(void)
+{
        struct rssurl *r;
        struct rssroom *rr;
 
@@ -375,7 +394,9 @@ void rss_pull_feeds(void) {
 
 
 // Scan a room's netconfig looking for RSS feed parsing requests
-void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) {
+//
+void rssclient_scan_room(struct ctdlroom *qrbuf, void *data)
+{
        char *serialized_config = NULL;
        int num_configs = 0;
        char cfgline[SIZ];
@@ -405,11 +426,13 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) {
 }
 
 
-// Scan for rooms that have RSS client requests configured
+/*
+ * Scan for rooms that have RSS client requests configured
+ */
 void rssclient_scan(void) {
        time_t now = time(NULL);
 
-       // Run no more than once every 15 minutes.
+       /* Run no more than once every 15 minutes. */
        if ((now - last_run) < 900) {
                syslog(LOG_DEBUG,
                        "rssclient: polling interval not yet reached; last run was %ldm%lds ago",
index 28cea70ec9cd5d72ee8d5640176c1dafafe1e788..7c49ed90da7b7ea82976d349222f9abbaa4fbf0b 100644 (file)
                        </div>
                        <div id="ctdl-banner-right" class="ctdl-banner-right">
                                <li><button id="lilo">Login</button></li>
-                               <li><button id="current_user">Not logged in.</button></li>
+                               <li><button>
+                                       <span id="current_user">Not logged in.</span>
+                               </button></li>
+                               <li><button>
+                                       <span id="current_user_avatar"><i class="fa fa-user-circle"></i></span>
+                               </button></li>
                        </div>
                </ul>
        </div>
index 78dfc0c41b4670538e0f5c3cb5c098f447ebd009..150caae267534e9d5f5a5656d143422ee755b5e9 100644 (file)
@@ -77,13 +77,14 @@ function update_banner() {
        else {
                document.getElementById("ctdl_banner_title").innerHTML = serv_info.serv_humannode;
        }
-       document.getElementById("current_user").innerHTML = render_userpic(current_user) + current_user ;
-
+       document.getElementById("current_user").innerHTML = current_user ;
        if (logged_in) {
                document.getElementById("lilo").innerHTML = "<a href=\"/ctdl/a/logout\"><i class=\"fa fa-right-from-bracket\"></i>" + _("Log off") + "</a>" ;
+               document.getElementById("current_user_avatar").innerHTML = render_userpic(current_user);
        }
        else {
                document.getElementById("lilo").innerHTML = "<a href=\"javascript:display_login_screen('')\"><i class=\"fa fa-right-to-bracket\"></i>" + _("Log in") + "</a>" ;
+               document.getElementById("current_user_avatar").innerHTML = "<i class=\"fa fa-user-circle fa-3x\"></i>";
        }
 }
 
diff --git a/webcit/.cvsignore b/webcit/.cvsignore
new file mode 100644 (file)
index 0000000..25ec644
--- /dev/null
@@ -0,0 +1,13 @@
+*.o
+Makefile
+config.cache
+config.log
+config.status
+config.h.in
+configure
+webcit
+webserver
+content
+autom4te.cache
+setup
+keys
diff --git a/webcit/.gitignore b/webcit/.gitignore
new file mode 100644 (file)
index 0000000..2be77a2
--- /dev/null
@@ -0,0 +1,23 @@
+*.d
+*.o
+Make_modules
+Make_sources
+Makefile
+aclocal.m4
+build-stamp
+config.log
+config.status
+configure
+configure-stamp
+ical_maps.c
+locale/
+modules_init.c
+modules_init.h
+po/Makefile
+setup
+sysdep.h
+sysdep.h.in
+webcit
+i18n_templatelist.c
+autom4te.cache
+gmon.out
diff --git a/webcit/COPYING b/webcit/COPYING
new file mode 100644 (file)
index 0000000..2330788
--- /dev/null
@@ -0,0 +1,670 @@
+Webcit Core is Copyright by the Citadel Development Team 1998 - 2012
+Webcit contains components under different Licenses, here their authors and list:
+
+Scriptaculous:Copyright (c) 2005-2007 
+             Thomas Fuchs, Marty Haught, Ivan Krstic, Jon Tirsen, Sammi Williams
+             (http://script.aculo.us, http://mir.aculo.us, http://blogs.law.harvard.edu/ivan, 
+             http://www.tirsen.com, http://www.oriontransfer.co.nz) 
+             MIT-style license.
+
+PrototypeJS: Copyright (c) 2005-2008 Sam Stephenson; http://www.prototypejs.org/; 
+  MIT License (http://dev.rubyonrails.org/browser/spinoffs/prototype/trunk/LICENSE?format=raw)
+
+strcmp: http://kevin.vanzonneveld.net; original by: Waldo Malqui Silva input by: Steve Hilder
+  improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) http://kevin.vanzonneveld.net
+
+DatePicker: widget using Prototype and Scriptaculous. (c) 2007 Mathieu Jondet <mathieu@eulerian.com> Eulerian Technologies
+  DatePicker is freely distributable under the same terms as Prototype. -> 
+
+NanoTree: Martin Mouritzen. (martin@nano.dk) LGPL V3
+
+Bubble Tooltips: Alessandro Fulciniti (http://web-graphics.com) Public Domain, GPL V3 by Art Cancro
+
+StdExt: Copyright (c) 2005 Michael Schuerig http://www.schuerig.de/michael/javascript/stdext.js LGPL V2.1 or later
+
+CSS3PIE: both the Apache license and the GNU General Public License.
+
+TinyMCE: Moxiecode tinymce.org LGPL V2.1 or later
+
+fineuploader: fineuploader.com GPL V3
+
+* In addition, as a special exception, we hereby declare that our
+  favorite type of software is called "open source" -- NOT "free
+  software" -- and that our favorite operating system is called
+  "Linux" -- NOT "GNU/Linux."  We officially reject and denounce
+  Richard Stallman's linguistic fascism.
+
+* In addition, as a special exception, the copyright holders give
+* permission to link the code of portions of this program with the
+* OpenSSL library under certain conditions as described in each
+* individual source file, and distribute linked combinations
+* including the two.
+* You must obey the GNU General Public License in all respects
+* for all of the code used other than OpenSSL. If you modify
+* file(s) with this exception, you may extend this exception to your
+* version of the file(s), but you are not obligated to do so. If you
+* do not wish to do so, delete this exception statement from your
+* version. If you delete this exception statement from all source
+* files in the program, then also delete it here.
+
+
+
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+
+                            Preamble
+
+  The GNU General Public License is an open source "copyleft" license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
diff --git a/webcit/Makefile.in b/webcit/Makefile.in
new file mode 100644 (file)
index 0000000..1e11235
--- /dev/null
@@ -0,0 +1,187 @@
+prefix=@prefix@
+srcdir=@srcdir@
+VPATH=$(srcdir)
+
+AUTOCONF=@AUTOCONF@
+CC=@CC@
+CFLAGS=@CFLAGS@
+DEFS=@DEFS@
+INSTALL=@INSTALL@
+LIBOBJS=@LIBOBJS@
+LIBS=@LIBS@
+LDFLAGS=@LDFLAGS@
+SED=@SED@
+SETUP_LIBS=@SETUP_LIBS@
+PTHREAD_DEFS=@PTHREAD_DEFS@
+LIB_SUBDIRS=
+PROG_SUBDIRS=@PROG_SUBDIRS@
+SUBDIRS=$(LIB_SUBDIRS) $(PROG_SUBDIRS) 
+LOCALEDIR=@LOCALEDIR@
+WWWDIR=@WWWDIR@
+ETCDIR=@ETCDIR@
+HEADERS=calendar.h  dav.h  messages.h  modules_init.h  paramhandling.h  preferences.h  roomops.h  subst.h  sysdep.h  sockets.h  utils.h  webcit.h  webserver.h
+
+# End of configuration section
+
+all: buildinfo all-progs-recursive webcit
+
+buildinfo:
+       echo
+       echo Compiler:  $(CC) $(CFLAGS) $(DEFS) $(PTHREAD_DEFS) -c -o $@
+       echo Linker:    $(CC) $(LDFLAGS) $(LIBOBJS)     $(LIBS)
+       echo
+
+# for VPATH builds (invoked by configure)
+mkdir-init:
+       mkdir locale
+
+.SILENT:
+
+.SUFFIXES: .cpp .c .o
+
+clean:
+       rm -f *.o webcit webcit
+       rm -fr locale/*
+
+distclean: clean
+       rm -f Makefile config.cache config.log config.status \
+               po/webcit/Makefile \
+               ical_maps.c \
+               $(srcdir)/TAGS
+
+webcit: webserver.o context_loop.o ical_dezonify.o \
+       cookie_conversion.o locate_host.o summary.o \
+       webcit.o auth.o sockets.o mainmenu.o serv_func.o who.o marchlist.o \
+       roomops.o roomlist.o roomtokens.o roomviews.o \
+       blogview_renderer.o msg_renderers.o jsonview_renderer.o mailview_renderer.o bbsview_renderer.o \
+       messages.o paging.o sysmsgs.o \
+       useredit.o vcard_edit.o preferences.o html2html.o listsub.o roomchat.o \
+       graphics.o netconf.o siteconfig.o subst.o \
+       calendar.o calendar_tools.o calendar_view.o tasks.o event.o smtpqueue.o \
+       availability.o iconbar.o icontheme.o crypto.o inetconf.o notes.o wiki.o \
+       dav_main.o dav_get.o dav_propfind.o dav_report.o fmt_date.o \
+       dav_options.o autocompletion.o gettext.o tabs.o sieve.o sitemap.o \
+       dav_delete.o dav_put.o http_datestring.o \
+       downloads.o addressbook_popup.o pushemail.o sysdep.o openid.o \
+       modules_init.o paramhandling.o utils.o \
+       ical_maps.o ical_subst.o static.o feed_generator.o \
+       $(LIBOBJS)
+       echo LD: webcit
+       $(CC) $(LDFLAGS) -o webcit $(LIBOBJS) \
+       webserver.o context_loop.o cookie_conversion.o marchlist.o \
+       webcit.o auth.o sockets.o mainmenu.o serv_func.o who.o listsub.o \
+       roomops.o roomlist.o roomtokens.o roomviews.o \
+       messages.o msg_renderers.o paging.o sysmsgs.o \
+       blogview_renderer.o jsonview_renderer.o mailview_renderer.o bbsview_renderer.o \
+       useredit.o locate_host.o siteconfig.o subst.o vcard_edit.o roomchat.o \
+       graphics.o netconf.o preferences.o html2html.o openid.o \
+       summary.o calendar.o calendar_tools.o calendar_view.o tasks.o event.o wiki.o \
+       availability.o ical_dezonify.o iconbar.o icontheme.o crypto.o inetconf.o notes.o \
+       dav_main.o dav_get.o dav_propfind.o dav_report.o dav_delete.o \
+       dav_options.o autocompletion.o tabs.o smtpqueue.o sieve.o sitemap.o \
+       dav_put.o http_datestring.o fmt_date.o modules_init.o \
+       gettext.o downloads.o addressbook_popup.o pushemail.o sysdep.o \
+       paramhandling.o utils.o ical_maps.o ical_subst.o static.o feed_generator.o \
+       $(LIBS)
+
+ical_maps.c: scripts/get_ical_data.sh
+       sh scripts/get_ical_data.sh
+
+%.o: %.c ${HEADERS}
+       echo "CC $<"
+       $(CC) $(CFLAGS) $(DEFS) $(PTHREAD_DEFS) -c -o $@ $<
+
+%.o: %.cpp ${HEADERS}
+       echo "CC+ $<"
+       $(CC) $(CFLAGS) $(DEFS) $(PTHREAD_DEFS) -c -o $@ $<
+
+Makefile: $(srcdir)/Makefile.in config.status
+       CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status
+
+config.status: $(srcdir)/configure
+       $(SHELL) ./config.status --recheck
+
+$(srcdir)/configure: $(srcdir)/configure.ac $(srcdir)/aclocal.m4
+       cd $(srcdir) && $(AUTOCONF)
+
+$(srcdir)/aclocal.m4: $(srcdir)/acinclude.m4
+       cd $(srcdir) && $(ACLOCAL)
+
+install:  install-bin install-wwwdata install-tinymce install-locale install-cfg
+
+install-bin:
+       test -d $(DESTDIR)$(prefix) || mkdir -p $(DESTDIR)$(prefix)
+       $(INSTALL) webcit $(DESTDIR)$(prefix)/webcit
+       if test -f $(DESTDIR)$(prefix)/webserver; then \
+               rm -f $(DESTDIR)$(prefix)/webserver; \
+               ln -s $(DESTDIR)$(prefix)/webcit $(DESTDIR)$(prefix)/webserver; \
+       fi
+
+install-cfg:
+       test -d $(DESTDIR)$(ETCDIR) || mkdir -p $(DESTDIR)$(ETCDIR)
+       $(INSTALL) nogz-mimetypes.txt $(DESTDIR)/$(ETCDIR)/nogz-mimetypes.txt
+
+install-wwwdata:
+       test -d $(DESTDIR)$(WWWDIR)/static.local/t || mkdir -p $(DESTDIR)$(WWWDIR)/static.local/t
+       test -d $(DESTDIR)$(WWWDIR)/static/t || mkdir -p $(DESTDIR)$(WWWDIR)/static/t
+       for i in `find static -type d | grep -v .svn` \
+               ; do \
+               test -d $(DESTDIR)$(WWWDIR)/$$i || mkdir -p $(DESTDIR)$(WWWDIR)/$$i; \
+       done
+       for i in `find static -type f | grep -v .svn`; do \
+               $(INSTALL) $$i $(DESTDIR)$(WWWDIR)/$$i; \
+       done
+
+install-tinymce:
+       test -d $(DESTDIR)$(WWWDIR)/static || mkdir -p $(DESTDIR)$(WWWDIR)/static
+       for i in `find tiny_mce -type d | grep -v .svn` \
+               ; do \
+               test -d $(DESTDIR)$(WWWDIR)/$$i || mkdir -p $(DESTDIR)$(WWWDIR)/$$i; \
+       done
+       for i in \
+               `find tiny_mce -type f | grep -v .svn` \
+               ; do \
+               $(INSTALL) $$i $(DESTDIR)$(WWWDIR)/$$i; \
+       done
+
+install-locale:
+       cd po/webcit/; $(MAKE)
+       for i in `find locale -type d | grep -v .svn` \
+               ; do \
+               test -d $(DESTDIR)$(LOCALEDIR)/$$i || mkdir -p $(DESTDIR)$(LOCALEDIR)/$$i; \
+       done
+       for i in `find locale -type f | grep -v .svn`; do \
+               $(INSTALL) $$i $(DESTDIR)$(LOCALEDIR)/$$i; \
+       done
+
+TAGS clean-recursive distclean-recursive depend-recursive check-recursive \
+  mostlyclean-recursive realclean-recursive:
+       @for subdir in $(SUBDIRS); do \
+         if test -d $$subdir ; then \
+           target=`echo $@|$(SED) 's/-recursive//'`; \
+           echo making $$target in $$subdir; \
+           (cd $$subdir && $(MAKE) $$target) || exit 1; \
+         fi ; \
+       done
+
+all-progs-recursive install-progs-recursive install-strip-progs-recursive  \
+       uninstall-progs-recursive:
+#      @for subdir in $(PROG_SUBDIRS); do \
+#        if test -d $$subdir ; then \
+#          target=`echo $@|$(SED) 's/-progs-recursive//'`; \
+#          echo making $$target in $$subdir; \
+#          (cd $$subdir && $(MAKE) $$target) || exit 1; \
+#        fi ; \
+#      done
+
+all-libs-recursive install-libs-recursive install-strip-libs-recursive \
+  uninstall-libs-recursive install-shlibs-libs-recursive \
+  install-shlibs-strip-libs-recursive uninstall-shlibs-libs-recursive:
+#      @for subdir in $(LIB_SUBDIRS); do \
+#        if test -d $$subdir ; then \
+#          target=`echo $@|$(SED) 's/-libs-recursive//'`; \
+#          echo making $$target in $$subdir; \
+#          (cd $$subdir && $(MAKE) $$target) || exit 1; \
+#        fi ; \
+#      done
+
diff --git a/webcit/README.txt b/webcit/README.txt
new file mode 100644 (file)
index 0000000..aa8f606
--- /dev/null
@@ -0,0 +1,335 @@
+                        WEBCIT for the Citadel System
+   Copyright (C) 1996-2012 by the authors.  Portions written by:
+       Art Cancro
+       Wilfried Goesgens
+       Dave West
+       Thierry Pasquier
+       Nathan Bryant
+       Nick Grossman
+       Andru Luvisi
+       Alessandro Fulciniti
+       Dave Lindquist
+       Matt Pfleger
+       Martin Mouritzen
+       Stefan Garthe
+
+   This program is open source software released under the terms of the GNU
+   General Public License, version 3. Please read COPYING.txt for more
+   licensing information.
+   WebCit bundles the Prototype JavaScript Framework, writen by Sam
+   Stephenson [http://prototype.conio.net].  These components are licensed to
+   you under the terms of an MIT-style license.
+
+   WebCit bundles the script.aculo.us JavaScript library, written by
+   Thomas Fuchs [http://script.aculo.us, http://mir.aculo.us].  These
+   components are licensed to you under the terms of an MIT-style license.
+
+   WebCit bundles the TinyMCE text editor, written by Moxiecode Systems AB
+   (http://tinymce.moxiecode.com/tinymce/docs/credits.html).  This component
+   is licensed to you under the terms of the GNU Lesser General Public
+   License.
+
+   Most of our Icons are taken from the "Essen" set by the people on
+   http://pc.de/icons/. We like to thank them for their astonishing work!
+   Their site explicitly states: "Free for commercial use as well."
+
+   One or more icons are from Milosz Wlazlo [http://miloszwl.deviantart.com]
+   whose license explicitly allows inclusion in open source projects on the
+   condition of this attribution.
+
+   WebCit bundles the CSS3PIE library [http://css3pie.com] which is offered
+   under both the Apache license and the GNU General Public License.
+
+   The Citadel logo was designed by Lisa Aurigemma.
+
+ INTRODUCTION
+ ------------
+ Citadel is a sophisticated groupware platform which allows multiple
+users to simultaneously access the system using a variety of user interfaces.
+This package (WebCit) is a web based front end and user interface to the
+Citadel system.
+
+ What this means in practice is that after you've installed WebCit, users can
+access all functions of your system using any web browser.  Since this may be
+the first Citadel experience for many new users, the screens have been designed
+to be attractive and easy to navigate.
+ INSTALLATION
+ ------------
+ Unlike some web-based packages, WebCit contains its own standalone HTTP
+engine.  As a result, you can get it running quickly without all that tedious
+mucking about with Apache configuration files and directories.  WebCit is not
+intended to be a general-purpose web server, however -- it *only* provides a
+front end to Citadel.  If you do not have another web server running, you may
+run WebCit on port 80; however, if you have Apache or some other web server
+listening on port 80, you must run WebCit on another port.  If you do not
+specify a port number, WebCit will bind to port 2000.
+ To compile from source, enter the usual commands:
+  ./configure --prefix=/usr/local/webcit   [or whatever directory you prefer]
+  make
+  make install
+ Package/Ports Maintainers: to make webcit fit smart into LHFS-ified systems
+ read on at the end of this file, Advanced configure options.
+
+ Then to initialize it:
+  cd /usr/local/webcit
+  ./setup
+ After running setup, you just point your web browser to whatever port you
+specified, such as:
+  http://your.host.name
+ (or if you specified some other port, such as 2000 in this example...)
+  http://your.host.name:2000
+ ...and log in.
+ The included "setup" program is basically just an installation helper that
+asks a series of questions and then adds the appropriate init files to
+start WebCit.  For most installations, this will do just fine.  If you have
+special circumstances, or if you'd prefer to configure WebCit manually, you
+may skip the setup program.  Instead, open /etc/inittab and add an entry
+something like this:
+ wc:2345:respawn:/usr/local/webcit/webcit
+ Several command-line options are also available.  Here's the usage for
+the "webcit" program:
+  
+ webcit [-i ip_addr] [-p http_port] [-s] [-S cipher_suite]
+           [-g guest_landing_page]
+           [-c] [-f] [remotehost [remoteport]]
+   *or*
+ webcit [-i ip_addr] [-p http_port] [-s] [-S cipher_suite]
+           [-g guest_landing_page]
+           [-c] [-f] uds /your/citadel/directory
+ Explained: 
+  
+  -> ip_addr: the IP address on which you wish your WebCit server to run.
+     You can leave this out, in which case WebCit will listen on all
+     available network interfaces.  Normally this will be the case, but if
+     you are running multiple Citadel systems on one host, it can be useful.
+     You can also use this option to run Apache and WebCit on different IP
+     addresses instead of different ports, if you have them available.
+  -> http_port: the TCP port on which you wish your WebCit server to run.  If
+     you are installing WebCit on a dedicated server, you can use the
+     standard port 80.  Otherwise, if port 80 is already occupied by some
+     other web service (probably Apache), then you'll need to select a
+     different port.  If you do not specify a port number, WebCit will attempt
+     to use port 80.
+     
+  -> The "guest landing page" is a location on your WebCit installation where
+     unauthenticated guest users are taken when they first enter the root of
+     your site.  If guest mode is not enabled on your Citadel server, they will
+     be taken to a login page instead.  If guest mode is enabled but no landing
+     page is defined, they will be taken to the Lobby.
+  -> The "-c" option causes WebCit to output an extra cookie containing the
+     identity of the WebCit server.  The cookie will look like this:
+       Set-cookie: wcserver=your.host.name
+     This is useful if you have a cluster of WebCit servers sitting behind a
+     load balancer, and the load balancer has the ability to use cookies to
+     keep track of which server to send HTTP requests to.
+  -> The "-s" option causes WebCit to present an HTTPS (SSL-encrypted) web
+     service.  If you want to do both HTTP and HTTPS, you can simply run two
+     instances of WebCit on two different ports.
+
+  -> The "-S" option also enables HTTPS, but must be followed by a list of
+     cipher suites you wish to enable.  Please see http://openssl.org/docs/apps/ciphers.html
+     for a list of cipher strings.
+
+  -> The "-f" option tells WebCit that it is allowed to follow the
+     "X-Forwarded-For:" HTTP headers which may be added if your WebCit service
+     is sitting behind a front end proxy.  This will allow users in your "Who
+     is online?" list to appear as connecting from their actual host address
+     instead of the address of the proxy.  In addition, the
+     "X-Forwarded-Host:" header from the front end proxy will also be honored,
+     which will help to make automatically generated absolute URL's (for
+     things like GroupDAV and mailing list subscriptions) correct.
+  -> remotehost: the name or IP address of the host on which your Citadel
+     server is running.  The default is "localhost".
+  -> remoteport: the port number on which your Citadel server is running.
+     The default is port 504, the IANA-designated standard port for Citadel.
+  -> "uds" is a keyword which tells WebCit that you wish to connect to a
+     Citadel server running on the same computer, rather than using a TCP/IP
+     socket.  /your/citadel/directory should be set to the actual name of the
+     directory in which you have Citadel installed
+     (such as /usr/local/citadel).  If you run Citadel and WebCit on the same
+     computer, this is recommended, as it will run much faster.
+ GRAPHICS
+ --------
+ WebCit contains graphics, templates, JavaScript code, etc. which are kept
+in its "static" subdirectory.  All site-specific graphics, however, are
+fetched from the Citadel server.
+ The "images" directory on a Citadel system contains these graphics.  The
+ones which you may be interested in are:
+ -> background.gif: a background texture displayed under all web pages
+ -> hello.gif: your system's logo.  It is displayed along with the logon
+    banner, and on the top left corner of each page.
+ If you would like to deploy a "favicon.ico" graphic, please put it in
+the static/ directory.  WebCit will properly serve it from there.
+
+ CUSTOMIZATION
+ -------------
+
+ The default WebCit installation will create an empty directory called 
+"static.local". In this directory you may place a file called "webcit.css"
+into the "styles" directory which, if present, is referenced *after* the
+default stylesheet. If you know CSS and wish to customize your WebCit
+installation, any styles you declare in static.local/styles/webcit.css
+will override the styles found in static/styles/webcit.css -- and your
+customizations will not be overwritten when you upgrade WebCit later.
+
+ You may also place other files, such as images, in static.local for
+further customization.
+
+ CALENDAR SERVICE
+ ----------------
+ WebCit contains support for calendaring and scheduling.  In order to use it
+you must have libical v0.26 (or newer) on your system.
+ WebCit also provides iCalendar format free/busy data for calendar clients.
+Unlike with some other servers, there is no need for each user to "publish"
+free/busy data -- it is generated on-the-fly from the server-side calendar
+of the user being queried.
+  
+ HTTPS (encryption) SUPPORT
+ --------------------------
+ WebCit now supports HTTPS for encrypted connections.  When a secure server
+port is specified via the "-s" flag, an HTTPS service is enabled.
+ The service will look in the "keys" directory for the following files:
+ citadel.key   (your server's private key)
+ citadel.csr   (a certificate signing request)
+ citadel.cer   (your server's public certificate)
+ If any of these files are not found, WebCit will first attempt to link to the
+SSL files in the Citadel service's directory (if Citadel is running on the
+same host as WebCit), and if that does not succeed, it will automatically
+generate a key and certificate.
+ It is up to you to decide whether to use an automatically generated,
+self-signed certificate, or purchase a certificate signed by a well known
+authority.
+
+
+ INTEGRATING INTO APACHE
+ -----------------------
+
+ It is best to run WebCit natively on its own HTTP port.  If, however, you wish
+to have WebCit run as part of an Apache web server installation (for example,
+you only have one IP address and you need to stay on port 80 or 443 in order to
+maintain compatibility with corporate firewall policy), you can do this with
+the "mod_proxy" Apache module.
+ The preferred way to do this is to configure a NameVirtualHost for your WebCit
+installation (for example, http://webcit.example.com) and then proxy that
+virtual host through to WebCit.  The alternative way, which does work but is not
+quite as robust, is to "mount" the WebCit paths as directory aliases to your
+main document root.
+
+Here is how to configure the NameVirtualHost method (recommended) :
+
+<VirtualHost mydomain.com:443>
+       #here some of your config stuff like logging, serveradmin...
+       NameVirtualHost www.mydomain.com
+    <location />
+         allow from all
+    </location>
+    ProxyPass / http://127.0.0.1:2000/
+    ProxyPassReverse / http://127.0.0.1:2000/
+# The following line is optional.  It allows WebCit's static content
+# such as images to be served directly by Apache.
+    alias /static /var/lib/citadel/www/static
+</VirtualHost>
+
+Here is how to configure the "subdirectory" method (not recommended) :
+
+<VirtualHost mydomain.com:443>
+       #here some of your config stuff like logging, serveradmin...
+       NameVirtualHost www.mydomain.com
+    <location /webcit>
+      allow from all
+    </location>
+    <location /listsub>
+      allow from all
+    </location>
+    <location /groupdav>
+      allow from all
+    </location>
+    <location /who_inner_html>
+      allow from all
+    </location>
+
+    ProxyPass /webcit/ http://127.0.0.1:2000/webcit/
+    ProxyPassReverse /webcit/ http://127.0.0.1:2000/webcit/
+    ProxyPass /listsub/ http://127.0.0.1:2000/listsub/
+    ProxyPassReverse /listsub/ http://127.0.0.1:2000/listsub/
+    ProxyPass /groupdav/ http://127.0.0.1:2000/groupdav/
+    ProxyPassReverse /groupdav/ http://127.0.0.1:2000/groupdav/
+    ProxyPass /who_inner_html http://127.0.0.1:2000/who_inner_html
+    ProxyPassReverse /who_inner_html http://127.0.0.1:2000/who_inner_html
+</VirtualHost>
+
+  
+ ADVANCED CONFIGURATION OPTIONS
+ ------------------------------
+If you are building packages and prefer not to have WebCit reside entirely in
+a single directory, there are several compile-time options available.
+
+--with-wwwdir defines where webcit should locate and search its templates and images. 
+--with-localedir defines where to put webcits locale files.
+
+Also, there are possibilities to load the TinyMCE editor into a system-wide location.  WebCit 
+uses this standard component to compose its messages for messages and postings. Several WebCit installations
+that may differ in design but use the same TinyMCE (which is the default that WebCit ships with)
+(set --with-editordir for that, it defaults to the dir the templates go)
+
+Install targets have diversified to reflect these changes too:
+ (make install-.....)
+locale: the webcit .mo files for gettext & locales.
+tinymce: the editor. if your system brings one, just ommit this.
+wwwdata: our templates.
+setupbin: if you want to use webcits setup facility... but isn't needed in case you provide own init & config scripts.
+bin: the binaries.
+
+
+ CONCLUSION
+ ----------
+ That's all you need to know to get started.  If you have any questions or
+comments, visit the Citadel Support room on UNCENSORED! BBS, the home of Citadel:
+http://uncensored.citadel.org/dotgoto?room=Citadel%20Support
diff --git a/webcit/acinclude.m4 b/webcit/acinclude.m4
new file mode 100644 (file)
index 0000000..0941acf
--- /dev/null
@@ -0,0 +1,50 @@
+# CIT_STRUCT_TM
+# ------------------
+# Figure out how to get the current GMT offset.  If `struct tm' has a
+# `tm_gmtoff' member, define `HAVE_STRUCT_TM_TM_GMTOFF'.  Otherwise, if the
+# external variable `timezone' is found, define `HAVE_TIMEZONE'.
+AC_DEFUN([CIT_STRUCT_TM],
+[AC_REQUIRE([AC_STRUCT_TM])dnl
+AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[#include <sys/types.h>
+#include <$ac_cv_struct_tm>
+])
+if test "$ac_cv_member_struct_tm_tm_gmtoff" != yes; then
+  AC_CACHE_CHECK(for timezone, ac_cv_var_timezone,
+[AC_TRY_LINK(
+[#include <time.h>],
+[printf("%ld", (long)timezone);], ac_cv_var_timezone=yes, ac_cv_var_timezone=no)])
+  if test $ac_cv_var_timezone = yes; then
+    AC_DEFINE(HAVE_TIMEZONE, 1,
+              [Define if you don't have `tm_gmtoff' but do have the external
+               variable `timezone'.])
+  fi
+fi
+])# CIT_STRUCT_TM
+
+AC_DEFUN([AC_CHECK_DB],[
+for lib in $1
+do
+   AS_VAR_PUSHDEF([ac_tr_db], [ac_cv_db_lib_${lib}])dnl
+   bogo_saved_LIBS="$LIBS"
+   LIBS="$LIBS -l$lib"
+   AC_CACHE_CHECK([for db_create in -l${lib}], ac_tr_db,
+      [AC_TRY_LINK([#include <db.h>], [int foo=db_create((void *)0, (void *) 0, 
+0 )],
+                   [AS_VAR_SET(ac_tr_db, yes)],
+                   [AS_VAR_SET(ac_tr_db, no)])
+      ])
+   AS_IF([test AS_VAR_GET(ac_tr_db) = yes],
+         [$2
+         LIBS="$bogo_saved_LIBS"
+         SERVER_LIBS="$SERVER_LIBS -l$lib"
+          db=yes],
+         [LIBS="$bogo_saved_LIBS"
+          db=no])
+   AS_VAR_POPDEF([ac_tr_db])dnl
+test "$db" = "yes" && break
+done
+if test "$db" = "no"; then
+$3
+fi
+])# AC_CHECK_DB
+
diff --git a/webcit/addressbook_popup.c b/webcit/addressbook_popup.c
new file mode 100644 (file)
index 0000000..afbf3a0
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Dynamic HTML (formerly known as "AJAX") powered auto-completion
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+
+
+/*
+ * Address book popup results
+ */
+HashList* GetAddressbookList()
+{
+       HashList *List = NULL;
+       const StrBuf *WhichAddrBook;
+       StrBuf *saved_roomname;
+       StrBuf *Name;
+       StrBuf *Line;
+       long BufLen;
+       int IsLocalAddrBook;
+
+       WhichAddrBook = sbstr("which_addr_book");
+       IsLocalAddrBook = strcasecmp(ChrPtr(WhichAddrBook), "__LOCAL_USERS__") == 1;
+
+       if (IsLocalAddrBook) {
+               serv_puts("LIST");
+       }
+       else {
+               /* remember the default addressbook for this room */
+               set_room_pref("defaddrbook", NewStrBufDup(WhichAddrBook), 0);
+               saved_roomname = NewStrBufDup(WC->CurRoom.name);
+               gotoroom(WhichAddrBook);
+               serv_puts("DVCA");
+       }
+       
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, NULL)  == 1) {
+               List = NewHash(1, NULL);
+               while (BufLen = StrBuf_ServGetln(Line), 
+                      ((BufLen >= 0) && 
+                       ((BufLen != 3) || strcmp(ChrPtr(Line), "000"))))
+               {
+                       if (IsLocalAddrBook &&
+                           (BufLen > 5) &&
+                           (strncmp(ChrPtr(Line), "SYS_", 4) == 0))
+                       {
+                               continue;
+                       }
+                       Name = NewStrBufPlain(NULL, StrLength(Line));
+                       StrBufExtract_token(Name, Line, 0, '|');
+                       Put(List, SKEY(Name), Name, HFreeStrBuf);
+
+               }
+               SortByHashKey(List, 1);
+       }
+
+       if (!IsLocalAddrBook) {
+               gotoroom(saved_roomname);
+               FreeStrBuf(&saved_roomname);
+       }
+
+       return List;
+}
+
+
+
+
+void 
+InitModule_ADDRBOOK_POPUP
+(void)
+{
+
+       RegisterIterator("ITERATE:ABNAMES", 0, NULL, GetAddressbookList, NULL, NULL, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+}
diff --git a/webcit/auth.c b/webcit/auth.c
new file mode 100644 (file)
index 0000000..74d9237
--- /dev/null
@@ -0,0 +1,931 @@
+/*
+ * These functions handle authentication of users to a Citadel server.
+ *
+ * Copyright (c) 1996-2021 by the citadel.org team
+ *
+ * This program is open source software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include <ctype.h>
+
+extern uint32_t hashlittle( const void *key, size_t length, uint32_t initval);
+
+/*
+ * Access level definitions.  This is initialized from a function rather than a
+ * static array so that the strings may be localized.
+ */
+char *axdefs[7]; 
+
+void initialize_axdefs(void) {
+
+       /* an erased user */
+       axdefs[0] = _("Deleted");       
+
+       /* a new user */
+       axdefs[1] = _("New User");      
+
+       /* a trouble maker */
+       axdefs[2] = _("Problem User");  
+
+       /* user with normal privileges */
+       axdefs[3] = _("Local User");    
+
+       /* a user that may access network resources */
+       axdefs[4] = _("Network User");  
+
+       /* a moderator */
+       axdefs[5] = _("Preferred User");
+
+       /* chief */
+       axdefs[6] = _("Admin");          
+}
+
+
+
+/* 
+ * Display the login screen
+ * mesg = the error message if last attempt failed.
+ */
+void display_login(void)
+{
+       begin_burst();
+       output_headers(1, 0, 0, 0, 1, 0);
+       do_template("login");
+       end_burst();
+}
+
+
+
+
+
+/* Initialize the session
+ *
+ * This function needs to get called whenever the session changes from
+ * not-logged-in to logged-in, either by an explicit login by the user or
+ * by a timed-out session automatically re-establishing with a little help
+ * from the browser cookie.  Either way, we need to load access controls and
+ * preferences from the server.
+ *
+ * user                        the username
+ * pass                        his password
+ * serv_response       The parameters returned from a Citadel USER or NEWU command
+ */
+void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_response)
+{
+       wcsession *WCC = WC;
+       StrBuf *Buf;
+       StrBuf *FloorDiv;
+
+       WCC->logged_in = 1;
+
+       if (WCC->wc_fullname == NULL)
+               WCC->wc_fullname = NewStrBufPlain(NULL, StrLength(serv_response));
+       StrBufExtract_token(WCC->wc_fullname, serv_response, 0, '|');
+       StrBufCutLeft(WCC->wc_fullname, 4 );
+       
+       if (WCC->wc_username == NULL)
+               WCC->wc_username = NewStrBufDup(user);
+       else {
+               FlushStrBuf(WCC->wc_username);
+               StrBufAppendBuf(WCC->wc_username, user, 0);
+       }
+
+       if (WCC->wc_password == NULL)
+               WCC->wc_password = NewStrBufDup(pass);
+       else {
+               FlushStrBuf(WCC->wc_password);
+               StrBufAppendBuf(WCC->wc_password, pass, 0);
+       }
+
+       WCC->axlevel = StrBufExtract_int(serv_response, 1, '|');
+       if (WCC->axlevel >= 6) {
+               WCC->is_aide = 1;
+       }
+
+       load_preferences();
+
+       Buf = NewStrBuf();
+       serv_puts("CHEK");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 2) {
+               const char *pch;
+
+               pch = ChrPtr(Buf) + 4;
+               /*WCC->new_mail  =*/ StrBufExtractNext_long(Buf, &pch, '|');
+               WCC->need_regi = StrBufExtractNext_long(Buf, &pch, '|');
+               WCC->need_vali = StrBufExtractNext_long(Buf, &pch, '|');
+               if (WCC->cs_inet_email == NULL)
+                       WCC->cs_inet_email  = NewStrBuf();
+               StrBufExtract_NextToken(WCC->cs_inet_email, Buf, &pch, '|');
+       }
+       get_preference("floordiv_expanded", &FloorDiv);
+       WCC->floordiv_expanded = FloorDiv;
+       FreeStrBuf(&Buf);
+       FlushRoomlist();
+}
+
+
+/* 
+ * modal/ajax version of 'login' (username and password)
+ */
+void ajax_login_username_password(void) {
+       StrBuf *Buf = NewStrBuf();
+
+       serv_printf("USER %s", bstr("name"));
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 3) {
+               serv_printf("PASS %s", bstr("pass"));
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatus(Buf, NULL) == 2) {
+                       become_logged_in(sbstr("name"), sbstr("pass"), Buf);
+               }
+       }
+
+       /* The client is expecting to read back a citadel protocol response */
+       wc_printf("%s", ChrPtr(Buf));
+       FreeStrBuf(&Buf);
+}
+
+
+
+/* 
+ * modal/ajax version of 'new user' (username and password)
+ */
+void ajax_login_newuser(void) {
+       StrBuf *NBuf = NewStrBuf();
+       StrBuf *SBuf = NewStrBuf();
+
+       serv_printf("NEWU %s", bstr("name"));
+       StrBuf_ServGetln(NBuf);
+       if (GetServerStatus(NBuf, NULL) == 2) {
+               become_logged_in(sbstr("name"), sbstr("pass"), NBuf);
+               serv_printf("SETP %s", bstr("pass"));
+               StrBuf_ServGetln(SBuf);
+       }
+
+       /* The client is expecting to read back a citadel protocol response */
+       wc_printf("%s", ChrPtr(NBuf));
+       FreeStrBuf(&NBuf);
+       FreeStrBuf(&SBuf);
+}
+
+
+
+/* 
+ * Try to create an account manually after an OpenID was verified
+ */
+void openid_manual_create(void)
+{
+       StrBuf *Buf;
+
+       /* Did the user change his mind?  Pack up and go home. */
+       if (havebstr("exit_action")) {
+               begin_burst();
+               output_headers(1, 0, 0, 0, 1, 0);
+               do_template("authpopup_finished");
+               end_burst();
+               return;
+       }
+
+
+       /* Ok, let's give this a try.  Can we create the new user? */
+
+       Buf = NewStrBuf();
+       serv_printf("OIDC %s", bstr("name"));
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 2) {
+               StrBuf *gpass;
+
+               gpass = NewStrBuf();
+               serv_puts("SETP GENERATE_RANDOM_PASSWORD");
+               StrBuf_ServGetln(gpass);
+               StrBufCutLeft(gpass, 4);
+               become_logged_in(sbstr("name"), gpass, Buf);
+               FreeStrBuf(&gpass);
+       }
+       FreeStrBuf(&Buf);
+
+       /* Did we manage to log in?  If so, continue with the normal flow... */
+       if (WC->logged_in) {
+               if (WC->logged_in) {
+                       begin_burst();
+                       output_headers(1, 0, 0, 0, 1, 0);
+                       do_template("authpopup_finished");
+                       end_burst();
+               }
+       } else {
+               /* Still no good!  Go back to teh dialog to select a username */
+               const StrBuf *Buf;
+               putbstr("__claimed_id", NewStrBufDup(sbstr("openid_url")));
+               Buf = sbstr("name");
+               if (StrLength(Buf) > 0)
+                       putbstr("__username", NewStrBufDup(Buf));
+               begin_burst();
+               output_headers(1, 0, 0, 0, 1, 0);
+               wc_printf("<html><body>");
+               do_template("openid_manual_create");
+               wc_printf("</body></html>");
+               end_burst();
+       }
+
+}
+
+
+/* 
+ * Perform authentication using OpenID
+ * assemble the checkid_setup request and then redirect to the user's identity provider
+ */
+void do_openid_login(void)
+{
+       char buf[4096];
+
+       snprintf(buf, sizeof buf,
+               "OIDS %s|%s/finalize_openid_login|%s",
+               bstr("openid_url"),
+               ChrPtr(site_prefix),
+               ChrPtr(site_prefix)
+       );
+
+       serv_puts(buf);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               syslog(LOG_DEBUG, "OpenID server contacted; redirecting to %s\n", &buf[4]);
+               http_redirect(&buf[4]);
+               return;
+       }
+
+       begin_burst();
+       output_headers(1, 0, 0, 0, 1, 0);
+       wc_printf("<html><body>");
+       escputs(&buf[4]);
+       wc_printf("</body></html>");
+       end_burst();
+}
+
+
+/* 
+ * Complete the authentication using OpenID
+ * This function handles the positive or negative assertion from the user's Identity Provider
+ */
+void finalize_openid_login(void)
+{
+       StrBuf *Buf;
+       wcsession *WCC = WC;
+       int linecount = 0;
+       StrBuf *result = NULL;
+       StrBuf *username = NULL;
+       StrBuf *password = NULL;
+       StrBuf *logged_in_response = NULL;
+       StrBuf *claimed_id = NULL;
+
+       if (havebstr("openid.mode")) {
+               if (!strcasecmp(bstr("openid.mode"), "id_res")) {
+                       Buf = NewStrBuf();
+                       serv_puts("OIDF");
+                       StrBuf_ServGetln(Buf);
+                       if (GetServerStatus(Buf, NULL) == 8) {
+                               urlcontent *u;
+                               void *U;
+                               long HKLen;
+                               const char *HKey;
+                               HashPos *Cursor;
+                               int len;
+                               
+                               Cursor = GetNewHashPos (WCC->Hdr->urlstrings, 0);
+                               while (GetNextHashPos(WCC->Hdr->urlstrings, Cursor, &HKLen, &HKey, &U)) {
+                                       u = (urlcontent*) U;
+                                       if (!strncasecmp(u->url_key, "openid.", 7)) {
+                                               serv_printf("%s|%s", &u->url_key[7], ChrPtr(u->url_data));
+                                       }
+                               }
+
+                               serv_puts("000");
+
+                               linecount = 0;
+                               while (len = StrBuf_ServGetln(Buf), 
+                                      ((len >= 0) &&
+                                       ((len != 3) || strcmp(ChrPtr(Buf), "000") )))
+                               {
+                                       if (linecount == 0) result = NewStrBufDup(Buf);
+                                       if (!strcasecmp(ChrPtr(result), "authenticate")) {
+                                               if (linecount == 1) {
+                                                       username = NewStrBufDup(Buf);
+                                               }
+                                               else if (linecount == 2) {
+                                                       password = NewStrBufDup(Buf);
+                                               }
+                                               else if (linecount == 3) {
+                                                       logged_in_response = NewStrBufDup(Buf);
+                                               }
+                                       }
+                                       else if (!strcasecmp(ChrPtr(result), "verify_only")) {
+                                               if (linecount == 1) {
+                                                       claimed_id = NewStrBufDup(Buf);
+                                               }
+                                               if (linecount == 2) {
+                                                       username = NewStrBufDup(Buf);
+                                               }
+                                       }
+                                       ++linecount;
+                               }
+                       }
+                       FreeStrBuf(&Buf);
+               }
+       }
+
+       /*
+        * Is this an attempt to associate a new OpenID with an account that is already logged in?
+        */
+       if ( (WCC->logged_in) && (havebstr("attach_existing")) ) {
+               display_openids();
+       }
+
+       /* If this operation logged us in, either by connecting with an existing account or by
+        * auto-creating one using Simple Registration Extension, we're already on our way.
+        */
+       else if (!strcasecmp(ChrPtr(result), "authenticate")) {
+               become_logged_in(username, password, logged_in_response);
+
+               /* Did we manage to log in?  If so, continue with the normal flow... */
+               if (WC->logged_in) {
+                       begin_burst();
+                       output_headers(1, 0, 0, 0, 1, 0);
+                       do_template("authpopup_finished");
+                       end_burst();
+               } else {
+                       begin_burst();
+                       output_headers(1, 0, 0, 0, 1, 0);
+                       wc_printf("<html><body>");
+                       wc_printf(_("An error has occurred."));
+                       wc_printf("</body></html>");
+                       end_burst();
+               }
+       }
+
+       /* The specified OpenID was verified but the desired user name was either not specified via SRE
+        * or conflicts with an existing user.  Either way the user will need to specify a new name.
+        */
+       else if (!strcasecmp(ChrPtr(result), "verify_only")) {
+               putbstr("__claimed_id", claimed_id);
+               claimed_id = NULL;
+               if (StrLength(username) > 0) {
+                       putbstr("__username", username);
+                       username = NULL;
+               }
+               begin_burst();
+               output_headers(1, 0, 0, 0, 1, 0);
+               wc_printf("<html><body>");
+               do_template("openid_manual_create");
+               wc_printf("</body></html>");
+               end_burst();
+       }
+
+       /* Something went VERY wrong if we get to this point */
+       else {
+               syslog(LOG_DEBUG, "finalize_openid_login() failed to do anything.  This is a code problem.\n");
+               begin_burst();
+               output_headers(1, 0, 0, 0, 1, 0);
+               wc_printf("<html><body>");
+               wc_printf(_("An error has occurred."));
+               wc_printf("</body></html>");
+               end_burst();
+       }
+
+       FreeStrBuf(&result);
+       FreeStrBuf(&username);
+       FreeStrBuf(&password);
+       FreeStrBuf(&claimed_id);
+       FreeStrBuf(&logged_in_response);
+}
+
+
+/*
+ * Display a welcome screen to the user.
+ */
+void do_welcome(void) {
+       StrBuf *Buf;
+       /*
+        * Go to the user's preferred start page
+        */
+       if (!get_preference("startpage", &Buf)) {
+               Buf = NewStrBuf ();
+               StrBufPrintf(Buf, "dotskip?room=_BASEROOM_");
+               set_preference("startpage", Buf, 1);
+       }
+       if (ChrPtr(Buf)[0] == '/') {
+               StrBufCutLeft(Buf, 1);
+       }
+       if (StrLength(Buf) == 0) {
+               StrBufAppendBufPlain(Buf, "dotgoto?room=_BASEROOM_", -1, 0);
+       }
+       syslog(LOG_DEBUG, "Redirecting to user's start page: %s\n", ChrPtr(Buf));
+       http_redirect(ChrPtr(Buf));
+}
+
+
+/*
+ * Disconnect from the Citadel server, and end this WebCit session
+ */
+void end_webcit_session(void) {
+       serv_puts("QUIT");
+       WC->killthis = 1;
+       /* close() of citadel socket will be done by do_housekeeping() */
+}
+
+
+/* 
+ * Log out the session with the Citadel server
+ */
+void do_logout(void)
+{
+       wcsession *WCC = WC;
+       char buf[SIZ];
+
+       FlushStrBuf(WCC->wc_username);
+       FlushStrBuf(WCC->wc_password);
+       FlushStrBuf(WCC->wc_fullname);
+       FlushRoomlist();
+
+       serv_puts("LOUT");
+       serv_getln(buf, sizeof buf);
+       WCC->logged_in = 0;
+
+       FlushStrBuf(WCC->CurRoom.name);
+
+       /* Calling output_headers() this way causes the cookies to be un-set */
+       output_headers(1, 1, 0, 1, 0, 0);
+       do_template("logout");
+       if ((WCC->serv_info != NULL) && WCC->serv_info->serv_supports_guest) {
+               display_default_landing_page();
+               return;
+       }
+
+       wDumpContent(2);
+       end_webcit_session();
+}
+
+
+/* 
+ * Special page for monitoring scripts etc
+ */
+void monitor(void)
+{
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       hprintf("Content-type: text/plain\r\n"
+               "Server: " PACKAGE_STRING "\r\n"
+               "Connection: close\r\n"
+       );
+       begin_burst();
+
+       wc_printf("Connection to Citadel server in %s : %s\r\n", ctdl_dir,
+               (WC->connected ? "SUCCESS" : "FAIL")
+       );
+
+       wDumpContent(0);
+}
+
+
+/*
+ * validate new users
+ */
+void validate(void)
+{
+       char cmd[SIZ];
+       char user[SIZ];
+       char buf[SIZ];
+       int a;
+
+       output_headers(1, 1, 1, 0, 0, 0);
+
+        do_template("box_begin_1");
+        StrBufAppendBufPlain(WC->WBuf, _("Validate new users"), -1, 0);
+        do_template("box_begin_2");
+
+       /* If the user just submitted a validation, process it... */
+       safestrncpy(buf, bstr("user"), sizeof buf);
+       if (!IsEmptyStr(buf)) {
+               if (havebstr("axlevel")) {
+                       serv_printf("VALI %s|%s", buf, bstr("axlevel"));
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] != '2') {
+                               wc_printf("<b>%s</b><br>\n", &buf[4]);
+                       }
+               }
+       }
+
+       /* Now see if any more users require validation. */
+       serv_puts("GNUR");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               wc_printf("<b>");
+               wc_printf(_("No users require validation at this time."));
+               wc_printf("</b><br>\n");
+               wDumpContent(1);
+               return;
+       }
+       if (buf[0] != '3') {
+               wc_printf("<b>%s</b><br>\n", &buf[4]);
+               wDumpContent(1);
+               return;
+       }
+
+       wc_printf("<table class=\"auth_validate\"><tr><td>\n");
+       wc_printf("<div id=\"validate\">");
+
+       safestrncpy(user, &buf[4], sizeof user);
+       serv_printf("GREG %s", user);
+       serv_getln(cmd, sizeof cmd);
+       if (cmd[0] == '1') {
+               a = 0;
+               do {
+                       serv_getln(buf, sizeof buf);
+                       ++a;
+                       if (a == 1)
+                               wc_printf("#%s<br><H1>%s</H1>",
+                                       buf, &cmd[4]);
+                       if (a == 2) {
+                               char *pch;
+                               int haveChar = 0;
+                               int haveNum = 0;
+                               int haveOther = 0;
+                               int haveLong = 0;
+                               pch = buf;
+                               while (!IsEmptyStr(pch))
+                               {
+                                       if (isdigit(*pch))
+                                               haveNum = 1;
+                                       else if (isalpha(*pch))
+                                               haveChar = 1;
+                                       else
+                                               haveOther = 1;
+                                       pch ++;
+                               }
+                               if (pch - buf > 7)
+                                       haveLong = 1;
+                               switch (haveLong + 
+                                       haveChar + 
+                                       haveNum + 
+                                       haveOther)
+                               {
+                               case 0:
+                                       pch = _("very weak");
+                                       break;
+                               case 1:
+                                       pch = _("weak");
+                                       break;
+                               case 2:
+                                       pch = _("ok");
+                                       break;
+                               case 3:
+                               default:
+                                       pch = _("strong");
+                               }
+
+                               wc_printf("PW: %s<br>\n", pch);
+                       }
+                       if (a == 3)
+                               wc_printf("%s<br>\n", buf);
+                       if (a == 4)
+                               wc_printf("%s<br>\n", buf);
+                       if (a == 5)
+                               wc_printf("%s, ", buf);
+                       if (a == 6)
+                               wc_printf("%s ", buf);
+                       if (a == 7)
+                               wc_printf("%s<br>\n", buf);
+                       if (a == 8)
+                               wc_printf("%s<br>\n", buf);
+                       if (a == 9)
+                               wc_printf(_("Current access level: %d (%s)\n"),
+                                       atoi(buf), axdefs[atoi(buf)]);
+               } while (strcmp(buf, "000"));
+       } else {
+               wc_printf("<H1>%s</H1>%s<br>\n", user, &cmd[4]);
+       }
+
+       wc_printf("<hr />");
+       wc_printf(_("Select access level for this user:"));
+       wc_printf("<br>\n");
+       for (a = 0; a <= 6; ++a) {
+               wc_printf("<a href=\"validate?nonce=%d?user=", WC->nonce);
+               urlescputs(user);
+               wc_printf("&axlevel=%d\">%s</A>&nbsp;&nbsp;&nbsp;\n",
+                       a, axdefs[a]);
+       }
+       wc_printf("<br>\n");
+
+       wc_printf("</div>\n");
+       wc_printf("</td></tr></table>\n");
+       do_template("box_end");
+       wDumpContent(1);
+}
+
+
+/*
+ * Display form for registration.
+ *
+ * (Set during_login to 1 if this registration is being performed during
+ * new user login and will require chaining to the proper screen.)
+ */
+void display_reg(int during_login)
+{
+       folder Room;
+       StrBuf *Buf;
+       message_summary *VCMsg = NULL;
+       wc_mime_attachment *VCAtt = NULL;
+       long vcard_msgnum;
+
+       Buf = NewStrBuf();
+       memset(&Room, 0, sizeof(folder));
+       if (goto_config_room(Buf, &Room) != 0) {
+               syslog(LOG_WARNING, "display_reg() exiting because goto_config_room() failed\n");
+               if (during_login) {
+                       pop_destination();
+               }
+               else {
+                       display_main_menu();
+               }
+               FreeStrBuf(&Buf);
+               FlushFolder(&Room);             
+               return;
+       }
+       FlushFolder(&Room);
+
+       FreeStrBuf(&Buf);
+       vcard_msgnum = locate_user_vcard_in_this_room(&VCMsg, &VCAtt);
+       if (vcard_msgnum < 0L) {
+               syslog(LOG_WARNING, "display_reg() exiting because locate_user_vcard_in_this_room() failed\n");
+               if (during_login) {
+                       pop_destination();
+               }
+               else {
+                       display_main_menu();
+               }
+               return;
+       }
+
+       if (during_login) {
+               do_edit_vcard(vcard_msgnum, "1", VCMsg, VCAtt, "pop", USERCONFIGROOM);
+       }
+       else {
+               StrBuf *ReturnTo;
+               ReturnTo = NewStrBufPlain(HKEY("display_main_menu?go="));
+               StrBufAppendBuf(ReturnTo, WC->CurRoom.name, 0);
+               do_edit_vcard(vcard_msgnum, "1", VCMsg, VCAtt, ChrPtr(ReturnTo), USERCONFIGROOM);
+               FreeStrBuf(&ReturnTo);
+       }
+
+}
+
+/*
+ * change password
+ * if passwords match, propagate it to citserver.
+ */
+void changepw(void)
+{
+       StrBuf *Line;
+       char newpass1[32], newpass2[32];
+
+       if (!havebstr("change_action")) {
+               AppendImportantMessage(_("Cancelled.  Password was not changed."), -1);
+               display_main_menu();
+               return;
+       }
+
+       safestrncpy(newpass1, bstr("newpass1"), sizeof newpass1);
+       safestrncpy(newpass2, bstr("newpass2"), sizeof newpass2);
+
+       if (strcasecmp(newpass1, newpass2)) {
+               AppendImportantMessage(_("They don't match.  Password was not changed."), -1);
+               do_template("menu_change_pw");
+               return;
+       }
+
+       if (IsEmptyStr(newpass1)) {
+               AppendImportantMessage(_("Blank passwords are not allowed."), -1);
+               do_template("menu_change_pw");
+               return;
+       }
+
+       Line = NewStrBuf();
+       serv_printf("SETP %s", newpass1);
+       StrBuf_ServGetln(Line);
+       if (GetServerStatusMsg(Line, NULL, 1, 0) == 2) {
+               if (WC->wc_password == NULL)
+                       WC->wc_password = NewStrBufPlain(
+                               ChrPtr(Line) + 4, 
+                               StrLength(Line) - 4);
+               else {
+                       FlushStrBuf(WC->wc_password);
+                       StrBufAppendBufPlain(WC->wc_password,  
+                                            ChrPtr(Line) + 4, 
+                                            StrLength(Line) - 4, 0);
+               }
+               display_main_menu();
+       }
+       else {
+               do_template("menu_change_pw");
+       }
+       FreeStrBuf(&Line);
+}
+
+
+int ConditionalHaveAccessCreateRoom(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Buf;    
+
+       Buf = NewStrBuf();
+       serv_puts("CRE8 0");
+       StrBuf_ServGetln(Buf);
+
+       if (GetServerStatus(Buf, NULL) == 2) {
+               StrBufCutLeft(Buf, 4);
+               AppendImportantMessage(SKEY(Buf));
+               FreeStrBuf(&Buf);
+               return 0;
+       }
+       FreeStrBuf(&Buf);
+       return 1;
+}
+
+
+int ConditionalAide(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       return (WCC != NULL) ? ((WCC->logged_in == 0)||(WC->is_aide == 0)) : 0;
+}
+
+
+int ConditionalIsLoggedIn(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+       return (WCC != NULL) ? (WCC->logged_in == 0) : 0;
+
+}
+
+
+/* 
+ * toggle the session over to a different language
+ */
+void switch_language(void) {
+       set_selected_language(bstr("lang"));
+       pop_destination();
+}
+
+
+void _display_reg(void) {
+       display_reg(0);
+}
+
+
+void Header_HandleAuth(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       if (hdr->HR.got_auth == NO_AUTH) /* don't override cookie auth... */
+       {
+               if (strncasecmp(ChrPtr(Line), "Basic", 5) == 0) {
+                       StrBufCutLeft(Line, 6);
+                       StrBufDecodeBase64(Line);
+                       hdr->HR.plainauth = Line;
+                       hdr->HR.got_auth = AUTH_BASIC;
+               }
+               else 
+                       syslog(LOG_WARNING, "Authentication scheme not supported! [%s]\n", ChrPtr(Line));
+       }
+}
+
+
+void CheckAuthBasic(ParsedHttpHdrs *hdr)
+{
+/*
+  todo: enable this if we can have other sessions than authenticated ones.
+       if (hdr->DontNeedAuth)
+               return;
+*/
+       StrBufAppendBufPlain(hdr->HR.plainauth, HKEY(":"), 0);
+       StrBufAppendBuf(hdr->HR.plainauth, hdr->HR.user_agent, 0);
+}
+
+
+void GetAuthBasic(ParsedHttpHdrs *hdr)
+{
+       const char *Pos = NULL;
+       if (hdr->c_username == NULL)
+               hdr->c_username = NewStrBufPlain(HKEY(DEFAULT_HTTPAUTH_USER));
+       if (hdr->c_password == NULL)
+               hdr->c_password = NewStrBufPlain(HKEY(DEFAULT_HTTPAUTH_PASS));
+       StrBufExtract_NextToken(hdr->c_username, hdr->HR.plainauth, &Pos, ':');
+       StrBufExtract_NextToken(hdr->c_password, hdr->HR.plainauth, &Pos, ':');
+}
+
+
+void Header_HandleCookie(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       const char *pch;
+/*
+  todo: enable this if we can have other sessions than authenticated ones.
+       if (hdr->DontNeedAuth)
+               return;
+*/
+       pch = strstr(ChrPtr(Line), "webcit=");
+       if (pch == NULL) {
+               return;
+       }
+
+       hdr->HR.RawCookie = Line;
+       StrBufCutLeft(hdr->HR.RawCookie, (pch - ChrPtr(hdr->HR.RawCookie)) + 7);
+       StrBufDecodeHex(hdr->HR.RawCookie);
+
+       cookie_to_stuff(Line, &hdr->HR.desired_session,
+                       hdr->c_username,
+                       hdr->c_password,
+                       hdr->c_roomname,
+                       hdr->c_language
+       );
+       hdr->HR.got_auth = AUTH_COOKIE;
+}
+
+
+void 
+HttpNewModule_AUTH
+(ParsedHttpHdrs *httpreq)
+{
+       httpreq->c_username = NewStrBufPlain(HKEY(DEFAULT_HTTPAUTH_USER));
+       httpreq->c_password = NewStrBufPlain(HKEY(DEFAULT_HTTPAUTH_PASS));
+       httpreq->c_roomname = NewStrBuf();
+       httpreq->c_language = NewStrBuf();
+}
+
+
+void 
+HttpDetachModule_AUTH
+(ParsedHttpHdrs *httpreq)
+{
+       FLUSHStrBuf(httpreq->c_username);
+       FLUSHStrBuf(httpreq->c_password);
+       FLUSHStrBuf(httpreq->c_roomname);
+       FLUSHStrBuf(httpreq->c_language);
+}
+
+
+void 
+HttpDestroyModule_AUTH
+(ParsedHttpHdrs *httpreq)
+{
+       FreeStrBuf(&httpreq->c_username);
+       FreeStrBuf(&httpreq->c_password);
+       FreeStrBuf(&httpreq->c_roomname);
+       FreeStrBuf(&httpreq->c_language);
+}
+
+
+void 
+InitModule_AUTH
+(void)
+{
+       initialize_axdefs();
+       RegisterHeaderHandler(HKEY("COOKIE"), Header_HandleCookie);
+       RegisterHeaderHandler(HKEY("AUTHORIZATION"), Header_HandleAuth);
+
+       /* no url pattern at all? Show login. */
+       WebcitAddUrlHandler(HKEY(""), "", 0, do_welcome, ANONYMOUS|COOKIEUNNEEDED);
+
+       WebcitAddUrlHandler(HKEY("do_welcome"), "", 0, do_welcome, ANONYMOUS|COOKIEUNNEEDED);
+       WebcitAddUrlHandler(HKEY("openid_login"), "", 0, do_openid_login, ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("finalize_openid_login"), "", 0, finalize_openid_login, ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("openid_manual_create"), "", 0, openid_manual_create, ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("validate"), "", 0, validate, 0);
+       WebcitAddUrlHandler(HKEY("do_welcome"), "", 0, do_welcome, 0);
+       WebcitAddUrlHandler(HKEY("display_reg"), "", 0, _display_reg, 0);
+       WebcitAddUrlHandler(HKEY("changepw"), "", 0, changepw, 0);
+       WebcitAddUrlHandler(HKEY("termquit"), "", 0, do_logout, 0);
+       WebcitAddUrlHandler(HKEY("do_logout"), "", 0, do_logout, ANONYMOUS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE);
+       WebcitAddUrlHandler(HKEY("monitor"), "", 0, monitor, ANONYMOUS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE);
+       WebcitAddUrlHandler(HKEY("ajax_login_username_password"), "", 0, ajax_login_username_password, AJAX|ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("ajax_login_newuser"), "", 0, ajax_login_newuser, AJAX|ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("switch_language"), "", 0, switch_language, ANONYMOUS);
+       RegisterConditional("COND:AIDE", 2, ConditionalAide, CTX_NONE);
+       RegisterConditional("COND:LOGGEDIN", 2, ConditionalIsLoggedIn, CTX_NONE);
+       RegisterConditional("COND:MAY_CREATE_ROOM", 2,  ConditionalHaveAccessCreateRoom, CTX_NONE);
+       return;
+}
+
+
+void 
+SessionDestroyModule_AUTH
+(wcsession *sess)
+{
+       FreeStrBuf(&sess->wc_username);
+       FreeStrBuf(&sess->wc_fullname);
+       FreeStrBuf(&sess->wc_password);
+       FreeStrBuf(&sess->httpauth_pass);
+       FreeStrBuf(&sess->cs_inet_email);
+}
diff --git a/webcit/autocompletion.c b/webcit/autocompletion.c
new file mode 100644 (file)
index 0000000..e936068
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * dynamic html autocompletion
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+
+/*
+ * Recipient autocompletion results
+ */
+void recp_autocomplete(char *partial) {
+       char buf[1024];
+       char name[128];
+
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       hprintf("Content-type: text/html\r\n"
+               "Server: %s\r\n"
+               "Connection: close\r\n"
+               "Pragma: no-cache\r\n"
+               "Cache-Control: no-store\r\n"
+               "Expires: -1\r\n"
+               ,
+               PACKAGE_STRING);
+       begin_burst();
+
+       wc_printf("<ul>");
+
+       serv_printf("AUTO %s", partial);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               while(serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       extract_token(name, buf, 0, '|', sizeof name);
+                       wc_printf("<li>");
+                       escputs(name);
+                       wc_printf("</li>");
+               }
+       }
+
+       wc_printf("</ul>");
+
+       wc_printf("\r\n\r\n");
+       wDumpContent(0);
+}
+
+
+void _recp_autocomplete(void) {recp_autocomplete(bstr("recp"));}
+void _cc_autocomplete(void)   {recp_autocomplete(bstr("cc"));} 
+void _bcc_autocomplete(void)  {recp_autocomplete(bstr("bcc"));}
+
+
+void 
+InitModule_AUTO_COMPLETE
+(void)
+{
+       WebcitAddUrlHandler(HKEY("recp_autocomplete"), "", 0, _recp_autocomplete, 0);
+       WebcitAddUrlHandler(HKEY("cc_autocomplete"),   "", 0, _cc_autocomplete, 0);
+       WebcitAddUrlHandler(HKEY("bcc_autocomplete"),  "", 0, _bcc_autocomplete, 0);
+}
diff --git a/webcit/availability.c b/webcit/availability.c
new file mode 100644 (file)
index 0000000..dcb6f14
--- /dev/null
@@ -0,0 +1,266 @@
+/*
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+
+#include "webcit.h"
+#include "webserver.h"
+#include "calendar.h"
+
+/*
+ * Utility function to fetch a VFREEBUSY type of thing for any specified user.
+ */
+icalcomponent *get_freebusy_for_user(char *who) {
+       long nLines;
+       char buf[SIZ];
+       StrBuf *serialized_fb = NewStrBuf();
+       icalcomponent *fb = NULL;
+
+       serv_printf("ICAL freebusy|%s", who);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               read_server_text(serialized_fb, &nLines);
+       }
+
+       if (serialized_fb == NULL) {
+               return NULL;
+       }
+       
+       fb = icalcomponent_new_from_string(ChrPtr(serialized_fb));
+       FreeStrBuf(&serialized_fb);
+       if (fb == NULL) {
+               return NULL;
+       }
+
+       return(fb);
+}
+
+
+/*
+ * Check to see if two events overlap.  
+ * (This function is used in both Citadel and WebCit.  If you change it in
+ * one place, change it in the other.  We should seriously consider moving
+ * this function upstream into libical.)
+ *
+ * Returns nonzero if they do overlap.
+ */
+int ical_ctdl_is_overlap(
+                       struct icaltimetype t1start,
+                       struct icaltimetype t1end,
+                       struct icaltimetype t2start,
+                       struct icaltimetype t2end
+) {
+
+       if (icaltime_is_null_time(t1start)) return(0);
+       if (icaltime_is_null_time(t2start)) return(0);
+
+       /* if either event lacks end time, assume end = start */
+       if (icaltime_is_null_time(t1end))
+               memcpy(&t1end, &t1start, sizeof(struct icaltimetype));
+       else {
+               if (t1end.is_date && icaltime_compare(t1start, t1end)) {
+                        /*
+                         * the end date is non-inclusive so adjust it by one
+                         * day because our test is inclusive, note that a day is
+                         * not too much because we are talking about all day
+                         * events
+                        * if start = end we assume that nevertheless the whole
+                        * day is meant
+                         */
+                       icaltime_adjust(&t1end, -1, 0, 0, 0);   
+               }
+       }
+
+       if (icaltime_is_null_time(t2end))
+               memcpy(&t2end, &t2start, sizeof(struct icaltimetype));
+       else {
+               if (t2end.is_date && icaltime_compare(t2start, t2end)) {
+                       icaltime_adjust(&t2end, -1, 0, 0, 0);   
+               }
+       }
+
+       /* First, check for all-day events */
+       if (t1start.is_date || t2start.is_date) {
+               /* If event 1 ends before event 2 starts, we're in the clear. */
+               if (icaltime_compare_date_only(t1end, t2start) < 0) return(0);
+
+               /* If event 2 ends before event 1 starts, we're also ok. */
+               if (icaltime_compare_date_only(t2end, t1start) < 0) return(0);
+
+               return(1);
+       }
+
+       /* syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d \n",
+               t1start.hour, t1start.minute, t1end.hour, t1end.minute,
+               t2start.hour, t2start.minute, t2end.hour, t2end.minute);
+       */
+
+       /* Now check for overlaps using date *and* time. */
+
+       /* If event 1 ends before event 2 starts, we're in the clear. */
+       if (icaltime_compare(t1end, t2start) <= 0) return(0);
+       /* syslog(LOG_DEBUG, "first passed\n"); */
+
+       /* If event 2 ends before event 1 starts, we're also ok. */
+       if (icaltime_compare(t2end, t1start) <= 0) return(0);
+       /* syslog(LOG_DEBUG, "second passed\n"); */
+
+       /* Otherwise, they overlap. */
+       return(1);
+}
+
+
+
+/*
+ * Back end function for check_attendee_availability()
+ * This one checks an individual attendee against a supplied
+ * event start and end time.  All these fields have already been
+ * broken out.  
+ *
+ * attendee_string     name of the attendee
+ * event_start         start time of the event to check
+ * event_end           end time of the event to check
+ *
+ * The result is placed in 'annotation'.
+ */
+void check_individual_attendee(char *attendee_string,
+                               struct icaltimetype event_start,
+                               struct icaltimetype event_end,
+                               char *annotation) {
+
+       icalcomponent *fbc = NULL;
+       icalcomponent *fb = NULL;
+       icalproperty *thisfb = NULL;
+       struct icalperiodtype period;
+
+       /*
+        * Set to 'unknown' right from the beginning.  Unless we learn
+        * something else, that's what we'll go with.
+        */
+       strcpy(annotation, _("availability unknown"));
+
+       fbc = get_freebusy_for_user(attendee_string);
+       if (fbc == NULL) {
+               return;
+       }
+
+       /*
+        * Make sure we're looking at a VFREEBUSY by itself.  What we're probably
+        * looking at initially is a VFREEBUSY encapsulated in a VCALENDAR.
+        */
+       if (icalcomponent_isa(fbc) == ICAL_VCALENDAR_COMPONENT) {
+               fb = icalcomponent_get_first_component(fbc, ICAL_VFREEBUSY_COMPONENT);
+       }
+       else if (icalcomponent_isa(fbc) == ICAL_VFREEBUSY_COMPONENT) {
+               fb = fbc;
+       }
+
+       /* Iterate through all FREEBUSY's looking for conflicts. */
+       if (fb != NULL) {
+
+               strcpy(annotation, _("free"));
+
+               for (thisfb = icalcomponent_get_first_property(fb, ICAL_FREEBUSY_PROPERTY);
+                   thisfb != NULL;
+                   thisfb = icalcomponent_get_next_property(fb, ICAL_FREEBUSY_PROPERTY) ) {
+
+                       /** Do the check */
+                       period = icalproperty_get_freebusy(thisfb);
+                       if (ical_ctdl_is_overlap(period.start, period.end,
+                          event_start, event_end)) {
+                               strcpy(annotation, _("BUSY"));
+                       }
+
+               }
+       }
+
+       icalcomponent_free(fbc);
+}
+
+
+
+
+/*
+ * Check the availability of all attendees for an event (when possible)
+ * and annotate accordingly.
+ *
+ * vevent      the event which should be compared with attendees calendar
+ */
+void check_attendee_availability(icalcomponent *vevent) {
+       icalproperty *attendee = NULL;
+       icalproperty *dtstart_p = NULL;
+       icalproperty *dtend_p = NULL;
+       struct icaltimetype dtstart_t;
+       struct icaltimetype dtend_t;
+       char attendee_string[SIZ];
+       char annotated_attendee_string[SIZ];
+       char annotation[SIZ];
+       const char *ch;
+
+       if (vevent == NULL) {
+               return;
+       }
+
+       /*
+        * If we're looking at a fully encapsulated VCALENDAR
+        * rather than a VEVENT component, attempt to use the first
+        * relevant VEVENT subcomponent.  If there is none, the
+        * NULL returned by icalcomponent_get_first_component() will
+        * tell the next iteration of this function to create a
+        * new one.
+        */
+       if (icalcomponent_isa(vevent) == ICAL_VCALENDAR_COMPONENT) {
+               check_attendee_availability(
+                       icalcomponent_get_first_component(
+                               vevent, ICAL_VEVENT_COMPONENT
+                       )
+               );
+               return;
+       }
+
+       ical_dezonify(vevent);          /**< Convert everything to UTC */
+
+       /*
+        * Learn the start and end times.
+        */
+       dtstart_p = icalcomponent_get_first_property(vevent, ICAL_DTSTART_PROPERTY);
+       if (dtstart_p != NULL) dtstart_t = icalproperty_get_dtstart(dtstart_p);
+
+       dtend_p = icalcomponent_get_first_property(vevent, ICAL_DTEND_PROPERTY);
+       if (dtend_p != NULL) dtend_t = icalproperty_get_dtend(dtend_p);
+
+       /*
+        * Iterate through attendees.
+        */
+       for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDEE_PROPERTY);
+           attendee != NULL;
+           attendee = icalcomponent_get_next_property(vevent, ICAL_ATTENDEE_PROPERTY)) {
+               ch = icalproperty_get_attendee(attendee);
+               if ((ch != NULL) && !strncasecmp(ch, "MAILTO:", 7)) {
+
+                       /** screen name or email address */
+                       safestrncpy(attendee_string, ch + 7, sizeof(attendee_string));
+                       string_trim(attendee_string);
+
+                       check_individual_attendee(attendee_string,
+                                               dtstart_t, dtend_t,
+                                               annotation);
+
+                       /** Replace the attendee name with an annotated one. */
+                       snprintf(annotated_attendee_string, sizeof annotated_attendee_string,
+                               "MAILTO:%s (%s)", attendee_string, annotation);
+                       icalproperty_set_attendee(attendee, annotated_attendee_string);
+
+               }
+       }
+
+}
+
diff --git a/webcit/bbsview_renderer.c b/webcit/bbsview_renderer.c
new file mode 100644 (file)
index 0000000..67f42b1
--- /dev/null
@@ -0,0 +1,423 @@
+/* 
+ * BBS View renderer module for WebCit
+ *
+ * Note: we briefly had a dynamic UI for this.  I thought it was cool, but
+ * it was not received well by the user community.  If you want to play
+ * with it, go get commit dcf99fe61379b78436c387ea3f89ebfd4ffaf635 of
+ * bbsview_renderer.c and have fun.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#define RANGE 5
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+/*
+ * Data which gets passed around between the various functions in this module
+ *
+ */
+struct bbsview {
+       long *msgs;             /* Array of msgnums for messages we are displaying */
+       int num_msgs;           /* Number of msgnums stored in 'msgs' */
+       long lastseen;          /* The number of the last seen message in this room */
+       int alloc_msgs;         /* Currently allocated size of array */
+       int requested_page;     /* Which page number did the user request? */
+       int num_pages;          /* Total number of pages in this room */
+       long start_reading_at;  /* Start reading at the page containing this message */
+};
+
+
+/*
+ * Attempt to determine the closest thing to the "last seen message number" using the
+ * results of the GTSN command
+ */
+long bbsview_get_last_seen(void)
+{
+       char buf[SIZ] = "0";
+
+       serv_puts("GTSN");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               char *colon_pos;
+               char *comma_pos;
+
+               comma_pos = strchr(buf, ',');   /* kill first comma and everything to its right */
+               if (comma_pos) {
+                       *comma_pos = 0;
+               }
+
+               colon_pos = strchr(buf, ':');   /* kill first colon and everything to its left */
+               if (colon_pos) {
+                       strcpy(buf, ++colon_pos);
+               }
+       }
+
+       return(atol(buf));
+}
+
+
+
+/*
+ * Entry point for message read operations.
+ */
+int bbsview_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                                  void **ViewSpecific, 
+                                  long oper, 
+                                  char *cmd, 
+                                  long len,
+                                  char *filter,
+                                  long flen)
+{
+       struct bbsview *BBS = malloc(sizeof(struct bbsview));
+       memset(BBS, 0, sizeof(struct bbsview));
+       *ViewSpecific = BBS;
+
+       Stat->startmsg = (-1);                                  /* not used here */
+       Stat->sortit = 1;                                       /* not used here */
+       Stat->num_displayed = DEFAULT_MAXMSGS;                  /* not used here */
+       BBS->requested_page = 0;
+       BBS->lastseen = bbsview_get_last_seen();
+       BBS->start_reading_at = 0;
+
+       /* By default, the requested page is the first one. */
+       if (havebstr("start_reading_at")) {
+               BBS->start_reading_at = lbstr("start_reading_at");
+               BBS->requested_page = (-4);
+       }
+
+       /* However, if we are asked to start with a specific message number, make sure
+        * we start on the page containing that message
+        */
+
+       /* Or, if a specific page was requested, make sure we go there */
+       else if (havebstr("page")) {
+               BBS->requested_page = ibstr("page");
+       }
+
+       /* Otherwise, if this is a "read new" operation, make sure we start on the page
+        * containing the first new message
+        */
+       else if (oper == 3) {
+               BBS->requested_page = (-3);
+       }
+
+       if (havebstr("maxmsgs")) {
+               Stat->maxmsgs = ibstr("maxmsgs");
+       }
+       if (Stat->maxmsgs == 0) Stat->maxmsgs = DEFAULT_MAXMSGS;
+       
+       /* perform a "read all" call to fetch the message list -- we'll cut it down later */
+       rlid[2].cmd(cmd, len);
+       
+       return 200;
+}
+
+
+/*
+ * This function is called for every message in the list.
+ */
+int bbsview_LoadMsgFromServer(SharedMessageStatus *Stat, 
+                             void **ViewSpecific, 
+                             message_summary* Msg, 
+                             int is_new, 
+                             int i)
+{
+       struct bbsview *BBS = (struct bbsview *) *ViewSpecific;
+
+       if (BBS->alloc_msgs == 0) {
+               BBS->alloc_msgs = 1000;
+               BBS->msgs = malloc(BBS->alloc_msgs * sizeof(long));
+               memset(BBS->msgs, 0, (BBS->alloc_msgs * sizeof(long)) );
+       }
+
+       /* Check our buffer size */
+       if (BBS->num_msgs >= BBS->alloc_msgs) {
+               BBS->alloc_msgs *= 2;
+               BBS->msgs = realloc(BBS->msgs, (BBS->alloc_msgs * sizeof(long)));
+               memset(&BBS->msgs[BBS->num_msgs], 0, ((BBS->alloc_msgs - BBS->num_msgs) * sizeof(long)) );
+       }
+
+       BBS->msgs[BBS->num_msgs++] = Msg->msgnum;
+
+       return 200;
+}
+
+
+int bbsview_sortfunc(const void *s1, const void *s2) {
+       long l1;
+       long l2;
+
+       l1 = *(long *)(s1);
+       l2 = *(long *)(s2);
+
+       if (l1 > l2) return(+1);
+       if (l1 < l2) return(-1);
+       return(0);
+}
+
+
+int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, 
+                              void **ViewSpecific, 
+                              long oper)
+{
+       struct bbsview *BBS = (struct bbsview *) *ViewSpecific;
+       int i;
+       int seq;
+       const StrBuf *Mime;
+       int start_index = 0;
+       int end_index = 0;
+       int go_to_the_very_end = 0;
+
+       if (Stat->nummsgs > 0) {
+               syslog(LOG_DEBUG, "sorting %d messages\n", BBS->num_msgs);
+               qsort(BBS->msgs, (size_t)(BBS->num_msgs), sizeof(long), bbsview_sortfunc);
+       }
+
+       if ((BBS->num_msgs % Stat->maxmsgs) == 0) {
+               BBS->num_pages = BBS->num_msgs / Stat->maxmsgs;
+       }
+       else {
+               BBS->num_pages = (BBS->num_msgs / Stat->maxmsgs) + 1;
+       }
+
+       /* If the requested page number is -4,
+        * it means "whichever page on which msg#xxxxx starts"
+        * Change to the page number which contains that message.
+        */
+       if (BBS->requested_page == (-4)) {
+               if (BBS->num_msgs == 0) {
+                       BBS->requested_page = 0;
+               }
+               else {
+                       for (i=0; i<BBS->num_msgs; ++i) {
+                               if (
+                                       (BBS->msgs[i] >= BBS->start_reading_at)
+                                       && (BBS->requested_page == (-4))
+                               ) {
+                                       BBS->requested_page = (i / Stat->maxmsgs) ;
+                               }
+                       }
+               }
+       }
+
+       /* If the requested page number is -3,
+        * it means "whichever page on which new messages start"
+        * Change that to an actual page number now.
+        */
+       if (BBS->requested_page == (-3)) {
+               if (BBS->num_msgs == 0) {
+                       /*
+                        * The room is empty; just start at the top and leave it there.
+                        */
+                       BBS->requested_page = 0;
+               }
+               else if (
+                       (BBS->num_msgs > 0) 
+                       && (BBS->lastseen <= BBS->msgs[0])
+               ) {
+                       /*
+                        * All messages are new; this is probably the user's first visit to the room,
+                        * so start at the last page instead of showing ancient history.
+                        */
+                       BBS->requested_page = BBS->num_pages - 1;
+                       go_to_the_very_end = 1;
+               }
+               else {
+                       /*
+                        * Some messages are old and some are new.  Go to the start of new messages.
+                        */
+                       for (i=0; i<BBS->num_msgs; ++i) {
+                               if (
+                                       (BBS->msgs[i] > BBS->lastseen)
+                                       && ( (i == 0) || (BBS->msgs[i-1] <= BBS->lastseen) )
+                               ) {
+                                       BBS->requested_page = (i / Stat->maxmsgs) ;
+                               }
+                       }
+               }
+       }
+
+       /* Still set to -3 ?  If so, that probably means that there are no new messages,
+        * so we'll go to the *end* of the final page.
+        */
+       if (BBS->requested_page == (-3)) {
+               if (BBS->num_msgs == 0) {
+                       BBS->requested_page = 0;
+               }
+               else {
+                       BBS->requested_page = BBS->num_pages - 1;
+               }
+       }
+
+       /* keep the requested page within bounds */
+       if (BBS->requested_page < 0) BBS->requested_page = 0;
+       if (BBS->requested_page >= BBS->num_pages) BBS->requested_page = BBS->num_pages - 1;
+
+       start_index = BBS->requested_page * Stat->maxmsgs;
+       if (start_index < 0) start_index = 0;
+       end_index = start_index + Stat->maxmsgs - 1;
+
+       for (seq = 0; seq < 3; ++seq) {         /* cheap & sleazy way of rendering the page numbers twice */
+
+               if ( (seq == 1) && (Stat->nummsgs > 0)) {
+                       /* display the selected range of messages */
+
+                       for (i=start_index; (i<=end_index && i<BBS->num_msgs); ++i) {
+                               if (
+                                       (BBS->msgs[i] > BBS->lastseen)
+                                       && ( (i == 0) || (BBS->msgs[i-1] <= BBS->lastseen) )
+                               ) {
+                                       /* new messages start here */
+                                       do_template("start_of_new_msgs");
+                                       if (!go_to_the_very_end) {
+                                               StrBufAppendPrintf(WC->trailing_javascript, "location.href=\"#newmsgs\";\n");
+                                       }
+                               }
+                               if (BBS->msgs[i] > 0L) {
+                                       read_message(WC->WBuf, HKEY("view_message"), BBS->msgs[i], NULL, &Mime, NULL);
+                               }
+                               if (
+                                       (i == (BBS->num_msgs - 1))
+                                       && (BBS->msgs[i] <= BBS->lastseen)
+                               ) {
+                                       /* no new messages */
+                                       do_template("no_new_msgs");
+                                       if (!go_to_the_very_end) {
+                                               StrBufAppendPrintf(WC->trailing_javascript, "location.href=\"#nonewmsgs\";\n");
+                                       }
+                               }
+                       }
+               }
+
+               else if ( (seq == 0) || (seq == 2) ) {
+                       int first;
+                       int last;
+                       /* Display the selecto-bar with the page numbers */
+
+                       wc_printf("<div class=\"moreprompt\">");
+                       if (seq == 2) {
+                               wc_printf("<a name=\"end_of_msgs\">");
+                       }
+                       wc_printf(_("Go to page: "));
+                       if (seq == 2) {
+                               wc_printf("</a>");
+                       }
+
+                       first = 0;
+                       last = BBS->num_pages - 1;
+
+                       for (i=0; i<=last; ++i) {
+
+                               if (
+                                       (i == first)
+                                       || (i == last)
+                                       || (i == BBS->requested_page)
+                                       || (
+                                               ((BBS->requested_page - i) < RANGE)
+                                               && ((BBS->requested_page - i) > (0 - RANGE))
+                                       )
+                               ) {
+
+                                       if (
+                                               (i == last) 
+                                               && (last - BBS->requested_page > RANGE)
+                                       ) {
+                                               wc_printf("...&nbsp;");
+                                       }
+                                       if (i == BBS->requested_page) {
+                                               wc_printf("[");
+                                       }
+                                       else {
+                                               wc_printf("<a href=\"readfwd?go=");
+                                               urlescputs(ChrPtr(WC->CurRoom.name));
+                                               wc_printf("?start_reading_at=%ld\">",
+                                                       BBS->msgs[i*Stat->maxmsgs]
+                                               );
+                                               /* wc_printf("?page=%d\">", i); */
+                                               wc_printf("<span class=\"moreprompt_link\">");
+                                       }
+                                       if (
+                                               (i == first)
+                                               && (BBS->requested_page > (RANGE + 1))
+                                       ) {
+                                               wc_printf(_("First"));
+                                       }
+                                       else if (
+                                               (i == last)
+                                               && (last - BBS->requested_page > RANGE)
+                                       ) {
+                                               wc_printf(_("Last"));
+                                       }
+                                       else {
+                                               wc_printf("%d", i + 1); /* change to one-based for display */
+                                       }
+                                       if (i == BBS->requested_page) {
+                                               wc_printf("]");
+                                       }
+                                       else {
+                                               wc_printf("</span>");
+                                               wc_printf("</a>");
+                                       }
+                                       if (
+                                               (i == first)
+                                               && (BBS->requested_page > (RANGE + 1))
+                                       ) {
+                                               wc_printf("&nbsp;...");
+                                       }
+                                       if (i != last) {
+                                               wc_printf("&nbsp;");
+                                       }
+                               }
+                       }
+                       wc_printf("</div>\n");
+               }
+       }
+
+       if (go_to_the_very_end) {
+               StrBufAppendPrintf(WC->trailing_javascript, "location.href=\"#end_of_msgs\";\n");
+       }
+       return(0);
+}
+
+
+int bbsview_Cleanup(void **ViewSpecific)
+{
+       struct bbsview *BBS = (struct bbsview *) *ViewSpecific;
+
+       if (BBS->alloc_msgs != 0) {
+               free(BBS->msgs);
+       }
+       free(BBS);
+
+       wDumpContent(1);
+       return 0;
+}
+
+
+void 
+InitModule_BBSVIEWRENDERERS
+(void)
+{
+       RegisterReadLoopHandlerset(
+               VIEW_BBS,
+               bbsview_GetParamsGetServerCall,
+               NULL,
+               NULL,
+               NULL, 
+               bbsview_LoadMsgFromServer,
+               bbsview_RenderView_or_Tail,
+               bbsview_Cleanup,
+               NULL
+       );
+}
diff --git a/webcit/blogview_renderer.c b/webcit/blogview_renderer.c
new file mode 100644 (file)
index 0000000..5cec696
--- /dev/null
@@ -0,0 +1,499 @@
+/* 
+ * Blog view renderer module for WebCit
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+CtxType CTX_BLOGPOST = CTX_NONE;
+
+typedef struct __BLOG {
+       HashList *BLOGPOSTS;
+       long p;
+       int gotonext;
+       long firstp;
+       long maxp;
+       StrBuf *Charset;
+       StrBuf *Buf;
+       const StrBuf *FilterTag;
+} BLOG;
+
+/* 
+ * Array type for a blog post.  The first message is the post; the rest are comments
+ */
+typedef struct _blogpost {
+       int top_level_id;
+       long *msgs;             /* Array of msgnums for messages we are displaying */
+       int num_msgs;           /* Number of msgnums stored in 'msgs' */
+       int alloc_msgs;         /* Currently allocated size of array */
+       int unread_oments;
+}blogpost;
+
+
+/*
+ * XML sitemap generator -- go through the message list for a Blog room
+ */
+void sitemap_do_blog(void) {
+       wcsession *WCC = WC;
+       blogpost oneBP;
+       int num_msgs = 0;
+       int i;
+       SharedMessageStatus Stat;
+       message_summary *Msg = NULL;
+       StrBuf *Buf = NewStrBuf();
+       StrBuf *FoundCharset = NewStrBuf();
+       WCTemplputParams SubTP;
+
+       memset(&Stat, 0, sizeof Stat);
+       memset(&oneBP, 0, sizeof(blogpost));
+        memset(&SubTP, 0, sizeof(WCTemplputParams));    
+       StackContext(NULL, &SubTP, &oneBP, CTX_BLOGPOST, 0, NULL);
+
+       Stat.maxload = INT_MAX;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0);
+       if (num_msgs < 1) return;
+
+       for (i=0; i<num_msgs; ++i) {
+               Msg = GetMessagePtrAt(i, WCC->summ);
+               if (Msg != NULL) {
+                       ReadOneMessageSummary(Msg, FoundCharset, Buf);
+                       /* Show only top level posts, not comments */
+                       if ((Msg->reply_inreplyto_hash != 0) && (Msg->reply_references_hash == 0)) {
+                               oneBP.top_level_id = Msg->reply_inreplyto_hash;
+                               DoTemplate(HKEY("view_blog_sitemap"), WCC->WBuf, &SubTP);
+                       }
+               }
+       }
+       UnStackContext(&SubTP);
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&FoundCharset);
+}
+
+
+
+/*
+ * Generate a permalink for a post
+ * (Call with NULL arguments to make this function wcprintf() the permalink
+ * instead of writing it to the template)
+ */
+void tmplput_blog_toplevel_id(StrBuf *Target, WCTemplputParams *TP) {
+       blogpost *bp = (blogpost*) CTX(CTX_BLOGPOST);
+       char buf[SIZ];
+       snprintf(buf, SIZ, "%d", bp->top_level_id);
+       StrBufAppendTemplateStr(Target, TP, buf, 0);
+}
+
+void tmplput_blog_comment_count(StrBuf *Target, WCTemplputParams *TP) {
+       blogpost *bp = (blogpost*) CTX(CTX_BLOGPOST);
+       char buf[SIZ];
+       snprintf(buf, SIZ, "%d", bp->num_msgs -1);
+       StrBufAppendTemplateStr(Target, TP, buf, 0);
+}
+void tmplput_blog_comment_unread_count(StrBuf *Target, WCTemplputParams *TP) {
+       blogpost *bp = (blogpost*) CTX(CTX_BLOGPOST);
+       char buf[SIZ];
+       snprintf(buf, SIZ, "%d", bp->unread_oments);
+       StrBufAppendTemplateStr(Target, TP, buf, 0);
+}
+
+
+
+/*
+ * Render a single blog post and (optionally) its comments
+ */
+void blogpost_render(blogpost *bp, int with_comments, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       WCTemplputParams SubTP;
+       const StrBuf *Mime;
+       int i;
+
+        memset(&SubTP, 0, sizeof(WCTemplputParams));
+       StackContext(TP, &SubTP, bp, CTX_BLOGPOST, 0, NULL);
+
+       /* Always show the top level post, unless we somehow ended up with an empty list */
+       if (bp->num_msgs > 0) {
+               read_message(WC->WBuf, HKEY("view_blog_post"), bp->msgs[0], NULL, &Mime, TP);
+       }
+
+       if (with_comments) {
+               /* Show any existing comments, then offer the comment box */
+               DoTemplate(HKEY("view_blog_show_commentlink"), WCC->WBuf, &SubTP);
+
+               for (i=1; i<bp->num_msgs; ++i) {
+                       read_message(WC->WBuf, HKEY("view_blog_comment"), bp->msgs[i], NULL, &Mime, &SubTP);
+               }
+               DoTemplate(HKEY("view_blog_comment_box"), WCC->WBuf, &SubTP);
+       }
+
+       else {
+               /* Show only the number of comments */
+               DoTemplate(HKEY("view_blog_show_no_comments"), WCC->WBuf, &SubTP);
+       }
+       UnStackContext(&SubTP);
+}
+
+
+/*
+ * Destructor for "blogpost"
+ */
+void blogpost_destroy(blogpost *bp) {
+       if (bp->alloc_msgs > 0) {
+               free(bp->msgs);
+       }
+       free(bp);
+}
+
+
+/*
+ * Entry point for message read operations.
+ */
+int blogview_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                                   void **ViewSpecific, 
+                                   long oper, 
+                                   char *cmd, 
+                                   long len,
+                                   char *filter,
+                                   long flen)
+{
+       BLOG *BL = (BLOG*) malloc(sizeof(BLOG)); 
+       BL->BLOGPOSTS = NewHash(1, lFlathash);
+       
+       /* are we looking for a specific post? */
+       BL->p = lbstr("p");
+       BL->gotonext = havebstr("gotonext");
+       BL->Charset = NewStrBuf();
+       BL->Buf = NewStrBuf();
+       BL->FilterTag = sbstr("FilterTag");
+       BL->firstp = lbstr("firstp");   /* start reading at... */
+       BL->maxp   = lbstr("maxp");         /* max posts to show... */
+       if (BL->maxp < 1) BL->maxp = 5;     /* default; move somewhere else? */
+       putlbstr("maxp", BL->maxp);
+       *ViewSpecific = BL;
+
+       Stat->startmsg = (-1);                                  /* not used here */
+       Stat->sortit = 1;                                       /* not used here */
+       Stat->num_displayed = DEFAULT_MAXMSGS;                  /* not used here */
+       if (Stat->maxmsgs == 0) Stat->maxmsgs = DEFAULT_MAXMSGS;
+       
+       /* perform a "read all" call to fetch the message list -- we'll cut it down later */
+       snprintf(cmd, len, "MSGS ALL||2|8\n");
+
+       if (BL->gotonext)
+               Stat->load_seen = 1;
+       return 200;
+}
+
+
+int blogview_IdentifyBlogposts (StrBuf *Line, 
+                               const char **pos, 
+                               message_summary *Msg, 
+                               StrBuf *ConversionBuffer,
+                               void **ViewSpecific)
+{
+       BLOG *BL = (BLOG*) *ViewSpecific;
+       blogpost *bp = NULL;
+
+       /* Stop processing if the viewer is only interested in a single post and
+        * that message ID is neither the id nor the refs.
+        */
+       if ((BL->p != 0) &&
+           (BL->p != Msg->reply_inreplyto_hash) &&
+           (BL->p != Msg->reply_references_hash)) {
+               return 0;
+       }
+
+       if ((Msg->reply_references_hash == 0) && 
+           (BL->FilterTag != NULL) && 
+           (strstr(ChrPtr(Msg->EnvTo) , ChrPtr(BL->FilterTag)) == NULL)) {
+               /* filtering for tags, blogpost doesn't fit. */
+               return 0;
+       }
+           
+       /*
+        * build up a hashtable of the blogposts.
+        */
+       if (Msg->reply_references_hash == 0) {
+               bp = malloc(sizeof(blogpost));
+
+               if (bp == NULL) return 0;
+
+               memset(bp, 0, sizeof (blogpost));
+
+               bp->top_level_id = Msg->reply_inreplyto_hash;
+               bp->alloc_msgs = 1000;
+               bp->msgs = malloc(bp->alloc_msgs * sizeof(long));
+               memset(bp->msgs, 0, (bp->alloc_msgs * sizeof(long)) );
+
+               /* the first one is the blogpost itself, all subequent are comments. */
+               bp->msgs[0] = Msg->msgnum;
+               bp->num_msgs = 1;
+
+               Put(BL->BLOGPOSTS,
+                   LKEY(Msg->reply_inreplyto_hash),
+                   bp,
+                   (DeleteHashDataFunc)blogpost_destroy);
+       }
+       /*
+        * Comments will be handled on the next iteration.
+        */
+
+       return 1;
+}
+
+
+/*
+ * This function is called for every message in the list.
+ */
+int blogview_LoadMsgFromServer(SharedMessageStatus *Stat, 
+                             void **ViewSpecific, 
+                             message_summary* Msg, 
+                             int is_new, 
+                             int i)
+{
+       blogpost *bp = NULL;
+       BLOG *BL = (BLOG*) *ViewSpecific;
+
+       if (Msg->reply_references_hash != 0) {
+               /* 
+                * this is a comment. try to assign it to a blogpost.
+                */
+               GetHash(BL->BLOGPOSTS,
+                       LKEY(Msg->reply_references_hash),
+                       (void *)&bp);
+
+               /*
+                * Now we have a 'blogpost' to which we can add the comment.  It's either the
+                * blog post itself or a comment attached to it; either way, the code is the same from
+                * this point onward.
+                */
+               if (bp != NULL) {
+                       if (bp->num_msgs >= bp->alloc_msgs) {
+                               bp->alloc_msgs *= 2;
+                               bp->msgs = realloc(bp->msgs, (bp->alloc_msgs * sizeof(long)));
+                               memset(&bp->msgs[bp->num_msgs], 0,
+                                      ((bp->alloc_msgs - bp->num_msgs) * sizeof(long)) );
+                       }
+                       bp->msgs[bp->num_msgs++] = Msg->msgnum;
+                       if ((Msg->Flags & MSGFLAG_READ) != 0) {
+                               bp->unread_oments++;
+                       }
+               }
+               else {
+                       /*
+                        * Ok, this comment probably belongs to one of the blogposts
+                        * we ruled out by filters. don't load it.
+                        */
+                       return 200;
+               }
+       }
+       return 200;
+}
+
+
+/*
+ * Sort a list of 'struct blogpost' pointers by newest-to-oldest msgnum.
+ * With big thanks to whoever wrote http://www.c.happycodings.com/Sorting_Searching/code14.html
+ */
+static int blogview_sortfunc(const void *a, const void *b) { 
+       blogpost const *one = GetSearchPayload(a);
+       blogpost const *two = GetSearchPayload(b);
+
+       if ( one->msgs[0] > two->msgs[0] ) return(-1);
+       if ( one->msgs[0] < two->msgs[0] ) return(+1);
+       return(0);
+}
+
+
+/*
+ * All blogpost entries are now in the hash list.
+ * Sort them, select the desired range, and render what we want to see.
+ */
+int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
+{
+       wcsession *WCC = WC;
+       BLOG *BL = (BLOG*) *ViewSpecific;
+       HashPos *it;
+       const char *Key;
+       blogpost *thisBlogpost;
+       void *Data;
+       long len;
+       int num_blogposts = 0;
+       int with_comments = 0;
+       WCTemplputParams SubTP;
+       WCTemplputParams StopSubTP;
+       blogpost oneBP;
+       long firstPOffset = 0;
+       int count = 0;
+       int totalCount = 0;
+       StrBuf *PrevNext = NULL;
+
+       num_blogposts = GetCount(BL->BLOGPOSTS);
+       if (num_blogposts == 0) {
+               /* Nothing to do... */
+               return 0;
+       }
+        memset(&SubTP, 0, sizeof(WCTemplputParams));    
+        memset(&StopSubTP, 0, sizeof(WCTemplputParams));    
+       memset(&oneBP, 0, sizeof(blogpost));
+
+       /* Comments are shown if we are only viewing a single blog post */
+       with_comments = (BL->p != 0);
+
+       it = GetNewHashPos(BL->BLOGPOSTS, 0);
+
+       if ((BL->gotonext) && (BL->p == 0)) {
+               /* did we come here via gotonext? lets find out whether
+                * this blog has just one blogpost with new comments just display 
+                * this one.
+                */
+               blogpost *unread_bp = NULL;
+               int unread_count = 0;
+               while (GetNextHashPos(BL->BLOGPOSTS, it, &len, &Key, &Data)) {
+                       blogpost *one_bp = (blogpost *) Data;
+                       if (one_bp->unread_oments > 0) {
+                               unread_bp = one_bp;
+                               unread_count++;
+                       }
+               }
+               if (unread_count == 1) {
+                       blogpost_render(unread_bp, 1, NULL);/// TODO other than null?
+
+                       DeleteHashPos(&it);
+                       return 0;
+               }
+       }
+
+       /* Now we have our array.  It is ONLY an array of pointers.  The objects to
+        * which they point are still owned by the hash list.
+        */
+
+       /* get it into the right sort of order - blogposts may have been edited */
+       SortByPayload(BL->BLOGPOSTS, blogview_sortfunc);
+
+       /* Find the start post to display: */
+       if (BL->firstp != 0) {
+               /* Translate the firstpost id into an offset */
+               RewindHashPos(BL->BLOGPOSTS, it, 0);
+               while (GetNextHashPos(BL->BLOGPOSTS, it, &len, &Key, &Data)) {
+                       thisBlogpost = (blogpost *) Data;
+                       if (thisBlogpost->top_level_id == BL->firstp) {
+                               firstPOffset = count;
+                               break;
+                       }
+                       count ++;
+               }
+       }
+
+       if ((num_blogposts > BL->maxp) || (firstPOffset != 0)){
+               PrevNext = NewStrBuf();
+               if (firstPOffset  > 0) {
+                       const char *k;
+                       long len;
+                       long posPrev = 0;
+                       /* we now need to go up to maxp items back */
+                       if (firstPOffset > BL->maxp) {
+                               posPrev = firstPOffset - BL->maxp;
+                       }
+                       GetHashAt(BL->BLOGPOSTS, posPrev, &len, &k, &Data);
+                       thisBlogpost = (blogpost *) Data;
+                       StackContext(NULL, &SubTP, thisBlogpost, CTX_BLOGPOST, 0, NULL);
+                       DoTemplate(HKEY("view_blog_newer_posts"), PrevNext, &SubTP);
+               }
+               if (firstPOffset + BL->maxp <= num_blogposts) {
+                       const char *k;
+                       long len;
+                       long posNext = firstPOffset + BL->maxp;
+                       GetHashAt(BL->BLOGPOSTS, posNext, &len, &k, &Data);
+                       thisBlogpost = (blogpost *) Data;
+                       StackContext(NULL, &SubTP, thisBlogpost, CTX_BLOGPOST, 0, NULL);
+                       DoTemplate(HKEY("view_blog_older_posts"), PrevNext, &SubTP);
+               }
+       }
+
+       StrBufAppendBuf(WCC->WBuf, PrevNext, 0);
+       count = totalCount = 0;
+       RewindHashPos(BL->BLOGPOSTS, it, 0);
+
+       /* FIXME -- allow the user (or a default setting) to select a maximum number of posts to display */
+       while (GetNextHashPos(BL->BLOGPOSTS, it, &len, &Key, &Data)) {
+               thisBlogpost = (blogpost *) Data;
+
+               /* allow the user to select a starting point in the list */
+               if (totalCount < firstPOffset) {
+                       /* skip all till we found the first valid: */
+                       totalCount ++;
+                       continue;
+               }
+               if (count >= BL->maxp) {
+                       /* enough is enough. */
+                       break;
+               }
+               StackContext(NULL, &SubTP, thisBlogpost, CTX_BLOGPOST, 0, NULL);
+               blogpost_render(thisBlogpost, with_comments, &SubTP);
+               UnStackContext(&SubTP);
+               count ++;
+               totalCount ++;
+       }
+       StrBufAppendBuf(WCC->WBuf, PrevNext, 0);
+       FreeStrBuf(&PrevNext);
+       DeleteHashPos(&it);
+
+       return(0);
+}
+
+
+int blogview_Cleanup(void **ViewSpecific)
+{
+       BLOG *BL = (BLOG*) *ViewSpecific;
+
+       FreeStrBuf(&BL->Buf);
+       FreeStrBuf(&BL->Charset);
+       DeleteHash(&BL->BLOGPOSTS);
+       free(BL);
+       wDumpContent(1);
+       return 0;
+}
+
+
+void 
+InitModule_BLOGVIEWRENDERERS
+(void)
+{
+       const char* browseListFields[] = {
+               "msgn",
+               "nvto",
+               "wefw",
+               NULL
+       };
+       RegisterCTX(CTX_BLOGPOST);
+
+       RegisterReadLoopHandlerset(
+               VIEW_BLOG,
+               blogview_GetParamsGetServerCall,
+               NULL,
+               NULL,
+               blogview_IdentifyBlogposts, 
+               blogview_LoadMsgFromServer,
+               blogview_render,
+               blogview_Cleanup,
+               browseListFields
+       );
+
+       RegisterNamespace("BLOG:TOPLEVEL:MSGID", 0, 0, tmplput_blog_toplevel_id, NULL, CTX_BLOGPOST);
+       RegisterNamespace("BLOG:COMMENTS:COUNT", 0, 0, tmplput_blog_comment_count, NULL, CTX_BLOGPOST);
+       RegisterNamespace("BLOG:COMMENTS:UNREAD:COUNT", 0, 0, tmplput_blog_comment_unread_count, NULL, CTX_BLOGPOST);
+}
diff --git a/webcit/bootstrap b/webcit/bootstrap
new file mode 100755 (executable)
index 0000000..43c30e3
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# run me after checking WebCit out of svn.
+#
+
+# Remove any vestiges of pre-6.05 build environments
+rm -f .libs modules *.so *.lo *.la 2>/dev/null
+
+echo ... running aclocal ...
+aclocal
+    
+echo ... running autoconf ...
+autoconf
+
+# If your autoconf version changes, the autom4te.cache stuff will mess you up.
+# Get rid of it.
+echo ... removing autoheader cache files ...
+rm -rf autom4te*.cache
+    
+echo ... running autoheader ...
+autoheader
+    
+echo ... mk_module_init.sh ...
+./scripts/mk_module_init.sh
+
+
+echo
+echo This script has been tested with autoconf 2.53 and
+echo automake 1.5. Other versions may work, but I recommend the latest
+echo compatible versions of these.
+echo
+echo Also note that autoconf and automake should be configured
+echo with the same prefix.
+echo
+
+grep '^#define CLIENT_VERSION' webcit.h | sed 's/[^0-9]*//g' >package-version.txt
diff --git a/webcit/calendar.c b/webcit/calendar.c
new file mode 100644 (file)
index 0000000..f0f34ef
--- /dev/null
@@ -0,0 +1,890 @@
+// Functions which handle calendar objects and their processing/display.
+//
+// Copyright (c) 1996-2022 by the citadel.org team
+//
+// This program is open source software.  You can redistribute it and/or
+// modify it under the terms of the GNU General Public License, version 3.
+//
+// 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.
+
+#include "webcit.h"
+#include "webserver.h"
+#include "calendar.h"
+
+// Process a calendar object.  At this point it's already been deserialized by cal_process_attachment()
+//
+// cal:                        the calendar object
+// recursion_level:    Number of times we've recursed into this function
+// msgnum:             Message number on the Citadel server
+// cal_partnum:                MIME part number within that message containing the calendar object
+void cal_process_object(StrBuf *Target,
+                       icalcomponent *cal,
+                       int recursion_level,
+                       long msgnum,
+                       const char *cal_partnum) 
+{
+       icalcomponent *c;
+       icalproperty *method = NULL;
+       icalproperty_method the_method = ICAL_METHOD_NONE;
+       icalproperty *p;
+       struct icaltimetype t;
+       time_t tt;
+       char buf[256];
+       char conflict_name[256];
+       char conflict_message[256];
+       int is_update = 0;
+       char divname[32];
+       static int divcount = 0;
+       const char *ch;
+
+       sprintf(divname, "rsvp%04x", ++divcount);
+
+       // Convert timezones to something easy to display.
+       // It's safe to do this in memory because we're only changing it on the
+       // display side -- when we tell the server to do something with the object,
+       // the server will be working with its original copy in the database.
+       if ((cal) && (recursion_level == 0)) {
+               ical_dezonify(cal);
+       }
+
+       // Leading HTML for the display of this object
+       if (recursion_level == 0) {
+               StrBufAppendPrintf(Target, "<div class=\"mimepart\">\n");
+       }
+
+       // Look for a method
+       method = icalcomponent_get_first_property(cal, ICAL_METHOD_PROPERTY);
+
+       // See what we need to do with this
+       if (method != NULL) {
+               char *title;
+               the_method = icalproperty_get_method(method);
+
+               StrBufAppendPrintf(Target, "<div id=\"%s_title\">", divname);
+               StrBufAppendPrintf(Target, "<img src=\"static/webcit_icons/essen/32x32/calendar.png\">");
+               StrBufAppendPrintf(Target, "<span>");
+               switch(the_method) {
+               case ICAL_METHOD_REQUEST:
+                       title = _("Meeting invitation");
+                       break;
+               case ICAL_METHOD_REPLY:
+                       title = _("Attendee's reply to your invitation");
+                       break;
+               case ICAL_METHOD_PUBLISH:
+                       title = _("Published event");
+                       break;
+               default:
+                       title = _("This is an unknown type of calendar item.");
+                       break;
+               }
+               StrBufAppendPrintf(Target, "</span>");
+
+               StrBufAppendPrintf(Target, "&nbsp;&nbsp;%s",title);
+               StrBufAppendPrintf(Target, "</div>");
+       }
+
+       StrBufAppendPrintf(Target, "<dl>");
+       p = icalcomponent_get_first_property(cal, ICAL_SUMMARY_PROPERTY);
+       if (p != NULL) {
+               StrBufAppendPrintf(Target, "<dt>");
+               StrBufAppendPrintf(Target, _("Summary:"));
+               StrBufAppendPrintf(Target, "</dt><dd>");
+               StrEscAppend(Target, NULL, (char *)icalproperty_get_comment(p), 0, 0);
+               StrBufAppendPrintf(Target, "</dd>\n");
+       }
+
+       p = icalcomponent_get_first_property(cal, ICAL_LOCATION_PROPERTY);
+       if (p != NULL) {
+               StrBufAppendPrintf(Target, "<dt>");
+               StrBufAppendPrintf(Target, _("Location:"));
+               StrBufAppendPrintf(Target, "</dt><dd>");
+               StrEscAppend(Target, NULL, (char *)icalproperty_get_comment(p), 0, 0);
+               StrBufAppendPrintf(Target, "</dd>\n");
+       }
+
+       // Only show start/end times if we're actually looking at the VEVENT
+       // component.  Otherwise it shows bogus dates for things like timezone.
+       if (icalcomponent_isa(cal) == ICAL_VEVENT_COMPONENT) {
+
+               p = icalcomponent_get_first_property(cal, ICAL_DTSTART_PROPERTY);
+               if (p != NULL) {
+                       t = icalproperty_get_dtstart(p);
+
+                       if (t.is_date) {
+                               struct tm d_tm;
+                               char d_str[32];
+                               memset(&d_tm, 0, sizeof d_tm);
+                               d_tm.tm_year = t.year - 1900;
+                               d_tm.tm_mon = t.month - 1;
+                               d_tm.tm_mday = t.day;
+                               wc_strftime(d_str, sizeof d_str, "%x", &d_tm);
+                               StrBufAppendPrintf(Target, "<dt>");
+                               StrBufAppendPrintf(Target, _("Date:"));
+                               StrBufAppendPrintf(Target, "</dt><dd>%s</dd>", d_str);
+                       }
+                       else {
+                               tt = icaltime_as_timet(t);
+                               webcit_fmt_date(buf, 256, tt, DATEFMT_FULL);
+                               StrBufAppendPrintf(Target, "<dt>");
+                               StrBufAppendPrintf(Target, _("Starting date/time:"));
+                               StrBufAppendPrintf(Target, "</dt><dd>%s</dd>", buf);
+                       }
+               }
+       
+               p = icalcomponent_get_first_property(cal, ICAL_DTEND_PROPERTY);
+               if (p != NULL) {
+                       t = icalproperty_get_dtend(p);
+                       tt = icaltime_as_timet(t);
+                       webcit_fmt_date(buf, 256, tt, DATEFMT_FULL);
+                       StrBufAppendPrintf(Target, "<dt>");
+                       StrBufAppendPrintf(Target, _("Ending date/time:"));
+                       StrBufAppendPrintf(Target, "</dt><dd>%s</dd>", buf);
+               }
+
+       }
+
+       p = icalcomponent_get_first_property(cal, ICAL_DESCRIPTION_PROPERTY);
+       if (p != NULL) {
+               StrBufAppendPrintf(Target, "<dt>");
+               StrBufAppendPrintf(Target, _("Description:"));
+               StrBufAppendPrintf(Target, "</dt><dd>");
+               StrEscAppend(Target, NULL, (char *)icalproperty_get_comment(p), 0, 0);
+               StrBufAppendPrintf(Target, "</dd>\n");
+       }
+
+       if (icalcomponent_get_first_property(cal, ICAL_RRULE_PROPERTY)) {
+               // Unusual string syntax used here in order to re-use existing translations
+               StrBufAppendPrintf(Target, "<dt>%s:</dt><dd>%s.</dd>\n",
+                       _("Recurrence"),
+                       _("This is a recurring event")
+               );
+       }
+
+       // If the component has attendees, iterate through them.
+       for (p = icalcomponent_get_first_property(cal, ICAL_ATTENDEE_PROPERTY); 
+            (p != NULL); 
+            p = icalcomponent_get_next_property(cal, ICAL_ATTENDEE_PROPERTY)) {
+               StrBufAppendPrintf(Target, "<dt>");
+               StrBufAppendPrintf(Target, _("Attendee:"));
+               StrBufAppendPrintf(Target, "</dt><dd>");
+               ch = icalproperty_get_attendee(p);
+               if ((ch != NULL) && !strncasecmp(ch, "MAILTO:", 7)) {
+
+                       // screen name or email address
+                       safestrncpy(buf, ch + 7, sizeof(buf));
+                       string_trim(buf);
+                       StrEscAppend(Target, NULL, buf, 0, 0);
+                       StrBufAppendPrintf(Target, " ");
+
+                       // participant status
+                       partstat_as_string(buf, p);
+                       StrEscAppend(Target, NULL, buf, 0, 0);
+               }
+               StrBufAppendPrintf(Target, "</dd>\n");
+       }
+
+       // If the component has subcomponents, recurse through them.
+       for (c = icalcomponent_get_first_component(cal, ICAL_ANY_COMPONENT);
+               (c != 0);
+               c = icalcomponent_get_next_component(cal, ICAL_ANY_COMPONENT)
+       ) {
+               // Recursively process subcomponent
+               cal_process_object(Target, c, recursion_level+1, msgnum, cal_partnum);
+       }
+
+       // If this is a REQUEST, display conflicts and buttons
+       if (the_method == ICAL_METHOD_REQUEST) {
+
+               // Check for conflicts
+               syslog(LOG_DEBUG, "Checking server calendar for conflicts...");
+               serv_printf("ICAL conflicts|%ld|%s|", msgnum, cal_partnum);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1') {
+                       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               extract_token(conflict_name, buf, 3, '|', sizeof conflict_name);
+                               is_update = extract_int(buf, 4);
+
+                               if (is_update) {
+                                       snprintf(conflict_message, sizeof conflict_message,
+                                                _("This is an update of '%s' which is already in your calendar."), conflict_name);
+                               }
+                               else {
+                                       snprintf(conflict_message, sizeof conflict_message,
+                                                _("This event would conflict with '%s' which is already in your calendar."), conflict_name);
+                               }
+
+                               StrBufAppendPrintf(Target, "<dt>%s",
+                                       (is_update ?
+                                        _("Update:") :
+                                        _("CONFLICT:")
+                                               )
+                                       );
+                               StrBufAppendPrintf(Target, "</dt><dd>");
+                               StrEscAppend(Target, NULL, conflict_message, 0, 0);
+                               StrBufAppendPrintf(Target, "</dd>\n");
+                       }
+               }
+               syslog(LOG_DEBUG, "...done.\n");
+
+               StrBufAppendPrintf(Target, "</dl>");
+
+               // Display the Accept/Decline buttons
+               StrBufAppendPrintf(Target, "<p id=\"%s_question\">"
+                       "%s "
+                       "&nbsp;&nbsp;&nbsp;<span class=\"button_link\"> "
+                       "<a href=\"javascript:RespondToInvitation('%s_question','%s_title','%ld','%s','Accept');\">%s</a>"
+                       "</span>&nbsp;&nbsp;&nbsp;<span class=\"button_link\">"
+                       "<a href=\"javascript:RespondToInvitation('%s_question','%s_title','%ld','%s','Tentative');\">%s</a>"
+                       "</span>&nbsp;&nbsp;&nbsp;<span class=\"button_link\">"
+                       "<a href=\"javascript:RespondToInvitation('%s_question','%s_title','%ld','%s','Decline');\">%s</a>"
+                       "</span></p>\n",
+                       divname,
+                       _("How would you like to respond to this invitation?"),
+                       divname, divname, msgnum, cal_partnum, _("Accept"),
+                       divname, divname, msgnum, cal_partnum, _("Tentative"),
+                       divname, divname, msgnum, cal_partnum, _("Decline")
+                       );
+
+       }
+
+       // If this is a REPLY, display update button
+       if (the_method == ICAL_METHOD_REPLY) {
+
+               // Display the update buttons
+               StrBufAppendPrintf(Target, "<p id=\"%s_question\" >"
+                       "%s "
+                       "&nbsp;&nbsp;&nbsp;<span class=\"button_link\"> "
+                       "<a href=\"javascript:HandleRSVP('%s_question','%s_title','%ld','%s','Update');\">%s</a>"
+                       "</span>&nbsp;&nbsp;&nbsp;<span class=\"button_link\">"
+                       "<a href=\"javascript:HandleRSVP('%s_question','%s_title','%ld','%s','Ignore');\">%s</a>"
+                       "</span></p>\n",
+                       divname,
+                       _("Click <i>Update</i> to accept this reply and update your calendar."),
+                       divname, divname, msgnum, cal_partnum, _("Update"),
+                       divname, divname, msgnum, cal_partnum, _("Ignore")
+                       );
+       
+       }
+       
+       // Trailing HTML for the display of this object
+       if (recursion_level == 0) {
+               StrBufAppendPrintf(Target, "<p>&nbsp;</p></div>\n");
+       }
+}
+
+
+// Deserialize a calendar object in a message so it can be displayed.
+void cal_process_attachment(wc_mime_attachment *Mime) {
+       icalcomponent *cal;
+
+       cal = icalcomponent_new_from_string(ChrPtr(Mime->Data));
+       FlushStrBuf(Mime->Data);
+       if (cal == NULL) {
+               StrBufAppendPrintf(Mime->Data, _("There was an error parsing this calendar item."));
+               StrBufAppendPrintf(Mime->Data, "<br>\n");
+               return;
+       }
+
+       cal_process_object(Mime->Data, cal, 0, Mime->msgnum, ChrPtr(Mime->PartNum));
+
+       // Free the memory we obtained from libical's constructor
+       icalcomponent_free(cal);
+}
+
+
+// Respond to a meeting request - accept/decline meeting
+void respond_to_request(void) {
+       char buf[1024];
+
+       begin_ajax_response();
+
+       serv_printf("ICAL respond|%s|%s|%s|",
+               bstr("msgnum"),
+               bstr("cal_partnum"),
+               bstr("sc")
+       );
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] == '2') {
+               wc_printf("<img src=\"static/webcit_icons/essen/32x32/calendar.png\"><span>");
+               if (!strcasecmp(bstr("sc"), "accept")) {
+                       wc_printf(_("You have accepted this meeting invitation.  "
+                               "It has been entered into your calendar.")
+                       );
+               }
+               else if (!strcasecmp(bstr("sc"), "tentative")) {
+                       wc_printf(_("You have tentatively accepted this meeting invitation.  "
+                               "It has been 'pencilled in' to your calendar.")
+                       );
+               }
+               else if (!strcasecmp(bstr("sc"), "decline")) {
+                       wc_printf(_("You have declined this meeting invitation.  "
+                                 "It has <b>not</b> been entered into your calendar.")
+                               );
+               }
+               wc_printf(" ");
+               wc_printf(_("A reply has been sent to the meeting organizer."));
+               wc_printf("</span>");
+       }
+       else {
+               wc_printf("<img align=\"center\" src=\"static/webcit_icons/error.gif\"><span>");
+               wc_printf("%s\n", &buf[4]);
+               wc_printf("</span>");
+       }
+       end_ajax_response();
+}
+
+
+// Handle an incoming RSVP
+void handle_rsvp(void) {
+       char buf[1024];
+
+       begin_ajax_response();
+
+       serv_printf("ICAL handle_rsvp|%s|%s|%s|",
+               bstr("msgnum"),
+               bstr("cal_partnum"),
+               bstr("sc")
+       );
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] == '2') {
+               wc_printf("<img src=\"static/webcit_icons/calendar.png\"><span>");
+               if (!strcasecmp(bstr("sc"), "update")) {
+                       // Translators: RSVP aka Répondez s'il-vous-plaît is the term 
+                       // that the recipient of an ical-invitation should please 
+                       // answer this request.
+                       wc_printf(_("Your calendar has been updated to reflect this RSVP."));
+               }
+               else if (!strcasecmp(bstr("sc"), "ignore")) {
+                       wc_printf(_("You have chosen to ignore this RSVP. "
+                                 "Your calendar has <b>not</b> been updated.")
+                       );
+               }
+               wc_printf("</span>");
+       }
+       else {
+               wc_printf("<img src=\"static/webcit_icons/error.gif\"><span> %s\n", &buf[4]);
+               wc_printf("</span>");
+       }
+
+       end_ajax_response();
+}
+
+
+// free memory allocated using libical
+void delete_cal(void *vCal) {
+       disp_cal *Cal = (disp_cal*) vCal;
+       icalcomponent_free(Cal->cal);
+       free(Cal->from);
+       free(Cal);
+}
+
+
+// This is the meat-and-bones of the first part of our two-phase calendar display.
+// As we encounter calendar items in messages being read from the server, we break out
+// any iCalendar objects and store them in a hash table.  Later on, the second phase will
+// use this hash table to render the calendar for display.
+void display_individual_cal(icalcomponent *event, long msgnum, char *from, int unread, calview *calv) {
+       icalproperty *ps = NULL;
+       struct icaltimetype dtstart, dtend;
+       struct icaldurationtype dur;
+       wcsession *WCC = WC;
+       disp_cal *Cal;
+       size_t len;
+       time_t final_recurrence = 0;
+       icalcomponent *cptr = NULL;
+
+       // recur variables
+       icalproperty *rrule = NULL;
+       struct icalrecurrencetype recur;
+       icalrecur_iterator *ritr = NULL;
+       struct icaltimetype next;
+       int num_recur = 0;
+       int stop_rr = 0;
+
+       // first and foremost, check for bogosity.  bail if we see no DTSTART property
+       if (icalcomponent_get_first_property(icalcomponent_get_first_component(
+               event, ICAL_VEVENT_COMPONENT), ICAL_DTSTART_PROPERTY) == NULL
+       ) {
+               return;
+       }
+
+       // ok, chances are we've got a live one here.  let's try to figure out where it goes.
+
+       dtstart = icaltime_null_time();
+       dtend = icaltime_null_time();
+       
+       if (WCC->disp_cal_items == NULL) {
+               WCC->disp_cal_items = NewHash(0, Flathash);
+       }
+
+       // Note: anything we do here, we also have to do below for the recurrences.
+       Cal = (disp_cal*) malloc(sizeof(disp_cal));
+       memset(Cal, 0, sizeof(disp_cal));
+       Cal->cal = icalcomponent_new_clone(event);
+
+       // Dezonify and decapsulate at the very last moment
+       ical_dezonify(Cal->cal);
+       if (icalcomponent_isa(Cal->cal) != ICAL_VEVENT_COMPONENT) {
+               cptr = icalcomponent_get_first_component(Cal->cal, ICAL_VEVENT_COMPONENT);
+               if (cptr) {
+                       cptr = icalcomponent_new_clone(cptr);
+                       icalcomponent_free(Cal->cal);
+                       Cal->cal = cptr;
+               }
+       }
+
+       Cal->unread = unread;
+       len = strlen(from);
+       Cal->from = (char*)malloc(len+ 1);
+       memcpy(Cal->from, from, len + 1);
+       Cal->cal_msgnum = msgnum;
+
+       // Precalculate the starting date and time of this event, and store it in our top-level
+       // structure.  Later, when we are rendering the calendar, we can just peek at these values
+       // without having to break apart every calendar item.
+       ps = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY);
+       if (ps != NULL) {
+               dtstart = icalproperty_get_dtstart(ps);
+               Cal->event_start = icaltime_as_timet(dtstart);
+       }
+
+       // Do the same for the ending date and time.  It makes the day view much easier to render.
+       ps = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY);
+       if (ps != NULL) {
+               dtend = icalproperty_get_dtend(ps);
+               Cal->event_end = icaltime_as_timet(dtend);
+       }
+
+       // Store it in the hash list.
+       // syslog(LOG_DEBUG, "INITIAL: %s", ctime(&Cal->event_start));
+       Put(WCC->disp_cal_items, (char*) &Cal->event_start, sizeof(Cal->event_start), Cal, delete_cal);
+
+       //***************************** handle recurring events ******************************
+
+       if (icaltime_is_null_time(dtstart)) return;     /* Can't recur without a start time */
+
+       if (!icaltime_is_null_time(dtend)) {            /* Need duration for recurrences */
+               dur = icaltime_subtract(dtend, dtstart);
+       }
+       else {
+               dur = icaltime_subtract(dtstart, dtstart);
+       }
+
+       /*
+        * Just let libical iterate the recurrence, and keep looping back to the top of this function,
+        * adding new hash entries that all point back to the same msgnum, until either the iteration
+        * stops or some outer bound is reached.  The display code will automatically do the Right Thing.
+        */
+       cptr = event;
+       if (icalcomponent_isa(cptr) != ICAL_VEVENT_COMPONENT) {
+               cptr = icalcomponent_get_first_component(cptr, ICAL_VEVENT_COMPONENT);
+       }
+       if (!cptr) return;
+       ps = icalcomponent_get_first_property(cptr, ICAL_DTSTART_PROPERTY);
+       if (ps == NULL) return;
+       dtstart = icalproperty_get_dtstart(ps);
+       rrule = icalcomponent_get_first_property(cptr, ICAL_RRULE_PROPERTY);
+       if (!rrule) return;
+       recur = icalproperty_get_rrule(rrule);
+       ritr = icalrecur_iterator_new(recur, dtstart);
+       if (!ritr) return;
+
+       while (next = icalrecur_iterator_next(ritr), ((!icaltime_is_null_time(next))&&(!stop_rr)) ) {
+               ++num_recur;
+               if (num_recur > 1) {            /* Skip the first one.  We already did it at the root. */
+                       icalcomponent *cptr;
+
+                       /* Note: anything we do here, we also have to do above for the root event. */
+                       Cal = (disp_cal*) malloc(sizeof(disp_cal));
+                       memset(Cal, 0, sizeof(disp_cal));
+                       Cal->cal = icalcomponent_new_clone(event);
+                       Cal->unread = unread;
+                       len = strlen(from);
+                       Cal->from = (char*)malloc(len+ 1);
+                       memcpy(Cal->from, from, len + 1);
+                       Cal->cal_msgnum = msgnum;
+
+                       if (icalcomponent_isa(Cal->cal) == ICAL_VEVENT_COMPONENT) {
+                               cptr = Cal->cal;
+                       }
+                       else {
+                               cptr = icalcomponent_get_first_component(Cal->cal, ICAL_VEVENT_COMPONENT);
+                       }
+                       if (cptr) {
+
+                               /* Remove any existing DTSTART properties */
+                               while ( ps = icalcomponent_get_first_property(cptr, ICAL_DTSTART_PROPERTY),
+                                       ps != NULL
+                               ) {
+                                       icalcomponent_remove_property(cptr, ps);
+                               }
+
+                               /* Add our shiny new DTSTART property from the iteration */
+                               ps = icalproperty_new_dtstart(next);
+                               icalcomponent_add_property(cptr, ps);
+                               Cal->event_start = icaltime_as_timet(next);
+                               final_recurrence = Cal->event_start;
+
+                               /* Remove any existing DTEND properties */
+                               while (ps = icalcomponent_get_first_property(cptr, ICAL_DTEND_PROPERTY), (ps != NULL)) {
+                                       icalcomponent_remove_property(cptr, ps);
+                               }
+
+                               /* Add our shiny new DTEND property from the iteration */
+                               ps = icalproperty_new_dtend(icaltime_add(next, dur));
+                               icalcomponent_add_property(cptr, ps);
+
+                       }
+
+                       /* Dezonify and decapsulate at the very last moment */
+                       ical_dezonify(Cal->cal);
+                       if (icalcomponent_isa(Cal->cal) != ICAL_VEVENT_COMPONENT) {
+                               cptr = icalcomponent_get_first_component(Cal->cal, ICAL_VEVENT_COMPONENT);
+                               if (cptr) {
+                                       cptr = icalcomponent_new_clone(cptr);
+                                       icalcomponent_free(Cal->cal);
+                                       Cal->cal = cptr;
+                               }
+                       }
+
+                       if (    (Cal->event_start > calv->lower_bound)
+                               && (Cal->event_start < calv->upper_bound)
+                       ) {
+                               /* syslog(LOG_DEBUG, "REPEATS: %s", ctime(&Cal->event_start)); */
+                               Put(WCC->disp_cal_items, 
+                                       (char*) &Cal->event_start,
+                                       sizeof(Cal->event_start), 
+                                       Cal, 
+                                       delete_cal
+                               );
+                       }
+                       else {
+                               delete_cal(Cal);
+                       }
+
+                       /* If an upper bound is set, stop when we go out of scope */
+                       if (final_recurrence > calv->upper_bound) stop_rr = 1;
+               }
+       }
+       icalrecur_iterator_free(ritr);
+       /* syslog(LOG_DEBUG, "Performed %d recurrences; final one is %s", num_recur, ctime(&final_recurrence)); */
+}
+
+
+void process_ical_object(long msgnum, int unread,
+                        char *from, 
+                        char *FlatIcal, 
+                        icalcomponent_kind which_kind,
+                        IcalCallbackFunc CallBack,
+                        calview *calv
+) {
+       icalcomponent *cal, *c;
+
+       cal = icalcomponent_new_from_string(FlatIcal);
+       if (cal != NULL) {
+
+               /* A which_kind of (-1) means just load the whole thing */
+               if (which_kind == (-1)) {
+                       CallBack(cal, msgnum, from, unread, calv);
+               }
+               
+               /* Otherwise recurse and hunt */
+               else {
+                       
+                       /* Simple components of desired type */
+                       if (icalcomponent_isa(cal) == which_kind) {
+                               CallBack(cal, msgnum, from, unread, calv);
+                       }
+                       
+                       /* Subcomponents of desired type */
+                       for (c = icalcomponent_get_first_component(cal, which_kind);
+                            (c != 0);
+                            c = icalcomponent_get_next_component(cal, which_kind)) {
+                               CallBack(c, msgnum, from, unread, calv);
+                       }
+                       
+               }
+               
+               icalcomponent_free(cal);
+       }
+}
+
+// Code common to all icalendar display handlers.  Given a message number and a MIME
+// type, we load the message and hunt for that MIME type.  If found, we load
+// the relevant part, deserialize it into a libical component, filter it for
+// the requested object type, and feed it to the specified handler.
+void load_ical_object(long msgnum, int unread,
+                     icalcomponent_kind which_kind,
+                     IcalCallbackFunc CallBack,
+                     calview *calv,
+                     int RenderAsync
+) {
+       StrBuf *Buf;
+       StrBuf *Data = NULL;
+       const char *bptr;
+       int Done = 0;
+       char from[128] = "";
+       char mime_partnum[256];
+       char mime_filename[256];
+       char mime_content_type[256];
+       char mime_disposition[256];
+       char relevant_partnum[256];
+       char *relevant_source = NULL;
+       int phase = 0;                          /* 0 = citadel headers, 1 = mime headers, 2 = body */
+       char msg4_content_type[256] = "";
+       char msg4_content_encoding[256] = "";
+       int msg4_content_length = 0;
+
+       relevant_partnum[0] = '\0';
+       serv_printf("MSG4 %ld", msgnum);        /* we need the mime headers */
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 1) {
+               FreeStrBuf (&Buf);
+               return;
+       }
+       while (!Done && (StrBuf_ServGetln(Buf)>=0)) {
+               if ( (StrLength(Buf)==3) && 
+                    !strcmp(ChrPtr(Buf), "000")) {
+                       Done = 1;
+                       break;
+               }
+               bptr = ChrPtr(Buf);
+               switch (phase) {
+               case 0:
+                       if (!strncasecmp(bptr, "part=", 5)) {
+                               extract_token(mime_filename, &bptr[5], 1, '|', sizeof mime_filename);
+                               extract_token(mime_partnum, &bptr[5], 2, '|', sizeof mime_partnum);
+                               extract_token(mime_disposition, &bptr[5], 3, '|', sizeof mime_disposition);
+                               extract_token(mime_content_type, &bptr[5], 4, '|', sizeof mime_content_type);
+                               /* do we care? mime_length = */extract_int(&bptr[5], 5);
+
+                               if (  (!strcasecmp(mime_content_type, "text/calendar"))
+                                     || (!strcasecmp(mime_content_type, "application/ics"))
+                                     || (!strcasecmp(mime_content_type, "text/vtodo"))
+                                     || (!strcasecmp(mime_content_type, "text/todo"))
+                                       ) {
+                                       strcpy(relevant_partnum, mime_partnum);
+                               }
+                       }
+                       else if (!strncasecmp(bptr, "from=", 4)) {
+                               extract_token(from, bptr, 1, '=', sizeof(from));
+                       }
+                       else if ((phase == 0) && (!strncasecmp(bptr, "text", 4))) {
+                               phase = 1;
+                       }
+               break;
+               case 1:
+                       if (!IsEmptyStr(bptr)) {
+                               if (!strncasecmp(bptr, "Content-type: ", 14)) {
+                                       safestrncpy(msg4_content_type, &bptr[14], sizeof msg4_content_type);
+                                       string_trim(msg4_content_type);
+                               }
+                               else if (!strncasecmp(bptr, "Content-transfer-encoding: ", 27)) {
+                                       safestrncpy(msg4_content_encoding, &bptr[27], sizeof msg4_content_encoding);
+                                       string_trim(msg4_content_type);
+                               }
+                               else if ((!strncasecmp(bptr, "Content-length: ", 16))) {
+                                       msg4_content_length = atoi(&bptr[16]);
+                               }
+                               break;
+                       }
+                       else {
+                               phase++;
+                               
+                               if ((msg4_content_length > 0)
+                                   && ( !strcasecmp(msg4_content_encoding, "7bit"))
+                                   && ((!strcasecmp(mime_content_type, "text/calendar"))
+                                       || (!strcasecmp(mime_content_type, "application/ics"))
+                                       || (!strcasecmp(mime_content_type, "text/vtodo"))
+                                       || (!strcasecmp(mime_content_type, "text/todo"))
+                                           )
+                                       ) 
+                               {
+                               }
+                       }
+               case 2:
+                       if (Data == NULL)
+                               Data = NewStrBufPlain(NULL, msg4_content_length * 2);
+                       if (msg4_content_length > 0) {
+                               StrBuf_ServGetBLOBBuffered(Data, msg4_content_length);
+                               phase ++;
+                       }
+                       else {
+                               StrBufAppendBuf(Data, Buf, 0);
+                               StrBufAppendBufPlain(Data, "\r\n", 1, 0);
+                       }
+               case 3:
+                       StrBufAppendBuf(Data, Buf, 0);
+               }
+       }
+       FreeStrBuf(&Buf);
+
+       // If MSG4 didn't give us the part we wanted, but we know that we can find it
+       // as one of the other MIME parts, attempt to load it now.
+       if ((Data == NULL) && (!IsEmptyStr(relevant_partnum))) {
+               Data = load_mimepart(msgnum, relevant_partnum);
+       }
+
+       if (Data != NULL) {
+               relevant_source = (char*) ChrPtr(Data);
+               process_ical_object(msgnum, unread,
+                                   from, 
+                                   relevant_source, 
+                                   which_kind,
+                                   CallBack,
+                                   calv);
+       }
+       FreeStrBuf (&Data);
+
+       icalmemory_free_ring();
+}
+
+
+// Display a calendar item
+int calendar_LoadMsgFromServer(SharedMessageStatus *Stat, void **ViewSpecific, message_summary* Msg, int is_new, int i) {
+       calview *c = (calview*) *ViewSpecific;
+       load_ical_object(Msg->msgnum, is_new, (-1), display_individual_cal, c, 1);
+       return 0;
+}
+
+
+// display the editor component for an event
+void display_edit_event(void) {
+       long msgnum = 0L;
+
+       msgnum = lbstr("msgnum");
+       if (msgnum > 0L) {
+               // existing event
+               load_ical_object(msgnum, 0, ICAL_VEVENT_COMPONENT, display_edit_individual_event, NULL, 0);
+       }
+       else {
+               // new event
+               display_edit_individual_event(NULL, 0L, "", 0, NULL);
+       }
+}
+
+
+// save an edited event
+void save_event(void) {
+       long msgnum = 0L;
+
+       msgnum = lbstr("msgnum");
+
+       if (msgnum > 0L) {
+               load_ical_object(msgnum, 0, (-1), save_individual_event, NULL, 0);
+       }
+       else {
+               save_individual_event(NULL, 0L, "", 0, NULL);
+       }
+}
+
+
+// Anonymous request of freebusy data for a user
+void do_freebusy(void) {
+       const char *req = ChrPtr(WC->Hdr->HR.ReqLine);
+       char who[SIZ];
+       char buf[SIZ];
+       int len;
+       long lines;
+
+       extract_token(who, req, 0, ' ', sizeof who);
+       if (!strncasecmp(who, "/freebusy/", 10)) {
+               strcpy(who, &who[10]);
+       }
+       unescape_input(who);
+
+       len = strlen(who);
+       if ( (!strcasecmp(&who[len-4], ".vcf"))
+            || (!strcasecmp(&who[len-4], ".ifb"))
+            || (!strcasecmp(&who[len-4], ".vfb")) ) {
+               who[len-4] = 0;
+       }
+
+       syslog(LOG_INFO, "freebusy requested for <%s>\n", who);
+       serv_printf("ICAL freebusy|%s", who);
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] != '1') {
+               hprintf("HTTP/1.1 404 %s\n", &buf[4]);
+               output_headers(0, 0, 0, 0, 0, 0);
+               hprintf("Content-Type: text/plain\r\n");
+               wc_printf("%s\n", &buf[4]);
+               end_burst();
+               return;
+       }
+
+       read_server_text(WC->WBuf, &lines);
+       http_transmit_thing("text/calendar", 0);
+}
+
+
+int calendar_Cleanup(void **ViewSpecific) {
+       calview *c;
+       
+       c = (calview *) *ViewSpecific;
+
+       wDumpContent(1);
+       free (c);
+       *ViewSpecific = NULL;
+
+       return 0;
+}
+
+
+int __calendar_Cleanup(void **ViewSpecific) {
+       calview *c;
+       
+       c = (calview *) *ViewSpecific;
+
+       free (c);
+       *ViewSpecific = NULL;
+
+       return 0;
+}
+
+
+void 
+InitModule_CALENDAR
+(void)
+{
+       RegisterReadLoopHandlerset(
+               VIEW_CALENDAR,
+               calendar_GetParamsGetServerCall,
+               NULL,
+               NULL,
+               NULL,
+               calendar_LoadMsgFromServer,
+               calendar_RenderView_or_Tail,
+               calendar_Cleanup,
+               NULL);
+
+       RegisterReadLoopHandlerset(
+               VIEW_CALBRIEF,
+               calendar_GetParamsGetServerCall,
+               NULL,
+               NULL,
+               NULL,
+               calendar_LoadMsgFromServer,
+               calendar_RenderView_or_Tail,
+               calendar_Cleanup,
+               NULL);
+
+
+
+       RegisterPreference("daystart", _("Calendar day view begins at:"), PRF_INT, NULL);
+       RegisterPreference("dayend", _("Calendar day view ends at:"), PRF_INT, NULL);
+       RegisterPreference("weekstart", _("Week starts on:"), PRF_INT, NULL);
+
+       WebcitAddUrlHandler(HKEY("freebusy"), "", 0, do_freebusy, COOKIEUNNEEDED|ANONYMOUS|FORCE_SESSIONCLOSE);
+       WebcitAddUrlHandler(HKEY("display_edit_task"), "", 0, display_edit_task, 0);
+       WebcitAddUrlHandler(HKEY("display_edit_event"), "", 0, display_edit_event, 0);
+       WebcitAddUrlHandler(HKEY("save_event"), "", 0, save_event, 0);
+       WebcitAddUrlHandler(HKEY("respond_to_request"), "", 0, respond_to_request, 0);
+       WebcitAddUrlHandler(HKEY("handle_rsvp"), "", 0, handle_rsvp, 0);
+}
diff --git a/webcit/calendar.h b/webcit/calendar.h
new file mode 100644 (file)
index 0000000..ee1f8bc
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#ifndef __CALENDAR_H__
+#define __CALENDAR_H__
+/*
+ * calview contains data passed back and forth between the message fetching loop
+ * and the calendar view renderer.
+ */
+enum {
+       calview_month,
+       calview_day,
+       calview_week,
+       calview_brief,
+       calview_summary
+};
+
+typedef struct _calview {
+       int view;
+       int year;
+       int month;
+       int day;
+       time_t lower_bound;
+       time_t upper_bound;
+}calview;
+
+typedef void (*IcalCallbackFunc)(icalcomponent *, long, char*, int, calview *);
+
+void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unread, calview *calv);
+void load_ical_object(long msgnum, int unread,
+                     icalcomponent_kind which_kind,
+                     IcalCallbackFunc CallBack,
+                     calview *calv,
+                     int RenderAsync
+       );
+
+int calendar_LoadMsgFromServer(SharedMessageStatus *Stat, 
+                              void **ViewSpecific, 
+                              message_summary* Msg, 
+                              int is_new, 
+                              int i);
+int calendar_RenderView_or_Tail(SharedMessageStatus *Stat, 
+                               void **ViewSpecific, 
+                               long oper);
+
+int calendar_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                                   void **ViewSpecific, 
+                                   long oper, 
+                                   char *cmd, 
+                                   long len,
+                                   char *filter,
+                                   long flen);
+
+int calendar_Cleanup(void **ViewSpecific);
+int __calendar_Cleanup(void **ViewSpecific);
+
+void render_calendar_view(calview *c);
+void display_edit_individual_event(icalcomponent *supplied_vtodo, long msgnum, char *from,
+       int unread, calview *calv);
+void save_individual_event(icalcomponent *supplied_vtodo, long msgnum, char *from,
+       int unread, calview *calv);
+void ical_dezonify(icalcomponent *cal);
+
+int tasks_LoadMsgFromServer(SharedMessageStatus *Stat, 
+                           void **ViewSpecific, 
+                           message_summary* Msg, 
+                           int is_new, 
+                           int i);
+
+void display_edit_task(void);
+void display_edit_event(void);
+
+icaltimezone *get_default_icaltimezone(void);
+void display_icaltimetype_as_webform(struct icaltimetype *, char *, int);
+void icaltime_from_webform(struct icaltimetype *result, char *prefix);
+void icaltime_from_webform_dateonly(struct icaltimetype *result, char *prefix);
+void partstat_as_string(char *buf, icalproperty *attendee);
+icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp);
+void check_attendee_availability(icalcomponent *supplied_vevent);
+int ical_ctdl_is_overlap(
+                        struct icaltimetype t1start,
+                        struct icaltimetype t1end,
+                        struct icaltimetype t2start,
+                        struct icaltimetype t2end
+);
+
+
+#endif
diff --git a/webcit/calendar_tools.c b/webcit/calendar_tools.c
new file mode 100644 (file)
index 0000000..3d875c3
--- /dev/null
@@ -0,0 +1,323 @@
+/*
+ * Miscellaneous functions which handle calendar components.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "time.h"
+#include "calendar.h"
+
+/* Hour strings */
+char *hourname[] = {
+       "12am", "1am", "2am", "3am", "4am", "5am", "6am",
+       "7am", "8am", "9am", "10am", "11am", "12pm",
+       "1pm", "2pm", "3pm", "4pm", "5pm", "6pm",
+       "7pm", "8pm", "9pm", "10pm", "11pm"
+};
+
+/*
+ * The display_icaltimetype_as_webform() and icaltime_from_webform() functions
+ * handle the display and editing of date/time properties in web pages.  The
+ * first one converts an icaltimetype into valid HTML markup -- a series of form
+ * fields for editing the date and time.  When the user submits the form, the
+ * results can be fed back into the second function, which turns it back into
+ * an icaltimetype.  The "prefix" string required by both functions is prepended
+ * to all field names.  This allows a form to contain more than one date/time
+ * property (for example, a start and end time) by ensuring the field names are
+ * unique within the form.
+ *
+ * NOTE: These functions assume that the icaltimetype being edited is in UTC, and
+ * will convert to/from local time for editing.  "local" in this case is assumed
+ * to be the time zone in which the WebCit server is running.  A future improvement
+ * might be to allow the user to specify his/her timezone.
+ */
+
+void display_icaltimetype_as_webform(struct icaltimetype *t, char *prefix, int date_only) {
+       wcsession *WCC = WC;
+       int i;
+       time_t now;
+       struct tm tm_now;
+       time_t tt;
+       struct tm tm;
+       int all_day_event = 0;
+       int time_format;
+       char timebuf[32];
+       
+       time_format = get_time_format_cached ();
+
+       now = time(NULL);
+       localtime_r(&now, &tm_now);
+
+       if (t == NULL) return;
+       if (t->is_date) all_day_event = 1;
+       tt = icaltime_as_timet(*t);
+       if (all_day_event) {
+               gmtime_r(&tt, &tm);
+       }
+       else {
+               localtime_r(&tt, &tm);
+       }
+
+       wc_printf("<input type=\"date\" name=\"");
+       StrBufAppendBufPlain(WCC->WBuf, prefix, -1, 0);
+       wc_printf("\" id=\"");
+       StrBufAppendBufPlain(WCC->WBuf, prefix, -1, 0);
+       wc_printf("\" size=\"10\" maxlength=\"10\" value=\"");
+       wc_strftime(timebuf, 32, "%Y-%m-%d", &tm);
+       StrBufAppendBufPlain(WCC->WBuf, timebuf, -1, 0);
+       wc_printf("\">");
+
+       StrBufAppendPrintf(WC->trailing_javascript, "attachDatePicker('");
+       StrBufAppendPrintf(WC->trailing_javascript, prefix);
+       StrBufAppendPrintf(WC->trailing_javascript, "', '%s');\n", get_selected_language());
+
+       /* If we're editing a date only, we still generate the time boxes, but we hide them.
+        * This keeps the data model consistent.
+        */
+       if (date_only) {
+               wc_printf("<div style=\"display:none\">");
+       }
+
+       wc_printf("<span ID=\"");
+       StrBufAppendBufPlain(WCC->WBuf, prefix, -1, 0);
+       wc_printf("_time\">");
+       wc_printf(_("Hour: "));
+       wc_printf("<SELECT NAME=\"%s_hour\" SIZE=\"1\">\n", prefix);
+       for (i=0; i<=23; ++i) {
+
+               if (time_format == WC_TIMEFORMAT_24) {
+                       wc_printf("<OPTION %s VALUE=\"%d\">%d</OPTION>\n",
+                               ((tm.tm_hour == i) ? "SELECTED" : ""),
+                               i, i
+                               );
+               }
+               else {
+                       wc_printf("<OPTION %s VALUE=\"%d\">%s</OPTION>\n",
+                               ((tm.tm_hour == i) ? "SELECTED" : ""),
+                               i, hourname[i]
+                               );
+               }
+
+       }
+       wc_printf("</SELECT>\n");
+
+       wc_printf(_("Minute: "));
+       wc_printf("<SELECT NAME=\"%s_minute\" SIZE=\"1\">\n", prefix);
+       for (i=0; i<=59; ++i) {
+               if ( (i % 5 == 0) || (tm.tm_min == i) ) {
+                       wc_printf("<OPTION %s VALUE=\"%d\">:%02d</OPTION>\n",
+                               ((tm.tm_min == i) ? "SELECTED" : ""),
+                               i, i
+                               );
+               }
+       }
+       wc_printf("</SELECT></span>\n");
+
+       if (date_only) {
+               wc_printf("</div>");
+       }
+}
+
+/*
+ * Get date/time from a web form and convert it into an icaltimetype struct.
+ */
+void icaltime_from_webform(struct icaltimetype *t, char *prefix) {
+       char vname[32];
+
+       if (!t) return;
+
+       /* Stuff with zero values */
+       memset(t, 0, sizeof(struct icaltimetype));
+
+       /* Get the year/month/date all in one shot -- it will be in ISO YYYY-MM-DD format */
+       sscanf((char*)BSTR(prefix), "%04d-%02d-%02d", &t->year, &t->month, &t->day);
+
+       /* hour */
+       sprintf(vname, "%s_hour", prefix);
+       t->hour = IBSTR(vname);
+
+       /* minute */
+       sprintf(vname, "%s_minute", prefix);
+       t->minute = IBSTR(vname);
+
+       /* time zone is set to the default zone for this server */
+       t->is_date = 0;
+       t->zone = get_default_icaltimezone();
+}
+
+
+/*
+ * Get date (no time) from a web form and convert it into an icaltimetype struct.
+ */
+void icaltime_from_webform_dateonly(struct icaltimetype *t, char *prefix) {
+       if (!t) return;
+
+       /* Stuff with zero values */
+       memset(t, 0, sizeof(struct icaltimetype));
+
+       /* Get the year/month/date all in one shot -- it will be in ISO YYYY-MM-DD format */
+       sscanf((char*)BSTR(prefix), "%04d-%02d-%02d", &t->year, &t->month, &t->day);
+
+       /* time zone is set to the default zone for this server */
+       t->zone = icaltimezone_get_utc_timezone();
+       t->is_date = 1;
+}
+
+
+/*
+ * Render a PARTSTAT parameter as a string (and put it in parentheses)
+ */
+void partstat_as_string(char *buf, icalproperty *attendee) {
+       icalparameter *partstat_param;
+       icalparameter_partstat partstat;
+
+       strcpy(buf, _("(status unknown)"));
+
+       partstat_param = icalproperty_get_first_parameter(
+               attendee,
+               ICAL_PARTSTAT_PARAMETER
+               );
+       if (partstat_param == NULL) {
+               return;
+       }
+
+       partstat = icalparameter_get_partstat(partstat_param);
+       switch(partstat) {
+       case ICAL_PARTSTAT_X:
+               strcpy(buf, "(x)");
+               break;
+       case ICAL_PARTSTAT_NEEDSACTION:
+               strcpy(buf, _("(needs action)"));
+               break;
+       case ICAL_PARTSTAT_ACCEPTED:
+               strcpy(buf, _("(accepted)"));
+               break;
+       case ICAL_PARTSTAT_DECLINED:
+               strcpy(buf, _("(declined)"));
+               break;
+       case ICAL_PARTSTAT_TENTATIVE:
+               strcpy(buf, _("(tenative)"));
+               break;
+       case ICAL_PARTSTAT_DELEGATED:
+               strcpy(buf, _("(delegated)"));
+               break;
+       case ICAL_PARTSTAT_COMPLETED:
+               strcpy(buf, _("(completed)"));
+               break;
+       case ICAL_PARTSTAT_INPROCESS:
+               strcpy(buf, _("(in process)"));
+               break;
+       case ICAL_PARTSTAT_NONE:
+               strcpy(buf, _("(none)"));
+               break;
+       }
+}
+
+/*
+ * Utility function to encapsulate a subcomponent into a full VCALENDAR.
+ *
+ * We also scan for any date/time properties that reference timezones, and attach
+ * those timezones along with the supplied subcomponent.  (Increase the size of the array if you need to.)
+ *
+ * Note: if you change anything here, change it in Citadel server's ical_send_out_invitations() too.
+ */
+icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) {
+       icalcomponent *encaps;
+       icalproperty *p;
+       struct icaltimetype t;
+       const icaltimezone *attached_zones[5] = { NULL, NULL, NULL, NULL, NULL };
+       int i;
+       const icaltimezone *z;
+       int num_zones_attached = 0;
+       int zone_already_attached;
+
+       if (subcomp == NULL) {
+               syslog(LOG_WARNING, "ERROR: ical_encapsulate_subcomponent() called with NULL argument\n");
+               return NULL;
+       }
+
+       /*
+        * If we're already looking at a full VCALENDAR component, this is probably an error.
+        */
+       if (icalcomponent_isa(subcomp) == ICAL_VCALENDAR_COMPONENT) {
+               syslog(LOG_WARNING, "ERROR: component sent to ical_encapsulate_subcomponent() already top level\n");
+               return subcomp;
+       }
+
+       /* search for... */
+       for (p = icalcomponent_get_first_property(subcomp, ICAL_ANY_PROPERTY);
+            p != NULL;
+            p = icalcomponent_get_next_property(subcomp, ICAL_ANY_PROPERTY))
+       {
+               if ( (icalproperty_isa(p) == ICAL_COMPLETED_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_CREATED_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_DATEMAX_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_DATEMIN_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_DTEND_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_DTSTAMP_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_DTSTART_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_DUE_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_EXDATE_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_LASTMODIFIED_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_MAXDATE_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_MINDATE_PROPERTY)
+                 || (icalproperty_isa(p) == ICAL_RECURRENCEID_PROPERTY)
+               ) {
+                       t = icalproperty_get_dtstart(p);        /*/ it's safe to use dtstart for all of them */
+                       if ((icaltime_is_valid_time(t)) && (z=icaltime_get_timezone(t), z)) {
+                       
+                               zone_already_attached = 0;
+                               for (i=0; i<5; ++i) {
+                                       if (z == attached_zones[i]) {
+                                               ++zone_already_attached;
+                                               syslog(LOG_DEBUG, "zone already attached!!\n");
+                                       }
+                               }
+                               if ((!zone_already_attached) && (num_zones_attached < 5)) {
+                                       syslog(LOG_DEBUG, "attaching zone %d!\n", num_zones_attached);
+                                       attached_zones[num_zones_attached++] = z;
+                               }
+
+                               icalproperty_set_parameter(p,
+                                       icalparameter_new_tzid(icaltimezone_get_tzid((icaltimezone *)z))
+                               );
+                       }
+               }
+       }
+
+       /* Encapsulate the VEVENT component into a complete VCALENDAR */
+       encaps = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+       if (encaps == NULL) {
+               syslog(LOG_WARNING, "ERROR: ical_encapsulate_subcomponent() could not allocate component\n");
+               return NULL;
+       }
+
+       /* Set the Product ID */
+       icalcomponent_add_property(encaps, icalproperty_new_prodid(PRODID));
+
+       /* Set the Version Number */
+       icalcomponent_add_property(encaps, icalproperty_new_version("2.0"));
+
+       /* Attach any timezones we need */
+       if (num_zones_attached > 0) for (i=0; i<num_zones_attached; ++i) {
+               icalcomponent *zc;
+               zc = icalcomponent_new_clone(icaltimezone_get_component((icaltimezone *)attached_zones[i]));
+               icalcomponent_add_component(encaps, zc);
+       }
+
+       /* Encapsulate the subcomponent inside */
+       icalcomponent_add_component(encaps, subcomp);
+
+       /* Return the object we just created. */
+       return(encaps);
+}
diff --git a/webcit/calendar_view.c b/webcit/calendar_view.c
new file mode 100644 (file)
index 0000000..1b6e868
--- /dev/null
@@ -0,0 +1,1538 @@
+/*
+ * Handles the HTML display of calendar items.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "calendar.h"
+
+/* These define how high the hour rows are in the day view */
+#define TIMELINE       22
+#define EXTRATIMELINE  22
+
+void embeddable_mini_calendar(int year, int month)
+{
+       struct tm starting_tm;
+       struct tm tm;
+       time_t thetime;
+       int i;
+       time_t previous_month;
+       time_t next_month;
+       time_t colheader_time;
+       struct tm colheader_tm;
+       char colheader_label[32];
+       long weekstart = 0;
+       char url[256];
+       char div_id[256];
+
+       snprintf(div_id, sizeof div_id, "mini_calendar_%d", rand() );
+
+       /* Determine what day to start.  If an impossible value is found, start on Sunday.
+       */
+       get_pref_long("weekstart", &weekstart, 17);
+       if (weekstart > 6) weekstart = 0;
+
+       /*
+       * Now back up to the 1st of the month...
+       */
+       memset(&starting_tm, 0, sizeof(struct tm));
+
+       starting_tm.tm_year = year - 1900;
+       starting_tm.tm_mon = month - 1;
+       starting_tm.tm_mday = 1;
+       thetime = mktime(&starting_tm);
+
+       memcpy(&tm, &starting_tm, sizeof(struct tm));
+       while (tm.tm_mday != 1) {
+               thetime = thetime - (time_t)86400;      /* go back 24 hours */
+               localtime_r(&thetime, &tm);
+       }
+
+       /* Determine previous and next months ... for links */
+       previous_month = thetime - (time_t)864000L;     /* back 10 days */
+       next_month = thetime + (time_t)(31L * 86400L);  /* ahead 31 days */
+
+       /* Now back up until we're on the user's preferred start day */
+       localtime_r(&thetime, &tm);
+       while (tm.tm_wday != weekstart) {
+               thetime = thetime - (time_t)86400;      /* go back 24 hours */
+               localtime_r(&thetime, &tm);
+       }
+
+       wc_printf("<div class=\"mini_calendar\" id=\"%s\">\n", div_id);
+
+       /* Previous month link */
+       localtime_r(&previous_month, &tm);
+       wc_printf("<a href=\"javascript:minical_change_month(%d,%d);\">&laquo;</a>", 
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+
+       wc_strftime(colheader_label, sizeof colheader_label, "%B", &starting_tm);
+       wc_printf("&nbsp;&nbsp;"
+               "<span class=\"mini_calendar_month_label\">"
+               "%s %d"
+               "</span>"
+               "&nbsp;&nbsp;", colheader_label, year);
+
+       /* Next month link */
+       localtime_r(&next_month, &tm);
+       wc_printf("<a href=\"javascript:minical_change_month(%d,%d);\">&raquo;</a>",
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+
+       wc_printf("<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\" class=\"mini_calendar_days\">"
+               "<tr>");
+       colheader_time = thetime;
+       for (i=0; i<7; ++i) {
+               colheader_time = thetime + (i * 86400) ;
+               localtime_r(&colheader_time, &colheader_tm);
+               wc_strftime(colheader_label, sizeof colheader_label, "%A", &colheader_tm);
+               wc_printf("<th>%c</th>", colheader_label[0]);
+
+       }
+       wc_printf("</tr>\n");
+
+
+        /* Now do 35 or 42 days */
+        for (i = 0; i < 42; ++i) {
+                localtime_r(&thetime, &tm);
+
+                if (i < 35) {
+
+                       /* Before displaying Sunday, start a new row */
+                       if ((i % 7) == 0) {
+                               wc_printf("<tr>");
+                       }
+
+                       if (tm.tm_mon == month-1) {
+                               snprintf(url, sizeof url, "readfwd?calview=day?year=%d?month=%d?day=%d",
+                                       tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday);
+                               wc_printf("<td><a href=\"%s\">%d</a></td>", url, tm.tm_mday);
+                       }
+                       else {
+                               wc_printf("<td> </td>");
+                       }
+
+                       /* After displaying one week, end the row */
+                       if ((i % 7) == 6) {
+                               wc_printf("</tr>\n");
+                       }
+
+               }
+
+               thetime += (time_t)86400;               /* ahead 24 hours */
+       }
+
+       wc_printf("</table>"                    /* end of inner table */
+               "</div>\n");
+
+       StrBufAppendPrintf(WC->trailing_javascript,
+               "       function minical_change_month(year, month) {                                    \n"
+               "               p = 'year=' + year + '&month=' + month                                  \n"
+               "                       + '&r=' + ctdlRandomString();                                   \n"
+               "               new Ajax.Updater('%s', 'mini_calendar',                                 \n"
+               "                       { method: 'get', parameters: p, evalScripts: true } );          \n"
+               "       }                                                                               \n"
+               "",
+               div_id
+       );
+
+}
+
+/*
+ * ajax embedder for the above mini calendar 
+ */
+void ajax_mini_calendar(void) 
+{
+       embeddable_mini_calendar( ibstr("year"), ibstr("month"));
+}
+
+
+/*
+ * Display one day of a whole month view of a calendar
+ */
+void calendar_month_view_display_events(int year, int month, int day)
+{
+       long hklen;
+       const char *HashKey;
+       void *vCal;
+       HashPos *Pos;
+       disp_cal *Cal;
+       icalproperty *p = NULL;
+       icalproperty *q = NULL;
+       struct icaltimetype t;
+       struct icaltimetype end_t;
+       struct icaltimetype today_start_t;
+       struct icaltimetype today_end_t;
+       struct icaltimetype today_t;
+       struct tm starting_tm;
+       struct tm ending_tm;
+       int all_day_event = 0;
+       int show_event = 0;
+       char buf[256];
+       wcsession *WCC = WC;
+       time_t tt;
+
+       if (GetCount(WCC->disp_cal_items) == 0) {
+               wc_printf("<br>\n");
+               return;
+       }
+
+       /*
+        * Create an imaginary event which spans the 24 hours of today.  Any events which
+        * overlap with this one take place at least partially in this day.  We have to
+        * convert it from a struct tm in order to make it UTC.
+        */
+       memset(&starting_tm, 0, sizeof(struct tm));
+       starting_tm.tm_year = year - 1900;
+       starting_tm.tm_mon = month - 1;
+       starting_tm.tm_mday = day;
+       starting_tm.tm_hour = 0;
+       starting_tm.tm_min = 0;
+       today_start_t = icaltime_from_timet_with_zone(mktime(&starting_tm), 0, icaltimezone_get_utc_timezone());
+
+       memset(&ending_tm, 0, sizeof(struct tm));
+       ending_tm.tm_year = year - 1900;
+       ending_tm.tm_mon = month - 1;
+       ending_tm.tm_mday = day;
+       ending_tm.tm_hour = 23;
+       ending_tm.tm_min = 59;
+       today_end_t = icaltime_from_timet_with_zone(mktime(&ending_tm), 0, icaltimezone_get_utc_timezone());
+
+       /*
+        * Create another one without caring about the timezone for all day events.
+        */
+       today_t = icaltime_null_date();
+       today_t.year = year;
+       today_t.month = month;
+       today_t.day = day;
+
+       /*
+        * Now loop through our list of events to see which ones occur today.
+        */
+       Pos = GetNewHashPos(WCC->disp_cal_items, 0);
+       while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) {
+               Cal = (disp_cal*)vCal;
+               all_day_event = 0;
+               q = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY);
+               if (q != NULL) {
+                       t = icalproperty_get_dtstart(q);
+               }
+               else {
+                       memset(&t, 0, sizeof t);
+               }
+               q = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY);
+               if (q != NULL) {
+                       end_t = icalproperty_get_dtend(q);
+               }
+               else {
+                       memset(&end_t, 0, sizeof end_t);
+               }
+               if (t.is_date) all_day_event = 1;
+
+               if (all_day_event)
+               {
+                       show_event = ical_ctdl_is_overlap(t, end_t, today_t, icaltime_null_time());
+               }
+               else
+               {
+                       show_event = ical_ctdl_is_overlap(t, end_t, today_start_t, today_end_t);
+               }
+
+               /*
+                * If we determined that this event occurs today, then display it.
+                */
+               if (show_event) {
+
+                       /* time_t logtt = icaltime_as_timet(t);
+                       syslog(LOG_DEBUG, "Match on %04d-%02d-%02d for event %x%s on %s",
+                               year, month, day,
+                               (int)Cal, ((all_day_event) ? " (all day)" : ""),
+                               ctime(&logtt)
+                       ); */
+
+                       p = icalcomponent_get_first_property(Cal->cal, ICAL_SUMMARY_PROPERTY);
+                       if (p == NULL) {
+                               p = icalproperty_new_summary(_("Untitled Event"));
+                               icalcomponent_add_property(Cal->cal, p);
+                       }
+                       if (p != NULL) {
+
+                               if (all_day_event) {
+                                       wc_printf("<table border=\"0\" cellpadding=\"2\"><TR>"
+                                               "<td bgcolor=\"#CCCCDD\">"
+                                               );
+                               }
+
+
+                               wc_printf("<font size=\"-1\">"
+                                       "<a class=\"event%s\" href=\"display_edit_event?"
+                                       "msgnum=%ld?calview=month?year=%d?month=%d?day=%d\">"
+                                       ,
+                                       (Cal->unread)?"_unread":"_read",
+                                       Cal->cal_msgnum,
+                                       year, month, day
+                               );
+
+                               escputs((char *) icalproperty_get_comment(p));
+
+                               wc_printf("<span class=\"tooltip\"><span class=\"btttop\"></span><span class=\"bttmiddle\">");
+
+                               wc_printf("<i>%s: %s</i><br>", _("From"), Cal->from);
+                               wc_printf("<i>%s</i> ",          _("Summary:"));
+                               escputs((char *)icalproperty_get_comment(p));
+                               wc_printf("<br>");
+
+                               q = icalcomponent_get_first_property(
+                                       Cal->cal,
+                                       ICAL_LOCATION_PROPERTY);
+                               if (q) {
+                                       wc_printf("<i>%s</i> ", _("Location:"));
+                                       escputs((char *)icalproperty_get_comment(q));
+                                       wc_printf("<br>");
+                               }
+
+                               /*
+                                * Only show start/end times if we're actually looking at the VEVENT
+                                * component.  Otherwise it shows bogus dates for e.g. timezones
+                                */
+                               if (icalcomponent_isa(Cal->cal) == ICAL_VEVENT_COMPONENT) {
+
+                                       q = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY);
+                                       if (q != NULL) {
+                                               int no_end = 0;
+
+                                               t = icalproperty_get_dtstart(q);
+                                               q = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY);
+                                               if (q != NULL) {
+                                                       end_t = icalproperty_get_dtend(q);
+                                               }
+                                               else {
+                                                       /*
+                                                        * events with starting date/time equal
+                                                        * ending date/time might get only
+                                                        * DTSTART but no DTEND
+                                                        */
+                                                       no_end = 1;
+                                               }
+
+                                               if (t.is_date) {
+                                                       /* all day event */
+                                                       struct tm d_tm;
+
+                                                       if (!no_end) {
+                                                               /* end given, have to adjust it */
+                                                               icaltime_adjust(&end_t, -1, 0, 0, 0);
+                                                       }
+                                                       memset(&d_tm, 0, sizeof d_tm);
+                                                       d_tm.tm_year = t.year - 1900;
+                                                       d_tm.tm_mon = t.month - 1;
+                                                       d_tm.tm_mday = t.day;
+                                                       wc_strftime(buf, sizeof buf, "%x", &d_tm);
+
+                                                       if (no_end || !icaltime_compare(t, end_t)) {
+                                                               wc_printf("<i>%s</i> %s<br>",
+                                                                       _("Date:"), buf);
+                                                       }
+                                                       else {
+                                                               wc_printf("<i>%s</i> %s<br>",
+                                                                       _("Starting date:"), buf);
+                                                               d_tm.tm_year = end_t.year - 1900;
+                                                               d_tm.tm_mon = end_t.month - 1;
+                                                               d_tm.tm_mday = end_t.day;
+                                                               wc_strftime(buf, sizeof buf, "%x", &d_tm);
+                                                               wc_printf("<i>%s</i> %s<br>",
+                                                                       _("Ending date:"), buf);
+                                                       }
+                                               }
+                                               else {
+                                                       tt = icaltime_as_timet(t);
+                                                       webcit_fmt_date(buf, 256, tt, DATEFMT_BRIEF);
+                                                       if (no_end || !icaltime_compare(t, end_t)) {
+                                                               wc_printf("<i>%s</i> %s<br>",
+                                                                       _("Date/time:"), buf);
+                                                       }
+                                                       else {
+                                                               wc_printf("<i>%s</i> %s<br>",
+                                                                       _("Starting date/time:"), buf);
+                                                               tt = icaltime_as_timet(end_t);
+                                                               webcit_fmt_date(buf, 256, tt, DATEFMT_BRIEF);
+                                                               wc_printf("<i>%s</i> %s<br>", _("Ending date/time:"), buf);
+                                                       }
+
+                                               }
+                                       }
+
+                               }
+
+                               q = icalcomponent_get_first_property(Cal->cal, ICAL_DESCRIPTION_PROPERTY);
+                               if (q) {
+                                       wc_printf("<i>%s</i> ", _("Notes:"));
+                                       escputs((char *)icalproperty_get_comment(q));
+                                       wc_printf("<br>");
+                               }
+
+                               wc_printf("</span><span class=\"bttbottom\"></span></span>");
+                               wc_printf("</a></font><br>\n");
+
+                               if (all_day_event) {
+                                       wc_printf("</td></tr></table>");
+                               }
+
+                       }
+
+               }
+
+
+       }
+       DeleteHashPos(&Pos);
+}
+
+
+/*
+ * Display one day of a whole month view of a calendar
+ */
+void calendar_month_view_brief_events(time_t thetime, const char *daycolor) {
+       long hklen;
+       const char *HashKey;
+       void *vCal;
+       HashPos *Pos;
+       time_t event_tt;
+       time_t event_tts;
+       time_t event_tte;
+       wcsession *WCC = WC;
+       struct tm event_tms;
+       struct tm event_tme;
+       struct tm today_tm;
+       icalproperty *p;
+       icalproperty *e;
+       struct icaltimetype t;
+       disp_cal *Cal;
+       int all_day_event = 0;
+       char *timeformat;
+       int time_format;
+
+       time_format = get_time_format_cached ();
+
+       if (time_format == WC_TIMEFORMAT_24) timeformat="%k:%M";
+       else timeformat="%I:%M %p";
+
+       localtime_r(&thetime, &today_tm);
+
+       Pos = GetNewHashPos(WCC->disp_cal_items, 0);
+       while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) {
+               Cal = (disp_cal*)vCal;
+               p = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY);
+               if (p != NULL) {
+                       t = icalproperty_get_dtstart(p);
+                       event_tt = icaltime_as_timet(t);
+                       event_tts=event_tt;
+                       if (t.is_date) all_day_event = 1;
+                       else all_day_event = 0;
+
+                       if (all_day_event) {
+                               gmtime_r(&event_tts, &event_tms);
+                       }
+                       else {
+                               localtime_r(&event_tts, &event_tms);
+                       }
+                       /* \todo epoch &! daymask */
+                       if ((event_tms.tm_year == today_tm.tm_year)
+                               && (event_tms.tm_mon == today_tm.tm_mon)
+                       && (event_tms.tm_mday == today_tm.tm_mday)) {
+
+
+                       char sbuf[255];
+                       char ebuf[255];
+
+                       p = icalcomponent_get_first_property(
+                               Cal->cal,
+                               ICAL_SUMMARY_PROPERTY);
+                       if (p == NULL) {
+                               p = icalproperty_new_summary(_("Untitled Event"));
+                               icalcomponent_add_property(Cal->cal, p);
+                       }
+                       e = icalcomponent_get_first_property(
+                               Cal->cal, 
+                               ICAL_DTEND_PROPERTY);
+                       if ((p != NULL) && (e != NULL)) {
+                               time_t difftime;
+                               int hours, minutes;
+                               t = icalproperty_get_dtend(e);
+                               event_tte = icaltime_as_timet(t);
+                               localtime_r(&event_tte, &event_tme);
+                               difftime=(event_tte-event_tts)/60;
+                               hours=(int)(difftime / 60);
+                               minutes=difftime % 60;
+                               wc_printf("<tr><td bgcolor='%s'>%i:%2i</td><td bgcolor='%s'>"
+                                       "<font size=\"-1\">"
+                                       "<a class=\"event%s\" href=\"display_edit_event?msgnum=%ld?calview=calbrief?year=%s?month=%s?day=%s\">",
+                                       daycolor,
+                                       hours, minutes,
+                                       (Cal->unread)?"_unread":"_read",
+                                       daycolor,
+                                       Cal->cal_msgnum,
+                                       bstr("year"),
+                                       bstr("month"),
+                                       bstr("day")
+                                       );
+
+                               escputs((char *)
+                                       icalproperty_get_comment(p));
+                               /* \todo: allso ammitime format */
+                               wc_strftime(&sbuf[0], sizeof(sbuf), timeformat, &event_tms);
+                               wc_strftime(&ebuf[0], sizeof(sbuf), timeformat, &event_tme);
+
+                               wc_printf("</a></font></td>"
+                                       "<td bgcolor='%s'>%s</td><td bgcolor='%s'>%s</td></tr>",
+                                       daycolor,
+                                       sbuf,
+                                       daycolor,
+                                       ebuf);
+                               }
+
+                       }
+
+
+               }
+       }
+       DeleteHashPos(&Pos);
+}
+
+
+/*
+ * view one month. pretty view
+ */
+void calendar_month_view(int year, int month, int day) {
+       struct tm starting_tm;
+       struct tm tm;
+       struct tm today_tm;
+       time_t thetime;
+       int i;
+       time_t previous_month;
+       time_t next_month;
+       time_t colheader_time;
+       time_t today_timet;
+       struct tm colheader_tm;
+       char colheader_label[32];
+       long weekstart = 0;
+
+       /*
+        * Make sure we know which day is today.
+        */
+       today_timet = time(NULL);
+       localtime_r(&today_timet, &today_tm);
+
+       /*
+        * Determine what day to start.  If an impossible value is found, start on Sunday.
+        */
+       get_pref_long("weekstart", &weekstart, 17);
+       if (weekstart > 6) weekstart = 0;
+
+       /*
+        * Now back up to the 1st of the month...
+        */
+       memset(&starting_tm, 0, sizeof(struct tm));
+
+       starting_tm.tm_year = year - 1900;
+       starting_tm.tm_mon = month - 1;
+       starting_tm.tm_mday = day;
+       thetime = mktime(&starting_tm);
+
+       memcpy(&tm, &starting_tm, sizeof(struct tm));
+       while (tm.tm_mday != 1) {
+               thetime = thetime - (time_t)86400;      /* go back 24 hours */
+               localtime_r(&thetime, &tm);
+       }
+
+       /* Determine previous and next months ... for links */
+       previous_month = thetime - (time_t)864000L;     /* back 10 days */
+       next_month = thetime + (time_t)(31L * 86400L);  /* ahead 31 days */
+
+       /* Now back up until we're on the user's preferred start day */
+       localtime_r(&thetime, &tm);
+       while (tm.tm_wday != weekstart) {
+               thetime = thetime - (time_t)86400;      /* go back 24 hours */
+               localtime_r(&thetime, &tm);
+       }
+
+       /* Outer table (to get the background color) */
+       wc_printf("<table class=\"calendar\"> \n <tr><td>"); 
+
+       wc_printf("<table width=\"100%%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>\n");
+
+       wc_printf("<td align=\"center\">");
+
+       localtime_r(&previous_month, &tm);
+       wc_printf("<a href=\"readfwd?calview=month?year=%d?month=%d?day=1\">",
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+       wc_printf("<img alt=\"%s\" align=\"middle\" src=\"static/webcit_icons/essen/32x32/back.png\" border=\"0\"></a>\n", _("previous"));
+
+       wc_strftime(colheader_label, sizeof colheader_label, "%B", &starting_tm);
+       wc_printf("&nbsp;&nbsp;"
+               "<font size=\"+1\" color=\"#FFFFFF\">"
+               "%s %d"
+               "</font>"
+               "&nbsp;&nbsp;", colheader_label, year);
+
+       localtime_r(&next_month, &tm);
+       wc_printf("<a href=\"readfwd?calview=month?year=%d?month=%d?day=1\">",
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+       wc_printf("<img alt=\"%s\" align=\"middle\" src=\"static/webcit_icons/essen/32x32/forward.png\" border=\"0\"></A>\n", _("next"));
+
+       wc_printf("</td></tr></table>\n");
+
+       /* Inner table (the real one) */
+       wc_printf("<table width=\"100%%\" border=\"0\" cellpadding=\"1\" cellspacing=\"1\" "
+               "bgcolor='#204B78' id=\"inner_month\"><tr>");
+       wc_printf("<th align=\"center\" width=\"2%%\"></th>");
+       colheader_time = thetime;
+       for (i=0; i<7; ++i) {
+               colheader_time = thetime + (i * 86400) ;
+               localtime_r(&colheader_time, &colheader_tm);
+               wc_strftime(colheader_label, sizeof colheader_label, "%A", &colheader_tm);
+               wc_printf("<th align=\"center\" width=\"14%%\">"
+                       "<font color=\"#FFFFFF\">%s</font></th>", colheader_label);
+
+       }
+       wc_printf("</tr>\n");
+
+
+        /* Now do 35 or 42 days */
+       localtime_r(&thetime, &tm);
+        for (i = 0; i<42; ++i) {
+
+               /* Before displaying the first day of the week, start a new row */
+               if ((i % 7) == 0) {
+                       wc_printf("<tr><td class=\"week_of_year\">");
+                       wc_strftime(colheader_label, sizeof colheader_label, "%V", &tm);
+                        wc_printf("%s ", colheader_label);
+               }
+
+               wc_printf("<td class=\"cal%s\"><div class=\"day\">",
+                       ((tm.tm_mon != month-1) ? "out" :
+                               (((tm.tm_year == today_tm.tm_year) && (tm.tm_mon == today_tm.tm_mon) && (tm.tm_mday == today_tm.tm_mday)) ? "today" :
+                               ((tm.tm_wday==0 || tm.tm_wday==6) ? "weekend" :
+                                       "day")))
+                       );
+               if ((i==0) || (tm.tm_mday == 1)) {
+                       wc_strftime(colheader_label, sizeof colheader_label, "%B", &tm);
+                       wc_printf("%s ", colheader_label);
+               }
+               wc_printf("<a href=\"readfwd?calview=day?year=%d?month=%d?day=%d\">"
+                       "%d</a></div>",
+                       tm.tm_year + 1900,
+                       tm.tm_mon + 1,
+                       tm.tm_mday,
+                       tm.tm_mday);
+
+               /* put the data here, stupid */
+               calendar_month_view_display_events(
+                       tm.tm_year + 1900,
+                       tm.tm_mon + 1,
+                       tm.tm_mday
+                       );
+
+               wc_printf("</td>");
+
+               /* After displaying the last day of the week, end the row */
+               if ((i % 7) == 6) {
+                       wc_printf("</tr>\n");
+               }
+
+               thetime += (time_t)86400;               /* ahead 24 hours */
+               localtime_r(&thetime, &tm);
+
+               if ( ((i % 7) == 6) && (tm.tm_mon != month-1) && (tm.tm_mday < 15) ) {
+                       i = 100;        /* break out of the loop */
+               }
+       }
+
+       wc_printf("</table>"                    /* end of inner table */
+               "</td></tr></table>\n"          /* end of outer table */
+       );
+}
+
+/*
+ * view one month. brief view
+ */
+void calendar_brief_month_view(int year, int month, int day) {
+       struct tm starting_tm;
+       struct tm tm;
+       time_t thetime;
+       int i;
+       time_t previous_month;
+       time_t next_month;
+       char month_label[32];
+
+       /* Determine what day to start.
+        * First, back up to the 1st of the month...
+        */
+       memset(&starting_tm, 0, sizeof(struct tm));
+       starting_tm.tm_year = year - 1900;
+       starting_tm.tm_mon = month - 1;
+       starting_tm.tm_mday = day;
+       thetime = mktime(&starting_tm);
+
+       memcpy(&tm, &starting_tm, sizeof(struct tm));
+       while (tm.tm_mday != 1) {
+               thetime = thetime - (time_t)86400;      /* go back 24 hours */
+               localtime_r(&thetime, &tm);
+       }
+
+       /* Determine previous and next months ... for links */
+       previous_month = thetime - (time_t)864000L;     /* back 10 days */
+       next_month = thetime + (time_t)(31L * 86400L);  /* ahead 31 days */
+
+       /* Now back up until we're on a Sunday */
+       localtime_r(&thetime, &tm);
+       while (tm.tm_wday != 0) {
+               thetime = thetime - (time_t)86400;      /* go back 24 hours */
+               localtime_r(&thetime, &tm);
+       }
+
+       /* Outer table (to get the background color) */
+       wc_printf("<table width=\"100%%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" "
+               "bgcolor=#204B78><tr><td>\n");
+
+       wc_printf("<table width=\"100%%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>\n");
+
+       wc_printf("<td align=\"center\">");
+
+       localtime_r(&previous_month, &tm);
+       wc_printf("<a href=\"readfwd?calview=month?year=%d?month=%d?day=1\">",
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+       wc_printf("<img alt=\"%s\" align=\"middle\" src=\"static/webcit_icons/essen/32x32/back.png\" border=\"0\"></a>\n", _("previous"));
+
+       wc_strftime(month_label, sizeof month_label, "%B", &tm);
+       wc_printf("&nbsp;&nbsp;"
+               "<font size=\"+1\" color=\"#FFFFFF\">"
+               "%s %d"
+               "</font>"
+               "&nbsp;&nbsp;", month_label, year);
+
+       localtime_r(&next_month, &tm);
+       wc_printf("<a href=\"readfwd?calview=month?year=%d?month=%d?day=1\">",
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+       wc_printf("<img alt=\"%s\" align=\"middle\" src=\"static/webcit_icons/essen/32x32/forward.png\" border=\"0\"></a>\n", _("next"));
+
+       wc_printf("</td></tr></table>\n");
+
+       /* Inner table (the real one) */
+       wc_printf("<table width=\"100%%\" border=\"0\" cellpadding=\"1\" cellspacing=\"1\" "
+               "bgcolor=#EEEECC><TR>");
+       wc_printf("</tr>\n");
+       wc_printf("<tr><td colspan=\"100%%\">\n");
+
+       /* Now do 35 days */
+       for (i = 0; i < 35; ++i) {
+               char weeknumber[255];
+               char weekday_name[32];
+               char *daycolor;
+               localtime_r(&thetime, &tm);
+
+
+               /* Before displaying Sunday, start a new CELL */
+               if ((i % 7) == 0) {
+                       wc_strftime(&weeknumber[0], sizeof(weeknumber), "%U", &tm);
+                       wc_printf("<table border='0' bgcolor=\"#EEEECC\" width='100%%'> <tr><th colspan='4'>%s %s</th></tr>"
+                               "   <tr><td>%s</td><td width='70%%'>%s</td><td>%s</td><td>%s</td></tr>\n",
+                               _("Week"),
+                               weeknumber,
+                               _("Hours"),
+                               _("Subject"),
+                               _("Start"),
+                               _("End")
+                               );
+               }
+
+               daycolor=((tm.tm_mon != month-1) ? "DDDDDD" :
+                       ((tm.tm_wday==0 || tm.tm_wday==6) ? "EEEECC" :
+                               "FFFFFF"));
+
+               /* Day Header */
+               wc_strftime(weekday_name, sizeof weekday_name, "%A", &tm);
+               wc_printf("<tr><td bgcolor='%s' colspan='1' align='left'> %s,%i."
+                       "</td><td bgcolor='%s' colspan='3'><hr></td></tr>\n",
+                       daycolor,
+                       weekday_name,tm.tm_mday,
+                       daycolor);
+
+               /* put the data of one day  here, stupid */
+               calendar_month_view_brief_events(thetime, daycolor);
+
+
+               /* After displaying Saturday, end the row */
+               if ((i % 7) == 6) {
+                       wc_printf("</td></tr></table>\n");
+               }
+
+               thetime += (time_t)86400;               /* ahead 24 hours */
+       }
+
+       wc_printf("</table>"                    /* end of inner table */
+               "</td></tr></table>\n"          /* end of outer table */
+       );
+}
+
+/*
+ * Calendar week view -- not implemented yet, this is a stub function
+ */
+void calendar_week_view(int year, int month, int day) {
+       wc_printf("<center><i>week view FIXME</i></center><br>\n");
+}
+
+
+/*
+ * display one day
+ * Display events for a particular hour of a particular day.
+ * (Specify hour < 0 to show "all day" events)
+ *
+ * dstart and dend indicate which hours our "daytime" begins and end
+ */
+void calendar_day_view_display_events(time_t thetime,
+       int year,
+       int month,
+       int day,
+       int notime_events,
+       int dstart,
+       int dend)
+{
+       long hklen;
+       const char *HashKey;
+       void *vCal;
+       HashPos *Pos;
+       icalproperty *p = NULL;
+       icalproperty *q = NULL;
+       time_t event_tt;
+       time_t event_tte;
+       struct tm event_te;
+       struct tm event_tm;
+       int show_event = 0;
+       int all_day_event = 0;
+       int ongoing_event = 0;
+       wcsession *WCC = WC;
+       disp_cal *Cal;
+       struct icaltimetype t;
+       struct icaltimetype end_t;
+       struct icaltimetype today_start_t;
+       struct icaltimetype today_end_t;
+       struct icaltimetype today_t;
+       struct tm starting_tm;
+       struct tm ending_tm;
+       int top = 0;
+       int bottom = 0;
+       int gap = 1;
+       int startmin = 0;
+       int diffmin = 0;
+       int endmin = 0;
+
+        char buf[256];
+
+       if (GetCount(WCC->disp_cal_items) == 0) {
+               /* nothing to display */
+               return;
+       }
+
+       /* Create an imaginary event which spans the current day.  Any events which
+        * overlap with this one take place at least partially in this day.
+        */
+       memset(&starting_tm, 0, sizeof(struct tm));
+       starting_tm.tm_year = year - 1900;
+       starting_tm.tm_mon = month - 1;
+       starting_tm.tm_mday = day;
+       starting_tm.tm_hour = 0;
+       starting_tm.tm_min = 0;
+       today_start_t = icaltime_from_timet_with_zone(mktime(&starting_tm), 0, icaltimezone_get_utc_timezone());
+
+       memset(&ending_tm, 0, sizeof(struct tm));
+       ending_tm.tm_year = year - 1900;
+       ending_tm.tm_mon = month - 1;
+       ending_tm.tm_mday = day;
+       ending_tm.tm_hour = 23;
+       ending_tm.tm_min = 59;
+       today_end_t = icaltime_from_timet_with_zone(mktime(&ending_tm), 0, icaltimezone_get_utc_timezone());
+
+       /*
+        * Create another one without caring about the timezone for all day events.
+        */
+       today_t = icaltime_null_date();
+       today_t.year = year;
+       today_t.month = month;
+       today_t.day = day;
+
+       /* Now loop through our list of events to see which ones occur today.
+        */
+       Pos = GetNewHashPos(WCC->disp_cal_items, 0);
+       while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) {
+               Cal = (disp_cal*)vCal;
+
+               all_day_event = 0;
+               ongoing_event=0;
+
+               q = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY);
+               if (q != NULL) {
+                       t = icalproperty_get_dtstart(q);
+                       event_tt = icaltime_as_timet(t);
+                       localtime_r(&event_tt, &event_te);
+               }
+               else {
+                       memset(&t, 0, sizeof t);
+               }
+
+               if (t.is_date) all_day_event = 1;
+
+               q = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY);
+               if (q != NULL) {
+                       end_t = icalproperty_get_dtend(q);
+               }
+               else {
+                       /* no end given means end = start */
+                       memcpy(&end_t, &t, sizeof(struct icaltimetype));
+               }
+
+               if (all_day_event)
+               {
+                       show_event = ical_ctdl_is_overlap(t, end_t, today_t, icaltime_null_time());
+                       if (icaltime_compare(t, end_t)) {
+                               /*
+                                * the end date is non-inclusive so adjust it by one
+                                * day because our test is inclusive, note that a day is
+                                * not to much because we are talking about all day
+                                * events
+                                */
+                               icaltime_adjust(&end_t, -1, 0, 0, 0);
+                       }
+               }
+               else
+               {
+                       show_event = ical_ctdl_is_overlap(t, end_t, today_start_t, today_end_t);
+               }
+
+               event_tte = icaltime_as_timet(end_t);
+               localtime_r(&event_tte, &event_tm);
+
+               /* If we determined that this event occurs today, then display it.
+                */
+               p = icalcomponent_get_first_property(Cal->cal,ICAL_SUMMARY_PROPERTY);
+               if (p == NULL) {
+                       p = icalproperty_new_summary(_("Untitled Event"));
+                       icalcomponent_add_property(Cal->cal, p);
+               }
+
+               if ((show_event) && (p != NULL)) {
+
+                       if ((event_te.tm_mday != day) || (event_tm.tm_mday != day)) ongoing_event = 1; 
+
+                       if (all_day_event && notime_events)
+                       {
+                               wc_printf("<li class=\"event_framed%s\"> "
+                                       "<a href=\"display_edit_event?"
+                                       "msgnum=%ld?calview=day?year=%d?month=%d?day=%d\" "
+                                       " class=\"event_title\">"
+                                       ,
+                                       (Cal->unread)?"_unread":"_read",
+                                        Cal->cal_msgnum, year, month, day
+                               );
+                                escputs((char *) icalproperty_get_comment(p));
+                               wc_printf("<span class=\"tooltip\"><span class=\"btttop\"></span><span class=\"bttmiddle\">");
+                                wc_printf("<i>%s</i><br>",      _("All day event"));
+                               wc_printf("<i>%s: %s</i><br>",  _("From"), Cal->from);
+                                wc_printf("<i>%s</i> ",           _("Summary:"));
+                                escputs((char *) icalproperty_get_comment(p));
+                                wc_printf("<br>");
+                               q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY);
+                                if (q) {
+                                        wc_printf("<i>%s</i> ", _("Location:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wc_printf("<br>");
+                               }
+                               if (!icaltime_compare(t, end_t)) { /* one day only */
+                                       webcit_fmt_date(buf, 256, event_tt, DATEFMT_LOCALEDATE);
+                                       wc_printf("<i>%s</i> %s<br>", _("Date:"), buf);
+                               }
+                               else {
+                                       webcit_fmt_date(buf, 256, event_tt, DATEFMT_LOCALEDATE);
+                                       wc_printf("<i>%s</i> %s<br>", _("Starting date:"), buf);
+                                       webcit_fmt_date(buf, 256, event_tte, DATEFMT_LOCALEDATE);
+                                       wc_printf("<i>%s</i> %s<br>", _("Ending date:"), buf);
+                               }
+                               q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY);
+                                if (q) {
+                                        wc_printf("<i>%s</i> ", _("Notes:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wc_printf("<br>");
+                                }
+                               wc_printf("</span><span class=\"bttbottom\"></span></span>");
+                                wc_printf("</a> <span>(");
+                                wc_printf(_("All day event"));
+                                wc_printf(")</span></li>\n");
+                       }
+                       else if (ongoing_event && notime_events) 
+                       {
+                               wc_printf("<li class=\"event_framed%s\"> "
+                                       "<a href=\"display_edit_event?"
+                                       "msgnum=%ld&calview=day?year=%d?month=%d?day=%d\" "
+                                       " class=\"event_title\">" 
+                                       ,
+                                       (Cal->unread)?"_unread":"_read",
+                                       Cal->cal_msgnum, year, month, day
+                               );
+                               escputs((char *) icalproperty_get_comment(p));
+                               wc_printf("<span class=\"tooltip\"><span class=\"btttop\"></span><span class=\"bttmiddle\">");
+                                wc_printf("<i>%s</i><br>",     _("Ongoing event"));
+                               wc_printf("<i>%s: %s</i><br>", _("From"), Cal->from);
+                                wc_printf("<i>%s</i> ",          _("Summary:"));
+                                escputs((char *) icalproperty_get_comment(p));
+                                wc_printf("<br>");
+                                q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY);
+                                if (q) {
+                                        wc_printf("<i>%s</i> ", _("Location:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wc_printf("<br>");
+                                                               }
+                                webcit_fmt_date(buf, 256, event_tt, DATEFMT_BRIEF);
+                                wc_printf("<i>%s</i> %s<br>", _("Starting date/time:"), buf);
+                                webcit_fmt_date(buf, 256, event_tte, DATEFMT_BRIEF);
+                                wc_printf("<i>%s</i> %s<br>", _("Ending date/time:"), buf);
+                                q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY);
+                                if (q) {
+                                        wc_printf("<i>%s</i> ", _("Notes:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wc_printf("<br>");
+                                }
+                                wc_printf("</span><span class=\"bttbottom\"></span></span>");
+                               wc_printf("</a> <span>(");
+                               wc_printf(_("Ongoing event"));
+                               wc_printf(")</span></li>\n");
+                       }
+                       else if (!all_day_event && !notime_events)
+                       {
+                               gap++;
+
+                               if (event_te.tm_mday != day) event_te.tm_hour = 0;
+                               if (event_tm.tm_mday != day) event_tm.tm_hour = 24;
+
+                               /* Calculate the location of the top of the box */
+                               if (event_te.tm_hour < dstart) {
+                                       startmin = diffmin = event_te.tm_min / 6;
+                                       top = (event_te.tm_hour * EXTRATIMELINE) + startmin;
+                               }
+                               else if ((event_te.tm_hour >= dstart) && (event_te.tm_hour <= dend)) {
+                                       startmin = diffmin = (event_te.tm_min / 2);
+                                       top = (dstart * EXTRATIMELINE) + ((event_te.tm_hour - dstart) * TIMELINE) + startmin;
+                               }
+                               else if (event_te.tm_hour >dend) {
+                                       startmin = diffmin = event_te.tm_min / 6;
+                                       top = (dstart * EXTRATIMELINE) + ((dend - dstart - 1) * TIMELINE) + ((event_tm.tm_hour - dend + 1) * EXTRATIMELINE) + startmin ;
+                               }
+                               else {
+                                       /* should never get here */
+                               }
+
+                               /* Calculate the location of the bottom of the box */
+                               if (event_tm.tm_hour < dstart) {
+                                       endmin = diffmin = event_tm.tm_min / 6;
+                                       bottom = (event_tm.tm_hour * EXTRATIMELINE) + endmin;
+                               }
+                               else if ((event_tm.tm_hour >= dstart) && (event_tm.tm_hour <= dend)) {
+                                       endmin = diffmin = (event_tm.tm_min / 2);
+                                       bottom = (dstart * EXTRATIMELINE) + ((event_tm.tm_hour - dstart) * TIMELINE) + endmin ;
+                               }
+                               else if (event_tm.tm_hour >dend) {
+                                       endmin = diffmin = event_tm.tm_min / 6;
+                                       bottom = (dstart * EXTRATIMELINE) + ((dend - dstart + 1) * TIMELINE) + ((event_tm.tm_hour - dend - 1) * EXTRATIMELINE) + endmin;
+                               }
+                               else {
+                                       /* should never get here */
+                               }
+
+                               wc_printf("<dd  class=\"event_framed%s\" "
+                                       "style=\"position: absolute; "
+                                       "top:%dpx; left:%dpx; "
+                                       "height:%dpx; \" >",
+                                       (Cal->unread)?"_unread":"_read",
+                                       top, (gap * 40), (bottom-top)
+                                       );
+                               wc_printf("<a href=\"display_edit_event?"
+                                       "msgnum=%ld?calview=day?year=%d?month=%d?day=%d?hour=%d\" "
+                                       "class=\"event_title\">"
+                                       ,
+                                       Cal->cal_msgnum, year, month, day, t.hour
+                               );
+                               escputs((char *) icalproperty_get_comment(p));
+                               wc_printf("<span class=\"tooltip\"><span class=\"btttop\"></span><span class=\"bttmiddle\">");
+                               wc_printf("<i>%s: %s</i><br>", _("From"), Cal->from);
+                                wc_printf("<i>%s</i> ",          _("Summary:"));
+                                escputs((char *) icalproperty_get_comment(p));
+                                wc_printf("<br>");
+                                q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY);
+                                if (q) {
+                                        wc_printf("<i>%s</i> ", _("Location:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wc_printf("<br>");
+                                                               }
+                               if (!icaltime_compare(t, end_t)) { /* one day only */
+                                       webcit_fmt_date(buf, 256, event_tt, DATEFMT_BRIEF);
+                                       wc_printf("<i>%s</i> %s<br>", _("Date/time:"), buf);
+                               }
+                               else {
+                                       webcit_fmt_date(buf, 256, event_tt, DATEFMT_BRIEF);
+                                       wc_printf("<i>%s</i> %s<br>", _("Starting date/time:"), buf);
+                                       webcit_fmt_date(buf, 256, event_tte, DATEFMT_BRIEF);
+                                       wc_printf("<i>%s</i> %s<br>", _("Ending date/time:"), buf);
+                               }
+                               q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY);
+                                if (q) {
+                                        wc_printf("<i>%s</i> ", _("Notes:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wc_printf("<br>");
+                                }
+                               wc_printf("</span><span class=\"bttbottom\"></span></span>");
+                               wc_printf("</a></dd>\n");
+                       }
+               }
+       }
+       DeleteHashPos(&Pos);
+}
+
+/*
+ * view one day
+ */
+void calendar_day_view(int year, int month, int day) {
+       int hour;
+       struct icaltimetype today, yesterday, tomorrow;
+       long daystart;
+       long dayend;
+       struct tm d_tm;
+       char d_str[160];
+       int time_format;
+       time_t today_t;
+       int timeline = TIMELINE;
+       int extratimeline = EXTRATIMELINE;
+       int gap = 0;
+       int hourlabel;
+       int extrahourlabel;
+
+       time_format = get_time_format_cached ();
+       get_pref_long("daystart", &daystart, 8);
+       get_pref_long("dayend", &dayend, 17);
+
+       /* when loading daystart/dayend, replace missing, corrupt, or impossible values with defaults */
+       if ((daystart < 0) || (dayend < 2) || (daystart >= 23) || (dayend > 23) || (dayend <= daystart)) {
+               daystart = 9;
+               dayend = 17;
+       }
+
+       /* Today's date */
+       memset(&d_tm, 0, sizeof d_tm);
+       d_tm.tm_year = year - 1900;
+       d_tm.tm_mon = month - 1;
+       d_tm.tm_mday = day;
+       today_t = mktime(&d_tm); 
+
+       /* Figure out the dates for "yesterday" and "tomorrow" links */
+
+       memset(&today, 0, sizeof(struct icaltimetype));
+       today.year = year;
+       today.month = month;
+       today.day = day;
+       today.is_date = 1;
+
+       memcpy(&yesterday, &today, sizeof(struct icaltimetype));
+       --yesterday.day;
+       yesterday = icaltime_normalize(yesterday);
+
+       memcpy(&tomorrow, &today, sizeof(struct icaltimetype));
+       ++tomorrow.day;
+       tomorrow = icaltime_normalize(tomorrow);
+
+       /* Inner table (the real one) */
+       wc_printf("<table class=\"calendar\" id=\"inner_day\"><tr> \n");
+
+       /* Innermost cell (contains hours etc.) */
+       wc_printf("<td class=\"events_of_the_day\" >");
+               wc_printf("<dl class=\"events\" >");
+
+       /* Now the middle of the day... */
+
+       extrahourlabel = extratimeline - 2;
+       hourlabel = extrahourlabel * 150 / 100;
+       if (hourlabel > (timeline - 2)) hourlabel = timeline - 2;
+
+       for (hour = 0; hour < daystart; ++hour) {       /* could do HEIGHT=xx */
+               wc_printf("<dt class=\"extrahour\">"
+                       "<a href=\"display_edit_event?msgnum=0"
+                       "?calview=day?year=%d?month=%d?day=%d?hour=%d?minute=0\">",
+/* TODO: what have these been used for?
+                       (hour * extratimeline ),
+                       extratimeline,
+                       extrahourlabel,
+*/
+                       year, month, day, hour
+                       );
+
+               if (time_format == WC_TIMEFORMAT_24) {
+                       wc_printf("%2d:00</a> ", hour);
+               }
+               else {
+                       wc_printf("%d:00%s</a> ",
+                               ((hour == 0) ? 12 : (hour <= 12 ? hour : hour-12)),
+                               (hour < 12 ? "am" : "pm")
+                               );
+               }
+
+               wc_printf("</dt>");
+       }
+
+       gap = daystart * extratimeline;
+
+        for (hour = daystart; hour <= dayend; ++hour) {       /* could do HEIGHT=xx */
+                wc_printf("<dt class=\"hour\">"
+                        "<a href=\"display_edit_event?msgnum=0?calview=day"
+                        "?year=%d?month=%d?day=%d?hour=%d?minute=0\">",
+/*TODO: what have these been used for?
+                        gap + ((hour - daystart) * timeline ),
+                       timeline,
+                       hourlabel,
+*/
+                        year, month, day, hour
+                       );
+
+                if (time_format == WC_TIMEFORMAT_24) {
+                        wc_printf("%2d:00</a> ", hour);
+                }
+                else {
+                        wc_printf("%d:00%s</a> ",
+                                (hour <= 12 ? hour : hour-12),
+                                (hour < 12 ? "am" : "pm")
+                                               );
+                }
+
+                wc_printf("</dt>");
+        }
+
+       gap = gap + ((dayend - daystart + 1) * timeline);
+
+        for (hour = (dayend + 1); hour < 24; ++hour) {       /* could do HEIGHT=xx */
+                wc_printf("<dt class=\"extrahour\">"
+                        "<a href=\"display_edit_event?msgnum=0?calview=day"
+                        "?year=%d?month=%d?day=%d?hour=%d?minute=0\">",
+/*TODO: what have these been used for?
+                        gap + ((hour - dayend - 1) * extratimeline ),
+                       extratimeline,
+                       extrahourlabel,
+*/
+                        year, month, day, hour
+                );
+
+                if (time_format == WC_TIMEFORMAT_24) {
+                        wc_printf("%2d:00</a> ", hour);
+                }
+                else {
+                        wc_printf("%d:00%s</a> ",
+                                (hour <= 12 ? hour : hour-12),
+                                (hour < 12 ? "am" : "pm")
+                        );
+                }
+
+                wc_printf("</dt>");
+        }
+
+       /* Display events with start and end times on this day */
+       calendar_day_view_display_events(today_t, year, month, day, 0, daystart, dayend);
+
+               wc_printf("</dl>");
+       wc_printf("</td>");                     /* end of innermost table */
+
+       /* Display extra events (start/end times not present or not today) in the middle column */
+        wc_printf("<td class=\"extra_events\">");
+
+        wc_printf("<ul>");
+
+        /* Display all-day events */
+       calendar_day_view_display_events(today_t, year, month, day, 1, daystart, dayend);
+
+        wc_printf("</ul>");
+
+       wc_printf("</td>");     /* end extra on the middle */
+
+       wc_printf("<td width='20%%' align=\"center\" valign=top>");     /* begin stuff-on-the-right */
+
+       /* Begin todays-date-with-left-and-right-arrows */
+       wc_printf("<table border=\"0\" width=\"100%%\" "
+               "cellspacing=\"0\" cellpadding=\"0\" bgcolor=\"#FFFFFF\">\n");
+       wc_printf("<tr>");
+
+       /* Left arrow */
+       wc_printf("<td align=\"center\">");
+       wc_printf("<a href=\"readfwd?calview=day?year=%d?month=%d?day=%d\">",
+               yesterday.year, yesterday.month, yesterday.day);
+       wc_printf("<img alt=\"previous\" align=\"middle\" src=\"static/webcit_icons/essen/32x32/back.png\" border=\"0\"></a>");
+       wc_printf("</td>");
+
+       wc_strftime(d_str, sizeof d_str,
+               "<td align=\"center\">"
+               "<font size='+2'>%A</font><br>"
+               "<font size='+2'>%B</font><br>"
+               "<font size='+3'>%d</font><br>"
+               "<font size='+2'>%Y</font><br>"
+               "</td>",
+               &d_tm
+               );
+       wc_printf("%s", d_str);
+
+       /* Right arrow */
+       wc_printf("<td align=\"center\">");
+       wc_printf("<a href=\"readfwd?calview=day?year=%d?month=%d?day=%d\">",
+               tomorrow.year, tomorrow.month, tomorrow.day);
+       wc_printf("<img alt=\"%s\" align=\"middle\" src=\"static/webcit_icons/essen/32x32/forward.png\""
+               " border=\"0\"></a>\n", _("next"));
+       wc_printf("</td>");
+
+       wc_printf("</tr></table>\n");
+       /* End todays-date-with-left-and-right-arrows */
+
+       /* Embed a mini month calendar in this space */
+       wc_printf("<br>\n");
+       embeddable_mini_calendar(year, month);
+
+       wc_printf("</td></tr>");                        /* end stuff-on-the-right */
+       wc_printf("</table>\n");                        /* end of inner table */
+}
+
+
+/*
+ * Display today's events.  Returns the number of items displayed.
+ */
+int calendar_summary_view(void) {
+       long hklen;
+       const char *HashKey;
+       void *vCal;
+       HashPos *Pos;
+       disp_cal *Cal;
+       icalproperty *p;
+       struct icaltimetype t;
+       time_t event_tt;
+       struct tm event_tm;
+       struct tm today_tm;
+       time_t now;
+       int all_day_event = 0;
+       char timestring[SIZ];
+       wcsession *WCC = WC;
+       int num_displayed = 0;
+
+       if (GetCount(WC->disp_cal_items) == 0) {
+               return(0);
+       }
+
+       now = time(NULL);
+       localtime_r(&now, &today_tm);
+
+       Pos = GetNewHashPos(WCC->disp_cal_items, 0);
+       while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) {
+               Cal = (disp_cal*)vCal;
+               p = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY);
+               if (p != NULL) {
+                       t = icalproperty_get_dtstart(p);
+                       event_tt = icaltime_as_timet(t);
+                       if (t.is_date) {
+                               all_day_event = 1;
+                       }
+                       else {
+                               all_day_event = 0;
+                       }
+                       fmt_time(timestring, SIZ, event_tt);
+
+                       if (all_day_event) {
+                               gmtime_r(&event_tt, &event_tm);
+                       }
+                       else {
+                               localtime_r(&event_tt, &event_tm);
+                       }
+
+                       if ( (event_tm.tm_year == today_tm.tm_year)
+                               && (event_tm.tm_mon == today_tm.tm_mon)
+                               && (event_tm.tm_mday == today_tm.tm_mday)
+                       ) {
+
+                               p = icalcomponent_get_first_property(Cal->cal, ICAL_SUMMARY_PROPERTY);
+                               if (p == NULL) {
+                                       p = icalproperty_new_summary(_("Untitled Task"));
+                                       icalcomponent_add_property(Cal->cal, p);
+                               }
+                               if (p != NULL)
+                               {
+                                       if (WCC->CurRoom.view == VIEW_TASKS) {
+                                               wc_printf("<a href=\"display_edit_task"
+                                                       "?msgnum=%ld"
+                                                       "?return_to_summary=1"
+                                                       "?go=",
+                                                       Cal->cal_msgnum
+                                               );
+                                               escputs(ChrPtr(WCC->CurRoom.name));
+                                               wc_printf("\">");
+                                       }
+                                       else {
+                                               wc_printf("<a href=\"display_edit_event"
+                                                       "?msgnum=%ld"
+                                                       "?calview=summary"
+                                                       "?year=%d"
+                                                       "?month=%d"
+                                                       "?day=%d"
+                                                       "?go=",
+                                                       Cal->cal_msgnum,
+                                                       today_tm.tm_year + 1900,
+                                                       today_tm.tm_mon + 1,
+                                                       today_tm.tm_mday
+                                               );
+                                               escputs(ChrPtr(WCC->CurRoom.name));
+                                               wc_printf("\">");
+                                       }
+                                       escputs((char *) icalproperty_get_comment(p));
+                                       if (!all_day_event) {
+                                               wc_printf(" (%s)", timestring);
+                                       }
+                                       wc_printf("</a><br>\n");
+                                       ++num_displayed;
+                               }
+                       }
+               }
+       }
+       DeleteHashPos(&Pos);
+       DeleteHash(&WC->disp_cal_items);
+       return(num_displayed);
+}
+
+/*
+ * Parse the URL variables in order to determine the scope and display of a calendar view
+ */
+int calendar_GetParamsGetServerCall(SharedMessageStatus *Stat,
+                                   void **ViewSpecific,
+                                   long oper,
+                                   char *cmd,
+                                   long len,
+                                   char *filter,
+                                   long flen)
+{
+       wcsession *WCC = WC;
+       calview *c;
+       time_t now;
+       struct tm tm;
+       char cv[32];
+
+       int span = 3888000;
+
+       c = (calview*) malloc(sizeof(calview));
+       memset(c, 0, sizeof(calview));
+       *ViewSpecific = (void*)c;
+
+       Stat->load_seen = 1;
+       strcpy(cmd, "MSGS ALL");
+       Stat->maxmsgs = 32767;
+
+       /* In case no date was specified, go with today */
+       now = time(NULL);
+       localtime_r(&now, &tm);
+       c->year = tm.tm_year + 1900;
+       c->month = tm.tm_mon + 1;
+       c->day = tm.tm_mday;
+
+       /* Now see if a date was specified */
+       if (havebstr("year")) c->year = ibstr("year");
+       if (havebstr("month")) c->month = ibstr("month");
+       if (havebstr("day")) c->day = ibstr("day");
+
+       /* How would you like that cooked? */
+       if (havebstr("calview")) {
+               strcpy(cv, bstr("calview"));
+       }
+       else {
+               strcpy(cv, "month");
+       }
+
+       /* Display the selected view */
+       if (!strcasecmp(cv, "day")) {
+               c->view = calview_day;
+       }
+       else if (!strcasecmp(cv, "week")) {
+               c->view = calview_week;
+       }
+       else if (!strcasecmp(cv, "summary")) {  /* shouldn't ever happen, but just in case */
+               c->view = calview_day;
+       }
+       else {
+               if (WCC->CurRoom.view == VIEW_CALBRIEF) {
+                       c->view = calview_brief;
+               }
+               else {
+                       c->view = calview_month;
+               }
+       }
+
+       /* Now try and set the lower and upper bounds so that we don't
+        * burn too many cpu cycles parsing data way in the past or future
+        */
+
+       tm.tm_year = c->year - 1900;
+       tm.tm_mon = c->month - 1;
+       tm.tm_mday = c->day;
+       now = mktime(&tm);
+
+       if (c->view == calview_month)   span = 3888000;
+       if (c->view == calview_brief)   span = 3888000;
+       if (c->view == calview_week)    span = 604800;
+       if (c->view == calview_day)     span = 86400;
+       if (c->view == calview_summary) span = 86400;
+
+       c->lower_bound = now - span;
+       c->upper_bound = now + span;
+       return 200;
+}
+
+
+
+/*
+ * Render a calendar view from data previously loaded into memory
+ */
+int calendar_RenderView_or_Tail(SharedMessageStatus *Stat,
+                               void **ViewSpecific,
+                               long oper)
+{
+       wcsession *WCC = WC;
+       calview *c = (calview*) *ViewSpecific;
+
+       if (c->view == calview_day) {
+               calendar_day_view(c->year, c->month, c->day);
+       }
+       else if (c->view == calview_week) {
+               calendar_week_view(c->year, c->month, c->day);
+       }
+       else {
+               if (WCC->CurRoom.view == VIEW_CALBRIEF) {
+                       calendar_brief_month_view(c->year, c->month, c->day);
+               }
+               else {
+                       calendar_month_view(c->year, c->month, c->day);
+               }
+       }
+
+       /* Free the in-memory list of calendar items */
+       DeleteHash(&WC->disp_cal_items);
+       return 0;
+}
+
+void 
+InitModule_CALENDAR_VIEW
+(void)
+{
+       WebcitAddUrlHandler(HKEY("mini_calendar"), "", 0, ajax_mini_calendar, AJAX);
+}
diff --git a/webcit/config.guess b/webcit/config.guess
new file mode 100755 (executable)
index 0000000..f772702
--- /dev/null
@@ -0,0 +1,1701 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2021 Free Software Foundation, Inc.
+
+timestamp='2021-01-01'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+me=$(echo "$0" | sed -e 's,.*/,,')
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2021 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+    # prevent multiple calls if $tmp is already set
+    test "$tmp" && return 0
+    : "${TMPDIR=/tmp}"
+    # shellcheck disable=SC2039
+    { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } ||
+       { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+       { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+       { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+    dummy=$tmp/dummy
+    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+       ,,)    echo "int x;" > "$dummy.c"
+              for driver in cc gcc c89 c99 ; do
+                  if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+                      CC_FOR_BUILD="$driver"
+                      break
+                  fi
+              done
+              if test x"$CC_FOR_BUILD" = x ; then
+                  CC_FOR_BUILD=no_compiler_found
+              fi
+              ;;
+       ,,*)   CC_FOR_BUILD=$CC ;;
+       ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+    esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown
+UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown
+UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown
+UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown
+
+case "$UNAME_SYSTEM" in
+Linux|GNU|GNU/*)
+       LIBC=unknown
+
+       set_cc_for_build
+       cat <<-EOF > "$dummy.c"
+       #include <features.h>
+       #if defined(__UCLIBC__)
+       LIBC=uclibc
+       #elif defined(__dietlibc__)
+       LIBC=dietlibc
+       #elif defined(__GLIBC__)
+       LIBC=gnu
+       #else
+       #include <stdarg.h>
+       /* First heuristic to detect musl libc.  */
+       #ifdef __DEFINED_va_list
+       LIBC=musl
+       #endif
+       #endif
+       EOF
+       eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')"
+
+       # Second heuristic to detect musl libc.
+       if [ "$LIBC" = unknown ] &&
+          command -v ldd >/dev/null &&
+          ldd --version 2>&1 | grep -q ^musl; then
+               LIBC=musl
+       fi
+
+       # If the system lacks a compiler, then just pick glibc.
+       # We could probably try harder.
+       if [ "$LIBC" = unknown ]; then
+               LIBC=gnu
+       fi
+       ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \
+           "/sbin/$sysctl" 2>/dev/null || \
+           "/usr/sbin/$sysctl" 2>/dev/null || \
+           echo unknown))
+       case "$UNAME_MACHINE_ARCH" in
+           aarch64eb) machine=aarch64_be-unknown ;;
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           sh5el) machine=sh5le-unknown ;;
+           earmv*)
+               arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,')
+               endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p')
+               machine="${arch}${endian}"-unknown
+               ;;
+           *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently (or will in the future) and ABI.
+       case "$UNAME_MACHINE_ARCH" in
+           earm*)
+               os=netbsdelf
+               ;;
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep -q __ELF__
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # Determine ABI tags.
+       case "$UNAME_MACHINE_ARCH" in
+           earm*)
+               expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+               abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr")
+               ;;
+       esac
+       # The OS release
+       # Debian GNU/NetBSD machines have a different userland, and
+       # thus, need a distinct triplet. However, they do not need
+       # kernel version information, so it can be replaced with a
+       # suitable tag, in the style of linux-gnu.
+       case "$UNAME_VERSION" in
+           Debian*)
+               release='-gnu'
+               ;;
+           *)
+               release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2)
+               ;;
+       esac
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "$machine-${os}${release}${abi-}"
+       exit ;;
+    *:Bitrig:*:*)
+       UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//')
+       echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
+       exit ;;
+    *:OpenBSD:*:*)
+       UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//')
+       echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
+       exit ;;
+    *:LibertyBSD:*:*)
+       UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//')
+       echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
+       exit ;;
+    *:MidnightBSD:*:*)
+       echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
+       exit ;;
+    *:ekkoBSD:*:*)
+       echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
+       exit ;;
+    *:SolidBSD:*:*)
+       echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
+       exit ;;
+    *:OS108:*:*)
+       echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
+       exit ;;
+    macppc:MirBSD:*:*)
+       echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
+       exit ;;
+    *:MirBSD:*:*)
+       echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
+       exit ;;
+    *:Sortix:*:*)
+       echo "$UNAME_MACHINE"-unknown-sortix
+       exit ;;
+    *:Twizzler:*:*)
+       echo "$UNAME_MACHINE"-unknown-twizzler
+       exit ;;
+    *:Redox:*:*)
+       echo "$UNAME_MACHINE"-unknown-redox
+       exit ;;
+    mips:OSF1:*.*)
+       echo mips-dec-osf1
+       exit ;;
+    alpha:OSF1:*:*)
+       case $UNAME_RELEASE in
+       *4.0)
+               UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}')
+               ;;
+       *5.*)
+               UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}')
+               ;;
+       esac
+       # According to Compaq, /usr/sbin/psrinfo has been available on
+       # OSF/1 and Tru64 systems produced since 1995.  I hope that
+       # covers most systems running today.  This code pipes the CPU
+       # types through head -n 1, so we only detect the type of CPU 0.
+       ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1)
+       case "$ALPHA_CPU_TYPE" in
+           "EV4 (21064)")
+               UNAME_MACHINE=alpha ;;
+           "EV4.5 (21064)")
+               UNAME_MACHINE=alpha ;;
+           "LCA4 (21066/21068)")
+               UNAME_MACHINE=alpha ;;
+           "EV5 (21164)")
+               UNAME_MACHINE=alphaev5 ;;
+           "EV5.6 (21164A)")
+               UNAME_MACHINE=alphaev56 ;;
+           "EV5.6 (21164PC)")
+               UNAME_MACHINE=alphapca56 ;;
+           "EV5.7 (21164PC)")
+               UNAME_MACHINE=alphapca57 ;;
+           "EV6 (21264)")
+               UNAME_MACHINE=alphaev6 ;;
+           "EV6.7 (21264A)")
+               UNAME_MACHINE=alphaev67 ;;
+           "EV6.8CB (21264C)")
+               UNAME_MACHINE=alphaev68 ;;
+           "EV6.8AL (21264B)")
+               UNAME_MACHINE=alphaev68 ;;
+           "EV6.8CX (21264D)")
+               UNAME_MACHINE=alphaev68 ;;
+           "EV6.9A (21264/EV69A)")
+               UNAME_MACHINE=alphaev69 ;;
+           "EV7 (21364)")
+               UNAME_MACHINE=alphaev7 ;;
+           "EV7.9 (21364A)")
+               UNAME_MACHINE=alphaev79 ;;
+       esac
+       # A Pn.n version is a patched version.
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)"
+       # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+       exitcode=$?
+       trap '' 0
+       exit $exitcode ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo "$UNAME_MACHINE"-unknown-amigaos
+       exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo "$UNAME_MACHINE"-unknown-morphos
+       exit ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit ;;
+    *:z/VM:*:*)
+       echo s390-ibm-zvmoe
+       exit ;;
+    *:OS400:*:*)
+       echo powerpc-ibm-os400
+       exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix"$UNAME_RELEASE"
+       exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+       echo arm-unknown-riscos
+       exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "$( (/bin/universe) 2>/dev/null)" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit ;;
+    DRS?6000:unix:4.0:6*)
+       echo sparc-icl-nx6
+       exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+       case $(/usr/bin/uname -p) in
+           sparc) echo sparc-icl-nx7; exit ;;
+       esac ;;
+    s390x:SunOS:*:*)
+       echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
+       exit ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
+       exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
+       exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+       echo i386-pc-auroraux"$UNAME_RELEASE"
+       exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+       set_cc_for_build
+       SUN_ARCH=i386
+       # If there is a compiler, see if it is configured for 64-bit objects.
+       # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+       # This test works for both compilers.
+       if test "$CC_FOR_BUILD" != no_compiler_found; then
+           if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+               (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+               grep IS_64BIT_ARCH >/dev/null
+           then
+               SUN_ARCH=x86_64
+           fi
+       fi
+       echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
+       exit ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
+       exit ;;
+    sun4*:SunOS:*:*)
+       case "$(/usr/bin/arch -k)" in
+           Series*|S4*)
+               UNAME_RELEASE=$(uname -v)
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')"
+       exit ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos"$UNAME_RELEASE"
+       exit ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null)
+       test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+       case "$(/bin/arch)" in
+           sun3)
+               echo m68k-sun-sunos"$UNAME_RELEASE"
+               ;;
+           sun4)
+               echo sparc-sun-sunos"$UNAME_RELEASE"
+               ;;
+       esac
+       exit ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos"$UNAME_RELEASE"
+       exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint"$UNAME_RELEASE"
+       exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint"$UNAME_RELEASE"
+       exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+       echo m68k-atari-mint"$UNAME_RELEASE"
+       exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+       echo m68k-milan-mint"$UNAME_RELEASE"
+       exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+       echo m68k-hades-mint"$UNAME_RELEASE"
+       exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+       echo m68k-unknown-mint"$UNAME_RELEASE"
+       exit ;;
+    m68k:machten:*:*)
+       echo m68k-apple-machten"$UNAME_RELEASE"
+       exit ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten"$UNAME_RELEASE"
+       exit ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix"$UNAME_RELEASE"
+       exit ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix"$UNAME_RELEASE"
+       exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix"$UNAME_RELEASE"
+       exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       set_cc_for_build
+       sed 's/^        //' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+         dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') &&
+         SYSTEM_NAME=$("$dummy" "$dummyarg") &&
+           { echo "$SYSTEM_NAME"; exit; }
+       echo mips-mips-riscos"$UNAME_RELEASE"
+       exit ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit ;;
+    AViiON:dgux:*:*)
+       # DG/UX returns AViiON for all architectures
+       UNAME_PROCESSOR=$(/usr/bin/uname -p)
+       if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+       then
+           if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+              test "$TARGET_BINARY_INTERFACE"x = x
+           then
+               echo m88k-dg-dgux"$UNAME_RELEASE"
+           else
+               echo m88k-dg-dguxbcs"$UNAME_RELEASE"
+           fi
+       else
+           echo i586-dg-dgux"$UNAME_RELEASE"
+       fi
+       exit ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')"
+       exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+       exit ;;               # Note that: echo "'$(uname -s)'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit ;;
+    ia64:AIX:*:*)
+       if test -x /usr/bin/oslevel ; then
+               IBM_REV=$(/usr/bin/oslevel)
+       else
+               IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+       fi
+       echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
+       exit ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               set_cc_for_build
+               sed 's/^                //' << EOF > "$dummy.c"
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy")
+               then
+                       echo "$SYSTEM_NAME"
+               else
+                       echo rs6000-ibm-aix3.2.5
+               fi
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit ;;
+    *:AIX:*:[4567])
+       IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }')
+       if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if test -x /usr/bin/lslpp ; then
+               IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc |
+                          awk -F: '{ print $3 }' | sed s/[0-9]*$/0/)
+       else
+               IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+       fi
+       echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
+       exit ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+       echo romp-ibm-bsd4.4
+       exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd"$UNAME_RELEASE"   # 4.3 with uname added to
+       exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
+       case "$UNAME_MACHINE" in
+           9000/31?)            HP_ARCH=m68000 ;;
+           9000/[34]??)         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if test -x /usr/bin/getconf; then
+                   sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null)
+                   sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null)
+                   case "$sc_cpu_version" in
+                     523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+                     528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+                     532)                      # CPU_PA_RISC2_0
+                       case "$sc_kernel_bits" in
+                         32) HP_ARCH=hppa2.0n ;;
+                         64) HP_ARCH=hppa2.0w ;;
+                         '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+                       esac ;;
+                   esac
+               fi
+               if test "$HP_ARCH" = ""; then
+                   set_cc_for_build
+                   sed 's/^            //' << EOF > "$dummy.c"
+
+               #define _HPUX_SOURCE
+               #include <stdlib.h>
+               #include <unistd.h>
+
+               int main ()
+               {
+               #if defined(_SC_KERNEL_BITS)
+                   long bits = sysconf(_SC_KERNEL_BITS);
+               #endif
+                   long cpu  = sysconf (_SC_CPU_VERSION);
+
+                   switch (cpu)
+                       {
+                       case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+                       case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+                       case CPU_PA_RISC2_0:
+               #if defined(_SC_KERNEL_BITS)
+                           switch (bits)
+                               {
+                               case 64: puts ("hppa2.0w"); break;
+                               case 32: puts ("hppa2.0n"); break;
+                               default: puts ("hppa2.0"); break;
+                               } break;
+               #else  /* !defined(_SC_KERNEL_BITS) */
+                           puts ("hppa2.0"); break;
+               #endif
+                       default: puts ("hppa1.0"); break;
+                       }
+                   exit (0);
+               }
+EOF
+                   (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy")
+                   test -z "$HP_ARCH" && HP_ARCH=hppa
+               fi ;;
+       esac
+       if test "$HP_ARCH" = hppa2.0w
+       then
+           set_cc_for_build
+
+           # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+           # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+           # generating 64-bit code.  GNU and HP use different nomenclature:
+           #
+           # $ CC_FOR_BUILD=cc ./config.guess
+           # => hppa2.0w-hp-hpux11.23
+           # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+           # => hppa64-hp-hpux11.23
+
+           if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+               grep -q __LP64__
+           then
+               HP_ARCH=hppa2.0w
+           else
+               HP_ARCH=hppa64
+           fi
+       fi
+       echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
+       exit ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
+       echo ia64-hp-hpux"$HPUX_REV"
+       exit ;;
+    3050*:HI-UX:*:*)
+       set_cc_for_build
+       sed 's/^        //' << EOF > "$dummy.c"
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") &&
+               { echo "$SYSTEM_NAME"; exit; }
+       echo unknown-hitachi-hiuxwe2
+       exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+       echo hppa1.1-hp-bsd
+       exit ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+       echo hppa1.1-hp-osf
+       exit ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit ;;
+    i*86:OSF1:*:*)
+       if test -x /usr/sbin/sysversion ; then
+           echo "$UNAME_MACHINE"-unknown-osf1mk
+       else
+           echo "$UNAME_MACHINE"-unknown-osf1
+       fi
+       exit ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+       exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+       exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+       exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+       exit ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    *:UNICOS/mp:*:*)
+       echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)
+       FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
+       FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/')
+       echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    5000:UNIX_System_V:4.*:*)
+       FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
+       FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/')
+       echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
+       exit ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi"$UNAME_RELEASE"
+       exit ;;
+    *:BSD/OS:*:*)
+       echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
+       exit ;;
+    arm:FreeBSD:*:*)
+       UNAME_PROCESSOR=$(uname -p)
+       set_cc_for_build
+       if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+           | grep -q __ARM_PCS_VFP
+       then
+           echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi
+       else
+           echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf
+       fi
+       exit ;;
+    *:FreeBSD:*:*)
+       UNAME_PROCESSOR=$(/usr/bin/uname -p)
+       case "$UNAME_PROCESSOR" in
+           amd64)
+               UNAME_PROCESSOR=x86_64 ;;
+           i386)
+               UNAME_PROCESSOR=i586 ;;
+       esac
+       echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
+       exit ;;
+    i*:CYGWIN*:*)
+       echo "$UNAME_MACHINE"-pc-cygwin
+       exit ;;
+    *:MINGW64*:*)
+       echo "$UNAME_MACHINE"-pc-mingw64
+       exit ;;
+    *:MINGW*:*)
+       echo "$UNAME_MACHINE"-pc-mingw32
+       exit ;;
+    *:MSYS*:*)
+       echo "$UNAME_MACHINE"-pc-msys
+       exit ;;
+    i*:PW*:*)
+       echo "$UNAME_MACHINE"-pc-pw32
+       exit ;;
+    *:Interix*:*)
+       case "$UNAME_MACHINE" in
+           x86)
+               echo i586-pc-interix"$UNAME_RELEASE"
+               exit ;;
+           authenticamd | genuineintel | EM64T)
+               echo x86_64-unknown-interix"$UNAME_RELEASE"
+               exit ;;
+           IA64)
+               echo ia64-unknown-interix"$UNAME_RELEASE"
+               exit ;;
+       esac ;;
+    i*:UWIN*:*)
+       echo "$UNAME_MACHINE"-pc-uwin
+       exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+       echo x86_64-pc-cygwin
+       exit ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
+       exit ;;
+    *:GNU:*:*)
+       # the GNU system
+       echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')"
+       exit ;;
+    *:GNU/*:*:*)
+       # other systems with GNU libc and userland
+       echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC"
+       exit ;;
+    *:Minix:*:*)
+       echo "$UNAME_MACHINE"-unknown-minix
+       exit ;;
+    aarch64:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    aarch64_be:Linux:*:*)
+       UNAME_MACHINE=aarch64_be
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    alpha:Linux:*:*)
+       case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+       esac
+       objdump --private-headers /bin/sh | grep -q ld.so.1
+       if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    arm*:Linux:*:*)
+       set_cc_for_build
+       if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+           | grep -q __ARM_EABI__
+       then
+           echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       else
+           if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+               | grep -q __ARM_PCS_VFP
+           then
+               echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
+           else
+               echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
+           fi
+       fi
+       exit ;;
+    avr32*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    cris:Linux:*:*)
+       echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+       exit ;;
+    crisv32:Linux:*:*)
+       echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+       exit ;;
+    e2k:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    frv:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    hexagon:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    i*86:Linux:*:*)
+       echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+       exit ;;
+    ia64:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    k1om:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    m32r*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    m68*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+       set_cc_for_build
+       IS_GLIBC=0
+       test x"${LIBC}" = xgnu && IS_GLIBC=1
+       sed 's/^        //' << EOF > "$dummy.c"
+       #undef CPU
+       #undef mips
+       #undef mipsel
+       #undef mips64
+       #undef mips64el
+       #if ${IS_GLIBC} && defined(_ABI64)
+       LIBCABI=gnuabi64
+       #else
+       #if ${IS_GLIBC} && defined(_ABIN32)
+       LIBCABI=gnuabin32
+       #else
+       LIBCABI=${LIBC}
+       #endif
+       #endif
+
+       #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+       CPU=mipsisa64r6
+       #else
+       #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+       CPU=mipsisa32r6
+       #else
+       #if defined(__mips64)
+       CPU=mips64
+       #else
+       CPU=mips
+       #endif
+       #endif
+       #endif
+
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       MIPS_ENDIAN=el
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       MIPS_ENDIAN=
+       #else
+       MIPS_ENDIAN=
+       #endif
+       #endif
+EOF
+       eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')"
+       test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+       ;;
+    mips64el:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    openrisc*:Linux:*:*)
+       echo or1k-unknown-linux-"$LIBC"
+       exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    padre:Linux:*:*)
+       echo sparc-unknown-linux-"$LIBC"
+       exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-"$LIBC"
+       exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in
+         PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
+         PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
+         *)    echo hppa-unknown-linux-"$LIBC" ;;
+       esac
+       exit ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-"$LIBC"
+       exit ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-"$LIBC"
+       exit ;;
+    ppc64le:Linux:*:*)
+       echo powerpc64le-unknown-linux-"$LIBC"
+       exit ;;
+    ppcle:Linux:*:*)
+       echo powerpcle-unknown-linux-"$LIBC"
+       exit ;;
+    riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
+       exit ;;
+    sh64*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    sh*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    tile*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    vax:Linux:*:*)
+       echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
+       exit ;;
+    x86_64:Linux:*:*)
+       set_cc_for_build
+       LIBCABI=$LIBC
+       if test "$CC_FOR_BUILD" != no_compiler_found; then
+           if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+               (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+               grep IS_X32 >/dev/null
+           then
+               LIBCABI="$LIBC"x32
+           fi
+       fi
+       echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI"
+       exit ;;
+    xtensa*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+       # Unixware is an offshoot of SVR4, but it has its own version
+       # number series starting with 2...
+       # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+       # Use sysv4.2uw... so that sysv4* matches it.
+       echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
+       exit ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo "$UNAME_MACHINE"-pc-os2-emx
+       exit ;;
+    i*86:XTS-300:*:STOP)
+       echo "$UNAME_MACHINE"-unknown-stop
+       exit ;;
+    i*86:atheos:*:*)
+       echo "$UNAME_MACHINE"-unknown-atheos
+       exit ;;
+    i*86:syllable:*:*)
+       echo "$UNAME_MACHINE"-pc-syllable
+       exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+       echo i386-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    i*86:*DOS:*:*)
+       echo "$UNAME_MACHINE"-pc-msdosdjgpp
+       exit ;;
+    i*86:*:4.*:*)
+       UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//')
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
+       else
+               echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
+       fi
+       exit ;;
+    i*86:*:5:[678]*)
+       # UnixWare 7.x, OpenUNIX and OpenServer 6.
+       case $(/bin/uname -X | grep "^Machine") in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
+       exit ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=$(sed -n 's/.*Version //p' </usr/options/cb.name)
+               echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //'))
+               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
+       else
+               echo "$UNAME_MACHINE"-pc-sysv32
+       fi
+       exit ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+       # uname -m prints for DJGPP always 'pc', but it prints nothing about
+       # the processor, so we play safe by assuming i586.
+       # Note: whatever this is, it MUST be the same as what config.sub
+       # prints for the "djgpp" host, or else GDB configure will decide that
+       # this is a cross-build.
+       echo i586-pc-msdosdjgpp
+       exit ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv"$UNAME_RELEASE"  # Unknown i860-SVR4
+       fi
+       exit ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+       echo m68k-convergent-sysv
+       exit ;;
+    M680?0:D-NIX:5.3:*)
+       echo m68k-diab-dnix
+       exit ;;
+    M68*:*:R3V[5678]*:*)
+       test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+       OS_REL='.3'
+       test -r /etc/.relid \
+           && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+           && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+           && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+           && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+       echo powerpc-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv"$UNAME_RELEASE"
+       exit ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=$( (uname -p) 2>/dev/null)
+               echo "$UNAME_MACHINE"-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit ;;
+    PENTIUM:*:4.0*:*)  # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                       # says <Richard.M.Bartel@ccMail.Census.GOV>
+       echo i586-unisys-sysv4
+       exit ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit ;;
+    i*86:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo "$UNAME_MACHINE"-stratus-vos
+       exit ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux"$UNAME_RELEASE"
+       exit ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if test -d /usr/nec; then
+               echo mips-nec-sysv"$UNAME_RELEASE"
+       else
+               echo mips-unknown-sysv"$UNAME_RELEASE"
+       fi
+       exit ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit ;;
+    BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
+       echo i586-pc-haiku
+       exit ;;
+    x86_64:Haiku:*:*)
+       echo x86_64-unknown-haiku
+       exit ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-6:SUPER-UX:*:*)
+       echo sx6-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-7:SUPER-UX:*:*)
+       echo sx7-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-8:SUPER-UX:*:*)
+       echo sx8-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-8R:SUPER-UX:*:*)
+       echo sx8r-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-ACE:SUPER-UX:*:*)
+       echo sxace-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody"$UNAME_RELEASE"
+       exit ;;
+    *:Rhapsody:*:*)
+       echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
+       exit ;;
+    arm64:Darwin:*:*)
+       echo aarch64-apple-darwin"$UNAME_RELEASE"
+       exit ;;
+    *:Darwin:*:*)
+       UNAME_PROCESSOR=$(uname -p)
+       case $UNAME_PROCESSOR in
+           unknown) UNAME_PROCESSOR=powerpc ;;
+       esac
+       if command -v xcode-select > /dev/null 2> /dev/null && \
+               ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+           # Avoid executing cc if there is no toolchain installed as
+           # cc will be a stub that puts up a graphical alert
+           # prompting the user to install developer tools.
+           CC_FOR_BUILD=no_compiler_found
+       else
+           set_cc_for_build
+       fi
+       if test "$CC_FOR_BUILD" != no_compiler_found; then
+           if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+                  (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+                  grep IS_64BIT_ARCH >/dev/null
+           then
+               case $UNAME_PROCESSOR in
+                   i386) UNAME_PROCESSOR=x86_64 ;;
+                   powerpc) UNAME_PROCESSOR=powerpc64 ;;
+               esac
+           fi
+           # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+           if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+                  (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+                  grep IS_PPC >/dev/null
+           then
+               UNAME_PROCESSOR=powerpc
+           fi
+       elif test "$UNAME_PROCESSOR" = i386 ; then
+           # uname -m returns i386 or x86_64
+           UNAME_PROCESSOR=$UNAME_MACHINE
+       fi
+       echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
+       exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       UNAME_PROCESSOR=$(uname -p)
+       if test "$UNAME_PROCESSOR" = x86; then
+               UNAME_PROCESSOR=i386
+               UNAME_MACHINE=pc
+       fi
+       echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
+       exit ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit ;;
+    NEO-*:NONSTOP_KERNEL:*:*)
+       echo neo-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+       echo nse-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    NSR-*:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    NSV-*:NONSTOP_KERNEL:*:*)
+       echo nsv-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    NSX-*:NONSTOP_KERNEL:*:*)
+       echo nsx-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit ;;
+    DS/*:UNIX_System_V:*:*)
+       echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
+       exit ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       # shellcheck disable=SC2154
+       if test "$cputype" = 386; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo "$UNAME_MACHINE"-unknown-plan9
+       exit ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit ;;
+    SEI:*:*:SEIUX)
+       echo mips-sei-seiux"$UNAME_RELEASE"
+       exit ;;
+    *:DragonFly:*:*)
+       echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
+       exit ;;
+    *:*VMS:*:*)
+       UNAME_MACHINE=$( (uname -p) 2>/dev/null)
+       case "$UNAME_MACHINE" in
+           A*) echo alpha-dec-vms ; exit ;;
+           I*) echo ia64-dec-vms ; exit ;;
+           V*) echo vax-dec-vms ; exit ;;
+       esac ;;
+    *:XENIX:*:SysV)
+       echo i386-pc-xenix
+       exit ;;
+    i*86:skyos:*:*)
+       echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')"
+       exit ;;
+    i*86:rdos:*:*)
+       echo "$UNAME_MACHINE"-pc-rdos
+       exit ;;
+    i*86:AROS:*:*)
+       echo "$UNAME_MACHINE"-pc-aros
+       exit ;;
+    x86_64:VMkernel:*:*)
+       echo "$UNAME_MACHINE"-unknown-esx
+       exit ;;
+    amd64:Isilon\ OneFS:*:*)
+       echo x86_64-unknown-onefs
+       exit ;;
+    *:Unleashed:*:*)
+       echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
+       exit ;;
+esac
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+  "4"
+#else
+  ""
+#endif
+  ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null);
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+  struct utsname un;
+
+  uname(&un);
+  if (strncmp(un.version, "V2", 2) == 0) {
+    printf ("i386-sequent-ptx2\n"); exit (0);
+  }
+  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+    printf ("i386-sequent-ptx1\n"); exit (0);
+  }
+  printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+  printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+  printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname un;
+  uname (&un);
+  printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname *un;
+  uname (&un);
+  printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) &&
+       { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM" in
+    mips:Linux | mips64:Linux)
+       # If we got here on MIPS GNU/Linux, output extra information.
+       cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+       ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+year=$(echo $timestamp | sed 's,-.*,,')
+# shellcheck disable=SC2003
+if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then
+   cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = $( (uname -m) 2>/dev/null || echo unknown)
+uname -r = $( (uname -r) 2>/dev/null || echo unknown)
+uname -s = $( (uname -s) 2>/dev/null || echo unknown)
+uname -v = $( (uname -v) 2>/dev/null || echo unknown)
+
+/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null)
+/bin/uname -X     = $( (/bin/uname -X) 2>/dev/null)
+
+hostinfo               = $( (hostinfo) 2>/dev/null)
+/bin/universe          = $( (/bin/universe) 2>/dev/null)
+/usr/bin/arch -k       = $( (/usr/bin/arch -k) 2>/dev/null)
+/bin/arch              = $( (/bin/arch) 2>/dev/null)
+/usr/bin/oslevel       = $( (/usr/bin/oslevel) 2>/dev/null)
+/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null)
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM  = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/webcit/config.rpath b/webcit/config.rpath
new file mode 100755 (executable)
index 0000000..39a3e15
--- /dev/null
@@ -0,0 +1,548 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+#   Copyright 1996-2003 Free Software Foundation, Inc.
+#   Taken from GNU libtool, 2001
+#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License, version 3.
+#   the Free Software Foundation; either version 2 of the License, or
+#   
+#
+#   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.
+#
+#   
+#   
+#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#   As a special exception to the GNU General Public License, if you
+#   distribute this file as part of a program that contains a
+#   configuration script generated by Autoconf, you may include it under
+#   the same distribution terms that you use for the rest of that program.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+#   than 256 bytes, otherwise the compiler driver will dump core. The only
+#   known workaround is to choose shorter directory names for the build
+#   directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+  wl='-Wl,'
+else
+  case "$host_os" in
+    aix*)
+      wl='-Wl,'
+      ;;
+    mingw* | pw32* | os2*)
+      ;;
+    hpux9* | hpux10* | hpux11*)
+      wl='-Wl,'
+      ;;
+    irix5* | irix6* | nonstopux*)
+      wl='-Wl,'
+      ;;
+    newsos6)
+      ;;
+    linux*)
+      case $CC in
+        icc|ecc)
+          wl='-Wl,'
+          ;;
+        ccc)
+          wl='-Wl,'
+          ;;
+      esac
+      ;;
+    osf3* | osf4* | osf5*)
+      wl='-Wl,'
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      wl='-Wl,'
+      ;;
+    sunos4*)
+      wl='-Qoption ld '
+      ;;
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      wl='-Wl,'
+      ;;
+    sysv4*MP*)
+      ;;
+    uts4*)
+      ;;
+  esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  case "$host_os" in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+        ld_shlibs=no
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can use
+      # them.
+      ld_shlibs=no
+      ;;
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    cygwin* | mingw* | pw32*)
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    netbsd*)
+      ;;
+    solaris* | sysv5*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+        ld_shlibs=no
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    sunos4*)
+      hardcode_direct=yes
+      ;;
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+  esac
+  if test "$ld_shlibs" = yes; then
+    # Unlike libtool, we use -rpath here, not --rpath, since the documented
+    # option of GNU ld is called -rpath, not --rpath.
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  fi
+else
+  case "$host_os" in
+    aix3*)
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes; then
+        # Neither direct hardcoding nor static linking is supported with a
+        # broken collect2.
+        hardcode_direct=unsupported
+      fi
+      ;;
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+        # On IA64, the linker does run time linking by default, so we don't
+        # have to do anything special.
+        aix_use_runtimelinking=no
+      else
+        aix_use_runtimelinking=no
+        # Test if we are trying to use run time linking or normal
+        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+        # need to do runtime linking.
+        case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+          for ld_flag in $LDFLAGS; do
+            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+              aix_use_runtimelinking=yes
+              break
+            fi
+          done
+        esac
+      fi
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      if test "$GCC" = yes; then
+        case $host_os in aix4.[012]|aix4.[012].*)
+          collect2name=`${CC} -print-prog-name=collect2`
+          if test -f "$collect2name" && \
+            strings "$collect2name" | grep resolve_lib_name >/dev/null
+          then
+            # We have reworked collect2
+            hardcode_direct=yes
+          else
+            # We have old collect2
+            hardcode_direct=unsupported
+            hardcode_minus_L=yes
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_libdir_separator=
+          fi
+        esac
+      fi
+      # Begin _LT_AC_SYS_LIBPATH_AIX.
+      echo 'int main () { return 0; }' > conftest.c
+      ${CC} ${LDFLAGS} conftest.c -o conftest
+      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      if test -z "$aix_libpath"; then
+        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      fi
+      if test -z "$aix_libpath"; then
+        aix_libpath="/usr/lib:/lib"
+      fi
+      rm -f conftest.c conftest
+      # End _LT_AC_SYS_LIBPATH_AIX.
+      if test "$aix_use_runtimelinking" = yes; then
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+      else
+        if test "$host_cpu" = ia64; then
+          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+        else
+          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        fi
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs=no
+      ;;
+    bsdi4*)
+      ;;
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      libext=lib
+      ;;
+    darwin* | rhapsody*)
+      if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then
+        hardcode_direct=no
+      fi
+      ;;
+    dgux*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+    freebsd2.2*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    freebsd2*)
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    freebsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    hpux9*)
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      ;;
+    hpux10* | hpux11*)
+      if test "$with_gnu_ld" = no; then
+        case "$host_cpu" in
+          hppa*64*)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=no
+            ;;
+          ia64*)
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_direct=no
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=yes
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+        esac
+      fi
+      ;;
+    irix5* | irix6* | nonstopux*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    netbsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    newsos6)
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    openbsd*)
+      hardcode_direct=yes
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      else
+        case "$host_os" in
+          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+            hardcode_libdir_flag_spec='-R$libdir'
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+            ;;
+        esac
+      fi
+      ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      ;;
+    osf3*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    osf4* | osf5*)
+      if test "$GCC" = yes; then
+        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+        # Both cc and cxx compiler support -rpath directly
+        hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      ;;
+    sunos4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    sysv4)
+      case $host_vendor in
+        sni)
+          hardcode_direct=yes # is this really true???
+          ;;
+        siemens)
+          hardcode_direct=no
+          ;;
+        motorola)
+          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+          ;;
+      esac
+      ;;
+    sysv4.3*)
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        ld_shlibs=yes
+      fi
+      ;;
+    sysv4.2uw2*)
+      hardcode_direct=yes
+      hardcode_minus_L=no
+      ;;
+    sysv5OpenUNIX8* | sysv5UnixWare7* |  sysv5uw[78]* | unixware7*)
+      ;;
+    sysv5*)
+      hardcode_libdir_flag_spec=
+      ;;
+    uts4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    *)
+      ld_shlibs=no
+      ;;
+  esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+libname_spec='lib$name'
+case "$host_os" in
+  aix3*)
+    ;;
+  aix4* | aix5*)
+    ;;
+  amigaos*)
+    ;;
+  beos*)
+    ;;
+  bsdi4*)
+    ;;
+  cygwin* | mingw* | pw32*)
+    shrext=.dll
+    ;;
+  darwin* | rhapsody*)
+    shrext=.dylib
+    ;;
+  dgux*)
+    ;;
+  freebsd1*)
+    ;;
+  freebsd*)
+    ;;
+  gnu*)
+    ;;
+  hpux9* | hpux10* | hpux11*)
+    case "$host_cpu" in
+      ia64*)
+        shrext=.so
+        ;;
+      hppa*64*)
+        shrext=.sl
+        ;;
+      *)
+        shrext=.sl
+        ;;
+    esac
+    ;;
+  irix5* | irix6* | nonstopux*)
+    case "$host_os" in
+      irix5* | nonstopux*)
+        libsuff= shlibsuff=
+        ;;
+      *)
+        case $LD in
+          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+          *) libsuff= shlibsuff= ;;
+        esac
+        ;;
+    esac
+    ;;
+  linux*oldld* | linux*aout* | linux*coff*)
+    ;;
+  linux*)
+    ;;
+  netbsd*)
+    ;;
+  newsos6)
+    ;;
+  nto-qnx)
+    ;;
+  openbsd*)
+    ;;
+  os2*)
+    libname_spec='$name'
+    shrext=.dll
+    ;;
+  osf3* | osf4* | osf5*)
+    ;;
+  sco3.2v5*)
+    ;;
+  solaris*)
+    ;;
+  sunos4*)
+    ;;
+  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+    ;;
+  sysv4*MP*)
+    ;;
+  uts4*)
+    ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/webcit/config.sub b/webcit/config.sub
new file mode 100755 (executable)
index 0000000..b0f8492
--- /dev/null
@@ -0,0 +1,1855 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2021 Free Software Foundation, Inc.
+
+timestamp='2021-01-07'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=$(echo "$0" | sed -e 's,.*/,,')
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2021 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo "$1"
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+
+# Separate into logical components for further validation
+case $1 in
+       *-*-*-*-*)
+               echo Invalid configuration \`"$1"\': more than four components >&2
+               exit 1
+               ;;
+       *-*-*-*)
+               basic_machine=$field1-$field2
+               basic_os=$field3-$field4
+               ;;
+       *-*-*)
+               # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+               # parts
+               maybe_os=$field2-$field3
+               case $maybe_os in
+                       nto-qnx* | linux-* | uclinux-uclibc* \
+                       | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+                       | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+                       | storm-chaos* | os2-emx* | rtmk-nova*)
+                               basic_machine=$field1
+                               basic_os=$maybe_os
+                               ;;
+                       android-linux)
+                               basic_machine=$field1-unknown
+                               basic_os=linux-android
+                               ;;
+                       *)
+                               basic_machine=$field1-$field2
+                               basic_os=$field3
+                               ;;
+               esac
+               ;;
+       *-*)
+               # A lone config we happen to match not fitting any pattern
+               case $field1-$field2 in
+                       decstation-3100)
+                               basic_machine=mips-dec
+                               basic_os=
+                               ;;
+                       *-*)
+                               # Second component is usually, but not always the OS
+                               case $field2 in
+                                       # Prevent following clause from handling this valid os
+                                       sun*os*)
+                                               basic_machine=$field1
+                                               basic_os=$field2
+                                               ;;
+                                       # Manufacturers
+                                       dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+                                       | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+                                       | unicom* | ibm* | next | hp | isi* | apollo | altos* \
+                                       | convergent* | ncr* | news | 32* | 3600* | 3100* \
+                                       | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+                                       | ultra | tti* | harris | dolphin | highlevel | gould \
+                                       | cbm | ns | masscomp | apple | axis | knuth | cray \
+                                       | microblaze* | sim | cisco \
+                                       | oki | wec | wrs | winbond)
+                                               basic_machine=$field1-$field2
+                                               basic_os=
+                                               ;;
+                                       *)
+                                               basic_machine=$field1
+                                               basic_os=$field2
+                                               ;;
+                               esac
+                       ;;
+               esac
+               ;;
+       *)
+               # Convert single-component short-hands not valid as part of
+               # multi-component configurations.
+               case $field1 in
+                       386bsd)
+                               basic_machine=i386-pc
+                               basic_os=bsd
+                               ;;
+                       a29khif)
+                               basic_machine=a29k-amd
+                               basic_os=udi
+                               ;;
+                       adobe68k)
+                               basic_machine=m68010-adobe
+                               basic_os=scout
+                               ;;
+                       alliant)
+                               basic_machine=fx80-alliant
+                               basic_os=
+                               ;;
+                       altos | altos3068)
+                               basic_machine=m68k-altos
+                               basic_os=
+                               ;;
+                       am29k)
+                               basic_machine=a29k-none
+                               basic_os=bsd
+                               ;;
+                       amdahl)
+                               basic_machine=580-amdahl
+                               basic_os=sysv
+                               ;;
+                       amiga)
+                               basic_machine=m68k-unknown
+                               basic_os=
+                               ;;
+                       amigaos | amigados)
+                               basic_machine=m68k-unknown
+                               basic_os=amigaos
+                               ;;
+                       amigaunix | amix)
+                               basic_machine=m68k-unknown
+                               basic_os=sysv4
+                               ;;
+                       apollo68)
+                               basic_machine=m68k-apollo
+                               basic_os=sysv
+                               ;;
+                       apollo68bsd)
+                               basic_machine=m68k-apollo
+                               basic_os=bsd
+                               ;;
+                       aros)
+                               basic_machine=i386-pc
+                               basic_os=aros
+                               ;;
+                       aux)
+                               basic_machine=m68k-apple
+                               basic_os=aux
+                               ;;
+                       balance)
+                               basic_machine=ns32k-sequent
+                               basic_os=dynix
+                               ;;
+                       blackfin)
+                               basic_machine=bfin-unknown
+                               basic_os=linux
+                               ;;
+                       cegcc)
+                               basic_machine=arm-unknown
+                               basic_os=cegcc
+                               ;;
+                       convex-c1)
+                               basic_machine=c1-convex
+                               basic_os=bsd
+                               ;;
+                       convex-c2)
+                               basic_machine=c2-convex
+                               basic_os=bsd
+                               ;;
+                       convex-c32)
+                               basic_machine=c32-convex
+                               basic_os=bsd
+                               ;;
+                       convex-c34)
+                               basic_machine=c34-convex
+                               basic_os=bsd
+                               ;;
+                       convex-c38)
+                               basic_machine=c38-convex
+                               basic_os=bsd
+                               ;;
+                       cray)
+                               basic_machine=j90-cray
+                               basic_os=unicos
+                               ;;
+                       crds | unos)
+                               basic_machine=m68k-crds
+                               basic_os=
+                               ;;
+                       da30)
+                               basic_machine=m68k-da30
+                               basic_os=
+                               ;;
+                       decstation | pmax | pmin | dec3100 | decstatn)
+                               basic_machine=mips-dec
+                               basic_os=
+                               ;;
+                       delta88)
+                               basic_machine=m88k-motorola
+                               basic_os=sysv3
+                               ;;
+                       dicos)
+                               basic_machine=i686-pc
+                               basic_os=dicos
+                               ;;
+                       djgpp)
+                               basic_machine=i586-pc
+                               basic_os=msdosdjgpp
+                               ;;
+                       ebmon29k)
+                               basic_machine=a29k-amd
+                               basic_os=ebmon
+                               ;;
+                       es1800 | OSE68k | ose68k | ose | OSE)
+                               basic_machine=m68k-ericsson
+                               basic_os=ose
+                               ;;
+                       gmicro)
+                               basic_machine=tron-gmicro
+                               basic_os=sysv
+                               ;;
+                       go32)
+                               basic_machine=i386-pc
+                               basic_os=go32
+                               ;;
+                       h8300hms)
+                               basic_machine=h8300-hitachi
+                               basic_os=hms
+                               ;;
+                       h8300xray)
+                               basic_machine=h8300-hitachi
+                               basic_os=xray
+                               ;;
+                       h8500hms)
+                               basic_machine=h8500-hitachi
+                               basic_os=hms
+                               ;;
+                       harris)
+                               basic_machine=m88k-harris
+                               basic_os=sysv3
+                               ;;
+                       hp300 | hp300hpux)
+                               basic_machine=m68k-hp
+                               basic_os=hpux
+                               ;;
+                       hp300bsd)
+                               basic_machine=m68k-hp
+                               basic_os=bsd
+                               ;;
+                       hppaosf)
+                               basic_machine=hppa1.1-hp
+                               basic_os=osf
+                               ;;
+                       hppro)
+                               basic_machine=hppa1.1-hp
+                               basic_os=proelf
+                               ;;
+                       i386mach)
+                               basic_machine=i386-mach
+                               basic_os=mach
+                               ;;
+                       isi68 | isi)
+                               basic_machine=m68k-isi
+                               basic_os=sysv
+                               ;;
+                       m68knommu)
+                               basic_machine=m68k-unknown
+                               basic_os=linux
+                               ;;
+                       magnum | m3230)
+                               basic_machine=mips-mips
+                               basic_os=sysv
+                               ;;
+                       merlin)
+                               basic_machine=ns32k-utek
+                               basic_os=sysv
+                               ;;
+                       mingw64)
+                               basic_machine=x86_64-pc
+                               basic_os=mingw64
+                               ;;
+                       mingw32)
+                               basic_machine=i686-pc
+                               basic_os=mingw32
+                               ;;
+                       mingw32ce)
+                               basic_machine=arm-unknown
+                               basic_os=mingw32ce
+                               ;;
+                       monitor)
+                               basic_machine=m68k-rom68k
+                               basic_os=coff
+                               ;;
+                       morphos)
+                               basic_machine=powerpc-unknown
+                               basic_os=morphos
+                               ;;
+                       moxiebox)
+                               basic_machine=moxie-unknown
+                               basic_os=moxiebox
+                               ;;
+                       msdos)
+                               basic_machine=i386-pc
+                               basic_os=msdos
+                               ;;
+                       msys)
+                               basic_machine=i686-pc
+                               basic_os=msys
+                               ;;
+                       mvs)
+                               basic_machine=i370-ibm
+                               basic_os=mvs
+                               ;;
+                       nacl)
+                               basic_machine=le32-unknown
+                               basic_os=nacl
+                               ;;
+                       ncr3000)
+                               basic_machine=i486-ncr
+                               basic_os=sysv4
+                               ;;
+                       netbsd386)
+                               basic_machine=i386-pc
+                               basic_os=netbsd
+                               ;;
+                       netwinder)
+                               basic_machine=armv4l-rebel
+                               basic_os=linux
+                               ;;
+                       news | news700 | news800 | news900)
+                               basic_machine=m68k-sony
+                               basic_os=newsos
+                               ;;
+                       news1000)
+                               basic_machine=m68030-sony
+                               basic_os=newsos
+                               ;;
+                       necv70)
+                               basic_machine=v70-nec
+                               basic_os=sysv
+                               ;;
+                       nh3000)
+                               basic_machine=m68k-harris
+                               basic_os=cxux
+                               ;;
+                       nh[45]000)
+                               basic_machine=m88k-harris
+                               basic_os=cxux
+                               ;;
+                       nindy960)
+                               basic_machine=i960-intel
+                               basic_os=nindy
+                               ;;
+                       mon960)
+                               basic_machine=i960-intel
+                               basic_os=mon960
+                               ;;
+                       nonstopux)
+                               basic_machine=mips-compaq
+                               basic_os=nonstopux
+                               ;;
+                       os400)
+                               basic_machine=powerpc-ibm
+                               basic_os=os400
+                               ;;
+                       OSE68000 | ose68000)
+                               basic_machine=m68000-ericsson
+                               basic_os=ose
+                               ;;
+                       os68k)
+                               basic_machine=m68k-none
+                               basic_os=os68k
+                               ;;
+                       paragon)
+                               basic_machine=i860-intel
+                               basic_os=osf
+                               ;;
+                       parisc)
+                               basic_machine=hppa-unknown
+                               basic_os=linux
+                               ;;
+                       psp)
+                               basic_machine=mipsallegrexel-sony
+                               basic_os=psp
+                               ;;
+                       pw32)
+                               basic_machine=i586-unknown
+                               basic_os=pw32
+                               ;;
+                       rdos | rdos64)
+                               basic_machine=x86_64-pc
+                               basic_os=rdos
+                               ;;
+                       rdos32)
+                               basic_machine=i386-pc
+                               basic_os=rdos
+                               ;;
+                       rom68k)
+                               basic_machine=m68k-rom68k
+                               basic_os=coff
+                               ;;
+                       sa29200)
+                               basic_machine=a29k-amd
+                               basic_os=udi
+                               ;;
+                       sei)
+                               basic_machine=mips-sei
+                               basic_os=seiux
+                               ;;
+                       sequent)
+                               basic_machine=i386-sequent
+                               basic_os=
+                               ;;
+                       sps7)
+                               basic_machine=m68k-bull
+                               basic_os=sysv2
+                               ;;
+                       st2000)
+                               basic_machine=m68k-tandem
+                               basic_os=
+                               ;;
+                       stratus)
+                               basic_machine=i860-stratus
+                               basic_os=sysv4
+                               ;;
+                       sun2)
+                               basic_machine=m68000-sun
+                               basic_os=
+                               ;;
+                       sun2os3)
+                               basic_machine=m68000-sun
+                               basic_os=sunos3
+                               ;;
+                       sun2os4)
+                               basic_machine=m68000-sun
+                               basic_os=sunos4
+                               ;;
+                       sun3)
+                               basic_machine=m68k-sun
+                               basic_os=
+                               ;;
+                       sun3os3)
+                               basic_machine=m68k-sun
+                               basic_os=sunos3
+                               ;;
+                       sun3os4)
+                               basic_machine=m68k-sun
+                               basic_os=sunos4
+                               ;;
+                       sun4)
+                               basic_machine=sparc-sun
+                               basic_os=
+                               ;;
+                       sun4os3)
+                               basic_machine=sparc-sun
+                               basic_os=sunos3
+                               ;;
+                       sun4os4)
+                               basic_machine=sparc-sun
+                               basic_os=sunos4
+                               ;;
+                       sun4sol2)
+                               basic_machine=sparc-sun
+                               basic_os=solaris2
+                               ;;
+                       sun386 | sun386i | roadrunner)
+                               basic_machine=i386-sun
+                               basic_os=
+                               ;;
+                       sv1)
+                               basic_machine=sv1-cray
+                               basic_os=unicos
+                               ;;
+                       symmetry)
+                               basic_machine=i386-sequent
+                               basic_os=dynix
+                               ;;
+                       t3e)
+                               basic_machine=alphaev5-cray
+                               basic_os=unicos
+                               ;;
+                       t90)
+                               basic_machine=t90-cray
+                               basic_os=unicos
+                               ;;
+                       toad1)
+                               basic_machine=pdp10-xkl
+                               basic_os=tops20
+                               ;;
+                       tpf)
+                               basic_machine=s390x-ibm
+                               basic_os=tpf
+                               ;;
+                       udi29k)
+                               basic_machine=a29k-amd
+                               basic_os=udi
+                               ;;
+                       ultra3)
+                               basic_machine=a29k-nyu
+                               basic_os=sym1
+                               ;;
+                       v810 | necv810)
+                               basic_machine=v810-nec
+                               basic_os=none
+                               ;;
+                       vaxv)
+                               basic_machine=vax-dec
+                               basic_os=sysv
+                               ;;
+                       vms)
+                               basic_machine=vax-dec
+                               basic_os=vms
+                               ;;
+                       vsta)
+                               basic_machine=i386-pc
+                               basic_os=vsta
+                               ;;
+                       vxworks960)
+                               basic_machine=i960-wrs
+                               basic_os=vxworks
+                               ;;
+                       vxworks68)
+                               basic_machine=m68k-wrs
+                               basic_os=vxworks
+                               ;;
+                       vxworks29k)
+                               basic_machine=a29k-wrs
+                               basic_os=vxworks
+                               ;;
+                       xbox)
+                               basic_machine=i686-pc
+                               basic_os=mingw32
+                               ;;
+                       ymp)
+                               basic_machine=ymp-cray
+                               basic_os=unicos
+                               ;;
+                       *)
+                               basic_machine=$1
+                               basic_os=
+                               ;;
+               esac
+               ;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+       # Here we handle the default manufacturer of certain CPU types.  It is in
+       # some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               cpu=hppa1.1
+               vendor=winbond
+               ;;
+       op50n)
+               cpu=hppa1.1
+               vendor=oki
+               ;;
+       op60c)
+               cpu=hppa1.1
+               vendor=oki
+               ;;
+       ibm*)
+               cpu=i370
+               vendor=ibm
+               ;;
+       orion105)
+               cpu=clipper
+               vendor=highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               cpu=m68k
+               vendor=apple
+               ;;
+       pmac | pmac-mpw)
+               cpu=powerpc
+               vendor=apple
+               ;;
+
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               cpu=m68000
+               vendor=att
+               ;;
+       3b*)
+               cpu=we32k
+               vendor=att
+               ;;
+       bluegene*)
+               cpu=powerpc
+               vendor=ibm
+               basic_os=cnk
+               ;;
+       decsystem10* | dec10*)
+               cpu=pdp10
+               vendor=dec
+               basic_os=tops10
+               ;;
+       decsystem20* | dec20*)
+               cpu=pdp10
+               vendor=dec
+               basic_os=tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               cpu=m68k
+               vendor=motorola
+               ;;
+       dpx2*)
+               cpu=m68k
+               vendor=bull
+               basic_os=sysv3
+               ;;
+       encore | umax | mmax)
+               cpu=ns32k
+               vendor=encore
+               ;;
+       elxsi)
+               cpu=elxsi
+               vendor=elxsi
+               basic_os=${basic_os:-bsd}
+               ;;
+       fx2800)
+               cpu=i860
+               vendor=alliant
+               ;;
+       genix)
+               cpu=ns32k
+               vendor=ns
+               ;;
+       h3050r* | hiux*)
+               cpu=hppa1.1
+               vendor=hitachi
+               basic_os=hiuxwe2
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               cpu=hppa1.0
+               vendor=hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               cpu=m68000
+               vendor=hp
+               ;;
+       hp9k3[2-9][0-9])
+               cpu=m68k
+               vendor=hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               cpu=hppa1.0
+               vendor=hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               cpu=hppa1.1
+               vendor=hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               cpu=hppa1.1
+               vendor=hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               cpu=hppa1.1
+               vendor=hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               cpu=hppa1.1
+               vendor=hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               cpu=hppa1.0
+               vendor=hp
+               ;;
+       i*86v32)
+               cpu=$(echo "$1" | sed -e 's/86.*/86/')
+               vendor=pc
+               basic_os=sysv32
+               ;;
+       i*86v4*)
+               cpu=$(echo "$1" | sed -e 's/86.*/86/')
+               vendor=pc
+               basic_os=sysv4
+               ;;
+       i*86v)
+               cpu=$(echo "$1" | sed -e 's/86.*/86/')
+               vendor=pc
+               basic_os=sysv
+               ;;
+       i*86sol2)
+               cpu=$(echo "$1" | sed -e 's/86.*/86/')
+               vendor=pc
+               basic_os=solaris2
+               ;;
+       j90 | j90-cray)
+               cpu=j90
+               vendor=cray
+               basic_os=${basic_os:-unicos}
+               ;;
+       iris | iris4d)
+               cpu=mips
+               vendor=sgi
+               case $basic_os in
+                   irix*)
+                       ;;
+                   *)
+                       basic_os=irix4
+                       ;;
+               esac
+               ;;
+       miniframe)
+               cpu=m68000
+               vendor=convergent
+               ;;
+       *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               cpu=m68k
+               vendor=atari
+               basic_os=mint
+               ;;
+       news-3600 | risc-news)
+               cpu=mips
+               vendor=sony
+               basic_os=newsos
+               ;;
+       next | m*-next)
+               cpu=m68k
+               vendor=next
+               case $basic_os in
+                   openstep*)
+                       ;;
+                   nextstep*)
+                       ;;
+                   ns2*)
+                     basic_os=nextstep2
+                       ;;
+                   *)
+                     basic_os=nextstep3
+                       ;;
+               esac
+               ;;
+       np1)
+               cpu=np1
+               vendor=gould
+               ;;
+       op50n-* | op60c-*)
+               cpu=hppa1.1
+               vendor=oki
+               basic_os=proelf
+               ;;
+       pa-hitachi)
+               cpu=hppa1.1
+               vendor=hitachi
+               basic_os=hiuxwe2
+               ;;
+       pbd)
+               cpu=sparc
+               vendor=tti
+               ;;
+       pbb)
+               cpu=m68k
+               vendor=tti
+               ;;
+       pc532)
+               cpu=ns32k
+               vendor=pc532
+               ;;
+       pn)
+               cpu=pn
+               vendor=gould
+               ;;
+       power)
+               cpu=power
+               vendor=ibm
+               ;;
+       ps2)
+               cpu=i386
+               vendor=ibm
+               ;;
+       rm[46]00)
+               cpu=mips
+               vendor=siemens
+               ;;
+       rtpc | rtpc-*)
+               cpu=romp
+               vendor=ibm
+               ;;
+       sde)
+               cpu=mipsisa32
+               vendor=sde
+               basic_os=${basic_os:-elf}
+               ;;
+       simso-wrs)
+               cpu=sparclite
+               vendor=wrs
+               basic_os=vxworks
+               ;;
+       tower | tower-32)
+               cpu=m68k
+               vendor=ncr
+               ;;
+       vpp*|vx|vx-*)
+               cpu=f301
+               vendor=fujitsu
+               ;;
+       w65)
+               cpu=w65
+               vendor=wdc
+               ;;
+       w89k-*)
+               cpu=hppa1.1
+               vendor=winbond
+               basic_os=proelf
+               ;;
+       none)
+               cpu=none
+               vendor=none
+               ;;
+       leon|leon[3-9])
+               cpu=sparc
+               vendor=$basic_machine
+               ;;
+       leon-*|leon[3-9]-*)
+               cpu=sparc
+               vendor=$(echo "$basic_machine" | sed 's/-.*//')
+               ;;
+
+       *-*)
+               # shellcheck disable=SC2162
+               IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+               ;;
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+               cpu=$basic_machine
+               vendor=pc
+               ;;
+       # These rules are duplicated from below for sake of the special case above;
+       # i.e. things that normalized to x86 arches should also default to "pc"
+       pc98)
+               cpu=i386
+               vendor=pc
+               ;;
+       x64 | amd64)
+               cpu=x86_64
+               vendor=pc
+               ;;
+       # Recognize the basic CPU types without company name.
+       *)
+               cpu=$basic_machine
+               vendor=unknown
+               ;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+       # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+       # some cases the only manufacturer, in others, it is the most popular.
+       craynv-unknown)
+               vendor=cray
+               basic_os=${basic_os:-unicosmp}
+               ;;
+       c90-unknown | c90-cray)
+               vendor=cray
+               basic_os=${Basic_os:-unicos}
+               ;;
+       fx80-unknown)
+               vendor=alliant
+               ;;
+       romp-unknown)
+               vendor=ibm
+               ;;
+       mmix-unknown)
+               vendor=knuth
+               ;;
+       microblaze-unknown | microblazeel-unknown)
+               vendor=xilinx
+               ;;
+       rs6000-unknown)
+               vendor=ibm
+               ;;
+       vax-unknown)
+               vendor=dec
+               ;;
+       pdp11-unknown)
+               vendor=dec
+               ;;
+       we32k-unknown)
+               vendor=att
+               ;;
+       cydra-unknown)
+               vendor=cydrome
+               ;;
+       i370-ibm*)
+               vendor=ibm
+               ;;
+       orion-unknown)
+               vendor=highlevel
+               ;;
+       xps-unknown | xps100-unknown)
+               cpu=xps100
+               vendor=honeywell
+               ;;
+
+       # Here we normalize CPU types with a missing or matching vendor
+       dpx20-unknown | dpx20-bull)
+               cpu=rs6000
+               vendor=bull
+               basic_os=${basic_os:-bosx}
+               ;;
+
+       # Here we normalize CPU types irrespective of the vendor
+       amd64-*)
+               cpu=x86_64
+               ;;
+       blackfin-*)
+               cpu=bfin
+               basic_os=linux
+               ;;
+       c54x-*)
+               cpu=tic54x
+               ;;
+       c55x-*)
+               cpu=tic55x
+               ;;
+       c6x-*)
+               cpu=tic6x
+               ;;
+       e500v[12]-*)
+               cpu=powerpc
+               basic_os=${basic_os}"spe"
+               ;;
+       mips3*-*)
+               cpu=mips64
+               ;;
+       ms1-*)
+               cpu=mt
+               ;;
+       m68knommu-*)
+               cpu=m68k
+               basic_os=linux
+               ;;
+       m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+               cpu=s12z
+               ;;
+       openrisc-*)
+               cpu=or32
+               ;;
+       parisc-*)
+               cpu=hppa
+               basic_os=linux
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               cpu=i586
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+               cpu=i686
+               ;;
+       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+               cpu=i686
+               ;;
+       pentium4-*)
+               cpu=i786
+               ;;
+       pc98-*)
+               cpu=i386
+               ;;
+       ppc-* | ppcbe-*)
+               cpu=powerpc
+               ;;
+       ppcle-* | powerpclittle-*)
+               cpu=powerpcle
+               ;;
+       ppc64-*)
+               cpu=powerpc64
+               ;;
+       ppc64le-* | powerpc64little-*)
+               cpu=powerpc64le
+               ;;
+       sb1-*)
+               cpu=mipsisa64sb1
+               ;;
+       sb1el-*)
+               cpu=mipsisa64sb1el
+               ;;
+       sh5e[lb]-*)
+               cpu=$(echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/')
+               ;;
+       spur-*)
+               cpu=spur
+               ;;
+       strongarm-* | thumb-*)
+               cpu=arm
+               ;;
+       tx39-*)
+               cpu=mipstx39
+               ;;
+       tx39el-*)
+               cpu=mipstx39el
+               ;;
+       x64-*)
+               cpu=x86_64
+               ;;
+       xscale-* | xscalee[bl]-*)
+               cpu=$(echo "$cpu" | sed 's/^xscale/arm/')
+               ;;
+       arm64-*)
+               cpu=aarch64
+               ;;
+
+       # Recognize the canonical CPU Types that limit and/or modify the
+       # company names they are paired with.
+       cr16-*)
+               basic_os=${basic_os:-elf}
+               ;;
+       crisv32-* | etraxfs*-*)
+               cpu=crisv32
+               vendor=axis
+               ;;
+       cris-* | etrax*-*)
+               cpu=cris
+               vendor=axis
+               ;;
+       crx-*)
+               basic_os=${basic_os:-elf}
+               ;;
+       neo-tandem)
+               cpu=neo
+               vendor=tandem
+               ;;
+       nse-tandem)
+               cpu=nse
+               vendor=tandem
+               ;;
+       nsr-tandem)
+               cpu=nsr
+               vendor=tandem
+               ;;
+       nsv-tandem)
+               cpu=nsv
+               vendor=tandem
+               ;;
+       nsx-tandem)
+               cpu=nsx
+               vendor=tandem
+               ;;
+       mipsallegrexel-sony)
+               cpu=mipsallegrexel
+               vendor=sony
+               ;;
+       tile*-*)
+               basic_os=${basic_os:-linux-gnu}
+               ;;
+
+       *)
+               # Recognize the canonical CPU types that are allowed with any
+               # company name.
+               case $cpu in
+                       1750a | 580 \
+                       | a29k \
+                       | aarch64 | aarch64_be \
+                       | abacus \
+                       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+                       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+                       | alphapca5[67] | alpha64pca5[67] \
+                       | am33_2.0 \
+                       | amdgcn \
+                       | arc | arceb \
+                       | arm | arm[lb]e | arme[lb] | armv* \
+                       | avr | avr32 \
+                       | asmjs \
+                       | ba \
+                       | be32 | be64 \
+                       | bfin | bpf | bs2000 \
+                       | c[123]* | c30 | [cjt]90 | c4x \
+                       | c8051 | clipper | craynv | csky | cydra \
+                       | d10v | d30v | dlx | dsp16xx \
+                       | e2k | elxsi | epiphany \
+                       | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+                       | h8300 | h8500 \
+                       | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+                       | hexagon \
+                       | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+                       | ip2k | iq2000 \
+                       | k1om \
+                       | le32 | le64 \
+                       | lm32 \
+                       | loongarch32 | loongarch64 | loongarchx32 \
+                       | m32c | m32r | m32rle \
+                       | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+                       | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+                       | m88110 | m88k | maxq | mb | mcore | mep | metag \
+                       | microblaze | microblazeel \
+                       | mips | mipsbe | mipseb | mipsel | mipsle \
+                       | mips16 \
+                       | mips64 | mips64eb | mips64el \
+                       | mips64octeon | mips64octeonel \
+                       | mips64orion | mips64orionel \
+                       | mips64r5900 | mips64r5900el \
+                       | mips64vr | mips64vrel \
+                       | mips64vr4100 | mips64vr4100el \
+                       | mips64vr4300 | mips64vr4300el \
+                       | mips64vr5000 | mips64vr5000el \
+                       | mips64vr5900 | mips64vr5900el \
+                       | mipsisa32 | mipsisa32el \
+                       | mipsisa32r2 | mipsisa32r2el \
+                       | mipsisa32r6 | mipsisa32r6el \
+                       | mipsisa64 | mipsisa64el \
+                       | mipsisa64r2 | mipsisa64r2el \
+                       | mipsisa64r6 | mipsisa64r6el \
+                       | mipsisa64sb1 | mipsisa64sb1el \
+                       | mipsisa64sr71k | mipsisa64sr71kel \
+                       | mipsr5900 | mipsr5900el \
+                       | mipstx39 | mipstx39el \
+                       | mmix \
+                       | mn10200 | mn10300 \
+                       | moxie \
+                       | mt \
+                       | msp430 \
+                       | nds32 | nds32le | nds32be \
+                       | nfp \
+                       | nios | nios2 | nios2eb | nios2el \
+                       | none | np1 | ns16k | ns32k | nvptx \
+                       | open8 \
+                       | or1k* \
+                       | or32 \
+                       | orion \
+                       | picochip \
+                       | pdp10 | pdp11 | pj | pjl | pn | power \
+                       | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+                       | pru \
+                       | pyramid \
+                       | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
+                       | rl78 | romp | rs6000 | rx \
+                       | s390 | s390x \
+                       | score \
+                       | sh | shl \
+                       | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+                       | sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+                       | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+                       | sparclite \
+                       | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+                       | spu \
+                       | tahoe \
+                       | thumbv7* \
+                       | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+                       | tron \
+                       | ubicom32 \
+                       | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+                       | vax \
+                       | visium \
+                       | w65 \
+                       | wasm32 | wasm64 \
+                       | we32k \
+                       | x86 | x86_64 | xc16x | xgate | xps100 \
+                       | xstormy16 | xtensa* \
+                       | ymp \
+                       | z8k | z80)
+                               ;;
+
+                       *)
+                               echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+                               exit 1
+                               ;;
+               esac
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+       digital*)
+               vendor=dec
+               ;;
+       commodore*)
+               vendor=cbm
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x$basic_os != x
+then
+
+# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+       gnu/linux*)
+               kernel=linux
+               os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|')
+               ;;
+       os2-emx)
+               kernel=os2
+               os=$(echo $basic_os | sed -e 's|os2-emx|emx|')
+               ;;
+       nto-qnx*)
+               kernel=nto
+               os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|')
+               ;;
+       *-*)
+               # shellcheck disable=SC2162
+               IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+               ;;
+       # Default OS when just kernel was specified
+       nto*)
+               kernel=nto
+               os=$(echo $basic_os | sed -e 's|nto|qnx|')
+               ;;
+       linux*)
+               kernel=linux
+               os=$(echo $basic_os | sed -e 's|linux|gnu|')
+               ;;
+       *)
+               kernel=
+               os=$basic_os
+               ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+case $os in
+       # First match some system type aliases that might get confused
+       # with valid system types.
+       # solaris* is a basic system type, with this one exception.
+       auroraux)
+               os=auroraux
+               ;;
+       bluegene*)
+               os=cnk
+               ;;
+       solaris1 | solaris1.*)
+               os=$(echo $os | sed -e 's|solaris1|sunos4|')
+               ;;
+       solaris)
+               os=solaris2
+               ;;
+       unixware*)
+               os=sysv4.2uw
+               ;;
+       # es1800 is here to avoid being matched by es* (a different OS)
+       es1800*)
+               os=ose
+               ;;
+       # Some version numbers need modification
+       chorusos*)
+               os=chorusos
+               ;;
+       isc)
+               os=isc2.2
+               ;;
+       sco6)
+               os=sco5v6
+               ;;
+       sco5)
+               os=sco3.2v5
+               ;;
+       sco4)
+               os=sco3.2v4
+               ;;
+       sco3.2.[4-9]*)
+               os=$(echo $os | sed -e 's/sco3.2./sco3.2v/')
+               ;;
+       sco*v* | scout)
+               # Don't match below
+               ;;
+       sco*)
+               os=sco3.2v2
+               ;;
+       psos*)
+               os=psos
+               ;;
+       qnx*)
+               os=qnx
+               ;;
+       hiux*)
+               os=hiuxwe2
+               ;;
+       lynx*178)
+               os=lynxos178
+               ;;
+       lynx*5)
+               os=lynxos5
+               ;;
+       lynxos*)
+               # don't get caught up in next wildcard
+               ;;
+       lynx*)
+               os=lynxos
+               ;;
+       mac[0-9]*)
+               os=$(echo "$os" | sed -e 's|mac|macos|')
+               ;;
+       opened*)
+               os=openedition
+               ;;
+       os400*)
+               os=os400
+               ;;
+       sunos5*)
+               os=$(echo "$os" | sed -e 's|sunos5|solaris2|')
+               ;;
+       sunos6*)
+               os=$(echo "$os" | sed -e 's|sunos6|solaris3|')
+               ;;
+       wince*)
+               os=wince
+               ;;
+       utek*)
+               os=bsd
+               ;;
+       dynix*)
+               os=bsd
+               ;;
+       acis*)
+               os=aos
+               ;;
+       atheos*)
+               os=atheos
+               ;;
+       syllable*)
+               os=syllable
+               ;;
+       386bsd)
+               os=bsd
+               ;;
+       ctix* | uts*)
+               os=sysv
+               ;;
+       nova*)
+               os=rtmk-nova
+               ;;
+       ns2)
+               os=nextstep2
+               ;;
+       # Preserve the version number of sinix5.
+       sinix5.*)
+               os=$(echo $os | sed -e 's|sinix|sysv|')
+               ;;
+       sinix*)
+               os=sysv4
+               ;;
+       tpf*)
+               os=tpf
+               ;;
+       triton*)
+               os=sysv3
+               ;;
+       oss*)
+               os=sysv3
+               ;;
+       svr4*)
+               os=sysv4
+               ;;
+       svr3)
+               os=sysv3
+               ;;
+       sysvr4)
+               os=sysv4
+               ;;
+       ose*)
+               os=ose
+               ;;
+       *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+               os=mint
+               ;;
+       dicos*)
+               os=dicos
+               ;;
+       pikeos*)
+               # Until real need of OS specific support for
+               # particular features comes up, bare metal
+               # configurations are quite functional.
+               case $cpu in
+                   arm*)
+                       os=eabi
+                       ;;
+                   *)
+                       os=elf
+                       ;;
+               esac
+               ;;
+       *)
+               # No normalization, but not necessarily accepted, that comes below.
+               ;;
+esac
+
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+kernel=
+case $cpu-$vendor in
+       score-*)
+               os=elf
+               ;;
+       spu-*)
+               os=elf
+               ;;
+       *-acorn)
+               os=riscix1.2
+               ;;
+       arm*-rebel)
+               kernel=linux
+               os=gnu
+               ;;
+       arm*-semi)
+               os=aout
+               ;;
+       c4x-* | tic4x-*)
+               os=coff
+               ;;
+       c8051-*)
+               os=elf
+               ;;
+       clipper-intergraph)
+               os=clix
+               ;;
+       hexagon-*)
+               os=elf
+               ;;
+       tic54x-*)
+               os=coff
+               ;;
+       tic55x-*)
+               os=coff
+               ;;
+       tic6x-*)
+               os=coff
+               ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=tops20
+               ;;
+       pdp11-*)
+               os=none
+               ;;
+       *-dec | vax-*)
+               os=ultrix4.2
+               ;;
+       m68*-apollo)
+               os=domain
+               ;;
+       i386-sun)
+               os=sunos4.0.2
+               ;;
+       m68000-sun)
+               os=sunos3
+               ;;
+       m68*-cisco)
+               os=aout
+               ;;
+       mep-*)
+               os=elf
+               ;;
+       mips*-cisco)
+               os=elf
+               ;;
+       mips*-*)
+               os=elf
+               ;;
+       or32-*)
+               os=coff
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=sysv3
+               ;;
+       sparc-* | *-sun)
+               os=sunos4.1.1
+               ;;
+       pru-*)
+               os=elf
+               ;;
+       *-be)
+               os=beos
+               ;;
+       *-ibm)
+               os=aix
+               ;;
+       *-knuth)
+               os=mmixware
+               ;;
+       *-wec)
+               os=proelf
+               ;;
+       *-winbond)
+               os=proelf
+               ;;
+       *-oki)
+               os=proelf
+               ;;
+       *-hp)
+               os=hpux
+               ;;
+       *-hitachi)
+               os=hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=sysv
+               ;;
+       *-cbm)
+               os=amigaos
+               ;;
+       *-dg)
+               os=dgux
+               ;;
+       *-dolphin)
+               os=sysv3
+               ;;
+       m68k-ccur)
+               os=rtu
+               ;;
+       m88k-omron*)
+               os=luna
+               ;;
+       *-next)
+               os=nextstep
+               ;;
+       *-sequent)
+               os=ptx
+               ;;
+       *-crds)
+               os=unos
+               ;;
+       *-ns)
+               os=genix
+               ;;
+       i370-*)
+               os=mvs
+               ;;
+       *-gould)
+               os=sysv
+               ;;
+       *-highlevel)
+               os=bsd
+               ;;
+       *-encore)
+               os=bsd
+               ;;
+       *-sgi)
+               os=irix
+               ;;
+       *-siemens)
+               os=sysv4
+               ;;
+       *-masscomp)
+               os=rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=uxpv
+               ;;
+       *-rom68k)
+               os=coff
+               ;;
+       *-*bug)
+               os=coff
+               ;;
+       *-apple)
+               os=macos
+               ;;
+       *-atari*)
+               os=mint
+               ;;
+       *-wrs)
+               os=vxworks
+               ;;
+       *)
+               os=none
+               ;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+       # Sometimes we do "kernel-abi", so those need to count as OSes.
+       musl* | newlib* | uclibc*)
+               ;;
+       # Likewise for "kernel-libc"
+       eabi* | gnueabi*)
+               ;;
+       # Now accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST end in a * to match a version number.
+       gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+            | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+            | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+            | sym* |  plan9* | psp* | sim* | xray* | os68k* | v88r* \
+            | hiux* | abug | nacl* | netware* | windows* \
+            | os9* | macos* | osx* | ios* \
+            | mpw* | magic* | mmixware* | mon960* | lnews* \
+            | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+            | aos* | aros* | cloudabi* | sortix* | twizzler* \
+            | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+            | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+            | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+            | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
+            | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+            | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+            | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+            | udi* | lites* | ieee* | go32* | aux* | hcos* \
+            | chorusrdb* | cegcc* | glidix* \
+            | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+            | midipix* | mingw32* | mingw64* | mint* \
+            | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+            | interix* | uwin* | mks* | rhapsody* | darwin* \
+            | openstep* | oskit* | conix* | pw32* | nonstopux* \
+            | storm-chaos* | tops10* | tenex* | tops20* | its* \
+            | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+            | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+            | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+            | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+            | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+            | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+            | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*)
+               ;;
+       # This one is extra strict with allowed versions
+       sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+               # Don't forget version if it is 3.2v4 or newer.
+               ;;
+       none)
+               ;;
+       *)
+               echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+       linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* )
+               ;;
+       uclinux-uclibc* )
+               ;;
+       -dietlibc* | -newlib* | -musl* | -uclibc* )
+               # These are just libc implementations, not actual OSes, and thus
+               # require a kernel.
+               echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+               exit 1
+               ;;
+       kfreebsd*-gnu* | kopensolaris*-gnu*)
+               ;;
+       nto-qnx*)
+               ;;
+       os2-emx)
+               ;;
+       *-eabi* | *-gnueabi*)
+               ;;
+       -*)
+               # Blank kernel with real OS is always fine.
+               ;;
+       *-*)
+               echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+case $vendor in
+       unknown)
+               case $cpu-$os in
+                       *-riscix*)
+                               vendor=acorn
+                               ;;
+                       *-sunos*)
+                               vendor=sun
+                               ;;
+                       *-cnk* | *-aix*)
+                               vendor=ibm
+                               ;;
+                       *-beos*)
+                               vendor=be
+                               ;;
+                       *-hpux*)
+                               vendor=hp
+                               ;;
+                       *-mpeix*)
+                               vendor=hp
+                               ;;
+                       *-hiux*)
+                               vendor=hitachi
+                               ;;
+                       *-unos*)
+                               vendor=crds
+                               ;;
+                       *-dgux*)
+                               vendor=dg
+                               ;;
+                       *-luna*)
+                               vendor=omron
+                               ;;
+                       *-genix*)
+                               vendor=ns
+                               ;;
+                       *-clix*)
+                               vendor=intergraph
+                               ;;
+                       *-mvs* | *-opened*)
+                               vendor=ibm
+                               ;;
+                       *-os400*)
+                               vendor=ibm
+                               ;;
+                       s390-* | s390x-*)
+                               vendor=ibm
+                               ;;
+                       *-ptx*)
+                               vendor=sequent
+                               ;;
+                       *-tpf*)
+                               vendor=ibm
+                               ;;
+                       *-vxsim* | *-vxworks* | *-windiss*)
+                               vendor=wrs
+                               ;;
+                       *-aux*)
+                               vendor=apple
+                               ;;
+                       *-hms*)
+                               vendor=hitachi
+                               ;;
+                       *-mpw* | *-macos*)
+                               vendor=apple
+                               ;;
+                       *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       *-vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               ;;
+esac
+
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/webcit/configure.ac b/webcit/configure.ac
new file mode 100644 (file)
index 0000000..8864447
--- /dev/null
@@ -0,0 +1,603 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl $Id$
+AC_INIT([WebCit],m4_esyscmd_s([grep CLIENT_VERSION webcit.h | sed 's/[^0-9]*//g']),[http://uncensored.citadel.org])
+
+AC_SUBST(PROG_SUBDIRS)
+AC_DEFINE(PROG_SUBDIRS, [], [Program dirs])
+AC_CANONICAL_HOST
+AC_PROG_INSTALL
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+
+dnl Make sure we see all GNU and Solaris extensions.
+AC_GNU_SOURCE
+
+AC_CHECK_PROG(SED, sed, sed, no)
+AC_PREFIX_DEFAULT(/usr/local/webcit)
+if test "$prefix" = NONE; then
+       AC_DEFINE_UNQUOTED(WEBCITDIR, "$ac_default_prefix", [define this to the Citadel home directory])
+       ssl_dir="$ac_default_prefix/keys"
+else
+       AC_DEFINE_UNQUOTED(WEBCITDIR, "$prefix", [define this to the Citadel home directory])
+       ssl_dir="$prefix/keys"
+fi
+
+AC_ARG_WITH(ssl,
+       [  --with-ssl=PATH         Specify path to OpenSSL installation ],
+       [
+               if test "x$withval" != "xno" ; then
+                       tryssldir=$withval
+               fi
+       ]
+)
+dnl Set some system-specific variables which are OK to set before compiler
+dnl checks:
+PTHREAD_DEFS=-D_REENTRANT
+case "$host" in
+       dnl Tru64 Unix requires we use -pthread instead of linking the threads
+       dnl libraries directly, and we can't build threaded programs with gcc
+       dnl due to header file problems.
+       alpha*-dec-osf*)
+               test -z "$CC" && CC=cc
+               LIBS=-pthread
+       ;;
+       dnl FreeBSD is similar:
+       *-*-freebsd*)
+               LIBS=-pthread
+               PTHREAD_DEFS=-D_THREAD_SAFE
+       ;;
+       *-*-solaris*)
+               PTHREAD_DEFS='-D_REENTRANT -D_PTHREADS'
+       ;;
+       *-*-darwin*)
+               LIBS=-lintl
+esac
+AC_SUBST(PTHREAD_DEFS)
+
+dnl Checks for programs.
+AC_PROG_CC
+
+dnl Configure compiler flags for GCC
+if test "$GCC" = yes; then
+       case "$host" in
+               *-*-solaris*)
+dnl                    CFLAGS="$CFLAGS -Wall -Wno-char-subscripts --pedantic"
+                       CFLAGS="$CFLAGS -Wall -Wno-char-subscripts"
+               ;;
+               *)
+dnl                    CFLAGS="$CFLAGS -Wall --pedantic"
+                       CFLAGS="$CFLAGS -Wall"
+               ;;
+       esac
+fi
+
+# missing_dir=`cd $ac_aux_dir && pwd`
+# AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+
+dnl Checks for libraries.
+if test "$LIBS" != -pthread; then
+       AC_CHECK_LIB(pthread, pthread_create)
+       AC_CHECK_LIB(pthreads, pthread_create)
+fi
+AC_SEARCH_LIBS(gethostbyname, nsl)
+AC_SEARCH_LIBS(connect, socket)
+
+dnl Checks for header files.
+AC_HEADER_STDC
+dnl AC_HEADER_SYS_WAIT
+
+AC_CHECK_FUNCS(crypt gethostbyname connect flock getpwnam_r getpwuid_r getloadavg)
+AC_CACHE_CHECK(
+       [for call semantics from getpwuid_r], 
+       ac_cv_call_getpwuid_r,
+       [AC_TRY_COMPILE([#include <sys/types.h>
+#include <pwd.h>], 
+                         [
+                               struct passwd pw, *pwp;
+                               char pwbuf[64];
+                               uid_t uid;
+
+                               getpwuid_r(uid, &pw, pwbuf, sizeof(pwbuf), &pwp);
+                       ],
+                       ac_cv_call_getpwuid_r=yes, 
+                       ac_cv_call_getpwuid_r=no)
+       ])
+
+if test $ac_cv_call_getpwuid_r = no; then
+       AC_DEFINE(SOLARIS_GETPWUID,[],[do we need to use solaris call syntax?])
+       AC_DEFINE(SOLARIS_LOCALTIME_R,[], [do we need to use soralis call syntax?])
+       AC_DEFINE(F_UID_T, "%ld", [whats the matching format string for uid_t?])
+       AC_DEFINE(F_PID_T, "%ld",  [whats the matching format string for pid_t?])
+       AC_DEFINE(F_XPID_T, "%lx",  [whats the matching format string for xpid_t?])
+else
+       AC_DEFINE(F_UID_T, "%d",  [whats the matching format string for uid_t?])
+       AC_DEFINE(F_PID_T, "%d",  [whats the matching format string for pid_t?])
+       AC_DEFINE(F_XPID_T, "%x",  [whats the matching format string for xpid_t?])
+fi
+
+
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+dnl Check the size of various builtin types; see typesize.h (error)
+AC_CHECK_SIZEOF(char, 0)
+AC_CHECK_SIZEOF(short, 0)
+AC_CHECK_SIZEOF(int, 0)
+AC_CHECK_SIZEOF(long, 0)
+AC_CHECK_SIZEOF(long unsigned int, 0)
+AC_CHECK_SIZEOF(size_t, 0)
+dnl AC_HEADER_TIME
+
+dnl Checks for library functions.
+AC_TYPE_SIGNAL
+dnl AC_FUNC_VPRINTF
+AC_REPLACE_FUNCS(snprintf)
+AC_CHECK_HEADER(CUnit/CUnit.h, [AC_DEFINE(ENABLE_TESTS, [], [whether we should compile the test-suite])])
+
+AC_CHECK_HEADERS(fcntl.h limits.h unistd.h iconv.h xlocale.h)
+
+dnl Checks for the zlib compression library.
+saved_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $SERVER_LIBS"
+AC_CHECK_HEADER(zlib.h,
+       [AC_CHECK_LIB(z, zlibVersion,
+               [
+                       LIBS="-lz $LIBS $SERVER_LIBS"
+               ],
+               [
+                       AC_MSG_ERROR(zlib was not found or is not usable.  Please install zlib.)
+               ]
+       ,
+       )],
+       [
+               AC_MSG_ERROR(zlib.h was not found or is not usable.  Please install zlib.)
+       ]
+)
+CFLAGS="$saved_CFLAGS"
+
+dnl Here is the check for a libc integrated iconv
+AC_ARG_ENABLE(iconv,
+       [  --disable-iconv         do not use iconv charset conversion],
+       ok_iconv=no, ok_iconv=yes)
+
+AC_MSG_CHECKING(Checking to see if your system supports iconv)
+AC_TRY_RUN([
+       #include <iconv.h>
+       main() {
+               iconv_t ic = (iconv_t)(-1) ;
+               ic = iconv_open("UTF-8", "us-ascii");
+               iconv_close(ic);
+               exit(0);
+       }
+ ],
+               [
+                 ok_iconv=yes
+                 AC_MSG_RESULT([yes])
+               ],
+               [ 
+                 ok_iconv=no
+                 AC_MSG_RESULT([no])
+               ]
+)
+
+dnl Check for iconv in external libiconv
+if test "$ok_iconv" = no; then
+       AC_MSG_CHECKING(Checking for an external libiconv)
+       OLD_LDFLAGS="$LDFLAGS"
+       LDFLAGS="$LDFLAGS -liconv"
+       AC_TRY_RUN([
+                       #include <iconv.h>
+                       main() {
+                               iconv_t ic = (iconv_t)(-1) ;
+                               ic = iconv_open("UTF-8", "us-ascii");
+                               iconv_close(ic);
+                       }
+               ],
+                       [
+                         ok_iconv=yes
+                         AC_MSG_RESULT([yes])
+                       ],
+                       [ 
+                         ok_iconv=no
+                         LDFLAGS="$OLD_LDFLAGS"
+                         AC_MSG_RESULT([no])
+                       ]
+               )
+fi     
+if test "$ok_iconv" != "no"; then
+       AC_MSG_RESULT(webcit will be built with character set conversion.)
+       AC_DEFINE(HAVE_ICONV,[],[whether we have iconv for charset conversion])
+else
+       AC_MSG_RESULT(webcit will be built without character set conversion.)
+fi
+
+AC_CHECK_LIB(intl, libintl_bindtextdomain, [LDFLAGS="$LDFLAGS -lintl"])
+
+
+dnl Checks for the libical iCalendar library.
+AC_CHECK_HEADER(libical/ical.h,
+       [AC_CHECK_LIB(ical, icaltimezone_set_tzid_prefix,
+               [
+                       LIBS="-lical $LIBS"
+               ],
+               [
+                       AC_MSG_ERROR(libical was not found and is required.  More info: http://www.citadel.org/doku.php/installation:start)
+               ]
+       ,
+       )],
+       [
+               AC_MSG_ERROR(libical/ical.h was not found and is required.  More info: http://www.citadel.org/doku.php/installation:start)
+       ]
+)
+
+dnl Checks for the discount markdown library.
+AC_CHECK_LIB(markdown,
+        markdown,
+        [
+        LIBS="$LIBS -lmarkdown"
+        AC_DEFINE(HAVE_MARKDOWN,[],[whether we have markdown message rendering])
+])
+
+dnl Check for libcitadel
+AC_CHECK_HEADER(libcitadel.h,
+       [AC_CHECK_LIB(citadel, libcitadel_version_string,
+               [
+                       LIBS="-lcitadel $LIBS"
+                       SETUP_LIBS="-lcitadel $SETUP_LIBS"
+               ],
+               [
+                       AC_MSG_ERROR(libcitadel was not found or is not usable.  Please install libcitadel.)
+               ]
+       ,
+       )],
+       [
+               AC_MSG_ERROR(libcitadel.h was not found or is not usable.  Please install libcitadel.)
+       ]
+)
+
+AC_MSG_CHECKING([whether your system likes memcpy + HKEY]) 
+AC_TRY_COMPILE([
+#define _GNU_SOURCE
+#include <ctype.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/select.h>
+#include <fcntl.h>
+#include <sys/types.h>
+
+#include "lib/libcitadel.h"
+],
+[
+       char foo[22];
+       memcpy(foo, HKEY("foo"));
+       
+],
+               [
+
+                 AC_MSG_RESULT([yes])
+               ],
+               [ 
+                 AC_DEFINE(UNDEF_MEMCPY, [], [whether we need to undefine memcpy])
+                 AC_MSG_RESULT([no])
+               ]
+)
+
+dnl Checks for the Expat XML parser.
+AC_CHECK_HEADER(expat.h,
+       [AC_CHECK_LIB(expat, XML_ParserCreateNS,
+               [
+                       LIBS="-lexpat $LIBS"
+               ],
+               [
+                       AC_MSG_ERROR(The Expat XML parser was not found and is required.  More info: http://www.citadel.org/doku.php/installation:start)
+               ]
+       ,
+       )],
+       [
+               AC_MSG_ERROR(expat.h was not found and is required.  More info: http://www.citadel.org/doku.php/installation:start)
+       ]
+)
+
+
+
+found_ssl=no
+# The big search for OpenSSL
+if test "$with_ssl" != "no"; then
+       saved_LIBS="$LIBS"
+       saved_LDFLAGS="$LDFLAGS"
+       saved_CFLAGS="$CFLAGS"
+       if test "x$prefix" != "xNONE"; then
+               tryssldir="$tryssldir $prefix"
+       fi
+       AC_CACHE_CHECK([for OpenSSL], ac_cv_openssldir, [
+               for ssldir in $tryssldir "" /usr /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/pkg /opt /opt/openssl ; do
+                       CFLAGS="$saved_CFLAGS"
+                       LDFLAGS="$saved_LDFLAGS"
+                       LIBS="$saved_LIBS -lssl -lcrypto"
+       
+                       # Skip directories if they don't exist
+                       if test ! -z "$ssldir" -a ! -d "$ssldir" ; then
+                               continue;
+                       fi
+                       if test ! -z "$ssldir" -a "x$ssldir" != "x/usr"; then
+                               # Try to use $ssldir/lib if it exists, otherwise
+                               # $ssldir
+                               if test -d "$ssldir/lib" ; then
+                                       LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
+                                       if test ! -z "$need_dash_r" ; then
+                                               LDFLAGS="-R$ssldir/lib $LDFLAGS"
+                                       fi
+                               else
+                                       LDFLAGS="-L$ssldir $saved_LDFLAGS"
+                                       if test ! -z "$need_dash_r" ; then
+                                               LDFLAGS="-R$ssldir $LDFLAGS"
+                                       fi
+                               fi
+                               # Try to use $ssldir/include if it exists, otherwise
+                               # $ssldir
+                               if test -d "$ssldir/include" ; then
+                                       CFLAGS="-I$ssldir/include $saved_CFLAGS"
+                               else
+                                       CFLAGS="-I$ssldir $saved_CFLAGS"
+                               fi
+                       fi
+       
+                       # Basic test to check for compatible version and correct linking
+                       # *does not* test for RSA - that comes later.
+                       AC_TRY_RUN(
+                               [
+       #include <string.h>
+       #include <openssl/rand.h>
+       int main(void)
+       {
+               char a[2048];
+               memset(a, 0, sizeof(a));
+               RAND_add(a, sizeof(a), sizeof(a));
+               return(RAND_status() <= 0);
+       }
+                               ],
+                               [
+                                       found_crypto=1
+                                       break;
+                               ], []
+                       )
+       
+                       if test ! -z "$found_crypto" ; then
+                               break;
+                       fi
+               done
+       
+               if test -z "$ssldir" ; then
+                       ssldir="(system)"
+               fi
+       
+               if test ! -z "$found_crypto" ; then
+                       ac_cv_openssldir=$ssldir
+               else
+                       ac_cv_openssldir="no"
+               fi
+       ])
+       LIBS="$saved_LIBS"
+       LDFLAGS="$saved_LDFLAGS"
+       CFLAGS="$saved_CFLAGS"
+       
+       if test "x$ac_cv_openssldir" != "xno" ; then
+               AC_DEFINE(HAVE_OPENSSL,[],[whethe we have openssl])
+               found_ssl=yes
+               LIBS="-lssl -lcrypto $LIBS"
+               dnl Need to recover ssldir - test above runs in subshell
+               ssldir=$ac_cv_openssldir
+               if test ! -z "$ssldir" -a "x$ssldir" != "x/usr" -a "x$ssldir" != "x(system)"; then
+                       # Try to use $ssldir/lib if it exists, otherwise
+                       # $ssldir
+                       if test -d "$ssldir/lib" ; then
+                               LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
+                               if test ! -z "$need_dash_r" ; then
+                                       LDFLAGS="-R$ssldir/lib $LDFLAGS"
+                               fi
+                       else
+                               LDFLAGS="-L$ssldir $saved_LDFLAGS"
+                               if test ! -z "$need_dash_r" ; then
+                                       LDFLAGS="-R$ssldir $LDFLAGS"
+                               fi
+                       fi
+                       # Try to use $ssldir/include if it exists, otherwise
+                       # $ssldir
+                       if test -d "$ssldir/include" ; then
+                               CFLAGS="-I$ssldir/include $saved_CFLAGS"
+                       else
+                               CFLAGS="-I$ssldir $saved_CFLAGS"
+                       fi
+               fi
+       fi
+fi
+dnl Checks for the SSLdir
+dnl this is a bit different than the rest, 
+dnl because of the citadel used to have a keys/ subdir.
+AC_ARG_WITH(ssldir, 
+                   [  --with-ssldir          directory to store the ssl certificates under],
+                       [ if test "x$withval" != "xno" ; then
+                                             
+                                                 ssl_dir="$withval"
+                                                 if test "$found_ssl" = "no"; then
+                                                    echo "Your setup was incomplete; ssldir doesn't make sense without openssl"
+                                                    exit
+                                                 fi
+                         fi
+                       AC_SUBST(MAKE_SSL_DIR)
+                       ]
+)
+AC_DEFINE_UNQUOTED(SSL_DIR, "$ssl_dir", [were should we put our keys?])
+
+
+
+
+AC_CHECK_FUNCS(strftime_l uselocale gettext)
+
+if test "$ok_nls" != "no"; then
+       AC_CHECK_PROG(ok_xgettext, xgettext, yes, no)
+       ok_nls=$ok_xgettext
+fi
+
+if test "$ok_nls" != "no"; then
+       AC_CHECK_PROG(ok_msgmerge, msgmerge, yes, no)
+       ok_nls=$ok_msgmerge
+fi
+
+if test "$ok_nls" != "no"; then
+       AC_CHECK_PROG(ok_msgfmt, msgfmt, yes, no)
+       ok_nls=$ok_msgfmt
+fi
+
+if test "$ok_nls" != "no"; then
+       AC_MSG_RESULT(WebCit will be built with national language support.)
+       AC_DEFINE(ENABLE_NLS, [], [whether we have NLS support])
+       PROG_SUBDIRS="$PROG_SUBDIRS po/webcit/"
+else
+       AC_MSG_RESULT(WebCit will be built without national language support.)
+fi
+
+AC_SUBST(SETUP_LIBS)
+
+dnl disable backtrace if we don't want it.
+AC_ARG_WITH(gprof, 
+                   [  --with-gprof          enable profiling],
+                       [ if test "x$withval" != "xno" ; then
+                            CFLAGS="$CFLAGS  -pg "
+                            LDFLAGS="$LDFLAGS  -pg "
+                         fi
+                       ]
+)
+
+dnl disable backtrace if we don't want it.
+AC_ARG_WITH(backtrace, 
+                   [  --with-backtrace          enable backtrace dumps in the syslog],
+                       [ if test "x$withval" != "xno" ; then
+                            CFLAGS="$CFLAGS  -rdynamic "
+                            LDFLAGS="$LDFLAGS  -rdynamic "
+                             AC_CHECK_FUNCS(backtrace)
+                         fi
+                       ]
+)
+
+if test "$prefix" = NONE; then
+       datadir=$ac_default_prefix
+       localedir=$ac_default_prefix
+       wwwdir=$ac_default_prefix
+       rundir=$ac_default_prefix
+       editordir=$ac_default_prefix/tiny_mce
+       etcdir=$ac_default_prefix
+else
+       localedir=$prefix
+       wwwdir=$prefix
+       datadir=$prefix
+       rundir=$prefix
+       editordir=$prefix/tiny_mce
+       etcdir=$prefix
+fi
+
+dnl where to put the locale files
+AC_ARG_WITH(localedir, 
+                   [  --with-localedir          directory to put the locale files to],
+                       [ if test "x$withval" != "xno" ; then
+                           localedir=$withval
+                         fi
+                       ]
+)
+AC_DEFINE_UNQUOTED(LOCALEDIR, "$localedir",[where to find our pot files])
+LOCALEDIR=$localedir
+AC_SUBST(LOCALEDIR)
+
+dnl Checks where to put our templates
+AC_ARG_WITH(wwwdir, 
+                   [  --with-wwwdir             directory to put our templates],
+                       [ if test "x$withval" != "xno" ; then
+                               wwwdir=$withval
+                         fi
+                       ]
+)
+AC_DEFINE_UNQUOTED(WWWDIR, "$wwwdir", [where to find our templates and pics])
+WWWDIR=$wwwdir
+AC_SUBST(WWWDIR)
+
+
+dnl Checks for the run-dir for the sockets
+AC_ARG_WITH(rundir, 
+                       [  --with-rundir           directory to place runtime files (UDS) to?],
+                       [ if test "x$withval" != "xno" ; then
+                                           AC_DEFINE(HAVE_RUN_DIR, [], [should we put our non volatile files elsewhere?])
+                                               
+                                               rundir=$withval
+                                               AC_SUBST(MAKE_RUN_DIR)
+                         fi
+                       ]
+)
+AC_DEFINE_UNQUOTED(RUNDIR, "$rundir", [define, where the config should go in unix style])
+
+dnl Checks for the Datadir
+AC_ARG_WITH(datadir, 
+                   [  --with-datadir          directory to store the databases under],
+                       [ if test "x$withval" != "xno" ; then
+                                             datadir=$withval
+                         fi
+                       ]
+)
+AC_DEFINE_UNQUOTED(DATADIR, "$datadir",[define, if the user suplied a data-directory to use.])
+
+dnl Checks where to put our editor
+AC_ARG_WITH(editordir, 
+                   [  --with-editordir             directory to put our editor],
+                       [ if test "x$withval" != "xno" ; then
+                               editordir=$withval
+                         fi
+                       ]
+)
+
+dnl Checks where to find our configs
+AC_ARG_WITH(etcdir, 
+                   [  --with-etcdir             directory to read our configs],
+                       [ if test "x$withval" != "xno" ; then
+                               etcdir=$withval
+                         fi
+                       ]
+)
+AC_DEFINE_UNQUOTED(ETCDIR, "$etcdir", [where to find our configs])
+ETCDIR=$etcdir
+AC_SUBST(ETCDIR)
+
+abs_srcdir="`cd $srcdir && pwd`"
+abs_builddir="`pwd`"
+if test "$abs_srcdir" != "$abs_builddir"; then
+   CFLAGS="$CFLAGS -I $abs_builddir"
+fi
+AC_CONFIG_HEADER(sysdep.h)
+AC_OUTPUT(Makefile po/webcit/Makefile)
+
+if test "$abs_srcdir" != "$abs_builddir"; then
+   ln -s $abs_srcdir/static $abs_builddir
+   ln -s $abs_srcdir/tiny_mce $abs_builddir
+   ln -s $abs_srcdir/*.h $abs_builddir
+   make mkdir-init
+   
+else
+dnl just run it on devel systems and if non vdir build.
+   if test -d .svn; then
+      ./mk_module_init.sh
+   fi
+fi
+
+if test -n "$srcdir"; then 
+   export srcdir=.
+fi
+
+
+echo ------------------------------------------------------------------------
+echo 'Character set conversion support:' $ok_iconv
+echo 'National language support:       ' $ok_nls
+echo 
diff --git a/webcit/context_loop.c b/webcit/context_loop.c
new file mode 100644 (file)
index 0000000..f1035e7
--- /dev/null
@@ -0,0 +1,891 @@
+/*
+ * This is the other half of the webserver.  It handles the task of hooking
+ * up HTTP requests with the sessions they belong to, using HTTP cookies to
+ * keep track of things.  If the HTTP request doesn't belong to any currently
+ * active session, a new session is started.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "modules_init.h"
+
+/* Only one thread may manipulate SessionList at a time... */
+pthread_mutex_t SessionListMutex;
+
+wcsession *SessionList = NULL; /* Linked list of all webcit sessions */
+
+HashList *HttpReqTypes = NULL;
+HashList *HttpHeaderHandler = NULL;
+extern HashList *HandlerHash;
+
+/* the following two values start at 1 because the initial parent thread counts as one. */
+int num_threads_existing = 1;          /* Number of worker threads which exist. */
+int num_threads_executing = 1;         /* Number of worker threads currently executing. */
+int verbose=0;
+
+extern void session_loop(void);
+void spawn_another_worker_thread(void);
+
+
+void DestroyHttpHeaderHandler(void *V)
+{
+       OneHttpHeader *pHdr;
+       pHdr = (OneHttpHeader*) V;
+       FreeStrBuf(&pHdr->Val);
+       free(pHdr);
+}
+
+void shutdown_sessions(void)
+{
+       wcsession *sptr;
+       
+       for (sptr = SessionList; sptr != NULL; sptr = sptr->next) {
+               sptr->killthis = 1;
+       }
+}
+
+void do_housekeeping(void)
+{
+       wcsession *sptr, *ss;
+       wcsession *sessions_to_kill = NULL;
+       time_t the_time;
+
+       /*
+        * Lock the session list, moving any candidates for euthanasia into
+        * a separate list.
+        */
+       the_time = 0;
+       CtdlLogResult(pthread_mutex_lock(&SessionListMutex));
+       for (sptr = SessionList; sptr != NULL; sptr = sptr->next) {
+               if (the_time == 0)
+                       the_time = time(NULL);
+               /* Kill idle sessions */
+               if ((sptr->inuse == 0) && 
+                   ((the_time - (sptr->lastreq)) > (time_t) WEBCIT_TIMEOUT))
+               {
+                       syslog(LOG_DEBUG, "Timeout session %d", sptr->wc_session);
+                       sptr->killthis = 1;
+               }
+
+               /* Remove sessions flagged for kill */
+               if (sptr->killthis) {
+
+                       /* remove session from linked list */
+                       if (sptr == SessionList) {
+                               SessionList = SessionList->next;
+                       }
+                       else for (ss=SessionList;ss!=NULL;ss=ss->next) {
+                               if (ss->next == sptr) {
+                                       ss->next = ss->next->next;
+                               }
+                       }
+
+                       sptr->next = sessions_to_kill;
+                       sessions_to_kill = sptr;
+               }
+       }
+       CtdlLogResult(pthread_mutex_unlock(&SessionListMutex));
+
+       /*
+        * Now free up and destroy the culled sessions.
+        */
+       while (sessions_to_kill != NULL) {
+               syslog(LOG_DEBUG, "Destroying session %d", sessions_to_kill->wc_session);
+               sptr = sessions_to_kill->next;
+               session_destroy_modules(&sessions_to_kill);
+               sessions_to_kill = sptr;
+       }
+}
+
+/*
+ * Check the size of our thread pool.  If all threads are executing, spawn another.
+ */
+void check_thread_pool_size(void)
+{
+       if (time_to_die) return;                /* don't expand the thread pool during shutdown */
+
+       begin_critical_section(S_SPAWNER);      /* only one of these should run at a time */
+       if (
+               (num_threads_executing >= num_threads_existing)
+               && (num_threads_existing < MAX_WORKER_THREADS)
+       ) {
+               syslog(LOG_DEBUG, "%d of %d threads are executing.  Adding another worker thread.",
+                       num_threads_executing,
+                       num_threads_existing
+               );
+               spawn_another_worker_thread();
+       }
+       end_critical_section(S_SPAWNER);
+}
+
+
+/*
+ * Wake up occasionally and clean house
+ */
+void housekeeping_loop(void)
+{
+       while (1) {
+               sleeeeeeeeeep(HOUSEKEEPING);
+               do_housekeeping();
+       }
+}
+
+
+/*
+ * Create a Session id
+ * Generate a unique WebCit session ID (which is not the same thing as the
+ * Citadel session ID).
+ */
+int GenerateSessionID(void)
+{
+       static int seq = (-1);
+
+       if (seq < 0) {
+               seq = (int) time(NULL);
+       }
+               
+       return ++seq;
+}
+
+wcsession *FindSession(wcsession **wclist, ParsedHttpHdrs *Hdr, pthread_mutex_t *ListMutex)
+{
+       wcsession *sptr = NULL;
+       wcsession *TheSession = NULL;   
+       
+       if (Hdr->HR.got_auth == AUTH_BASIC) {
+               GetAuthBasic(Hdr);
+       }
+
+       CtdlLogResult(pthread_mutex_lock(ListMutex));
+       for (sptr = *wclist; ((sptr != NULL) && (TheSession == NULL)); sptr = sptr->next) {
+               
+               /* If HTTP-AUTH, look for a session with matching credentials */
+               switch (Hdr->HR.got_auth)
+               {
+               case AUTH_BASIC:
+                       if (    (!strcasecmp(ChrPtr(Hdr->c_username), ChrPtr(sptr->wc_username)))
+                               && (!strcasecmp(ChrPtr(Hdr->c_password), ChrPtr(sptr->wc_password)))
+                               && (sptr->killthis == 0)
+                       ) {
+                               if (verbose)
+                                       syslog(LOG_DEBUG, "Matched a session with the same http-auth");
+                               TheSession = sptr;
+                       }
+                       break;
+               case AUTH_COOKIE:
+                       /* If cookie-session, look for a session with matching session ID */
+                       if (    (Hdr->HR.desired_session != 0)
+                               && (sptr->wc_session == Hdr->HR.desired_session)
+                       ) {
+                               if (verbose)
+                                       syslog(LOG_DEBUG, "Matched a session with the same cookie");
+                               TheSession = sptr;
+                       }
+                       break;                       
+               case NO_AUTH:
+                       /* Any unbound session is a candidate */
+                       if ( (sptr->wc_session == 0) && (sptr->inuse == 0) ) {
+                               if (verbose)
+                                       syslog(LOG_DEBUG, "Reusing an unbound session");
+                               TheSession = sptr;
+                       }
+                       break;
+               }
+       }
+       CtdlLogResult(pthread_mutex_unlock(ListMutex));
+       if (TheSession == NULL) {
+               syslog(LOG_DEBUG, "No existing session was matched");
+       }
+       return TheSession;
+}
+
+wcsession *CreateSession(int Lockable, int Static, wcsession **wclist, ParsedHttpHdrs *Hdr, pthread_mutex_t *ListMutex)
+{
+       wcsession *TheSession;
+       TheSession = (wcsession *) malloc(sizeof(wcsession));
+       memset(TheSession, 0, sizeof(wcsession));
+       TheSession->Hdr = Hdr;
+       TheSession->serv_sock = (-1);
+       TheSession->lastreq = time(NULL);;
+
+       pthread_setspecific(MyConKey, (void *)TheSession);
+       
+       /* If we're recreating a session that expired, it's best to give it the same
+        * session number that it had before.  The client browser ought to pick up
+        * the new session number and start using it, but in some rare situations it
+        * doesn't, and that's a Bad Thing because it causes lots of spurious sessions
+        * to get created.
+        */     
+       if (Hdr->HR.desired_session == 0) {
+               TheSession->wc_session = GenerateSessionID();
+               syslog(LOG_DEBUG, "Created new session %d", TheSession->wc_session);
+       }
+       else {
+               TheSession->wc_session = Hdr->HR.desired_session;
+               syslog(LOG_DEBUG, "Re-created session %d", TheSession->wc_session);
+       }
+       Hdr->HR.Static = Static;
+       session_new_modules(TheSession);
+
+       if (Lockable) {
+               pthread_mutex_init(&TheSession->SessionMutex, NULL);
+
+               if (ListMutex != NULL)
+                       CtdlLogResult(pthread_mutex_lock(ListMutex));
+
+               if (wclist != NULL) {
+                       TheSession->nonce = rand();
+                       TheSession->next = *wclist;
+                       *wclist = TheSession;
+               }
+               if (ListMutex != NULL)
+                       CtdlLogResult(pthread_mutex_unlock(ListMutex));
+       }
+       return TheSession;
+}
+
+
+/* If it's a "force 404" situation then display the error and bail. */
+void do_404(void)
+{
+       hprintf("HTTP/1.1 404 Not found\r\n");
+       hprintf("Content-Type: text/plain\r\n");
+       wc_printf("Not found\r\n");
+       end_burst();
+}
+
+int ReadHttpSubject(ParsedHttpHdrs *Hdr, StrBuf *Line, StrBuf *Buf)
+{
+       const char *Args;
+       void *vLine, *vHandler;
+       const char *Pos = NULL;
+
+       Hdr->HR.ReqLine = Line;
+       /* The requesttype... GET, POST... */
+       StrBufExtract_token(Buf, Hdr->HR.ReqLine, 0, ' ');
+       if (GetHash(HttpReqTypes, SKEY(Buf), &vLine) &&
+           (vLine != NULL))
+       {
+               Hdr->HR.eReqType = *(long*)vLine;
+       }
+       else {
+               Hdr->HR.eReqType = eGET;
+               return 1;
+       }
+       StrBufCutLeft(Hdr->HR.ReqLine, StrLength(Buf) + 1);
+
+       /* the HTTP Version... */
+       StrBufExtract_token(Buf, Hdr->HR.ReqLine, 1, ' ');
+       StrBufCutRight(Hdr->HR.ReqLine, StrLength(Buf) + 1);
+       
+       if (StrLength(Buf) == 0) {
+               Hdr->HR.eReqType = eGET;
+               return 1;
+       }
+
+       StrBufAppendBuf(Hdr->this_page, Hdr->HR.ReqLine, 0);
+
+       /* chop Filename / query arguments */
+       Args = strchr(ChrPtr(Hdr->HR.ReqLine), '?');
+       if (Args == NULL) /* whe're not that picky about params... TODO: this will spoil '&' in filenames.*/
+               Args = strchr(ChrPtr(Hdr->HR.ReqLine), '&');
+       if (Args != NULL) {
+               Args ++; /* skip the ? */
+               StrBufPlain(Hdr->PlainArgs, 
+                           Args, 
+                           StrLength(Hdr->HR.ReqLine) -
+                           (Args - ChrPtr(Hdr->HR.ReqLine)));
+               StrBufCutAt(Hdr->HR.ReqLine, 0, Args - 1);
+       } /* don't parse them yet, maybe we don't even care... */
+       
+       /* now lookup what we are going to do with this... */
+       /* skip first slash */
+       StrBufExtract_NextToken(Buf, Hdr->HR.ReqLine, &Pos, '/');
+       do {
+               StrBufExtract_NextToken(Buf, Hdr->HR.ReqLine, &Pos, '/');
+
+               GetHash(HandlerHash, SKEY(Buf), &vHandler),
+               Hdr->HR.Handler = (WebcitHandler*) vHandler;
+               if (Hdr->HR.Handler == NULL)
+                       break;
+               /*
+                * If the request is prefixed by "/webcit" then chop that off.  This
+                * allows a front end web server to forward all /webcit requests to us
+                * while still using the same web server port for other things.
+                */
+               if ((Hdr->HR.Handler->Flags & URLNAMESPACE) != 0)
+                       continue;
+               break;
+       } while (1);
+       /* remove the handlername from the URL */
+       if ((Pos != NULL) && (Pos != StrBufNOTNULL)){
+               StrBufCutLeft(Hdr->HR.ReqLine, 
+                             Pos - ChrPtr(Hdr->HR.ReqLine));
+       }
+
+       if (Hdr->HR.Handler != NULL) {
+               if ((Hdr->HR.Handler->Flags & BOGUS) != 0) {
+                       return 1;
+               }
+               Hdr->HR.DontNeedAuth = (
+                       ((Hdr->HR.Handler->Flags & ISSTATIC) != 0) ||
+                       ((Hdr->HR.Handler->Flags & ANONYMOUS) != 0)
+               );
+       }
+       else {
+               /* If this is a "flat" request for the root, display the configured landing page. */
+               int return_value;
+               StrBuf *NewLine = NewStrBuf();
+               Hdr->HR.DontNeedAuth = 1;
+               StrBufAppendPrintf(NewLine, "GET /landing?go=%s?failvisibly=1 HTTP/1.0", ChrPtr(Buf));
+               if (verbose) syslog(LOG_DEBUG, "Replacing with: %s", ChrPtr(NewLine));
+               return_value = ReadHttpSubject(Hdr, NewLine, Buf);
+               FreeStrBuf(&NewLine);
+               return return_value;
+       }
+
+       return 0;
+}
+
+int AnalyseHeaders(ParsedHttpHdrs *Hdr) {
+       OneHttpHeader *pHdr;
+       void *vHdr;
+       long HKLen;
+       const char *HashKey;
+       HashPos *at = GetNewHashPos(Hdr->HTTPHeaders, 0);
+       
+       while (GetNextHashPos(Hdr->HTTPHeaders, at, &HKLen, &HashKey, &vHdr) && 
+              (vHdr != NULL)) {
+               pHdr = (OneHttpHeader *)vHdr;
+               if (pHdr->HaveEvaluator)
+                       pHdr->H(pHdr->Val, Hdr);
+
+       }
+       DeleteHashPos(&at);
+       return 0;
+}
+
+
+/*
+ * Read in the request
+ */
+int ReadHTTPRequest(ParsedHttpHdrs *Hdr) {
+       const char *pch, *pchs, *pche;
+       OneHttpHeader *pHdr;
+       StrBuf *Line, *LastLine, *HeaderName;
+       int nLine = 0;
+       void *vF;
+       int isbogus = 0;
+
+       HeaderName = NewStrBuf();
+       LastLine = NULL;
+       do {
+               nLine ++;
+               Line = NewStrBufPlain(NULL, SIZ / 4);
+
+               if (ClientGetLine(Hdr, Line) < 0) {
+                       FreeStrBuf(&Line);
+                       isbogus = 1;
+                       break;
+               }
+
+               if (StrLength(Line) == 0) {
+                       FreeStrBuf(&Line);
+                       continue;
+               }
+               if (nLine == 1) {
+                       Hdr->HTTPHeaders = NewHash(1, NULL);
+                       pHdr = (OneHttpHeader*) malloc(sizeof(OneHttpHeader));
+                       memset(pHdr, 0, sizeof(OneHttpHeader));
+                       pHdr->Val = Line;
+                       Put(Hdr->HTTPHeaders, HKEY("GET /"), pHdr, DestroyHttpHeaderHandler);
+                       if (verbose || strstr(ChrPtr(Line), "sslg") == NULL) {
+                               syslog(LOG_DEBUG, "%s", ChrPtr(Line));
+                       }
+                       isbogus = ReadHttpSubject(Hdr, Line, HeaderName);
+                       if (isbogus) break;
+                       continue;
+               }
+
+               /* Do we need to Unfold? */
+               if ((LastLine != NULL) && (isspace(*ChrPtr(Line)))) {
+                       pch = pchs = ChrPtr(Line);
+                       pche = pchs + StrLength(Line);
+                       while (isspace(*pch) && (pch < pche)) {
+                               pch ++;
+                       }
+                       StrBufCutLeft(Line, pch - pchs);
+                       StrBufAppendBuf(LastLine, Line, 0);
+
+                       FreeStrBuf(&Line);
+                       continue;
+               }
+
+               StrBufSanitizeAscii(Line, (char)0xa7);
+               StrBufExtract_token(HeaderName, Line, 0, ':');
+
+               pchs = ChrPtr(Line);
+               pche = pchs + StrLength(Line);
+               pch = pchs + StrLength(HeaderName) + 1;
+               pche = pchs + StrLength(Line);
+               while ((pch < pche) && isspace(*pch)) {
+                       pch ++;
+               }
+               StrBufCutLeft(Line, pch - pchs);
+               StrBufUpCase(HeaderName);
+
+               pHdr = (OneHttpHeader*) malloc(sizeof(OneHttpHeader));
+               memset(pHdr, 0, sizeof(OneHttpHeader));
+               pHdr->Val = Line;
+
+               if (GetHash(HttpHeaderHandler, SKEY(HeaderName), &vF) && (vF != NULL)) {
+                       OneHttpHeader *FHdr = (OneHttpHeader*) vF;
+                       pHdr->H = FHdr->H;
+                       pHdr->HaveEvaluator = 1;
+               }
+               Put(Hdr->HTTPHeaders, SKEY(HeaderName), pHdr, DestroyHttpHeaderHandler);
+               LastLine = Line;
+       } while (Line != NULL);
+
+       FreeStrBuf(&HeaderName);
+
+       return isbogus;
+}
+
+void OverrideRequest(ParsedHttpHdrs *Hdr, const char *Line, long len)
+{
+       StrBuf *Buf = NewStrBuf();
+
+       if (Hdr->HR.ReqLine != NULL) {
+               FlushStrBuf(Hdr->HR.ReqLine);
+               StrBufPlain(Hdr->HR.ReqLine, Line, len);
+       }
+       else {
+               Hdr->HR.ReqLine = NewStrBufPlain(Line, len);
+       }
+       ReadHttpSubject(Hdr, Hdr->HR.ReqLine, Buf);
+
+       FreeStrBuf(&Buf);
+}
+
+/*
+ * handle one request
+ *
+ * This loop gets called once for every HTTP connection made to WebCit.  At
+ * this entry point we have an HTTP socket with a browser allegedly on the
+ * other end, but we have not yet bound to a WebCit session.
+ *
+ * The job of this function is to locate the correct session and bind to it,
+ * or create a session if necessary and bind to it, then run the WebCit
+ * transaction loop.  Afterwards, we unbind from the session.  When this
+ * function returns, the worker thread is then free to handle another
+ * transaction.
+ */
+void context_loop(ParsedHttpHdrs *Hdr) {
+       int isbogus = 0;
+       wcsession *TheSession;
+       struct timeval tx_start;
+       struct timeval tx_finish;
+       int session_may_be_reused = 1;
+       time_t now;
+       
+       gettimeofday(&tx_start, NULL);          /* start a stopwatch for performance timing */
+
+       /*
+        * Find out what it is that the web browser is asking for
+        */
+       isbogus = ReadHTTPRequest(Hdr);
+
+       Hdr->HR.dav_depth = 32767; /* TODO: find a general way to have non-0 defaults */
+
+       if (!isbogus) {
+               isbogus = AnalyseHeaders(Hdr);
+       }
+
+       if (    (isbogus)
+               || ((Hdr->HR.Handler != NULL)
+               && ((Hdr->HR.Handler->Flags & BOGUS) != 0))
+       ) {
+               wcsession *Bogus;
+               Bogus = CreateSession(0, 1, NULL, Hdr, NULL);
+               do_404();
+               syslog(LOG_WARNING, "HTTP: 404 [%ld.%06ld] %s %s",
+                       ((tx_finish.tv_sec*1000000 + tx_finish.tv_usec) - (tx_start.tv_sec*1000000 + tx_start.tv_usec)) / 1000000,
+                       ((tx_finish.tv_sec*1000000 + tx_finish.tv_usec) - (tx_start.tv_sec*1000000 + tx_start.tv_usec)) % 1000000,
+                       ReqStrs[Hdr->HR.eReqType],
+                       ChrPtr(Hdr->this_page)
+                       );
+               session_detach_modules(Bogus);
+               session_destroy_modules(&Bogus);
+               return;
+       }
+
+       if ((Hdr->HR.Handler != NULL) && ((Hdr->HR.Handler->Flags & ISSTATIC) != 0)) {
+               wcsession *Static;
+               Static = CreateSession(0, 1, NULL, Hdr, NULL);
+               
+               Hdr->HR.Handler->F();
+
+               /* How long did this transaction take? */
+               gettimeofday(&tx_finish, NULL);
+               
+               if (verbose)
+                       syslog(LOG_DEBUG, "HTTP: 200 [%ld.%06ld] %s %s",
+                              ((tx_finish.tv_sec*1000000 + tx_finish.tv_usec) - (tx_start.tv_sec*1000000 + tx_start.tv_usec)) / 1000000,
+                              ((tx_finish.tv_sec*1000000 + tx_finish.tv_usec) - (tx_start.tv_sec*1000000 + tx_start.tv_usec)) % 1000000,
+                              ReqStrs[Hdr->HR.eReqType],
+                              ChrPtr(Hdr->this_page)
+               );
+               session_detach_modules(Static);
+               session_destroy_modules(&Static);
+               return;
+       }
+
+       if (Hdr->HR.got_auth == AUTH_BASIC) {
+               CheckAuthBasic(Hdr);
+       }
+
+       if (Hdr->HR.got_auth) {
+               session_may_be_reused = 0;
+       }
+
+       /*
+        * See if there's an existing session open with any of:
+        * - The desired Session ID
+        * - A matching http-auth username and password
+        * - An unbound session flagged as reusable
+        */
+       TheSession = FindSession(&SessionList, Hdr, &SessionListMutex);
+
+       /*
+        * If there were no qualifying sessions, then create a new one.
+        */
+       if ((TheSession == NULL) || (TheSession->killthis != 0)) {
+               TheSession = CreateSession(1, 0, &SessionList, Hdr, &SessionListMutex);
+       }
+
+       /*
+        * Reject transactions which require http-auth, if http-auth was not provided
+        */
+       if (    (StrLength(Hdr->c_username) == 0)
+               && (!Hdr->HR.DontNeedAuth)
+               && (Hdr->HR.Handler != NULL)
+               && ((XHTTP_COMMANDS & Hdr->HR.Handler->Flags) == XHTTP_COMMANDS)
+       ) {
+               syslog(LOG_DEBUG, "http-auth required but not provided");
+               OverrideRequest(Hdr, HKEY("GET /401 HTTP/1.0"));
+               Hdr->HR.prohibit_caching = 1;                           
+       }
+
+       /*
+        * A future improvement might be to check the session integrity
+        * at this point before continuing.
+        */
+
+       /*
+        * Bind to the session and perform the transaction
+        */
+       now = time(NULL);;
+       CtdlLogResult(pthread_mutex_lock(&TheSession->SessionMutex));
+       pthread_setspecific(MyConKey, (void *)TheSession);
+       
+       TheSession->inuse = 1;                          /* mark the session as bound */
+       TheSession->isFailure = 0;                      /* reset evntually existing error flags */
+       TheSession->lastreq = now;                      /* log */
+       TheSession->Hdr = Hdr;
+
+       /*
+        * If a language was requested via a cookie, select that language now.
+        */
+       if (StrLength(Hdr->c_language) > 0) {
+               if (verbose) {
+                       syslog(LOG_DEBUG, "Session cookie requests language '%s'", ChrPtr(Hdr->c_language));
+               }
+               set_selected_language(ChrPtr(Hdr->c_language));
+               go_selected_language();
+       }
+
+       /*
+        * do the transaction
+        */
+       session_attach_modules(TheSession);
+       session_loop();
+
+       /* How long did this transaction take? */
+       gettimeofday(&tx_finish, NULL);
+
+       if (verbose || strstr(ChrPtr(Hdr->this_page), "sslg") == NULL) {
+               syslog(LOG_INFO, "HTTP: 200 [%ld.%06ld] %s %s",
+                      ((tx_finish.tv_sec*1000000 + tx_finish.tv_usec) - (tx_start.tv_sec*1000000 + tx_start.tv_usec)) / 1000000,
+                      ((tx_finish.tv_sec*1000000 + tx_finish.tv_usec) - (tx_start.tv_sec*1000000 + tx_start.tv_usec)) % 1000000,
+                      ReqStrs[Hdr->HR.eReqType],
+                      ChrPtr(Hdr->this_page)
+                       );
+       }
+       session_detach_modules(TheSession);
+
+       /* If *this* very transaction did not explicitly specify a session cookie,
+        * and it did not log in, we want to flag the session as a candidate for
+        * re-use by the next unbound client that comes along.  This keeps our session
+        * table from getting bombarded with new sessions when, for example, a web
+        * spider crawls the site without using cookies.
+        */
+       if ((session_may_be_reused) && (!TheSession->logged_in)) {
+               TheSession->wc_session = 0;             /* flag as available for re-use */
+               TheSession->selected_language = -1;     /* clear any non-default language setting */
+       }
+
+       TheSession->Hdr = NULL;
+       TheSession->inuse = 0;                                  /* mark the session as unbound */
+       CtdlLogResult(pthread_mutex_unlock(&TheSession->SessionMutex));
+}
+
+void tmplput_nonce(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       StrBufAppendPrintf(Target, "%ld",
+                          (WCC != NULL)? WCC->nonce:0);                   
+}
+
+void tmplput_current_user(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBufAppendTemplate(Target, TP, WC->wc_fullname, 0);
+}
+
+void Header_HandleContentLength(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       hdr->HR.ContentLength = StrToi(Line);
+}
+
+void Header_HandleContentType(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       hdr->HR.ContentType = Line;
+}
+
+
+void Header_HandleHost(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       if (hdr->HostHeader != NULL) {
+               FreeStrBuf(&hdr->HostHeader);
+       }
+       hdr->HostHeader = NewStrBuf();
+       StrBufAppendPrintf(hdr->HostHeader, "%s://", (is_https ? "https" : "http") );
+       StrBufAppendBuf(hdr->HostHeader, Line, 0);
+}
+
+void Header_HandleXFFHost(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       if (!follow_xff) return;
+
+       if (hdr->HostHeader != NULL) {
+               FreeStrBuf(&hdr->HostHeader);
+       }
+
+       hdr->HostHeader = NewStrBuf();
+       StrBufAppendPrintf(hdr->HostHeader, "http://"); /* this is naive; do something about it */
+       StrBufAppendBuf(hdr->HostHeader, Line, 0);
+}
+
+
+void Header_HandleXFF(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       hdr->HR.browser_host = Line;
+
+       while (StrBufNum_tokens(hdr->HR.browser_host, ',') > 1) {
+               StrBufRemove_token(hdr->HR.browser_host, 0, ',');
+       }
+       StrBufTrim(hdr->HR.browser_host);
+}
+
+void Header_HandleIfModSince(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       hdr->HR.if_modified_since = httpdate_to_timestamp(Line);
+}
+
+void Header_HandleAcceptEncoding(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       /*
+        * Can we compress?
+        */
+       if (strstr(&ChrPtr(Line)[16], "gzip")) {
+               hdr->HR.gzip_ok = 1;
+       }
+}
+
+void Header_HandleContentRange(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       const char *PRange = ChrPtr(Line);
+
+       while ((*PRange != '=') && (*PRange != '\0'))
+               PRange ++;
+       if (*PRange == '=')
+               PRange ++;
+       if ((*PRange == '\0'))
+               return;
+       hdr->HaveRange = 1;
+       hdr->RangeStart = atol(PRange);
+
+       while (isdigit(*PRange))
+               PRange++;
+
+       if (*PRange == '-')
+               PRange ++;
+       if ((*PRange == '\0'))
+               hdr->RangeTil = -1;
+       else
+               hdr->RangeTil = atol(PRange);
+}
+
+const char *ReqStrs[eNONE] = {
+       "GET",
+       "POST",
+       "OPTIONS",
+       "PROPFIND",
+       "PUT",
+       "DELETE",
+       "HEAD",
+       "MOVE",
+       "COPY",
+       "REPORT"
+};
+
+void
+ServerStartModule_CONTEXT
+(void)
+{
+       long *v;
+       HttpReqTypes = NewHash(1, NULL);
+       HttpHeaderHandler = NewHash(1, NULL);
+
+       v = malloc(sizeof(long));
+       *v = eGET;
+       Put(HttpReqTypes, HKEY("GET"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = ePOST;
+       Put(HttpReqTypes, HKEY("POST"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = eOPTIONS;
+       Put(HttpReqTypes, HKEY("OPTIONS"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = ePROPFIND;
+       Put(HttpReqTypes, HKEY("PROPFIND"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = ePUT;
+       Put(HttpReqTypes, HKEY("PUT"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = eDELETE;
+       Put(HttpReqTypes, HKEY("DELETE"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = eHEAD;
+       Put(HttpReqTypes, HKEY("HEAD"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = eMOVE;
+       Put(HttpReqTypes, HKEY("MOVE"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = eCOPY;
+       Put(HttpReqTypes, HKEY("COPY"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = eREPORT;
+       Put(HttpReqTypes, HKEY("REPORT"), v, NULL);
+}
+
+void 
+ServerShutdownModule_CONTEXT
+(void)
+{
+       DeleteHash(&HttpReqTypes);
+       DeleteHash(&HttpHeaderHandler);
+}
+
+void RegisterHeaderHandler(const char *Name, long Len, Header_Evaluator F)
+{
+       OneHttpHeader *pHdr;
+       pHdr = (OneHttpHeader*) malloc(sizeof(OneHttpHeader));
+       memset(pHdr, 0, sizeof(OneHttpHeader));
+       pHdr->H = F;
+       Put(HttpHeaderHandler, Name, Len, pHdr, DestroyHttpHeaderHandler);
+}
+
+
+void 
+InitModule_CONTEXT
+(void)
+{
+       RegisterHeaderHandler(HKEY("RANGE"), Header_HandleContentRange);
+       RegisterHeaderHandler(HKEY("CONTENT-LENGTH"), Header_HandleContentLength);
+       RegisterHeaderHandler(HKEY("CONTENT-TYPE"), Header_HandleContentType);
+       RegisterHeaderHandler(HKEY("X-FORWARDED-HOST"), Header_HandleXFFHost); /* Apache way... */
+       RegisterHeaderHandler(HKEY("X-REAL-IP"), Header_HandleXFFHost);        /* NGinX way... */
+       RegisterHeaderHandler(HKEY("HOST"), Header_HandleHost);
+       RegisterHeaderHandler(HKEY("X-FORWARDED-FOR"), Header_HandleXFF);
+       RegisterHeaderHandler(HKEY("ACCEPT-ENCODING"), Header_HandleAcceptEncoding);
+       RegisterHeaderHandler(HKEY("IF-MODIFIED-SINCE"), Header_HandleIfModSince);
+
+       RegisterNamespace("CURRENT_USER", 0, 1, tmplput_current_user, NULL, CTX_NONE);
+       RegisterNamespace("NONCE", 0, 0, tmplput_nonce, NULL, 0);
+
+       WebcitAddUrlHandler(HKEY("404"), "", 0, do_404, ANONYMOUS|COOKIEUNNEEDED);
+/*
+ * Look for commonly-found probes of malware such as worms, viruses, trojans, and Microsoft Office.
+ * Short-circuit these requests so we don't have to send them through the full processing loop.
+ */
+       WebcitAddUrlHandler(HKEY("scripts"), "", 0, do_404, ANONYMOUS|BOGUS);           /* /root.exe - Worms and trojans and viruses, oh my! */
+       WebcitAddUrlHandler(HKEY("c"), "", 0, do_404, ANONYMOUS|BOGUS);         /* /winnt */
+       WebcitAddUrlHandler(HKEY("MSADC"), "", 0, do_404, ANONYMOUS|BOGUS);
+       WebcitAddUrlHandler(HKEY("_vti"), "", 0, do_404, ANONYMOUS|BOGUS);              /* Broken Microsoft DAV implementation */
+       WebcitAddUrlHandler(HKEY("MSOffice"), "", 0, do_404, ANONYMOUS|BOGUS);          /* Stoopid MSOffice thinks everyone is IIS */
+       WebcitAddUrlHandler(HKEY("nonexistenshit"), "", 0, do_404, ANONYMOUS|BOGUS);    /* Exploit found in the wild January 2009 */
+}
+       
+
+void 
+HttpNewModule_CONTEXT
+(ParsedHttpHdrs *httpreq)
+{
+       httpreq->PlainArgs = NewStrBufPlain(NULL, SIZ);
+       httpreq->this_page = NewStrBufPlain(NULL, SIZ);
+}
+
+void 
+HttpDetachModule_CONTEXT
+(ParsedHttpHdrs *httpreq)
+{
+       FlushStrBuf(httpreq->PlainArgs);
+       FlushStrBuf(httpreq->HostHeader);
+       FlushStrBuf(httpreq->this_page);
+       FlushStrBuf(httpreq->PlainArgs);
+       DeleteHash(&httpreq->HTTPHeaders);
+       memset(&httpreq->HR, 0, sizeof(HdrRefs));
+}
+
+void 
+HttpDestroyModule_CONTEXT
+(ParsedHttpHdrs *httpreq)
+{
+       FreeStrBuf(&httpreq->this_page);
+       FreeStrBuf(&httpreq->PlainArgs);
+       FreeStrBuf(&httpreq->this_page);
+       FreeStrBuf(&httpreq->PlainArgs);
+       FreeStrBuf(&httpreq->HostHeader);
+       DeleteHash(&httpreq->HTTPHeaders);
+
+}
diff --git a/webcit/cookie_conversion.c b/webcit/cookie_conversion.c
new file mode 100644 (file)
index 0000000..dcdc6da
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+
+/*
+ * String to unset the cookie.
+ * Any date "in the past" will work, so I chose my birthday, right down to
+ * the exact minute.  :)
+ */
+static char *unset = "; expires=28-May-1971 18:10:00 GMT";
+typedef unsigned char byte;          /* Byte type used by cookie_to_stuff() */
+extern const char *get_selected_language(void);
+
+/*
+ * Pack all session info into one easy-to-digest cookie. Healthy and delicious!
+ */
+void stuff_to_cookie(int unset_cookies)
+{
+       wcsession *WCC = WC;
+       char buf[SIZ];
+
+       if (unset_cookies) {
+               hprintf("Set-cookie: webcit=%s; path=/\r\n", unset);
+       }
+       else
+       {
+               StrBufAppendPrintf(WCC->HBuf, "Set-cookie: webcit=");
+               snprintf(buf, sizeof(buf), "%d", WCC->wc_session);
+               StrBufHexescAppend(WCC->HBuf, NULL, buf);
+               StrBufHexescAppend(WCC->HBuf, NULL, "|");
+               StrBufHexescAppend(WCC->HBuf, WCC->wc_username, NULL);
+               StrBufHexescAppend(WCC->HBuf, NULL, "|");
+               StrBufHexescAppend(WCC->HBuf, WCC->wc_password, NULL);
+               StrBufHexescAppend(WCC->HBuf, NULL, "|");
+               StrBufHexescAppend(WCC->HBuf, WCC->CurRoom.name, NULL);
+               StrBufHexescAppend(WCC->HBuf, NULL, "|");
+               StrBufHexescAppend(WCC->HBuf, NULL, get_selected_language());
+               StrBufHexescAppend(WCC->HBuf, NULL, "|");
+
+               if (server_cookie != NULL) {
+                       StrBufAppendPrintf(WCC->HBuf, 
+                                          ";path=/ \r\n%s\r\n", 
+                                          server_cookie);
+               }
+               else {
+                       StrBufAppendBufPlain(WCC->HBuf,
+                                            HKEY("; path=/\r\n"), 0);
+               }
+       }
+}
+
+/*
+ * Extract all that fun stuff out of the cookie.
+ */
+void cookie_to_stuff(StrBuf *cookie,
+                       int *session,
+                       StrBuf *user,
+                       StrBuf *pass,
+                       StrBuf *room,
+                       StrBuf *language)
+{
+       if (session != NULL) {
+               *session = StrBufExtract_int(cookie, 0, '|');
+       }
+       if (user != NULL) {
+               StrBufExtract_token(user, cookie, 1, '|');
+       }
+       if (pass != NULL) {
+               StrBufExtract_token(pass, cookie, 2, '|');
+       }
+       if (room != NULL) {
+               StrBufExtract_token(room, cookie, 3, '|');
+       }
+       if (language != NULL) {
+               StrBufExtract_token(language, cookie, 4, '|');
+       }
+}
diff --git a/webcit/crypto.c b/webcit/crypto.c
new file mode 100644 (file)
index 0000000..0a91289
--- /dev/null
@@ -0,0 +1,251 @@
+// Copyright (c) 1996-2022 by the citadel.org team
+//
+// This program is open source software.  You can redistribute it and/or
+// modify it under the terms of the GNU General Public License, version 3.
+// 
+// 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.
+
+#include "sysdep.h"
+#ifdef HAVE_OPENSSL
+
+#include "webcit.h"
+#include "webserver.h"
+
+
+SSL_CTX *ssl_ctx;              // Global SSL context
+char key_file[PATH_MAX] = "";
+char cert_file[PATH_MAX] = "";
+char *ssl_cipher_list = DEFAULT_SSL_CIPHER_LIST;
+
+pthread_key_t ThreadSSL;       // Per-thread SSL context
+
+
+// Set the private key and certificate chain for the global SSL Context.
+// This is called during initialization, and can be called again later if the certificate changes.
+void bind_to_key_and_certificate(void) {
+
+       SSL_CTX *old_ctx, *new_ctx;
+
+       if (IsEmptyStr(key_file)) {
+               snprintf(key_file, sizeof key_file, "%s/keys/citadel.key", ctdl_dir);
+       }
+       if (IsEmptyStr(cert_file)) {
+               snprintf(cert_file, sizeof key_file, "%s/keys/citadel.cer", ctdl_dir);
+       }
+
+       if (!(new_ctx = SSL_CTX_new(SSLv23_server_method()))) {
+               syslog(LOG_WARNING, "SSL_CTX_new failed: %s", ERR_reason_error_string(ERR_get_error()));
+               return;
+       }
+
+       syslog(LOG_INFO, "Requesting cipher list: %s", ssl_cipher_list);
+       if (!(SSL_CTX_set_cipher_list(new_ctx, ssl_cipher_list))) {
+               syslog(LOG_WARNING, "SSL_CTX_set_cipher_list failed: %s", ERR_reason_error_string(ERR_get_error()));
+               return;
+       }
+
+       syslog(LOG_DEBUG, "crypto: [re]installing key \"%s\" and certificate \"%s\"", key_file, cert_file);
+
+       SSL_CTX_use_certificate_chain_file(new_ctx, cert_file);
+       SSL_CTX_use_PrivateKey_file(new_ctx, key_file, SSL_FILETYPE_PEM);
+
+       if ( !SSL_CTX_check_private_key(new_ctx) ) {
+               syslog(LOG_WARNING, "crypto: cannot install certificate: %s", ERR_reason_error_string(ERR_get_error()));
+       }
+
+       old_ctx = ssl_ctx;
+       ssl_ctx = new_ctx;
+       sleep(1);
+       SSL_CTX_free(old_ctx);
+}
+
+
+// initialize ssl engine, load certs and initialize openssl internals
+void init_ssl(void) {
+
+       // Initialize the OpenSSL library
+       SSL_load_error_strings();
+       ERR_load_crypto_strings();
+       OpenSSL_add_all_algorithms();
+       SSL_library_init();
+
+       // Now try to bind to the key and certificate.
+       bind_to_key_and_certificate();
+}
+
+
+// Check the modification time of the key and certificate -- reload if either one changed
+void update_key_and_cert_if_needed(void) {
+       static time_t previous_mtime = 0;
+       struct stat keystat;
+       struct stat certstat;
+
+       if (stat(key_file, &keystat) != 0) {
+               syslog(LOG_ERR, "%s: %s", key_file, strerror(errno));
+               return;
+       }
+       if (stat(cert_file, &certstat) != 0) {
+               syslog(LOG_ERR, "%s: %s", cert_file, strerror(errno));
+               return;
+       }
+
+       if ((keystat.st_mtime + certstat.st_mtime) != previous_mtime) {
+               bind_to_key_and_certificate();
+               previous_mtime = keystat.st_mtime + certstat.st_mtime;
+       }
+}
+
+
+// starts SSL/TLS encryption for the current session.
+int starttls(int sock) {
+       SSL *newssl;
+       int retval, bits, alg_bits;
+
+       // Check the modification time of the key and certificate -- reload if they changed
+       update_key_and_cert_if_needed();
+       
+       // SSL is a thread-specific thing, I think.
+       pthread_setspecific(ThreadSSL, NULL);
+
+       if (!ssl_ctx) {
+               return(1);
+       }
+       if (!(newssl = SSL_new(ssl_ctx))) {
+               syslog(LOG_WARNING, "SSL_new failed: %s", ERR_reason_error_string(ERR_get_error()));
+               return(2);
+       }
+       if (!(SSL_set_fd(newssl, sock))) {
+               syslog(LOG_WARNING, "SSL_set_fd failed: %s", ERR_reason_error_string(ERR_get_error()));
+               SSL_free(newssl);
+               return(3);
+       }
+       retval = SSL_accept(newssl);
+       if (retval < 1) {
+               // Can't notify the client of an error here; they will
+               // discover the problem at the SSL layer and should
+               // revert to unencrypted communications.
+               long errval;
+               const char *ssl_error_reason = NULL;
+
+               errval = SSL_get_error(newssl, retval);
+               ssl_error_reason = ERR_reason_error_string(ERR_get_error());
+               if (ssl_error_reason == NULL) {
+                       syslog(LOG_WARNING, "first SSL_accept failed: errval=%ld, retval=%d %s", errval, retval, strerror(errval));
+               }
+               else {
+                       syslog(LOG_WARNING, "first SSL_accept failed: %s", ssl_error_reason);
+               }
+       }
+       else {
+               syslog(LOG_INFO, "SSL_accept success");
+       }
+       BIO_set_close(SSL_get_rbio(newssl), BIO_NOCLOSE);
+       bits = SSL_CIPHER_get_bits(SSL_get_current_cipher(newssl), &alg_bits);
+       syslog(LOG_INFO, "SSL/TLS using %s on %s (%d of %d bits)",
+               SSL_CIPHER_get_name(SSL_get_current_cipher(newssl)),
+               SSL_CIPHER_get_version(SSL_get_current_cipher(newssl)),
+               bits, alg_bits);
+
+       pthread_setspecific(ThreadSSL, newssl);
+       syslog(LOG_INFO, "SSL started");
+       return(0);
+}
+
+
+// shuts down the TLS connection
+//
+// WARNING:  This may make your session vulnerable to a known plaintext
+// attack in the current implmentation.
+void endtls(void) {
+
+       if (THREADSSL == NULL) {
+               return;
+       }
+
+       syslog(LOG_INFO, "Ending SSL/TLS");
+       SSL_shutdown(THREADSSL);
+       SSL_get_SSL_CTX(THREADSSL);
+       SSL_free(THREADSSL);
+       pthread_setspecific(ThreadSSL, NULL);
+}
+
+
+// Send binary data to the client encrypted.
+int client_write_ssl(const StrBuf *Buf) {
+       const char *buf;
+       int retval;
+       int nremain;
+       long nbytes;
+       char junk[1];
+
+       if (THREADSSL == NULL) return -1;
+
+       nbytes = nremain = StrLength(Buf);
+       buf = ChrPtr(Buf);
+
+       while (nremain > 0) {
+               if (SSL_want_write(THREADSSL)) {
+                       if ((SSL_read(THREADSSL, junk, 0)) < 1) {
+                               syslog(LOG_WARNING, "SSL_read in client_write: %s", ERR_reason_error_string(ERR_get_error()));
+                       }
+               }
+               retval = SSL_write(THREADSSL, &buf[nbytes - nremain], nremain);
+               if (retval < 1) {
+                       long errval;
+
+                       errval = SSL_get_error(THREADSSL, retval);
+                       if (errval == SSL_ERROR_WANT_READ || errval == SSL_ERROR_WANT_WRITE) {
+                               sleeeeeeeeeep(1);
+                               continue;
+                       }
+                       syslog(LOG_WARNING, "SSL_write: %s", ERR_reason_error_string(ERR_get_error()));
+                       if (retval == -1) {
+                               syslog(LOG_WARNING, "errno is %d\n", errno);
+                       }
+                       endtls();
+                       return -1;
+               }
+               nremain -= retval;
+       }
+       return 0;
+}
+
+
+// read data from the encrypted layer.
+int client_read_sslbuffer(StrBuf *buf, int timeout) {
+       char sbuf[16384];       // OpenSSL communicates in 16k blocks, so let's speak its native tongue.
+       int rlen;
+       char junk[1];
+       SSL *pssl = THREADSSL;
+
+       if (pssl == NULL) return(-1);
+
+       while (1) {
+               if (SSL_want_read(pssl)) {
+                       if ((SSL_write(pssl, junk, 0)) < 1) {
+                               syslog(LOG_WARNING, "SSL_write in client_read");
+                       }
+               }
+               rlen = SSL_read(pssl, sbuf, sizeof(sbuf));
+               if (rlen < 1) {
+                       long errval;
+
+                       errval = SSL_get_error(pssl, rlen);
+                       if (errval == SSL_ERROR_WANT_READ || errval == SSL_ERROR_WANT_WRITE) {
+                               sleeeeeeeeeep(1);
+                               continue;
+                       }
+                       syslog(LOG_WARNING, "SSL_read in client_read: %s", ERR_reason_error_string(ERR_get_error()));
+                       endtls();
+                       return (-1);
+               }
+               StrBufAppendBufPlain(buf, sbuf, rlen, 0);
+               return rlen;
+       }
+       return (0);
+}
+
+#endif                         /* HAVE_OPENSSL */
diff --git a/webcit/dav.h b/webcit/dav.h
new file mode 100644 (file)
index 0000000..3426c81
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+
+/*
+ * Data passed back and forth between dav_get() and its callback functions called by the MIME parser
+ */
+struct epdata {
+       char desired_content_type_1[128];
+       char desired_content_type_2[128];
+       char found_section[128];
+       char charset[128];
+};
+
+
+void dav_common_headers(void);
+void dav_main(void);
+void dav_get(void);
+void dav_put(void);
+void dav_delete(void);
+void dav_propfind(void);
+void dav_options(void);
+void dav_report(void);
+
+long locate_message_by_uid(const char *);
+void dav_folder_list(void);
+void euid_escapize(char *, const char *);
+void euid_unescapize(char *, const char *);
+void dav_identify_host(void);
+void dav_identify_hosthdr(void);
+
+void RegisterDAVNamespace(const char * UrlString, 
+                         long UrlSLen, 
+                         const char *DisplayName, 
+                         long dslen, 
+                         WebcitHandlerFunc F, 
+                         WebcitRESTDispatchID RID,
+                         long Flags);
diff --git a/webcit/dav_delete.c b/webcit/dav_delete.c
new file mode 100644 (file)
index 0000000..6abd8ce
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Handles GroupDAV DELETE requests.
+ *
+ * Copyright (c) 2005-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+
+/*
+ * The pathname is always going to be /groupdav/room_name/euid
+ */
+void dav_delete(void) 
+{
+       wcsession *WCC = WC;
+       char dav_uid[SIZ];
+       long dav_msgnum = (-1);
+       char buf[SIZ];
+       int n = 0;
+       StrBuf *dav_roomname = NewStrBuf();
+       
+       /* Now extract the message euid */
+       n = StrBufNum_tokens(WCC->Hdr->HR.ReqLine, '/');
+       extract_token(dav_uid, ChrPtr(WCC->Hdr->HR.ReqLine), n-1, '/', sizeof dav_uid);
+       StrBufExtract_token(dav_roomname, WCC->Hdr->HR.ReqLine, 0, '/');
+
+       ///* What's left is the room name.  Remove trailing slashes. */
+       //len = StrLength(WCC->Hdr->HR.ReqLine);
+       //if ((len > 0) && (ChrPtr(WCC->Hdr->HR.ReqLinee)[len-1] == '/')) {
+       //      StrBufCutRight(WCC->Hdr->HR.ReqLine, 1);
+       //}
+       //StrBufCutLeft(WCC->Hdr->HR.ReqLine, 1);
+
+       /* Go to the correct room. */
+       if (strcasecmp(ChrPtr(WC->CurRoom.name), ChrPtr(dav_roomname))) {
+               gotoroom(dav_roomname);
+       }
+       if (strcasecmp(ChrPtr(WC->CurRoom.name), ChrPtr(dav_roomname))) {
+               hprintf("HTTP/1.1 404 not found\r\n");
+               dav_common_headers();
+               hprintf("Content-Length: 0\r\n\r\n");
+               begin_burst();
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               return;
+       }
+
+       dav_msgnum = locate_message_by_uid(dav_uid);
+
+       /*
+        * If no item exists with the requested uid ... simple error.
+        */
+       if (dav_msgnum < 0L) {
+               hprintf("HTTP/1.1 404 Not Found\r\n");
+               dav_common_headers();
+               hprintf("Content-Length: 0\r\n\r\n");
+               begin_burst();
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               return;
+       }
+
+       /*
+        * It's there ... check the ETag and make sure it matches
+        * the message number.
+        */
+       if (StrLength(WCC->Hdr->HR.dav_ifmatch) > 0) {
+               if (StrTol(WCC->Hdr->HR.dav_ifmatch) != dav_msgnum) {
+                       hprintf("HTTP/1.1 412 Precondition Failed\r\n");
+                       dav_common_headers();
+                       hprintf("Content-Length: 0\r\n\r\n");
+                       begin_burst();
+                       end_burst();
+                       FreeStrBuf(&dav_roomname);
+                       return;
+               }
+       }
+
+       /*
+        * Ok, attempt to delete the item.
+        */
+       serv_printf("DELE %ld", dav_msgnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               hprintf("HTTP/1.1 204 No Content\r\n"); /* success */
+               dav_common_headers();
+               hprintf("Content-Length: 0\r\n\r\n");
+               begin_burst();
+               end_burst();
+       }
+       else {
+               hprintf("HTTP/1.1 403 Forbidden\r\n");  /* access denied */
+               dav_common_headers();
+               hprintf("Content-Length: 0\r\n\r\n");
+               begin_burst();
+               end_burst();
+       }
+       FreeStrBuf(&dav_roomname);
+       return;
+}
diff --git a/webcit/dav_get.c b/webcit/dav_get.c
new file mode 100644 (file)
index 0000000..9c57f52
--- /dev/null
@@ -0,0 +1,275 @@
+/*
+ * Handles GroupDAV GET requests.
+ *
+ * Copyright (c) 2005-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+
+/*
+ * Fetch the entire contents of the room as one big ics file.
+ * This is for "webcal://" type access.
+ */    
+void dav_get_big_ics(void) {
+       char buf[1024];
+
+       serv_puts("ICAL getics");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               hprintf("HTTP/1.1 404 not found\r\n");
+               dav_common_headers();
+               hprintf("Content-Type: text/plain\r\n");
+               begin_burst();
+               wc_printf("%s\r\n",
+                       &buf[4]
+                       );
+               end_burst();
+               return;
+       }
+
+       hprintf("HTTP/1.1 200 OK\r\n");
+       dav_common_headers();
+       hprintf("Content-type: text/calendar; charset=UTF-8\r\n");
+       begin_burst();
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               wc_printf("%s\r\n", buf);
+       }
+       end_burst();
+}
+
+
+/* 
+ * MIME parser callback function for dav_get()
+ * Helps identify the relevant section of a multipart message
+ */
+void extract_preferred(char *name, char *filename, char *partnum, char *disp,
+                       void *content, char *cbtype, char *cbcharset,
+                       size_t length, char *encoding, char *cbid, void *userdata)
+{
+       struct epdata *epdata = (struct epdata *)userdata;
+       int hit = 0;
+
+       /* We only want the first one that we found */
+       if (!IsEmptyStr(epdata->found_section)) return;
+
+       /* Check for a content type match */
+       if (strlen(epdata->desired_content_type_1) > 0) {
+               if (!strcasecmp(epdata->desired_content_type_1, cbtype)) {
+                       hit = 1;
+               }
+       }
+       if (!IsEmptyStr(epdata->desired_content_type_2)) {
+               if (!strcasecmp(epdata->desired_content_type_2, cbtype)) {
+                       hit = 1;
+               }
+       }
+
+       /* Is this the one?  If so, output it. */
+       if (hit) {
+               safestrncpy(epdata->found_section, partnum, sizeof epdata->found_section);
+               if (!IsEmptyStr(cbcharset)) {
+                       safestrncpy(epdata->charset, cbcharset, sizeof epdata->charset);
+               }
+               hprintf("Content-type: %s; charset=%s\r\n", cbtype, epdata->charset);
+               begin_burst();
+               StrBufAppendBufPlain(WC->WBuf, content, length, 0);
+               end_burst();
+       }
+}
+
+
+
+/*
+ * The pathname is always going to take one of two formats:
+ * /groupdav/room_name/euid    (GroupDAV)
+ * /groupdav/room_name         (webcal)
+ */
+void dav_get(void)
+{
+       wcsession *WCC = WC;
+       StrBuf *dav_roomname;
+       StrBuf *dav_uid;
+       long dav_msgnum = (-1);
+       char buf[1024];
+       int in_body = 0;
+       char *ptr;
+       char *endptr;
+       char *msgtext = NULL;
+       size_t msglen = 0;
+       size_t msgalloc = 0;
+       int linelen;
+       char content_type[128];
+       char charset[128];
+       char date[128];
+       struct epdata epdata;
+
+       if (StrBufNum_tokens(WCC->Hdr->HR.ReqLine, '/') < 2) {
+               hprintf("HTTP/1.1 404 not found\r\n");
+               dav_common_headers();
+               hprintf("Content-Type: text/plain\r\n");
+               wc_printf("The object you requested was not found.\r\n");
+               end_burst();
+               return;
+       }
+
+       dav_roomname = NewStrBuf();;
+       dav_uid = NewStrBuf();;
+       StrBufExtract_token(dav_roomname, WCC->Hdr->HR.ReqLine, 0, '/');
+       StrBufExtract_token(dav_uid, WCC->Hdr->HR.ReqLine, 1, '/');
+       if ((!strcasecmp(ChrPtr(dav_uid), "ics")) || 
+           (!strcasecmp(ChrPtr(dav_uid), "calendar.ics"))) {
+               FlushStrBuf(dav_uid);
+       }
+
+       /* Go to the correct room. */
+       if (strcasecmp(ChrPtr(WCC->CurRoom.name), ChrPtr(dav_roomname))) {
+               gotoroom(dav_roomname);
+       }
+       if (strcasecmp(ChrPtr(WCC->CurRoom.name), ChrPtr(dav_roomname))) {
+               hprintf("HTTP/1.1 404 not found\r\n");
+               dav_common_headers();
+               hprintf("Content-Type: text/plain\r\n");
+               wc_printf("There is no folder called \"%s\" on this server.\r\n",
+                       ChrPtr(dav_roomname));
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       /** GET on the collection itself returns an ICS of the entire collection.
+        */
+       if (StrLength(dav_uid) == 0) {
+               dav_get_big_ics();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       dav_msgnum = locate_message_by_uid(ChrPtr(dav_uid));
+       serv_printf("MSG2 %ld", dav_msgnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               hprintf("HTTP/1.1 404 not found\r\n");
+               dav_common_headers();
+               hprintf("Content-Type: text/plain\r\n");
+               wc_printf("Object \"%s\" was not found in the \"%s\" folder.\r\n",
+                       ChrPtr(dav_uid),
+                       ChrPtr(dav_roomname));
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+       FreeStrBuf(&dav_roomname);
+       FreeStrBuf(&dav_uid);
+
+       /* We got it; a message is now arriving from the server.  Read it in. */
+
+       in_body = 0;
+       strcpy(charset, "UTF-8");
+       strcpy(content_type, "text/plain");
+       strcpy(date, "");
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               linelen = strlen(buf);
+
+               /* Append it to the buffer */
+               if ((msglen + linelen + 3) > msgalloc) {
+                       msgalloc = ( (msgalloc > 0) ? (msgalloc * 2) : 1024 );
+                       msgtext = realloc(msgtext, msgalloc);
+               }
+               strcpy(&msgtext[msglen], buf);
+               msglen += linelen;
+               strcpy(&msgtext[msglen], "\n");
+               msglen += 1;
+
+               /* Also learn some things about the message */
+               if (linelen == 0) {
+                       in_body = 1;
+               }
+               if (!in_body) {
+                       if (!strncasecmp(buf, "Date:", 5)) {
+                               safestrncpy(date, &buf[5], sizeof date);
+                               string_trim(date);
+                       }
+                       if (!strncasecmp(buf, "Content-type:", 13)) {
+                               safestrncpy(content_type, &buf[13], sizeof content_type);
+                               string_trim(content_type);
+                               ptr = bmstrcasestr(&buf[13], "charset=");
+                               if (ptr) {
+                                       safestrncpy(charset, ptr+8, sizeof charset);
+                                       string_trim(charset);
+                                       endptr = strchr(charset, ';');
+                                       if (endptr != NULL) strcpy(endptr, "");
+                               }
+                               endptr = strchr(content_type, ';');
+                               if (endptr != NULL) strcpy(endptr, "");
+                       }
+               }
+       }
+       msgtext[msglen] = 0;
+
+       /* Output headers common to single or multi part messages */
+
+       hprintf("HTTP/1.1 200 OK\r\n");
+       dav_common_headers();
+       hprintf("etag: \"%ld\"\r\n", dav_msgnum);
+       hprintf("Date: %s\r\n", date);
+
+       memset(&epdata, 0, sizeof(struct epdata));
+       safestrncpy(epdata.charset, charset, sizeof epdata.charset);
+
+       /* If we have a multipart message on our hands, and we are in a groupware room,
+        * strip it down to only the relevant part.
+        */
+       if (!strncasecmp(content_type, "multipart/", 10)) {
+
+               if ( (WCC->CurRoom.defview == VIEW_CALENDAR) || (WCC->CurRoom.defview == VIEW_TASKS) ) {
+                       strcpy(epdata.desired_content_type_1, "text/calendar");
+               }
+
+               else if (WCC->CurRoom.defview == VIEW_ADDRESSBOOK) {
+                       strcpy(epdata.desired_content_type_1, "text/vcard");
+                       strcpy(epdata.desired_content_type_2, "text/x-vcard");
+               }
+
+               mime_parser(msgtext, &msgtext[msglen], extract_preferred, NULL, NULL, (void *)&epdata, 0);
+       }
+
+       /* If epdata.found_section is empty, we haven't output anything yet, so output the whole thing */
+
+       if (IsEmptyStr(epdata.found_section)) {
+               ptr = msgtext;
+               endptr = &msgtext[msglen];
+       
+               hprintf("Content-type: %s; charset=%s\r\n", content_type, charset);
+       
+               in_body = 0;
+               do {
+                       ptr = memreadline(ptr, buf, sizeof buf);
+       
+                       if (in_body) {
+                               wc_printf("%s\r\n", buf);
+                       }
+                       else if ((buf[0] == 0) && (in_body == 0)) {
+                               in_body = 1;
+                               begin_burst();
+                       }
+               } while (ptr < endptr);
+       
+               end_burst();
+       }
+
+       free(msgtext);
+}
diff --git a/webcit/dav_main.c b/webcit/dav_main.c
new file mode 100644 (file)
index 0000000..31cbfaf
--- /dev/null
@@ -0,0 +1,357 @@
+/*
+ * Entry point for GroupDAV functions
+ *
+ * Copyright (c) 2005-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+CtxType CTX_DAVNS = CTX_NONE;
+extern HashList *HandlerHash;
+
+HashList *DavNamespaces = NULL;
+
+/*
+ * Output HTTP headers which are common to all requests.
+ *
+ * Please observe that we don't use the usual output_headers()
+ * and wDumpContent() functions in the GroupDAV subsystem, so we
+ * do our own header stuff here.
+ *
+ */
+void dav_common_headers(void) {
+       hprintf(
+               "Server: %s / %s\r\n"
+               "Connection: close\r\n",
+               PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software)
+       );
+}
+
+
+
+/*
+ * string conversion function
+ */
+void euid_escapize(char *target, const char *source) {
+       int i, len;
+       int target_length = 0;
+
+       strcpy(target, "");
+       len = strlen(source);
+       for (i=0; i<len; ++i) {
+               if ( (isalnum(source[i])) || (source[i]=='-') || (source[i]=='_') ) {
+                       target[target_length] = source[i];
+                       target[++target_length] = 0;
+               }
+               else {
+                       sprintf(&target[target_length], "=%02X", (0xFF & source[i]));
+                       target_length += 3;
+               }
+       }
+}
+
+/*
+ * string conversion function
+ */
+void euid_unescapize(char *target, const char *source) {
+       int a, b, len;
+       char hex[3];
+       int target_length = 0;
+
+       strcpy(target, "");
+
+       len = strlen(source);
+       for (a = 0; a < len; ++a) {
+               if (source[a] == '=') {
+                       hex[0] = source[a + 1];
+                       hex[1] = source[a + 2];
+                       hex[2] = 0;
+                       b = 0;
+                       b = decode_hex(hex);
+                       target[target_length] = b;
+                       target[++target_length] = 0;
+                       a += 2;
+               }
+               else {
+                       target[target_length] = source[a];
+                       target[++target_length] = 0;
+               }
+       }
+}
+
+
+
+
+/*
+ * Main entry point for GroupDAV requests
+ */
+void dav_main(void)
+{
+       wcsession *WCC = WC;
+       int i, len;
+
+       syslog(LOG_DEBUG, "dav_main() called, logged_in=%d", WCC->logged_in );
+
+       StrBufUnescape(WCC->Hdr->HR.ReqLine, 0);
+       StrBufStripSlashes(WCC->Hdr->HR.ReqLine, 0);
+
+       /*
+        * If there's an If-Match: header, strip out the quotes if present, and
+        * then if all that's left is an asterisk, make it go away entirely.
+        */
+       len = StrLength(WCC->Hdr->HR.dav_ifmatch);
+       if (len > 0) {
+               StrBufTrim(WCC->Hdr->HR.dav_ifmatch);
+               if (ChrPtr(WCC->Hdr->HR.dav_ifmatch)[0] == '\"') {
+                       StrBufCutLeft(WCC->Hdr->HR.dav_ifmatch, 1);
+                       len --;
+                       for (i=0; i<len; ++i) {
+                               if (ChrPtr(WCC->Hdr->HR.dav_ifmatch)[i] == '\"') {
+                                       StrBufCutAt(WCC->Hdr->HR.dav_ifmatch, i, NULL);
+                                       len = StrLength(WCC->Hdr->HR.dav_ifmatch);
+                               }
+                       }
+               }
+               if (!strcmp(ChrPtr(WCC->Hdr->HR.dav_ifmatch), "*")) {
+                       FlushStrBuf(WCC->Hdr->HR.dav_ifmatch);
+               }
+       }
+
+       switch (WCC->Hdr->HR.eReqType)
+       {
+       /*
+        * The OPTIONS method is not required by GroupDAV but it will be
+        * needed for future implementations of other DAV-based protocols.
+        */
+       case eOPTIONS:
+               dav_options();
+               break;
+
+       /*
+        * The PROPFIND method is basically used to list all objects in a
+        * room, or to list all relevant rooms on the server.
+        */
+       case ePROPFIND:
+               dav_propfind();
+               break;
+
+       /*
+        * The GET method is used for fetching individual items.
+        */
+       case eGET:
+               dav_get();
+               break;
+       
+       /*
+        * The PUT method is used to add or modify items.
+        */
+       case ePUT:
+               dav_put();
+               break;
+       
+       /*
+        * The DELETE method kills, maims, and destroys.
+        */
+       case eDELETE:
+               dav_delete();
+               break;
+
+       /*
+        * The REPORT method tells us that Mike Shaver is a self-righteous asshole.
+        */
+       case eREPORT:
+               dav_report();
+               break;
+
+       default:
+       /*
+        * Couldn't find what we were looking for.  Die in a car fire.
+        */
+               hprintf("HTTP/1.1 501 Method not implemented\r\n");
+               dav_common_headers();
+               hprintf("Content-Type: text/plain\r\n");
+               wc_printf("GroupDAV method \"%s\" is not implemented.\r\n",
+                       ReqStrs[WCC->Hdr->HR.eReqType]);
+               end_burst();
+       }
+}
+
+
+/*
+ * Output our host prefix for globally absolute URL's.
+ */  
+void dav_identify_host(void) {
+       wc_printf("%s", ChrPtr(site_prefix));
+}
+
+
+void tmplput_dav_HOSTNAME(StrBuf *Target, WCTemplputParams *TP) 
+{
+       StrBufAppendPrintf(Target, "%s", ChrPtr(site_prefix));
+}
+
+/*
+ * Output our host prefix for globally absolute URL's.
+ */  
+void dav_identify_hosthdr(void) {
+       hprintf("%s", ChrPtr(site_prefix));
+}
+
+
+void Header_HandleIfMatch(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       hdr->HR.dav_ifmatch = Line;
+}
+       
+
+void Header_HandleDepth(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       if (!strcasecmp(ChrPtr(Line), "infinity")) {
+               hdr->HR.dav_depth = 32767;
+       }
+       else if (strcmp(ChrPtr(Line), "0") == 0) {
+               hdr->HR.dav_depth = 0;
+       }
+       else if (strcmp(ChrPtr(Line), "1") == 0) {
+               hdr->HR.dav_depth = 1;
+       }
+}
+
+
+int Conditional_DAV_DEPTH(StrBuf *Target, WCTemplputParams *TP)
+{
+       return WC->Hdr->HR.dav_depth == GetTemplateTokenNumber(Target, TP, 2, 0);
+}
+
+
+void RegisterDAVNamespace(const char * UrlString, 
+                         long UrlSLen, 
+                         const char *DisplayName, 
+                         long dslen, 
+                         WebcitHandlerFunc F, 
+                         WebcitRESTDispatchID RID,
+                         long Flags)
+{
+       void *vHandler;
+
+       /* first put it in... */
+       WebcitAddUrlHandler(UrlString, UrlSLen, DisplayName, dslen, F, Flags|PARSE_REST_URL);
+       /* get it out again... */
+       GetHash(HandlerHash, UrlString, UrlSLen, &vHandler);
+       ((WebcitHandler*)vHandler)->RID = RID;
+       /* and keep a copy of it, so we can compare it later */
+       Put(DavNamespaces, UrlString, UrlSLen, vHandler, reference_free_handler);
+}
+
+
+int Conditional_DAV_NS(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       void *vHandler;
+       const char *NS;
+       long NSLen;
+
+       GetTemplateTokenString(NULL, TP, 2, &NS, &NSLen);
+       GetHash(HandlerHash, NS, NSLen, &vHandler);
+       return WCC->Hdr->HR.Handler == vHandler;
+}
+
+
+int Conditional_DAV_NSCURRENT(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       void *vHandler;
+
+       vHandler = CTX(CTX_NONE);
+       return WCC->Hdr->HR.Handler == vHandler;
+}
+
+
+void tmplput_DAV_NAMESPACE(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+
+       if (TP->Filter.ContextType == CTX_DAVNS) {
+               WebcitHandler *H;
+               H = (WebcitHandler*) CTX(CTX_DAVNS);
+               if (H != NULL)
+                       StrBufAppendTemplate(Target, TP, H->Name, 0);
+       }
+       else if (WCC->Hdr->HR.Handler != NULL) {
+               StrBufAppendTemplate(Target, TP, WCC->Hdr->HR.Handler->Name, 0);
+       }
+}
+
+
+int GroupdavDispatchREST(RESTDispatchID WhichAction, int IgnoreFloor)
+{
+       wcsession *WCC = WC;
+       void *vDir;
+       
+       switch(WhichAction){
+       case ExistsID:
+               GetHash(WCC->Directory, IKEY(WCC->ThisRoom->nRoomNameParts + 1), &vDir);
+               return locate_message_by_uid(ChrPtr((StrBuf*)vDir)) != -1;
+               /* TODO: remember euid */
+       case PutID:
+       case DeleteID:
+               break;
+
+
+       }
+       return 0;
+}
+
+
+void
+ServerStartModule_DAV
+(void)
+{
+
+       DavNamespaces = NewHash(1, NULL);
+}
+
+
+void 
+ServerShutdownModule_DAV
+(void)
+{
+       DeleteHash(&DavNamespaces);
+}
+
+
+void 
+InitModule_GROUPDAV
+(void)
+{
+       RegisterCTX(CTX_DAVNS);
+       RegisterDAVNamespace(HKEY("groupdav"), HKEY("GroupDAV"), 
+                            dav_main, GroupdavDispatchREST, 
+                            XHTTP_COMMANDS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE
+       );
+
+       RegisterNamespace("DAV:HOSTNAME", 0, 0, tmplput_dav_HOSTNAME, NULL, CTX_NONE);
+
+       RegisterConditional("COND:DAV:NS", 0, Conditional_DAV_NS,  CTX_NONE);
+
+       RegisterIterator("DAV:NS", 0, DavNamespaces, NULL, 
+                        NULL, NULL, CTX_DAVNS, CTX_NONE, IT_NOFLAG
+       );
+
+       RegisterConditional("COND:DAV:NSCURRENT", 0, Conditional_DAV_NSCURRENT,  CTX_DAVNS);
+       RegisterNamespace("DAV:NAMESPACE", 0, 1, tmplput_DAV_NAMESPACE, NULL, CTX_NONE);
+
+       RegisterHeaderHandler(HKEY("IF-MATCH"), Header_HandleIfMatch);
+       RegisterHeaderHandler(HKEY("DEPTH"), Header_HandleDepth);
+       RegisterConditional("COND:DAV:DEPTH", 1, Conditional_DAV_DEPTH,  CTX_NONE);
+}
diff --git a/webcit/dav_options.c b/webcit/dav_options.c
new file mode 100644 (file)
index 0000000..f7687cf
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Handles DAV OPTIONS requests (experimental -- not required by GroupDAV)
+ *
+ * Copyright (c) 2005-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+/*
+ * The pathname is always going to be /groupdav/room_name/msg_num
+ */
+void dav_options(void)
+{
+       wcsession *WCC = WC;
+       StrBuf *dav_roomname;
+       StrBuf *dav_uid;
+       long dav_msgnum = (-1);
+       char datestring[256];
+       time_t now;
+
+       now = time(NULL);
+       http_datestring(datestring, sizeof datestring, now);
+
+       dav_roomname = NewStrBuf();
+       dav_uid = NewStrBuf();
+       StrBufExtract_token(dav_roomname, WCC->Hdr->HR.ReqLine, 0, '/');
+       StrBufExtract_token(dav_uid, WCC->Hdr->HR.ReqLine, 1, '/');
+
+       syslog(LOG_DEBUG, "\033[35m%s (logged_in=%d)\033[0m", ChrPtr(WCC->Hdr->HR.ReqLine), WC->logged_in);
+       /*
+        * If the room name is blank, the client is doing an OPTIONS on the root.
+        */
+       if (StrLength(dav_roomname) == 0) {
+               syslog(LOG_DEBUG, "\033[36mOPTIONS requested for root\033[0m");
+               hprintf("HTTP/1.1 200 OK\r\n");
+               dav_common_headers();
+               hprintf("Date: %s\r\n", datestring);
+               hprintf("DAV: 1\r\n");
+               hprintf("Allow: OPTIONS, PROPFIND\r\n");
+               hprintf("\r\n");
+               begin_burst();
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       /* Go to the correct room. */
+       if (strcasecmp(ChrPtr(WC->CurRoom.name), ChrPtr(dav_roomname))) {
+               gotoroom(dav_roomname);
+       }
+
+       if (strcasecmp(ChrPtr(WC->CurRoom.name), ChrPtr(dav_roomname))) {
+               syslog(LOG_DEBUG, "\033[36mOPTIONS requested for invalid item\033[0m");
+               hprintf("HTTP/1.1 404 not found\r\n");
+               dav_common_headers();
+               hprintf("Date: %s\r\n", datestring);
+               hprintf(
+                       "Content-Type: text/plain\r\n");
+               begin_burst();
+               wc_printf(
+                       "There is no folder called \"%s\" on this server.\r\n",
+                       ChrPtr(dav_roomname)
+               );
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       /* If dav_uid is non-empty, client is requesting an OPTIONS on
+        * a specific item in the room.
+        */
+       if (StrLength(dav_uid) != 0) {
+               syslog(LOG_DEBUG, "\033[36mOPTIONS requested for specific item\033[0m");
+               dav_msgnum = locate_message_by_uid(ChrPtr(dav_uid));
+               if (dav_msgnum < 0) {
+                       hprintf("HTTP/1.1 404 not found\r\n");
+                       dav_common_headers();
+                       hprintf("Content-Type: text/plain\r\n");
+                       begin_burst();
+                       wc_printf(
+                               "Object \"%s\" was not found in the \"%s\" folder.\r\n",
+                               ChrPtr(dav_uid),
+                               ChrPtr(dav_roomname)
+                       );
+                       FreeStrBuf(&dav_roomname);
+                       FreeStrBuf(&dav_uid);
+                       end_burst();return;
+               }
+
+               hprintf("HTTP/1.1 200 OK\r\n");
+               dav_common_headers();
+               hprintf("Date: %s\r\n", datestring);
+               hprintf("DAV: 1\r\n");
+               hprintf("Allow: OPTIONS, PROPFIND, GET, PUT, DELETE\r\n");
+               
+               begin_burst();
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       FreeStrBuf(&dav_roomname);
+       FreeStrBuf(&dav_uid);
+
+       /*
+        * We got to this point, which means that the client is requesting
+        * an OPTIONS on the room itself.
+        */
+       syslog(LOG_DEBUG, "\033[36mOPTIONS requested for room '%s' (%slogged in)\033[0m",
+               ChrPtr(WC->CurRoom.name),
+               ((WC->logged_in) ? "" : "not ")
+       );
+       hprintf("HTTP/1.1 200 OK\r\n");
+       dav_common_headers();
+       hprintf("Date: %s\r\n", datestring);
+
+       /*
+        * Offer CalDAV (RFC 4791) if this is a calendar room
+        */
+       if ( (WC->CurRoom.view == VIEW_CALENDAR) || (WC->CurRoom.view == VIEW_CALBRIEF) ) {
+               hprintf("DAV: 1, calendar-access\r\n");
+               syslog(LOG_DEBUG, "\033[36mDAV: 1, calendar-access\033[0m");
+       }
+       else {
+               hprintf("DAV: 1\r\n");
+               syslog(LOG_DEBUG, "\033[36mDAV: 1\033[0m");
+       }
+
+       hprintf("Allow: OPTIONS, PROPFIND, GET, PUT, REPORT\r\n");
+       begin_burst();
+       end_burst();
+}
diff --git a/webcit/dav_propfind.c b/webcit/dav_propfind.c
new file mode 100644 (file)
index 0000000..76df63d
--- /dev/null
@@ -0,0 +1,824 @@
+/*
+ * Handles GroupDAV and CalDAV PROPFIND requests.
+ *
+ * A few notes about our XML output:
+ *
+ * --> Yes, we are spewing tags directly instead of using an XML library.
+ *     Whining about it will be summarily ignored.
+ *
+ * --> XML is deliberately output with no whitespace/newlines between tags.
+ *     This makes it difficult to read, but we have discovered clients which
+ *     crash when you try to pretty it up.
+ *
+ * References:
+ * http://www.ietf.org/rfc/rfc4791.txt
+ * http://blogs.nologin.es/rickyepoderi/index.php?/archives/14-Introducing-CalDAV-Part-I.html
+ * https://msdn.microsoft.com/en-us/library/aa142960(v=exchg.65).aspx
+ *
+ * Copyright (c) 2005-2017 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+/*
+ * Given an encoded UID, translate that to an unencoded Citadel EUID and
+ * then search for it in the current room.  Return a message number or -1
+ * if not found.
+ *
+ */
+long locate_message_by_uid(const char *uid) {
+       char buf[256];
+       char decoded_uid[1024];
+       long retval = (-1L);
+
+       /* decode the UID */
+       euid_unescapize(decoded_uid, uid);
+
+       /* ask Citadel if we have this one */
+       serv_printf("EUID %s", decoded_uid);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               retval = atol(&buf[4]);
+       }
+
+       return(retval);
+}
+
+
+/*
+ * IgnoreFloor: set to 0 or 1 _nothing else_
+ * Subfolders: direct child floors will be put here.
+ */
+const folder *GetRESTFolder(int IgnoreFloor, HashList *Subfolders)
+{
+       wcsession  *WCC = WC;
+       void *vFolder;
+       const folder *ThisFolder = NULL;
+       const folder *FoundFolder = NULL;
+       const folder *BestGuess = NULL;
+       int nBestGuess = 0;
+       HashPos    *itd, *itfl;
+       StrBuf     * Dir;
+       void       *vDir;
+       long        len;
+        const char *Key;
+       int iRoom, jURL, urlp;
+       int delta;
+
+/*
+ * Guess room: if the full URL matches a room, list thats it. We also need to remember direct sub rooms.
+ * if the URL is longer, we need to find the "best guess" so we can find the room we're in, and the rest
+ * of the URL will be uids and so on.
+ */
+       itfl = GetNewHashPos(WCC->Floors, 0);
+       urlp = GetCount(WCC->Directory);
+
+       while (GetNextHashPos(WCC->Floors, itfl, &len, &Key, &vFolder) && 
+              (ThisFolder == NULL))
+       {
+               ThisFolder = vFolder;
+               if (!IgnoreFloor && /* so we can handle legacy URLS... */
+                   (ThisFolder->Floor != WCC->CurrentFloor))
+                       continue;
+
+               if (ThisFolder->nRoomNameParts > 1) 
+               {
+                       /*TODO: is that number all right? */
+//                     if (urlp - ThisFolder->nRoomNameParts != 2) {
+//                             if (BestGuess != NULL)
+//                                     continue;
+//ThisFolder->name
+//                             itd  = GetNewHashPos(WCC->Directory, 0);
+//                             GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir); //TODO: how many to fast forward?
+//                     }
+                       itd  = GetNewHashPos(WCC->Directory, 0);
+                       GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir); //TODO: how many to fast forward?
+       
+                       for (iRoom = 0, /* Fast forward the floorname as we checked it above: */ jURL = IgnoreFloor; 
+
+                            (iRoom <= ThisFolder->nRoomNameParts) && (jURL <= urlp); 
+
+                            iRoom++, jURL++, GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir))
+                       {
+                               Dir = (StrBuf*)vDir;
+                               if (strcmp(ChrPtr(ThisFolder->RoomNameParts[iRoom]), 
+                                          ChrPtr(Dir)) != 0)
+                               {
+                                       DeleteHashPos(&itd);
+                                       continue;
+                               }
+                       }
+                       DeleteHashPos(&itd);
+                       /* Gotcha? */
+                       if ((iRoom == ThisFolder->nRoomNameParts) && (jURL == urlp))
+                       {
+                               FoundFolder = ThisFolder;
+                       }
+                       /* URL got more parts then this room, so we remember it for the best guess*/
+                       else if ((jURL <= urlp) &&
+                                (ThisFolder->nRoomNameParts <= nBestGuess))
+                       {
+                               BestGuess = ThisFolder;
+                               nBestGuess = jURL - 1;
+                       }
+                       /* Room has more parts than the URL, it might be a sub-room? */
+                       else if (iRoom <ThisFolder->nRoomNameParts) 
+                       {//// TODO: ThisFolder->nRoomNameParts == urlp - IgnoreFloor???
+                               Put(Subfolders, SKEY(ThisFolder->name), 
+                                   /* Cast away const, its a reference. */
+                                   (void*)ThisFolder, reference_free_handler);
+                       }
+               }
+               else {
+                       delta = GetCount(WCC->Directory) - ThisFolder->nRoomNameParts;
+                       if ((delta != 2) && (nBestGuess > 1))
+                           continue;
+                       
+                       itd  = GetNewHashPos(WCC->Directory, 0);
+                                               
+                       if (!GetNextHashPos(WCC->Directory, 
+                                           itd, &len, &Key, &vDir) ||
+                           (vDir == NULL))
+                       {
+                               DeleteHashPos(&itd);
+                               
+                               syslog(LOG_DEBUG, "5\n");
+                               continue;
+                       }
+                       DeleteHashPos(&itd);
+                       Dir = (StrBuf*) vDir;
+                       if (strcmp(ChrPtr(ThisFolder->name), 
+                                              ChrPtr(Dir))
+                           != 0)
+                       {
+                               DeleteHashPos(&itd);
+                               
+                               syslog(LOG_DEBUG, "5\n");
+                               continue;
+                       }
+                       DeleteHashPos(&itfl);
+                       DeleteHashPos(&itd);
+                       if (delta != 2) {
+                               nBestGuess = 1;
+                               BestGuess = ThisFolder;
+                       }
+                       else 
+                               FoundFolder = ThisFolder;
+               }
+       }
+
+/* TODO: Subfolders: remove patterns not matching the best guess or thisfolder */
+       DeleteHashPos(&itfl);
+       if (FoundFolder != NULL)
+               return FoundFolder;
+       else
+               return BestGuess;
+}
+
+
+
+
+long GotoRestRoom(HashList *SubRooms)
+{
+       int IgnoreFloor = 0; /* deprecated... */
+       wcsession *WCC = WC;
+       long Count;
+       long State;
+       const folder *ThisFolder;
+
+       State = REST_TOPLEVEL;
+
+       if (WCC->Hdr->HR.Handler != NULL) 
+               State |= REST_IN_NAMESPACE;
+
+       Count = GetCount(WCC->Directory);
+       
+       if (Count == 0) return State;
+
+       if (Count >= 1) State |=REST_IN_FLOOR;
+       if (Count == 1) return State;
+       
+       /* 
+        * More than 3 params and no floor found? 
+        * -> fall back to old non-floored notation
+        */
+       if ((Count >= 3) && (WCC->CurrentFloor == NULL))
+               IgnoreFloor = 1;
+       if (Count >= 3)
+       {
+               IgnoreFloor = 0;
+               State |= REST_IN_FLOOR;
+
+               ThisFolder = GetRESTFolder(IgnoreFloor, SubRooms);
+               if (ThisFolder != NULL)
+               {
+                       if (WCC->ThisRoom != NULL)
+                               if (CompareRooms(WCC->ThisRoom, ThisFolder) != 0)
+                                       gotoroom(ThisFolder->name);
+                       State |= REST_IN_ROOM;
+                       
+               }
+               if (GetCount(SubRooms) > 0)
+                       State |= REST_HAVE_SUB_ROOMS;
+       }
+       if ((WCC->ThisRoom != NULL) && 
+           (Count + IgnoreFloor > 3))
+       {
+               if (WCC->Hdr->HR.Handler->RID(ExistsID, IgnoreFloor))
+               {
+                       State |= REST_GOT_LOCAL_PART;
+               }
+               else {
+                       /// WHOOPS, not there???
+                       State |= REST_NONEXIST;
+               }
+
+
+       }
+       return State;
+}
+
+
+
+/*
+ * List rooms (or "collections" in DAV terminology) which contain
+ * interesting groupware objects.
+ */
+void dav_collection_list(void)
+{
+       wcsession *WCC = WC;
+       char buf[256];
+       char roomname[256];
+       int view;
+       char datestring[256];
+       time_t now;
+       time_t mtime;
+       int is_groupware_collection = 0;
+       int starting_point = 1;         /**< 0 for /, 1 for /groupdav/ */
+
+       if (WCC->Hdr->HR.Handler == NULL) {
+               starting_point = 0;
+       }
+       else if (StrLength(WCC->Hdr->HR.ReqLine) == 0) {
+               starting_point = 1;
+       }
+       else {
+               starting_point = 2;
+       }
+
+       now = time(NULL);
+       http_datestring(datestring, sizeof datestring, now);
+
+       /*
+        * Be rude.  Completely ignore the XML request and simply send them
+        * everything we know about.  Let the client sort it out.
+        */
+       hprintf("HTTP/1.0 207 Multi-Status\r\n");
+       dav_common_headers();
+       hprintf("Date: %s\r\n", datestring);
+       hprintf("Content-type: text/xml\r\n");
+       if (DisableGzip || (!WCC->Hdr->HR.gzip_ok))     
+               hprintf("Content-encoding: identity\r\n");
+
+       begin_burst();
+
+       wc_printf("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+               "<multistatus xmlns=\"DAV:\" xmlns:G=\"http://groupdav.org/\">"
+       );
+
+       /*
+        * If the client is requesting the root, show a root node.
+        */
+       if (starting_point == 0) {
+               wc_printf("<response>");
+                       wc_printf("<href>");
+                               dav_identify_host();
+                               wc_printf("/");
+                       wc_printf("</href>");
+                       wc_printf("<propstat>");
+                               wc_printf("<status>HTTP/1.1 200 OK</status>");
+                               wc_printf("<prop>");
+                                       wc_printf("<displayname>/</displayname>");
+                                       wc_printf("<resourcetype><collection/></resourcetype>");
+                                       wc_printf("<getlastmodified>");
+                                               escputs(datestring);
+                                       wc_printf("</getlastmodified>");
+                               wc_printf("</prop>");
+                       wc_printf("</propstat>");
+               wc_printf("</response>");
+       }
+
+       /*
+        * If the client is requesting "/groupdav", show a /groupdav subdirectory.
+        */
+       if ((starting_point + WCC->Hdr->HR.dav_depth) >= 1) {
+               wc_printf("<response>");
+                       wc_printf("<href>");
+                               dav_identify_host();
+                               wc_printf("/groupdav");
+                       wc_printf("</href>");
+                       wc_printf("<propstat>");
+                               wc_printf("<status>HTTP/1.1 200 OK</status>");
+                               wc_printf("<prop>");
+                                       wc_printf("<displayname>GroupDAV</displayname>");
+                                       wc_printf("<resourcetype><collection/></resourcetype>");
+                                       wc_printf("<getlastmodified>");
+                                               escputs(datestring);
+                                       wc_printf("</getlastmodified>");
+                               wc_printf("</prop>");
+                       wc_printf("</propstat>");
+               wc_printf("</response>");
+       }
+
+       /*
+        * Now go through the list and make it look like a DAV collection
+        */
+       serv_puts("LKRA");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+
+               extract_token(roomname, buf, 0, '|', sizeof roomname);
+               view = extract_int(buf, 7);
+               mtime = extract_long(buf, 8);
+               http_datestring(datestring, sizeof datestring, mtime);
+
+               /*
+                * For now, only list rooms that we know a GroupDAV client
+                * might be interested in.  In the future we may add
+                * the rest.
+                *
+                * We determine the type of objects which are stored in each
+                * room by looking at the *default* view for the room.  This
+                * allows, for example, a Calendar room to appear as a
+                * GroupDAV calendar even if the user has switched it to a
+                * Calendar List view.
+                */
+               if (    (view == VIEW_CALENDAR) || 
+                       (view == VIEW_TASKS) || 
+                       (view == VIEW_ADDRESSBOOK) ||
+                       (view == VIEW_NOTES) ||
+                       (view == VIEW_JOURNAL) ||
+                       (view == VIEW_WIKI)
+               ) {
+                       is_groupware_collection = 1;
+               }
+               else {
+                       is_groupware_collection = 0;
+               }
+
+               if ( (is_groupware_collection) && ((starting_point + WCC->Hdr->HR.dav_depth) >= 2) ) {
+                       wc_printf("<response>");
+
+                       wc_printf("<href>");
+                       dav_identify_host();
+                       wc_printf("/groupdav/");
+                       urlescputs(roomname);
+                       wc_printf("/</href>");
+
+                       wc_printf("<propstat>");
+                       wc_printf("<status>HTTP/1.1 200 OK</status>");
+                       wc_printf("<prop>");
+                       wc_printf("<displayname>");
+                       escputs(roomname);
+                       wc_printf("</displayname>");
+                       wc_printf("<resourcetype><collection/>");
+
+                       switch(view) {
+                       case VIEW_CALENDAR:
+                               wc_printf("<G:vevent-collection />");
+                               break;
+                       case VIEW_TASKS:
+                               wc_printf("<G:vtodo-collection />");
+                               break;
+                       case VIEW_ADDRESSBOOK:
+                               wc_printf("<G:vcard-collection />");
+                               break;
+                       case VIEW_NOTES:
+                               wc_printf("<G:vnotes-collection />");
+                               break;
+                       case VIEW_JOURNAL:
+                               wc_printf("<G:vjournal-collection />");
+                               break;
+                       case VIEW_WIKI:
+                               wc_printf("<G:wiki-collection />");
+                               break;
+                       }
+
+                       wc_printf("</resourcetype>");
+                       wc_printf("<getlastmodified>");
+                               escputs(datestring);
+                       wc_printf("</getlastmodified>");
+                       wc_printf("</prop>");
+                       wc_printf("</propstat>");
+                       wc_printf("</response>");
+               }
+       }
+       wc_printf("</multistatus>\n");
+
+       end_burst();
+}
+
+
+void propfind_xml_start(void *data, const char *supplied_el, const char **attr) {
+       // syslog(LOG_DEBUG, "<%s>", supplied_el);
+}
+
+void propfind_xml_end(void *data, const char *supplied_el) {
+       // syslog(LOG_DEBUG, "</%s>", supplied_el);
+}
+
+
+
+/*
+ * The pathname is always going to be /groupdav/room_name/msg_num
+ */
+void dav_propfind(void) 
+{
+       wcsession *WCC = WC;
+       StrBuf *dav_roomname;
+       StrBuf *dav_uid;
+       StrBuf *MsgNum;
+       long BufLen;
+       long dav_msgnum = (-1);
+       char uid[256];
+       char encoded_uid[256];
+       long *msgs = NULL;
+       int num_msgs = 0;
+       int i;
+       char datestring[256];
+       time_t now;
+
+       now = time(NULL);
+       http_datestring(datestring, sizeof datestring, now);
+
+       int parse_success = 0;
+       XML_Parser xp = XML_ParserCreateNS(NULL, '|');
+       if (xp) {
+               // XML_SetUserData(xp, XXX);
+               XML_SetElementHandler(xp, propfind_xml_start, propfind_xml_end);
+               // XML_SetCharacterDataHandler(xp, xrds_xml_chardata);
+
+               const char *req = ChrPtr(WCC->upload);
+               if (req) {
+                       req = strchr(req, '<');                 /* hunt for the first tag */
+               }
+               if (!req) {
+                       req = "ERROR";                          /* force it to barf */
+               }
+
+               i = XML_Parse(xp, req, strlen(req), 1);
+               if (!i) {
+                       syslog(LOG_DEBUG, "XML_Parse() failed: %s", XML_ErrorString(XML_GetErrorCode(xp)));
+                       XML_ParserFree(xp);
+                       parse_success = 0;
+               }
+               else {
+                       parse_success = 1;
+               }
+       }
+
+       if (!parse_success) {
+               hprintf("HTTP/1.1 500 Internal Server Error\r\n");
+               dav_common_headers();
+               hprintf("Date: %s\r\n", datestring);
+               hprintf("Content-Type: text/plain\r\n");
+               wc_printf("An internal error has occurred at %s:%d.\r\n", __FILE__ , __LINE__ );
+               end_burst();
+               return;
+       }
+
+       dav_roomname = NewStrBuf();
+       dav_uid = NewStrBuf();
+       StrBufExtract_token(dav_roomname, WCC->Hdr->HR.ReqLine, 0, '/');
+       StrBufExtract_token(dav_uid, WCC->Hdr->HR.ReqLine, 1, '/');
+
+       syslog(LOG_DEBUG, "PROPFIND requested for '%s' at depth %d",
+               ChrPtr(dav_roomname), WCC->Hdr->HR.dav_depth
+       );
+
+       /*
+        * If the room name is blank, the client is requesting a folder list.
+        */
+       if (StrLength(dav_roomname) == 0) {
+               dav_collection_list();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       /* Go to the correct room. */
+       if (strcasecmp(ChrPtr(WCC->CurRoom.name), ChrPtr(dav_roomname))) {
+               gotoroom(dav_roomname);
+       }
+       if (strcasecmp(ChrPtr(WCC->CurRoom.name), ChrPtr(dav_roomname))) {
+               hprintf("HTTP/1.1 404 not found\r\n");
+               dav_common_headers();
+               hprintf("Date: %s\r\n", datestring);
+               hprintf("Content-Type: text/plain\r\n");
+               wc_printf("There is no folder called \"%s\" on this server.\r\n", ChrPtr(dav_roomname));
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       /* If dav_uid is non-empty, client is requesting a PROPFIND on
+        * a specific item in the room.  This is not valid GroupDAV, but
+        * it is valid WebDAV (and probably CalDAV too).
+        */
+       if (StrLength(dav_uid) != 0) {
+
+               dav_msgnum = locate_message_by_uid(ChrPtr(dav_uid));
+               if (dav_msgnum < 0) {
+                       hprintf("HTTP/1.1 404 not found\r\n");
+                       dav_common_headers();
+                       hprintf("Content-Type: text/plain\r\n");
+                       wc_printf("Object \"%s\" was not found in the \"%s\" folder.\r\n",
+                               ChrPtr(dav_uid),
+                               ChrPtr(dav_roomname)
+                       );
+                       end_burst();
+                       FreeStrBuf(&dav_roomname);
+                       FreeStrBuf(&dav_uid);
+                       return;
+               }
+
+               /* Be rude.  Completely ignore the XML request and simply send them
+                * everything we know about (which is going to simply be the ETag and
+                * nothing else).  Let the client-side parser sort it out.
+                */
+               hprintf("HTTP/1.0 207 Multi-Status\r\n");
+               dav_common_headers();
+               hprintf("Date: %s\r\n", datestring);
+               hprintf("Content-type: text/xml\r\n");
+               if (DisableGzip || (!WCC->Hdr->HR.gzip_ok))     
+                       hprintf("Content-encoding: identity\r\n");
+       
+               begin_burst();
+       
+               wc_printf("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+                       "<multistatus xmlns=\"DAV:\">"
+               );
+
+               wc_printf("<response>");
+               
+               wc_printf("<href>");
+               dav_identify_host();
+               wc_printf("/groupdav/");
+               urlescputs(ChrPtr(WCC->CurRoom.name));
+               euid_escapize(encoded_uid, ChrPtr(dav_uid));
+               wc_printf("/%s", encoded_uid);
+               wc_printf("</href>");
+               wc_printf("<propstat>");
+               wc_printf("<status>HTTP/1.1 200 OK</status>");
+               wc_printf("<prop>");
+               wc_printf("<getetag>\"%ld\"</getetag>", dav_msgnum);
+               wc_printf("<getlastmodified>");
+               escputs(datestring);
+               wc_printf("</getlastmodified>");
+               wc_printf("</prop>");
+               wc_printf("</propstat>");
+
+               wc_printf("</response>\n");
+               wc_printf("</multistatus>\n");
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+       FreeStrBuf(&dav_roomname);
+       FreeStrBuf(&dav_uid);
+
+
+       /*
+        * If we get to this point the client is performing a PROPFIND on the room itself.
+        *
+        * We call it a room; DAV calls it a "collection."  We have to give it some properties
+        * of the room itself and then offer a list of all items contained therein.
+        *
+        * Be rude.  Completely ignore the XML request and simply send them
+        * everything we know about (which is going to simply be the ETag and
+        * nothing else).  Let the client-side parser sort it out.
+        */
+       //syslog(LOG_DEBUG, "BE RUDE AND IGNORE: \033[31m%s\033[0m", ChrPtr(WC->upload) );
+       hprintf("HTTP/1.0 207 Multi-Status\r\n");
+       dav_common_headers();
+       hprintf("Date: %s\r\n", datestring);
+       hprintf("Content-type: text/xml\r\n");
+       if (DisableGzip || (!WCC->Hdr->HR.gzip_ok)) {
+               hprintf("Content-encoding: identity\r\n");
+       }
+       begin_burst();
+
+       wc_printf("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+               "<D:multistatus "
+                       "xmlns:D=\"DAV:\" "
+                       "xmlns:G=\"http://groupdav.org/\" "
+                       "xmlns:C=\"urn:ietf:params:xml:ns:caldav\""
+               ">"
+       );
+
+       /* Transmit the collection resource */
+       wc_printf("<D:response>");
+
+       wc_printf("<D:href>");
+       dav_identify_host();
+       wc_printf("/groupdav/");
+       urlescputs(ChrPtr(WCC->CurRoom.name));
+       wc_printf("</D:href>");
+
+       wc_printf("<D:propstat>");
+       wc_printf("<D:status>HTTP/1.1 200 OK</D:status>");
+       wc_printf("<D:prop>");
+       wc_printf("<D:displayname>");
+       escputs(ChrPtr(WCC->CurRoom.name));
+       wc_printf("</D:displayname>");
+
+       wc_printf("<D:owner/>");                /* empty owner ought to be legal; see rfc3744 section 5.1 */
+
+       wc_printf("<D:resourcetype><D:collection/>");
+       switch(WCC->CurRoom.defview) {
+               case VIEW_CALENDAR:
+                       wc_printf("<G:vevent-collection />");
+                       wc_printf("<C:calendar />");
+                       break;
+               case VIEW_TASKS:
+                       wc_printf("<G:vtodo-collection />");
+                       break;
+               case VIEW_ADDRESSBOOK:
+                       wc_printf("<G:vcard-collection />");
+                       break;
+       }
+       wc_printf("</D:resourcetype>");
+
+       /* FIXME get the mtime
+       wc_printf("<D:getlastmodified>");
+               escputs(datestring);
+       wc_printf("</D:getlastmodified>");
+       */
+       wc_printf("</D:prop>");
+       wc_printf("</D:propstat>");
+       wc_printf("</D:response>");
+
+       /* If a depth greater than zero was specified, transmit the collection listing */
+
+       if (WCC->Hdr->HR.dav_depth > 0) {
+               MsgNum = NewStrBuf();
+               serv_puts("MSGS ALL");
+       
+               StrBuf_ServGetln(MsgNum);
+               if (GetServerStatus(MsgNum, NULL) == 1)
+                       while (BufLen = StrBuf_ServGetln(MsgNum), 
+                       ((BufLen >= 0) && 
+                               ((BufLen != 3) || strcmp(ChrPtr(MsgNum), "000"))  ))
+                       {
+                               msgs = realloc(msgs, ++num_msgs * sizeof(long));
+                               msgs[num_msgs-1] = StrTol(MsgNum);
+                       }
+       
+               if (num_msgs > 0) for (i=0; i<num_msgs; ++i) {
+       
+                       syslog(LOG_DEBUG, "PROPFIND enumerating message # %ld", msgs[i]);
+                       strcpy(uid, "");
+                       now = (-1);
+                       serv_printf("MSG0 %ld|3", msgs[i]);
+                       StrBuf_ServGetln(MsgNum);
+                       if (GetServerStatus(MsgNum, NULL) == 1)
+                               while (BufLen = StrBuf_ServGetln(MsgNum), 
+                               ((BufLen >= 0) && 
+                                       ((BufLen != 3) || strcmp(ChrPtr(MsgNum), "000")) ))
+                               {
+                                       if (!strncasecmp(ChrPtr(MsgNum), "exti=", 5)) {
+                                               strcpy(uid, &ChrPtr(MsgNum)[5]);
+                                       }
+                                       else if (!strncasecmp(ChrPtr(MsgNum), "time=", 5)) {
+                                               now = atol(&ChrPtr(MsgNum)[5]);
+                               }
+                       }
+       
+                       if (!IsEmptyStr(uid)) {
+                               wc_printf("<D:response>");
+                               wc_printf("<D:href>");
+                               dav_identify_host();
+                               wc_printf("/groupdav/");
+                               urlescputs(ChrPtr(WCC->CurRoom.name));
+                               euid_escapize(encoded_uid, uid);
+                               wc_printf("/%s", encoded_uid);
+                               wc_printf("</D:href>");
+                               wc_printf("<D:propstat>");
+                               wc_printf("<D:status>HTTP/1.1 200 OK</D:status>");
+                               wc_printf("<D:prop>");
+                               wc_printf("<D:getetag>\"%ld\"</D:getetag>", msgs[i]);
+                               switch(WCC->CurRoom.defview) {
+                                       case VIEW_CALENDAR:
+                                               wc_printf("<D:getcontenttype>text/x-ical</D:getcontenttype>");
+                                               break;
+                                       case VIEW_TASKS:
+                                               wc_printf("<D:getcontenttype>text/x-ical</D:getcontenttype>");
+                                               break;
+                                       case VIEW_ADDRESSBOOK:
+                                               wc_printf("<D:getcontenttype>text/x-vcard</D:getcontenttype>");
+                                               break;
+                               }
+                               if (now > 0L) {
+                                       http_datestring(datestring, sizeof datestring, now);
+                                       wc_printf("<D:getlastmodified>");
+                                       escputs(datestring);
+                                       wc_printf("</D:getlastmodified>");
+                               }
+                               wc_printf("</D:prop>");
+                               wc_printf("</D:propstat>");
+                               wc_printf("</D:response>");
+                       }
+               }
+               FreeStrBuf(&MsgNum);
+       }
+
+       wc_printf("</D:multistatus>\n");
+       end_burst();
+
+       if (msgs != NULL) {
+               free(msgs);
+       }
+}
+
+
+
+int ParseMessageListHeaders_EUID(StrBuf *Line, 
+                                const char **pos, 
+                                message_summary *Msg, 
+                                StrBuf *ConversionBuffer,
+                                void **ViewSpecific)
+{
+       Msg->euid = NewStrBuf();
+       StrBufExtract_NextToken(Msg->euid,  Line, pos, '|');
+       Msg->date = StrBufExtractNext_long(Line, pos, '|');
+       
+       return StrLength(Msg->euid) > 0;
+}
+
+int DavUIDL_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                                  void **ViewSpecific, 
+                                  long oper, 
+                                  char *cmd, 
+                                  long len,
+                                  char *filter,
+                                  long flen)
+{
+       Stat->defaultsortorder = 0;
+       Stat->sortit = 0;
+       Stat->load_seen = 0;
+       Stat->maxmsgs  = 9999999;
+
+       snprintf(cmd, len, "MSGS ALL|||2");
+       return 200;
+}
+
+int DavUIDL_RenderView_or_Tail(SharedMessageStatus *Stat, 
+                               void **ViewSpecific, 
+                               long oper)
+{
+       
+       DoTemplate(HKEY("msg_listview"),NULL,&NoCtx);
+       
+       return 0;
+}
+
+int DavUIDL_Cleanup(void **ViewSpecific)
+{
+       /* Note: wDumpContent() will output one additional </div> tag. */
+       /* We ought to move this out into template */
+       wDumpContent(1);
+
+       return 0;
+}
+
+
+
+
+void 
+InitModule_PROPFIND
+(void)
+{
+       RegisterReadLoopHandlerset(
+               eReadEUIDS,
+               DavUIDL_GetParamsGetServerCall,
+               NULL,
+               NULL,
+               ParseMessageListHeaders_EUID,
+               NULL,
+               DavUIDL_RenderView_or_Tail,
+               DavUIDL_Cleanup,
+               NULL);
+
+}
diff --git a/webcit/dav_put.c b/webcit/dav_put.c
new file mode 100644 (file)
index 0000000..8b6935e
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ * Handles GroupDAV PUT requests.
+ *
+ * Copyright (c) 2005-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+
+/*
+ * This function is for uploading an ENTIRE calendar, not just one
+ * component.  This would be for webcal:// 'publish' operations, not
+ * for GroupDAV.
+ */
+void dav_put_bigics(void)
+{
+       wcsession *WCC = WC;
+       char buf[1024];
+
+       /*
+        * Tell the server that when we save a calendar event, we
+        * do *not* want the server to generate invitations. 
+        */
+       serv_puts("ICAL sgi|0");
+       serv_getln(buf, sizeof buf);
+
+       serv_puts("ICAL putics");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '4') {
+               hprintf("HTTP/1.1 502 Bad Gateway\r\n");
+               dav_common_headers();
+               hprintf("Content-type: text/plain\r\n");
+               begin_burst();
+               wc_printf("%s\r\n", &buf[4]);
+               end_burst();
+               return;
+       }
+
+       serv_putbuf(WCC->upload);
+       serv_printf("\n000");
+
+       /* Report success and not much else. */
+       hprintf("HTTP/1.1 204 No Content\r\n");
+       syslog(LOG_DEBUG, "HTTP/1.1 204 No Content\r\n");
+       dav_common_headers();
+       begin_burst();
+       end_burst();
+}
+
+
+
+/*
+ * The pathname is always going to take one of two formats:
+ * [/groupdav/]room_name/euid  (GroupDAV)
+ * [/groupdav/]room_name               (webcal)
+ */
+void dav_put(void) 
+{
+       wcsession *WCC = WC;
+       StrBuf *dav_roomname;
+       StrBuf *dav_uid;
+       long new_msgnum = (-2L);
+       long old_msgnum = (-1L);
+       char buf[SIZ];
+       int n = 0;
+
+       if (StrBufNum_tokens(WCC->Hdr->HR.ReqLine, '/') < 2) {
+               hprintf("HTTP/1.1 404 not found\r\n");
+               dav_common_headers();
+               hprintf("Content-Type: text/plain\r\n");
+               begin_burst();
+               wc_printf("The object you requested was not found.\r\n");
+               end_burst();
+               return;
+       }
+
+       dav_roomname = NewStrBuf();;
+       dav_uid = NewStrBuf();;
+       StrBufExtract_token(dav_roomname, WCC->Hdr->HR.ReqLine, 0, '/');
+       StrBufExtract_token(dav_uid, WCC->Hdr->HR.ReqLine, 1, '/');
+       if ((!strcasecmp(ChrPtr(dav_uid), "ics")) || 
+           (!strcasecmp(ChrPtr(dav_uid), "calendar.ics"))) {
+               FlushStrBuf(dav_uid);
+       }
+
+       /* Go to the correct room. */
+       if (strcasecmp(ChrPtr(WC->CurRoom.name), ChrPtr(dav_roomname))) {
+               gotoroom(dav_roomname);
+       }
+       if (strcasecmp(ChrPtr(WC->CurRoom.name), ChrPtr(dav_roomname))) {
+               hprintf("HTTP/1.1 404 not found\r\n");
+               dav_common_headers();
+               hprintf("Content-Type: text/plain\r\n");
+               begin_burst();
+               wc_printf("There is no folder called \"%s\" on this server.\r\n",
+                       ChrPtr(dav_roomname));
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);           
+               return;
+       }
+
+       /*
+        * If an HTTP If-Match: header is present, the client is attempting
+        * to replace an existing item.  We have to check to see if the
+        * message number associated with the supplied uid matches what the
+        * client is expecting.  If not, the server probably contains a newer
+        * version, so we fail...
+        */
+       if (StrLength(WCC->Hdr->HR.dav_ifmatch) > 0) {
+               syslog(LOG_DEBUG, "dav_ifmatch: %s\n", ChrPtr(WCC->Hdr->HR.dav_ifmatch));
+               old_msgnum = locate_message_by_uid(ChrPtr(dav_uid));
+               syslog(LOG_DEBUG, "old_msgnum:  %ld\n", old_msgnum);
+               if (StrTol(WCC->Hdr->HR.dav_ifmatch) != old_msgnum) {
+                       hprintf("HTTP/1.1 412 Precondition Failed\r\n");
+                       syslog(LOG_INFO, "HTTP/1.1 412 Precondition Failed (ifmatch=%ld, old_msgnum=%ld)\r\n",
+                               StrTol(WCC->Hdr->HR.dav_ifmatch), old_msgnum);
+                       dav_common_headers();
+                       
+                       end_burst();
+                       FreeStrBuf(&dav_roomname);
+                       FreeStrBuf(&dav_uid);
+                       return;
+               }
+       }
+
+       /** PUT on the collection itself uploads an ICS of the entire collection.
+        */
+       if (StrLength(dav_uid) == 0) {
+               dav_put_bigics();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       /*
+        * We are cleared for upload!  We use the new calling syntax for ENT0
+        * which allows a confirmation to be sent back to us.  That's how we
+        * extract the message ID.
+        */
+       serv_puts("ENT0 1|||4|||1|");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '8') {
+               hprintf("HTTP/1.1 502 Bad Gateway\r\n");
+               dav_common_headers();
+               hprintf("Content-type: text/plain\r\n");
+               begin_burst();
+               wc_printf("%s\r\n", &buf[4]);
+               end_burst();
+               return;
+       }
+
+       /* Send the content to the Citadel server */
+       //serv_printf("Content-type: %s\n\n", WCC->upload_content_type);
+       serv_putbuf(WCC->upload);
+       serv_puts("\n000");
+
+       /* Fetch the reply from the Citadel server */
+       n = 0;
+       FlushStrBuf(dav_uid);
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               switch(n++) {
+               case 0: 
+                       new_msgnum = atol(buf);
+                       break;
+               case 1: 
+                       syslog(LOG_DEBUG, "new_msgnum=%ld (%s)\n", new_msgnum, buf);
+                       break;
+               case 2: 
+                       StrBufAppendBufPlain(dav_uid, buf, -1, 0);
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       /* Tell the client what happened. */
+
+       /* Citadel failed in some way? */
+       if (new_msgnum < 0L) {
+               hprintf("HTTP/1.1 502 Bad Gateway\r\n");
+               dav_common_headers();
+               hprintf("Content-type: text/plain\r\n");
+               begin_burst();
+               wc_printf("new_msgnum is %ld\r\n"
+                       "\r\n", new_msgnum);
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       /* We created this item for the first time. */
+       if (old_msgnum < 0L) {
+               char escaped_uid[1024];
+               hprintf("HTTP/1.1 201 Created\r\n");
+               syslog(LOG_DEBUG, "HTTP/1.1 201 Created\r\n");
+               dav_common_headers();
+               hprintf("etag: \"%ld\"\r\n", new_msgnum);
+               hprintf("Location: ");
+               dav_identify_hosthdr();
+               hprintf("/groupdav/");/* TODO */
+               hurlescputs(ChrPtr(dav_roomname));
+               euid_escapize(escaped_uid, ChrPtr(dav_uid));
+               hprintf("/%s\r\n", escaped_uid);
+               end_burst();
+               FreeStrBuf(&dav_roomname);
+               FreeStrBuf(&dav_uid);
+               return;
+       }
+
+       /* We modified an existing item. */
+       hprintf("HTTP/1.1 204 No Content\r\n");
+       syslog(LOG_DEBUG, "HTTP/1.1 204 No Content\r\n");
+       dav_common_headers();
+       hprintf("Etag: \"%ld\"\r\n", new_msgnum);
+       /* The item we replaced has probably already been deleted by
+        * the Citadel server, but we'll do this anyway, just in case.
+        */
+       serv_printf("DELE %ld", old_msgnum);
+       serv_getln(buf, sizeof buf);
+       begin_burst();
+       end_burst();
+       FreeStrBuf(&dav_roomname);
+       FreeStrBuf(&dav_uid);
+       return;
+}
diff --git a/webcit/dav_report.c b/webcit/dav_report.c
new file mode 100644 (file)
index 0000000..9331ffd
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Handles GroupDAV REPORT requests.
+ *
+ * Copyright (c) 2005-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 3.
+ *
+ * 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.
+ */
+
+
+/* SAMPLE QUERIES TO WORK WITH *
+
+REPORT /groupdav/calendar/ HTTP/1.1
+Content-type: application/xml
+Content-length: 349
+
+<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:D="DAV:">
+  <D:prop>
+    <D:getetag/>
+  </D:prop>
+  <C:filter>
+    <C:comp-filter name="VCALENDAR">
+      <C:comp-filter name="VEVENT">
+        <C:time-range start="20111129T231445Z" end="20120207T231445Z"/>
+      </C:comp-filter>
+    </C:comp-filter>
+  </C:filter>
+</C:calendar-query>
+
+
+REPORT /groupdav/calendar/ HTTP/1.1
+Content-type: application/xml
+Content-length: 255
+
+<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:D="DAV:">
+  <D:prop>
+    <D:getetag/>
+  </D:prop>
+  <C:filter>
+    <C:comp-filter name="VCALENDAR">
+      <C:comp-filter name="VEVENT"/>
+    </C:comp-filter>
+  </C:filter>
+</C:calendar-query>
+
+*/
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+
+/*
+ * The pathname is always going to be /groupdav/room_name/msg_num
+ */
+void dav_report(void) 
+{
+       char datestring[256];
+       time_t now = time(NULL);
+
+       http_datestring(datestring, sizeof datestring, now);
+       const char *req = ChrPtr(WC->upload);
+
+       syslog(LOG_DEBUG, "REPORT: \033[31m%s\033[0m", req);
+
+       hprintf("HTTP/1.1 500 Internal Server Error\r\n");
+       dav_common_headers();
+       hprintf("Date: %s\r\n", datestring);
+       hprintf("Content-Type: text/plain\r\n");
+       wc_printf("An internal error has occurred at %s:%d.\r\n", __FILE__ , __LINE__ );
+       end_burst();
+       return;
+}
+
+
+
+extern int ParseMessageListHeaders_EUID(StrBuf *Line, 
+                                       const char **pos, 
+                                       message_summary *Msg, 
+                                       StrBuf *ConversionBuffer,
+                                       void **ViewSpecific);
+
+extern int DavUIDL_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                                         void **ViewSpecific, 
+                                         long oper, 
+                                         char *cmd, 
+                                         long len,
+                                         char *filter,
+                                         long flen);
+
+extern int DavUIDL_RenderView_or_Tail(SharedMessageStatus *Stat, 
+                               void **ViewSpecific, 
+                               long oper);
+
+extern int DavUIDL_Cleanup(void **ViewSpecific);
+
+
+
+void 
+InitModule_REPORT
+(void)
+{
+       RegisterReadLoopHandlerset(
+               eReadEUIDS,
+               DavUIDL_GetParamsGetServerCall,
+               NULL,
+               NULL,
+               ParseMessageListHeaders_EUID,
+               NULL,
+               DavUIDL_RenderView_or_Tail,
+               DavUIDL_Cleanup,
+               NULL
+       );
+
+}
diff --git a/webcit/downloads.c b/webcit/downloads.c
new file mode 100644 (file)
index 0000000..6e6c9b9
--- /dev/null
@@ -0,0 +1,477 @@
+/*
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+CtxType CTX_FILELIST = CTX_NONE;
+
+extern void output_static(const char* What);
+
+extern char* static_dirs[];
+
+typedef struct _FileListStruct {
+       StrBuf *Filename;
+       long FileSize;
+       StrBuf *MimeType;
+       StrBuf *Comment;
+       int IsPic;
+       int Sequence;
+} FileListStruct;
+
+void FreeFiles(void *vFile)
+{
+       FileListStruct *F = (FileListStruct*) vFile;
+       FreeStrBuf(&F->Filename);
+       FreeStrBuf(&F->MimeType);
+       FreeStrBuf(&F->Comment);
+       free(F);
+}
+
+/* -------------------------------------------------------------------------------- */
+void tmplput_FILE_NAME(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
+       StrBufAppendTemplate(Target, TP, F->Filename, 0);
+}
+void tmplput_FILE_SIZE(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
+       StrBufAppendPrintf(Target, "%ld", F->FileSize);
+}
+void tmplput_FILEMIMETYPE(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
+       StrBufAppendTemplate(Target, TP, F->MimeType, 0);
+}
+void tmplput_FILE_COMMENT(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
+       StrBufAppendTemplate(Target, TP, F->Comment, 0);
+}
+
+/* -------------------------------------------------------------------------------- */
+
+int Conditional_FILE_ISPIC(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
+       return F->IsPic;
+}
+
+/* -------------------------------------------------------------------------------- */
+int CompareFilelistByMime(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+
+       if (File1->IsPic != File2->IsPic)
+               return File1->IsPic > File2->IsPic;
+       return strcasecmp(ChrPtr(File1->MimeType), ChrPtr(File2->MimeType));
+}
+int CompareFilelistByMimeRev(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+       if (File1->IsPic != File2->IsPic)
+               return File1->IsPic < File2->IsPic;
+       return strcasecmp(ChrPtr(File2->MimeType), ChrPtr(File1->MimeType));
+}
+int GroupchangeFilelistByMime(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) vFile1;
+       FileListStruct *File2 = (FileListStruct*) vFile2;
+
+       if (File1->IsPic != File2->IsPic)
+               return File1->IsPic > File2->IsPic;
+       return strcasecmp(ChrPtr(File1->MimeType), ChrPtr(File2->MimeType)) != 0;
+}
+
+
+int CompareFilelistByName(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+
+       if (File1->IsPic != File2->IsPic)
+               return File1->IsPic > File2->IsPic;
+       return strcasecmp(ChrPtr(File1->Filename), ChrPtr(File2->Filename));
+}
+int CompareFilelistByNameRev(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+       if (File1->IsPic != File2->IsPic)
+               return File1->IsPic < File2->IsPic;
+       return strcasecmp(ChrPtr(File2->Filename), ChrPtr(File1->Filename));
+}
+int GroupchangeFilelistByName(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) vFile1;
+       FileListStruct *File2 = (FileListStruct*) vFile2;
+
+       return ChrPtr(File1->Filename)[0] != ChrPtr(File2->Filename)[0];
+}
+
+
+int CompareFilelistBySize(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+       if (File1->FileSize == File2->FileSize)
+               return 0;
+       return (File1->FileSize > File2->FileSize);
+}
+int CompareFilelistBySizeRev(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+       if (File1->FileSize == File2->FileSize)
+               return 0;
+       return (File1->FileSize < File2->FileSize);
+}
+int GroupchangeFilelistBySize(const void *vFile1, const void *vFile2)
+{
+       return 0;
+}
+
+
+int CompareFilelistByComment(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+       return strcasecmp(ChrPtr(File1->Comment), ChrPtr(File2->Comment));
+}
+int CompareFilelistByCommentRev(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+       return strcasecmp(ChrPtr(File2->Comment), ChrPtr(File1->Comment));
+}
+int GroupchangeFilelistByComment(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) vFile1;
+       FileListStruct *File2 = (FileListStruct*) vFile2;
+       return ChrPtr(File1->Comment)[9] != ChrPtr(File2->Comment)[0];
+}
+
+
+int CompareFilelistBySequence(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+       return (File2->Sequence >  File1->Sequence);
+}
+int GroupchangeFilelistBySequence(const void *vFile1, const void *vFile2)
+{
+       return 0;
+}
+
+/* -------------------------------------------------------------------------------- */
+HashList* LoadFileList(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *Entry;
+       StrBuf *Buf;
+       HashList *Files;
+       int Done = 0;
+       int sequence = 0;
+       char buf[1024];
+       CompareFunc SortIt;
+       int HavePic = 0;
+       WCTemplputParams SubTP;
+
+       memset(&SubTP, 0, sizeof(WCTemplputParams));
+       serv_puts("RDIR");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') return NULL;
+
+       Buf = NewStrBuf();             
+       Files = NewHash(1, NULL);
+       while (!Done && (StrBuf_ServGetln(Buf)>=0)) {
+               if ( (StrLength(Buf)==3) && 
+                   !strcmp(ChrPtr(Buf), "000")) 
+               {
+                       Done = 1;
+                       continue;
+               }
+
+               Entry = (FileListStruct*) malloc(sizeof (FileListStruct));
+               Entry->Filename = NewStrBufPlain(NULL, StrLength(Buf));
+               Entry->MimeType = NewStrBufPlain(NULL, StrLength(Buf));
+               Entry->Comment = NewStrBufPlain(NULL, StrLength(Buf));
+
+               Entry->Sequence = sequence++;
+
+               StrBufExtract_token(Entry->Filename, Buf, 0, '|');
+               Entry->FileSize = StrBufExtract_long(Buf, 1, '|');
+               StrBufExtract_token(Entry->MimeType, Buf, 2, '|');
+               StrBufExtract_token(Entry->Comment, Buf, 3, '|');
+
+
+
+               Entry->IsPic = (strstr(ChrPtr(Entry->MimeType), "image") != NULL);
+               if (Entry->IsPic) {
+                       HavePic = 1;
+               }
+               Put(Files, SKEY(Entry->Filename), Entry, FreeFiles);
+       }
+       if (HavePic)
+               putbstr("__HAVE_PIC", NewStrBufPlain(HKEY("1")));
+       SubTP.Filter.ContextType = CTX_FILELIST;
+       SortIt = RetrieveSort(&SubTP, NULL, 0, HKEY("fileunsorted"), 0);
+       if (SortIt != NULL)
+               SortByPayload(Files, SortIt);
+       else 
+               SortByPayload(Files, CompareFilelistBySequence);
+       FreeStrBuf(&Buf);
+       return Files;
+}
+
+void display_mime_icon(void)
+{
+       char FileBuf[SIZ];
+       const char *FileName;
+       char *MimeType;
+       size_t tlen;
+
+       MimeType = xbstr("type", &tlen);
+       FileName = GetIconFilename(MimeType, tlen);
+
+       if (FileName == NULL)
+               snprintf (FileBuf, SIZ, "%s%s", static_dirs[0], "/webcit_icons/essen/16x16/file.png");
+       else
+               snprintf (FileBuf, SIZ, "%s%s", static_dirs[3], FileName);
+       output_static(FileBuf);
+}
+
+void download_file(void)
+{
+       wcsession *WCC = WC;
+       StrBuf *Buf;
+       off_t bytes;
+       StrBuf *ContentType = NewStrBufPlain(HKEY("application/octet-stream"));
+
+       /* Setting to nonzero forces a MIME type of application/octet-stream */
+       int force_download = 1;
+       
+       Buf = NewStrBuf();
+       StrBufExtract_token(Buf, WCC->Hdr->HR.ReqLine, 0, '/');
+       StrBufUnescape(Buf, 1);
+       serv_printf("OPEN %s", ChrPtr(Buf));
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 2) {
+               StrBufCutLeft(Buf, 4);
+               bytes = StrBufExtract_long(Buf, 0, '|');
+               StrBufExtract_token(ContentType, Buf, 3, '|');
+
+               CheckGZipCompressionAllowed (SKEY(ContentType));
+               if (force_download)
+                       FlushStrBuf(ContentType);
+
+               serv_read_binary_to_http(ContentType, bytes, 0, 0);
+               serv_puts("CLOS");
+               StrBuf_ServGetln(Buf);
+       } else {
+               StrBufCutLeft(Buf, 4);
+               hprintf("HTTP/1.1 404 %s\n", ChrPtr(Buf));
+               output_headers(0, 0, 0, 0, 0, 0);
+               hprintf("Content-Type: text/plain\r\n");
+               wc_printf(_("An error occurred while retrieving this file: %s\n"), 
+                       ChrPtr(Buf));
+               end_burst();
+       }
+       FreeStrBuf(&ContentType);
+       FreeStrBuf(&Buf);
+}
+
+
+
+void delete_file(void)
+{
+       const StrBuf *MimeType;
+       StrBuf *Line;
+       char buf[256];
+       
+       safestrncpy(buf, bstr("file"), sizeof buf);
+       unescape_input(buf);
+       serv_printf("DELF %s", buf);
+
+       StrBuf_ServGetln(Line);
+       GetServerStatusMsg(Line, NULL, 1, 0);
+
+       MimeType = DoTemplate(HKEY("files"), NULL, &NoCtx);
+       http_transmit_thing(ChrPtr(MimeType), 0);
+       FreeStrBuf(&Line);
+}
+
+
+
+void upload_file(void)
+{
+       const StrBuf *RetMimeType;
+       const char *MimeType;
+       StrBuf *Line;
+       long bytes_transmitted = 0;
+       long blocksize;
+       const StrBuf *Desc;
+       wcsession *WCC = WC;     /* stack this for faster access (WC is a function) */
+
+       MimeType = GuessMimeType(ChrPtr(WCC->upload), WCC->upload_length); 
+
+               Desc = sbstr("description");
+
+       serv_printf("UOPN %s|%s|%s", 
+                   ChrPtr(WCC->upload_filename), 
+                   MimeType, 
+                   ChrPtr(Desc));
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatusMsg(Line, NULL, 1, 2) != 2) {
+               RetMimeType = DoTemplate(HKEY("files"), NULL, &NoCtx);
+               http_transmit_thing(ChrPtr(RetMimeType), 0);
+               FreeStrBuf(&Line);
+               return;
+       }
+
+       while (bytes_transmitted < WCC->upload_length)
+       {
+               blocksize = 4096;
+               if (blocksize > (WCC->upload_length - bytes_transmitted))
+               {
+                       blocksize = (WCC->upload_length - bytes_transmitted);
+               }
+               serv_printf("WRIT %ld", blocksize);
+               StrBuf_ServGetln(Line);
+               if (GetServerStatusMsg(Line, NULL, 0, 0) == 7) {
+                       blocksize = atoi(ChrPtr(Line) + 4);
+                       serv_write(&ChrPtr(WCC->upload)[bytes_transmitted], blocksize);
+                       bytes_transmitted += blocksize;
+               }
+               else
+                       break;
+       }
+
+       serv_puts("UCLS 1");
+       StrBuf_ServGetln(Line);
+       GetServerStatusMsg(Line, NULL, 1, 0);
+       RetMimeType = DoTemplate(HKEY("files"), NULL, &NoCtx);
+       http_transmit_thing(ChrPtr(RetMimeType), 0);
+       FreeStrBuf(&Line);
+}
+
+
+
+/*
+ * When the browser requests an image file from the Citadel server,
+ * this function is called to transmit it.
+ */
+void output_image(void)
+{
+       StrBuf *Buf;
+       wcsession *WCC = WC;
+       off_t bytes;
+       const char *MimeType;
+       
+       Buf = NewStrBuf();
+       serv_printf("OIMG %s|%s", bstr("name"), bstr("parm"));
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 2) {
+               int rc;
+               StrBufCutLeft(Buf, 4);
+               bytes = StrBufExtract_long(Buf, 0, '|');
+
+               /** Read it from the server */
+               
+               rc = serv_read_binary(WCC->WBuf, bytes, Buf);
+               serv_puts("CLOS");
+               StrBuf_ServGetln(Buf);
+               
+               if (rc > 0) {
+                       MimeType = GuessMimeType (ChrPtr(WCC->WBuf), StrLength(WCC->WBuf));
+                       /** Write it to the browser */
+                       if (!IsEmptyStr(MimeType))
+                       {
+                               CheckGZipCompressionAllowed (MimeType, strlen(MimeType));
+                               http_transmit_thing(MimeType, 0);
+                               FreeStrBuf(&Buf);
+                               return;
+                       }
+               }
+               /* hm... unknown mimetype? fallback to blank gif */
+       }
+       else { 
+               syslog(LOG_DEBUG, "OIMG failed: %s", ChrPtr(Buf));
+       }
+
+       
+       /*
+        * Instead of an ugly 404, send a 1x1 transparent GIF
+        * when there's no such image on the server.
+        */
+       StrBufPrintf (Buf, "%s%s", static_dirs[0], "/webcit_icons/blank.gif");
+       output_static(ChrPtr(Buf));
+       FreeStrBuf(&Buf);
+}
+
+void 
+InitModule_DOWNLOAD
+(void)
+{
+       RegisterCTX(CTX_FILELIST);
+
+       RegisterIterator("ROOM:FILES", 0, NULL, LoadFileList,
+                        NULL, DeleteHash, CTX_FILELIST, CTX_NONE, 
+                        IT_FLAG_DETECT_GROUPCHANGE);
+
+       RegisterSortFunc(HKEY("filemime"),
+                        NULL, 0,
+                        CompareFilelistByMime,
+                        CompareFilelistByMimeRev,
+                        GroupchangeFilelistByMime,
+                        CTX_FILELIST);
+       RegisterSortFunc(HKEY("filename"),
+                        NULL, 0,
+                        CompareFilelistByName,
+                        CompareFilelistByNameRev,
+                        GroupchangeFilelistByName,
+                        CTX_FILELIST);
+       RegisterSortFunc(HKEY("filesize"),
+                        NULL, 0,
+                        CompareFilelistBySize,
+                        CompareFilelistBySizeRev,
+                        GroupchangeFilelistBySize,
+                        CTX_FILELIST);
+       RegisterSortFunc(HKEY("filesubject"),
+                        NULL, 0,
+                        CompareFilelistByComment,
+                        CompareFilelistByCommentRev,
+                        GroupchangeFilelistByComment,
+                        CTX_FILELIST);
+       RegisterSortFunc(HKEY("fileunsorted"),
+                        NULL, 0,
+                        CompareFilelistBySequence,
+                        CompareFilelistBySequence,
+                        GroupchangeFilelistBySequence,
+                        CTX_FILELIST);
+
+       RegisterNamespace("FILE:NAME", 0, 2, tmplput_FILE_NAME, NULL, CTX_FILELIST);
+       RegisterNamespace("FILE:SIZE", 0, 1, tmplput_FILE_SIZE, NULL, CTX_FILELIST);
+       RegisterNamespace("FILE:MIMETYPE", 0, 2, tmplput_FILEMIMETYPE, NULL, CTX_FILELIST);
+       RegisterNamespace("FILE:COMMENT", 0, 2, tmplput_FILE_COMMENT, NULL, CTX_FILELIST);
+
+       RegisterConditional("COND:FILE:ISPIC", 0, Conditional_FILE_ISPIC, CTX_FILELIST);
+
+       WebcitAddUrlHandler(HKEY("image"), "", 0, output_image, ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("display_mime_icon"), "", 0, display_mime_icon , ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("download_file"), "", 0, download_file, NEED_URL);
+       WebcitAddUrlHandler(HKEY("delete_file"), "", 0, delete_file, NEED_URL);
+       WebcitAddUrlHandler(HKEY("upload_file"), "", 0, upload_file, 0);
+}
diff --git a/webcit/event.c b/webcit/event.c
new file mode 100644 (file)
index 0000000..e2894d1
--- /dev/null
@@ -0,0 +1,1223 @@
+/*
+ * Editing calendar events.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "calendar.h"
+
+/*
+ * Display an event by itself (for editing)
+ * supplied_vevent     the event to edit
+ * msgnum              reference on the citserver
+ */
+void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, char *from,
+       int unread, calview *calv)
+{
+       wcsession *WCC = WC;
+       icalcomponent *vevent;
+       icalproperty *p;
+       icalvalue *v;
+       struct icaltimetype t_start, t_end;
+       time_t now;
+       struct tm tm_now;
+       int created_new_vevent = 0;
+       icalproperty *organizer = NULL;
+       char organizer_string[SIZ];
+       icalproperty *attendee = NULL;
+       char attendee_string[SIZ];
+       char buf[SIZ];
+       int organizer_is_me = 0;
+       int i, j = 0;
+       /************************************************************
+        * Uncomment this to see the UID in calendar events for debugging
+       int sequence = 0;
+       */
+       char weekday_labels[7][32];
+       char month_labels[12][32];
+       long weekstart = 0;
+       icalproperty *rrule = NULL;
+       struct icalrecurrencetype recur;
+       char weekday_is_selected[7];
+       int which_rrmonthtype_is_preselected = 0;
+
+       int rrmday;
+       int rrmweekday;
+
+       icaltimetype day1;
+       int weekbase;
+       int rrmweek;
+       int rrymweek;
+       int rrymweekday;
+       int rrymonth;
+       int which_rrend_is_preselected;
+       int which_rryeartype_is_preselected;
+
+       const char *ch;
+       const char *tabnames[3];
+       const char *frequency_units[8];
+       const char *ordinals[6];
+
+       frequency_units[0] = _("seconds");
+       frequency_units[1] = _("minutes");
+       frequency_units[2] = _("hours");
+       frequency_units[3] = _("days");
+       frequency_units[4] = _("weeks");
+       frequency_units[5] = _("months");
+       frequency_units[6] = _("years");
+       frequency_units[7] = _("never");
+
+
+       ordinals[0] = "0";
+       ordinals[1] = _("first");
+       ordinals[2] = _("second");
+       ordinals[3] = _("third");
+       ordinals[4] = _("fourth");
+       ordinals[5] = _("fifth");
+
+
+       tabnames[0] = _("Event");
+       tabnames[1] = _("Attendees");
+       tabnames[2] = _("Recurrence");
+
+       get_pref_long("weekstart", &weekstart, 17);
+       if (weekstart > 6) weekstart = 0;
+
+       syslog(LOG_DEBUG, "display_edit_individual_event(%ld) calview=%s year=%s month=%s day=%s\n",
+               msgnum, bstr("calview"), bstr("year"), bstr("month"), bstr("day")
+       );
+
+       /* populate the weekday names - begin */
+       now = time(NULL);
+       localtime_r(&now, &tm_now);
+       while (tm_now.tm_wday != 0) {
+               now -= 86400L;
+               localtime_r(&now, &tm_now);
+       }
+       for (i=0; i<7; ++i) {
+               localtime_r(&now, &tm_now);
+               wc_strftime(weekday_labels[i], 32, "%A", &tm_now);
+               now += 86400L;
+       }
+       /* populate the weekday names - end */
+
+       /* populate the month names - begin */
+       now = 259200L;  /* 1970-jan-04 is the first Sunday ever */
+       localtime_r(&now, &tm_now);
+       for (i=0; i<12; ++i) {
+               localtime_r(&now, &tm_now);
+               wc_strftime(month_labels[i], 32, "%B", &tm_now);
+               now += 2678400L;
+       }
+       /* populate the month names - end */
+
+       now = time(NULL);
+       strcpy(organizer_string, "");
+       strcpy(attendee_string, "");
+
+       if (supplied_vevent != NULL) {
+               vevent = supplied_vevent;
+
+               /* Convert all timestamps to UTC to make them easier to process. */
+               ical_dezonify(vevent);
+
+               /*
+                * If we're looking at a fully encapsulated VCALENDAR
+                * rather than a VEVENT component, attempt to use the first
+                * relevant VEVENT subcomponent.  If there is none, the
+                * NULL returned by icalcomponent_get_first_component() will
+                * tell the next iteration of this function to create a
+                * new one.
+                */
+               if (icalcomponent_isa(vevent) == ICAL_VCALENDAR_COMPONENT) {
+                       display_edit_individual_event(
+                               icalcomponent_get_first_component(
+                                       vevent, ICAL_VEVENT_COMPONENT), 
+                               msgnum, from, unread, NULL
+                       );
+                       return;
+               }
+       }
+       else {
+               vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+               created_new_vevent = 1;
+       }
+
+       /* Learn the sequence */
+       p = icalcomponent_get_first_property(vevent, ICAL_SEQUENCE_PROPERTY);
+       /************************************************************
+        * Uncomment this to see the UID in calendar events for debugging
+       if (p != NULL) {
+               sequence = icalproperty_get_sequence(p);
+       }
+       */
+       /* Begin output */
+       output_headers(1, 1, 1, 0, 0, 0);
+       wc_printf("<div id=\"room_banner_override\">\n");
+       wc_printf("<h1>");
+       wc_printf(_("Add or edit an event"));
+       wc_printf("</h1>");
+       wc_printf("</div>\n");
+
+       wc_printf("<div id=\"content\" class=\"service\">\n");
+
+       /************************************************************
+        * Uncomment this to see the UID in calendar events for debugging
+       wc_printf("UID == ");
+       p = icalcomponent_get_first_property(vevent, ICAL_UID_PROPERTY);
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wc_printf("<br>\n");
+       wc_printf("SEQUENCE == %d<br>\n", sequence);
+       *************************************************************/
+
+       wc_printf("<form name=\"EventForm\" method=\"POST\" action=\"save_event\">\n");
+       wc_printf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
+
+       wc_printf("<input type=\"hidden\" name=\"go\" value=\"");
+       StrEscAppend(WCC->WBuf, WCC->CurRoom.name, NULL, 0, 0);
+       wc_printf("\">\n");
+
+       wc_printf("<input type=\"hidden\" name=\"msgnum\" value=\"%ld\">\n",
+               msgnum);
+       wc_printf("<input type=\"hidden\" name=\"calview\" value=\"%s\">\n",
+               bstr("calview"));
+       wc_printf("<input type=\"hidden\" name=\"year\" value=\"%s\">\n",
+               bstr("year"));
+       wc_printf("<input type=\"hidden\" name=\"month\" value=\"%s\">\n",
+               bstr("month"));
+       wc_printf("<input type=\"hidden\" name=\"day\" value=\"%s\">\n",
+               bstr("day"));
+
+
+       tabbed_dialog(3, tabnames);
+       begin_tab(0, 3);
+
+       /* Put it in a borderless table so it lines up nicely */
+       wc_printf("<table border='0' width='100%%'>\n");
+
+       wc_printf("<tr><td><b>");
+       wc_printf(_("Summary"));
+       wc_printf("</b></td><td>\n"
+               "<input type=\"text\" name=\"summary\" "
+               "maxlength=\"64\" size=\"64\" value=\"");
+       p = icalcomponent_get_first_property(vevent, ICAL_SUMMARY_PROPERTY);
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wc_printf("\"></td></tr>\n");
+
+       wc_printf("<tr><td><b>");
+       wc_printf(_("Location"));
+       wc_printf("</b></td><td>\n"
+               "<input type=\"text\" name=\"location\" "
+               "maxlength=\"64\" size=\"64\" value=\"");
+       p = icalcomponent_get_first_property(vevent, ICAL_LOCATION_PROPERTY);
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wc_printf("\"></td></tr>\n");
+
+       wc_printf("<tr><td><b>");
+       wc_printf(_("Start"));
+       wc_printf("</b></td><td>\n");
+       p = icalcomponent_get_first_property(vevent, ICAL_DTSTART_PROPERTY);
+       if (p != NULL) {
+               t_start = icalproperty_get_dtstart(p);
+               if (t_start.is_date) {
+                       t_start.hour = 0;
+                       t_start.minute = 0;
+                       t_start.second = 0;
+               }
+       }
+       else {
+               localtime_r(&now, &tm_now);
+               if (havebstr("year")) {
+                       tm_now.tm_year = ibstr("year") - 1900;
+                       tm_now.tm_mon = ibstr("month") - 1;
+                       tm_now.tm_mday = ibstr("day");
+               }
+               if (havebstr("hour")) {
+                       tm_now.tm_hour = ibstr("hour");
+                       tm_now.tm_min = ibstr("minute");
+                       tm_now.tm_sec = 0;
+               }
+               else {
+                       tm_now.tm_hour = 0;
+                       tm_now.tm_min = 0;
+                       tm_now.tm_sec = 0;
+               }
+
+               t_start = icaltime_from_timet_with_zone(
+                       mktime(&tm_now),
+                       ((yesbstr("alldayevent")) ? 1 : 0),
+                       icaltimezone_get_utc_timezone()
+               );
+       }
+       display_icaltimetype_as_webform(&t_start, "dtstart", 0);
+
+       wc_printf("<input type=\"checkbox\" id=\"alldayevent\" name=\"alldayevent\" "
+               "value=\"yes\" onclick=\"eventEditAllDay();\""
+               " %s >%s",
+               (t_start.is_date ? "checked=\"checked\"" : "" ),
+               _("All day event")
+       );
+
+       wc_printf("</td></tr>\n");
+
+       wc_printf("<tr><td><b>");
+       wc_printf(_("End"));
+       wc_printf("</b></td><td id=\"dtendcell\">\n");
+       p = icalcomponent_get_first_property(vevent,
+                                               ICAL_DTEND_PROPERTY);
+       if (p != NULL) {
+               t_end = icalproperty_get_dtend(p);
+
+               /*
+                * If this is an all-day-event, the end time is set to real end
+                * day + 1, so we have to adjust accordingly.
+                */
+               if (t_start.is_date) {
+                       icaltime_adjust(&t_end, -1, 0, 0, 0);
+               }
+       }
+       else {
+               if (created_new_vevent == 1) {
+                       /* set default duration */
+                       if (t_start.is_date) {
+                               /*
+                                * If this is an all-day-event, set the end time to be identical to
+                                * the start time (the hour/minute/second will be set to midnight).
+                                */
+                               t_end = t_start;
+                       }
+                       else {
+                               /*
+                                * If this is not an all-day event and there is no
+                                * end time specified, make the default one hour
+                                * from the start time.
+                                */
+                               t_end = t_start;
+                               t_end.hour += 1;
+                               t_end.second = 0;
+                               t_end = icaltime_normalize(t_end);
+                               /* t_end = icaltime_from_timet(now, 0); */
+                       }
+               }
+               else {
+                       /*
+                        * If an existing event has no end date/time this is
+                        * supposed to mean end = start.
+                        */
+                       t_end = t_start;
+               }
+       }
+       display_icaltimetype_as_webform(&t_end, "dtend", 0);
+       wc_printf("</td></tr>\n");
+
+       wc_printf("<tr><td><b>");
+       wc_printf(_("Notes"));
+       wc_printf("</b></td><td>\n"
+               "<textarea name=\"description\" "
+               "rows='5' cols='72' style='width:72'>\n"
+       );
+       p = icalcomponent_get_first_property(vevent, ICAL_DESCRIPTION_PROPERTY);
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wc_printf("</textarea></td></tr>");
+
+       /*
+        * For a new event, the user creating the event should be the
+        * organizer.  Set this field accordingly.
+        */
+       if (icalcomponent_get_first_property(vevent, ICAL_ORGANIZER_PROPERTY)
+          == NULL) {
+               sprintf(organizer_string, "mailto:%s", ChrPtr(WC->cs_inet_email));
+               icalcomponent_add_property(vevent,
+                       icalproperty_new_organizer(organizer_string)
+               );
+       }
+
+       /*
+        * Determine who is the organizer of this event.
+        * We need to determine "me" or "not me."
+        */
+       organizer = icalcomponent_get_first_property(vevent, ICAL_ORGANIZER_PROPERTY);
+       if (organizer != NULL) {
+               strcpy(organizer_string, icalproperty_get_organizer(organizer));
+               if (!strncasecmp(organizer_string, "mailto:", 7)) {
+                       strcpy(organizer_string, &organizer_string[7]);
+                       string_trim(organizer_string);
+                       serv_printf("ISME %s", organizer_string);
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '2') {
+                               organizer_is_me = 1;
+                       }
+               }
+       }
+
+       wc_printf("<tr><td><b>");
+       wc_printf(_("Organizer"));
+       wc_printf("</b></td><td>");
+       escputs(organizer_string);
+       if (organizer_is_me) {
+               wc_printf(" <font size='-1'><i>");
+               wc_printf(_("(you are the organizer)"));
+               wc_printf("</i></font>\n");
+       }
+
+       /*
+        * Transmit the organizer as a hidden field.   We don't want the user
+        * to be able to change it, but we do want it fed back to the server,
+        * especially if this is a new event and there is no organizer already
+        * in the calendar object.
+        */
+       wc_printf("<input type=\"hidden\" name=\"organizer\" value=\"");
+       escputs(organizer_string);
+       wc_printf("\">");
+
+       wc_printf("</td></tr>\n");
+
+       /* Transparency */
+       wc_printf("<tr><td><b>");
+       wc_printf(_("Show time as:"));
+       wc_printf("</b></td><td>");
+
+       p = icalcomponent_get_first_property(vevent, ICAL_TRANSP_PROPERTY);
+       if (p == NULL) {
+               /* No transparency found.  Default to opaque (busy). */
+               p = icalproperty_new_transp(ICAL_TRANSP_OPAQUE);
+               if (p != NULL) {
+                       icalcomponent_add_property(vevent, p);
+               }
+       }
+       if (p != NULL) {
+               v = icalproperty_get_value(p);
+       }
+       else {
+               v = NULL;
+       }
+
+       wc_printf("<input type=\"radio\" name=\"transp\" value=\"transparent\"");
+       if ((v != NULL) && (icalvalue_get_transp(v) == ICAL_TRANSP_TRANSPARENT)) {
+               wc_printf(" CHECKED");
+       }
+       wc_printf(">");
+       wc_printf(_("Free"));
+       wc_printf("&nbsp;&nbsp;");
+
+       wc_printf("<input type=\"radio\" name=\"transp\" value=\"opaque\"");
+       if ((v != NULL) && (icalvalue_get_transp(v) == ICAL_TRANSP_OPAQUE)) {
+               wc_printf(" CHECKED");
+       }
+       wc_printf(">");
+       wc_printf(_("Busy"));
+
+       wc_printf("</td></tr>\n");
+
+
+       /* Done with properties. */
+       wc_printf("</TABLE>\n");
+
+       end_tab(0, 3);
+
+       /* Attendees tab (need to move things here) */
+       begin_tab(1, 3);
+       wc_printf("<table border='0' width='100%%'>\n");        /* same table style as the event tab */
+       wc_printf("<tr><td><b>");
+       wc_printf(_("Attendees"));
+       wc_printf("</b><br>"
+               "<font size='-2'>");
+       wc_printf(_("(One per line)"));
+       wc_printf("</font>\n");
+
+       /* Pop open an address book -- begin */
+       wc_printf(
+               "&nbsp;<a href=\"javascript:PopOpenAddressBook('attendees_box|%s');\" "
+               "title=\"%s\">"
+               "<img alt='' align='middle' border='0' width='16' height='16' src=\"static/webcit_icons/essen/16x16/contact.png\">"
+               "</a>",
+               _("Attendees"),
+               _("Contacts")
+       );
+       /* Pop open an address book -- end */
+
+       wc_printf("</td><td>"
+               "<textarea %s name=\"attendees\" id=\"attendees_box\" "
+               "onchange=\"EnableOrDisableCheckButton();\" "
+               "onKeyPress=\"EnableOrDisableCheckButton();\" "
+               "rows='10' cols='72' style='width:72'>\n",
+               (organizer_is_me ? "" : "disabled='disabled' ")
+       );
+       i = 0;
+       for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDEE_PROPERTY);
+           attendee != NULL;
+           attendee = icalcomponent_get_next_property(vevent, ICAL_ATTENDEE_PROPERTY)) {
+               ch = icalproperty_get_attendee(attendee);
+               if ((ch != NULL) && !strncasecmp(ch, "mailto:", 7)) {
+
+                       /* screen name or email address */
+                       safestrncpy(attendee_string, ch + 7, sizeof(attendee_string));
+                       string_trim(attendee_string);
+                       if (i++) wc_printf("\n");
+                       escputs(attendee_string);
+                       wc_printf(" ");
+
+                       /* participant status */
+                       partstat_as_string(buf, attendee);
+                       escputs(buf);
+               }
+       }
+       wc_printf("</textarea></td></tr>\n");
+       wc_printf("</table>\n");
+       end_tab(1, 3);
+
+       /* Recurrence tab */
+       begin_tab(2, 3);
+
+       rrule = icalcomponent_get_first_property(vevent, ICAL_RRULE_PROPERTY);
+       if (rrule) {
+               recur = icalproperty_get_rrule(rrule);
+       }
+       else {
+               /* blank recurrence with some sensible defaults */
+               memset(&recur, 0, sizeof(struct icalrecurrencetype));
+               recur.count = 3;
+               recur.until = icaltime_null_time();
+               recur.interval = 1;
+               recur.freq = ICAL_WEEKLY_RECURRENCE;
+       }
+
+       wc_printf("<input type=\"checkbox\" id=\"is_recur\" name=\"is_recur\" "
+               "value=\"yes\" "
+               "onclick=\"RecurrenceShowHide();\""
+               " %s >%s",
+               (rrule ? "checked=\"checked\"" : "" ),
+               _("This is a recurring event")
+       );
+
+       wc_printf("<div id=\"rrule_div\">\n");          /* begin 'rrule_div' div */
+
+       wc_printf("<table border='0' cellspacing='10' width='100%%'>\n");
+
+       wc_printf("<tr><td><b>");
+       wc_printf(_("Recurrence rule"));
+       wc_printf("</b></td><td>");
+
+       if ((recur.freq < 0) || (recur.freq > 6)) recur.freq = 4;
+       wc_printf("%s ", _("Repeats every"));
+
+       wc_printf("<input type=\"text\" name=\"interval\" maxlength=\"3\" size=\"3\" ");
+       wc_printf("value=\"%d\">&nbsp;", recur.interval);
+
+       wc_printf("<select name=\"freq\" id=\"freq_selector\" size=\"1\" "
+               "onChange=\"RecurrenceShowHide();\">\n");
+       for (i=0; i<(sizeof frequency_units / sizeof(char *)); ++i) {
+               wc_printf("<option %s%svalue=\"%d\">%s</option>\n",
+                       ((i == recur.freq) ? "selected='selected' " : ""),
+                       (((i == recur.freq) || ((i>=3)&&(i<=6))) ? "" : "disabled='disabled' "),
+                       i,
+                       frequency_units[i]
+               );
+       }
+       wc_printf("</select>\n");
+
+       wc_printf("<div id=\"weekday_selector\">");     /* begin 'weekday_selector' div */
+       wc_printf("%s<br>", _("on these weekdays:"));
+
+       memset(weekday_is_selected, 0, 7);
+
+       for (i=0; i<ICAL_BY_DAY_SIZE; ++i) {
+               if (recur.by_day[i] == ICAL_RECURRENCE_ARRAY_MAX) {
+                       i = ICAL_RECURRENCE_ARRAY_MAX;                  /* all done */
+               }
+               else {
+                       for (j=0; j<7; ++j) {
+                               if (icalrecurrencetype_day_day_of_week(recur.by_day[i]) == j+1) {
+                                       weekday_is_selected[j] = 1;
+                               }
+                       }
+               }
+       }
+
+       for (j=0; j<7; ++j) {
+               i = ((j + (int)weekstart) % 7);
+               wc_printf("<input type=\"checkbox\" name=\"weekday%d\" value=\"yes\"", i);
+               if (weekday_is_selected[i]) wc_printf(" checked='checked'");
+               wc_printf(">%s\n", weekday_labels[i]);
+       }
+       wc_printf("</div>\n");                          /* end 'weekday_selector' div */
+
+
+
+
+
+       wc_printf("<div id=\"monthday_selector\">");    /* begin 'monthday_selector' div */
+
+       wc_printf("<input type=\"radio\" name=\"rrmonthtype\" id=\"rrmonthtype_mday\" "
+               "value=\"rrmonthtype_mday\" "
+               "%s onChange=\"RecurrenceShowHide();\">",
+               ((which_rrmonthtype_is_preselected == 0) ? "checked='checked'" : "")
+       );
+
+       rrmday = t_start.day;
+       rrmweekday = icaltime_day_of_week(t_start) - 1;
+
+       /* Figure out what week of the month we're in */
+       day1 = t_start;
+       day1.day = 1;
+       weekbase = icaltime_week_number(day1);
+       rrmweek = icaltime_week_number(t_start) - weekbase + 1;
+
+       /* Are we going by day of the month or week/day? */
+
+       if (recur.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
+               which_rrmonthtype_is_preselected = 0;
+               rrmday = recur.by_month_day[0];
+       }
+       else if (recur.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
+               which_rrmonthtype_is_preselected = 1;
+               rrmweek = icalrecurrencetype_day_position(recur.by_day[0]);
+               rrmweekday = icalrecurrencetype_day_day_of_week(recur.by_day[0]) - 1;
+       }
+
+       wc_printf(_("on day %s%d%s of the month"), "<span id=\"rrmday\">", rrmday, "</span>");
+       wc_printf("<br>\n");
+
+       wc_printf("<input type=\"radio\" name=\"rrmonthtype\" id=\"rrmonthtype_wday\" "
+               "value=\"rrmonthtype_wday\" "
+               "%s onChange=\"RecurrenceShowHide();\">",
+               ((which_rrmonthtype_is_preselected == 1) ? "checked='checked'" : "")
+       );
+
+       wc_printf(_("on the "));
+       wc_printf("<select name=\"rrmweek\" id=\"rrmweek\" size=\"1\" "
+               "onChange=\"RecurrenceShowHide();\">\n");
+       for (i=1; i<=5; ++i) {
+               wc_printf("<option %svalue=\"%d\">%s</option>\n",
+                       ((i==rrmweek) ? "selected='selected' " : ""),
+                       i,
+                       ordinals[i]
+               );
+       }
+       wc_printf("</select> \n");
+
+       wc_printf("<select name=\"rrmweekday\" id=\"rrmweekday\" size=\"1\" "
+               "onChange=\"RecurrenceShowHide();\">\n");
+       for (j=0; j<7; ++j) {
+               i = ((j + (int)weekstart) % 7);
+               wc_printf("<option %svalue=\"%d\">%s</option>\n",
+                       ((i==rrmweekday) ? "selected='selected' " : ""),
+                       i,
+                       weekday_labels[i]
+               );
+       }
+       wc_printf("</select>");
+
+       wc_printf(" %s<br>\n", _("of the month"));
+
+       wc_printf("</div>\n");                          /* end 'monthday_selector' div */
+
+
+       rrymweek = rrmweek;
+       rrymweekday = rrmweekday;
+       rrymonth = t_start.month;
+       which_rryeartype_is_preselected = 0;
+
+       if (
+               (recur.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX)
+               && (recur.by_day[0] != 0)
+               && (recur.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX)
+               && (recur.by_month[0] != 0)
+       ) {
+               which_rryeartype_is_preselected = 1;
+               rrymweek = icalrecurrencetype_day_position(recur.by_day[0]);
+               rrymweekday = icalrecurrencetype_day_day_of_week(recur.by_day[0]) - 1;
+               rrymonth = recur.by_month[0];
+       }
+
+       wc_printf("<div id=\"yearday_selector\">");     /* begin 'yearday_selector' div */
+
+       wc_printf("<input type=\"radio\" name=\"rryeartype\" id=\"rryeartype_ymday\" "
+               "value=\"rryeartype_ymday\" "
+               "%s onChange=\"RecurrenceShowHide();\">",
+               ((which_rryeartype_is_preselected == 0) ? "checked='checked'" : "")
+       );
+       wc_printf(_("every "));
+       wc_printf("<span id=\"ymday\">%s</span><br>", _("year on this date"));
+
+       wc_printf("<input type=\"radio\" name=\"rryeartype\" id=\"rryeartype_ywday\" "
+               "value=\"rryeartype_ywday\" "
+               "%s onChange=\"RecurrenceShowHide();\">",
+               ((which_rryeartype_is_preselected == 1) ? "checked='checked'" : "")
+       );
+
+       wc_printf(_("on the "));
+       wc_printf("<select name=\"rrymweek\" id=\"rrymweek\" size=\"1\" "
+               "onChange=\"RecurrenceShowHide();\">\n");
+       for (i=1; i<=5; ++i) {
+               wc_printf("<option %svalue=\"%d\">%s</option>\n",
+                       ((i==rrymweek) ? "selected='selected' " : ""),
+                       i,
+                       ordinals[i]
+               );
+       }
+       wc_printf("</select> \n");
+
+       wc_printf("<select name=\"rrymweekday\" id=\"rrymweekday\" size=\"1\" "
+               "onChange=\"RecurrenceShowHide();\">\n");
+       for (j=0; j<7; ++j) {
+               i = ((j + (int)weekstart) % 7);
+               wc_printf("<option %svalue=\"%d\">%s</option>\n",
+                       ((i==rrymweekday) ? "selected='selected' " : ""),
+                       i,
+                       weekday_labels[i]
+               );
+       }
+       wc_printf("</select>");
+
+       wc_printf(" %s ", _("of"));
+
+       wc_printf("<select name=\"rrymonth\" id=\"rrymonth\" size=\"1\" "
+               "onChange=\"RecurrenceShowHide();\">\n");
+       for (i=1; i<=12; ++i) {
+               wc_printf("<option %svalue=\"%d\">%s</option>\n",
+                       ((i==rrymonth) ? "selected='selected' " : ""),
+                       i,
+                       month_labels[i-1]
+               );
+       }
+       wc_printf("</select>");
+       wc_printf("<br>\n");
+
+       wc_printf("</div>\n");                          /* end 'yearday_selector' div */
+
+       wc_printf("</td></tr>\n");
+
+
+       which_rrend_is_preselected = 0;
+       if (!icaltime_is_null_time(recur.until)) which_rrend_is_preselected = 2;
+       if (recur.count > 0) which_rrend_is_preselected = 1;
+
+       wc_printf("<tr><td><b>");
+       wc_printf(_("Recurrence range"));
+       wc_printf("</b></td><td>\n");
+
+       wc_printf("<input type=\"radio\" name=\"rrend\" id=\"rrend_none\" "
+               "value=\"rrend_none\" "
+               "%s onChange=\"RecurrenceShowHide();\">",
+               ((which_rrend_is_preselected == 0) ? "checked='checked'" : "")
+       );
+       wc_printf("%s<br>\n", _("No ending date"));
+
+       wc_printf("<input type=\"radio\" name=\"rrend\" id=\"rrend_count\" "
+               "value=\"rrend_count\" "
+               "%s onChange=\"RecurrenceShowHide();\">",
+               ((which_rrend_is_preselected == 1) ? "checked='checked'" : "")
+       );
+       wc_printf(_("Repeat this event"));
+       wc_printf(" <input type=\"text\" name=\"rrcount\" id=\"rrcount\" maxlength=\"3\" size=\"3\" ");
+       wc_printf("value=\"%d\"> ", recur.count);
+       wc_printf(_("times"));
+       wc_printf("<br>\n");
+
+       wc_printf("<input type=\"radio\" name=\"rrend\" id=\"rrend_until\" "
+               "value=\"rrend_until\" "
+               "%s onChange=\"RecurrenceShowHide();\">",
+               ((which_rrend_is_preselected == 2) ? "checked='checked'" : "")
+       );
+       wc_printf(_("Repeat this event until "));
+
+       if (icaltime_is_null_time(recur.until)) {
+               recur.until = icaltime_add(t_start, icaldurationtype_from_int(604800));
+       }
+       display_icaltimetype_as_webform(&recur.until, "rruntil", 1);
+       wc_printf("<br>\n");
+
+       wc_printf("</td></tr>\n");
+
+       wc_printf("</table>\n");
+       wc_printf("</div>\n");                          /* end 'rrule' div */
+
+       end_tab(2, 3);
+
+       /* submit buttons (common area beneath the tabs) */
+       begin_tab(3, 3);
+       wc_printf("<center>"
+               "<input type=\"submit\" name=\"save_button\" value=\"%s\">"
+               "&nbsp;&nbsp;"
+               "<input type=\"submit\" name=\"delete_button\" value=\"%s\">\n"
+               "&nbsp;&nbsp;"
+               "<input type=\"submit\" id=\"check_button\" name=\"check_button\" value=\"%s\">\n"
+               "&nbsp;&nbsp;"
+               "<input type=\"submit\" name=\"cancel_button\" value=\"%s\">\n"
+               "</center>\n",
+               _("Save"),
+               _("Delete"),
+               _("Check attendee availability"),
+               _("Cancel")
+       );
+       end_tab(3, 3);
+       wc_printf("</form>\n");
+
+       StrBufAppendPrintf(WC->trailing_javascript,
+               "eventEditAllDay();             \n"
+               "RecurrenceShowHide();          \n"
+               "EnableOrDisableCheckButton();  \n"
+       );
+       do_template("addressbook_popup");
+
+       wDumpContent(1);
+
+       if (created_new_vevent) {
+               icalcomponent_free(vevent);
+       }
+}
+
+/*
+ * Save an edited event
+ *
+ * supplied_vevent:    the event to save
+ * msgnum:             the index on the citserver
+ */
+void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *from,
+                       int unread, calview *calv) {
+       StrBuf *Buf;
+       char buf[SIZ];
+       icalproperty *prop;
+       icalcomponent *vevent, *encaps;
+       int created_new_vevent = 0;
+       int all_day_event = 0;
+       struct icaltimetype event_start, t;
+       icalproperty *attendee = NULL;
+       char attendee_string[SIZ];
+       int i, j;
+       int foundit;
+       char form_attendees[SIZ];
+       char organizer_string[SIZ];
+       int sequence = 0;
+       enum icalproperty_transp formtransp = ICAL_TRANSP_NONE;
+       const char *ch;
+
+       if (supplied_vevent != NULL) {
+               vevent = supplied_vevent;
+
+               /* Convert all timestamps to UTC to make them easier to process. */
+               ical_dezonify(vevent);
+
+               /*
+                * If we're looking at a fully encapsulated VCALENDAR
+                * rather than a VEVENT component, attempt to use the first
+                * relevant VEVENT subcomponent.  If there is none, the
+                * NULL returned by icalcomponent_get_first_component() will
+                * tell the next iteration of this function to create a
+                * new one.
+                */
+               if (icalcomponent_isa(vevent) == ICAL_VCALENDAR_COMPONENT) {
+                       save_individual_event(
+                               icalcomponent_get_first_component(
+                                       vevent, ICAL_VEVENT_COMPONENT),
+                               msgnum, from, unread, NULL
+                       );
+                       return;
+               }
+       }
+       else {
+               vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+               created_new_vevent = 1;
+       }
+
+       if ( (havebstr("save_button"))
+          || (havebstr("check_button")) ) {
+
+               /* Replace values in the component with ones from the form */
+
+               while (prop = icalcomponent_get_first_property(vevent,
+                     ICAL_SUMMARY_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+
+               /* Add NOW() to the calendar object... */
+               icalcomponent_set_dtstamp(vevent,
+                                         icaltime_from_timet_with_zone(
+                                                 time(NULL), 0, icaltimezone_get_utc_timezone()));
+
+               if (havebstr("summary")) {
+                       icalcomponent_add_property(vevent,
+                                       icalproperty_new_summary(bstr("summary")));
+               } else {
+                       icalcomponent_add_property(vevent,
+                                       icalproperty_new_summary(_("Untitled Event")));
+               }
+
+               while (prop = icalcomponent_get_first_property(vevent,
+                                       ICAL_LOCATION_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+               if (havebstr("location")) {
+                       icalcomponent_add_property(vevent,
+                                       icalproperty_new_location(bstr("location")));
+               }
+               while (prop = icalcomponent_get_first_property(vevent,
+                                 ICAL_DESCRIPTION_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+               if (havebstr("description")) {
+                       icalcomponent_add_property(vevent,
+                               icalproperty_new_description(bstr("description")));
+               }
+
+               while (prop = icalcomponent_get_first_property(vevent,
+                     ICAL_DTSTART_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+
+               if (yesbstr("alldayevent")) {
+                       all_day_event = 1;
+               }
+               else {
+                       all_day_event = 0;
+               }
+
+               if (all_day_event) {
+                       icaltime_from_webform_dateonly(&event_start, "dtstart");
+               }
+               else {
+                       icaltime_from_webform(&event_start, "dtstart");
+               }
+
+               prop = icalproperty_new_dtstart(event_start);
+
+               if (all_day_event) {
+                       /* Force it to serialize as a date-only rather than date/time */
+                       icalproperty_set_value(prop, icalvalue_new_date(event_start));
+               }
+
+               if (prop) icalcomponent_add_property(vevent, prop);
+               else icalproperty_free(prop);
+
+               while (prop = icalcomponent_get_first_property(vevent,
+                     ICAL_DTEND_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+               while (prop = icalcomponent_get_first_property(vevent,
+                     ICAL_DURATION_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+
+               if (all_day_event) {
+                       icaltime_from_webform_dateonly(&t, "dtend");
+
+                       /* with this field supposed to be non-inclusive we have to add one day */
+                       icaltime_adjust(&t, 1, 0, 0, 0);
+               }
+               else {
+                       icaltime_from_webform(&t, "dtend");
+               }
+
+               icalcomponent_add_property(vevent,
+                       icalproperty_new_dtend(icaltime_normalize(t)
+                       )
+               );
+
+               /* recurrence rules -- begin */
+
+               /* remove any existing rule */
+               while (prop = icalcomponent_get_first_property(vevent, ICAL_RRULE_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+
+               if (yesbstr("is_recur")) {
+                       struct icalrecurrencetype recur;
+                       icalrecurrencetype_clear(&recur);
+
+                       recur.interval = atoi(bstr("interval"));
+                       recur.freq = atoi(bstr("freq"));
+
+                       switch(recur.freq) {
+
+                               /* These can't happen; they're disabled. */
+                               case ICAL_SECONDLY_RECURRENCE:
+                                       break;
+                               case ICAL_MINUTELY_RECURRENCE:
+                                       break;
+                               case ICAL_HOURLY_RECURRENCE:
+                                       break;
+
+                               /* Daily is valid but there are no further inputs. */
+                               case ICAL_DAILY_RECURRENCE:
+                                       break;
+
+                               /* These are the real options. */
+
+                               case ICAL_WEEKLY_RECURRENCE:
+                                       j=0;
+                                       for (i=0; i<7; ++i) {
+                                               snprintf(buf, sizeof buf, "weekday%d", i);
+                                               if (YESBSTR(buf)) recur.by_day[j++] =
+                                                       icalrecurrencetype_day_day_of_week(i+1);
+                                       }
+                                       recur.by_day[j++] = ICAL_RECURRENCE_ARRAY_MAX;
+                                       break;
+
+                               case ICAL_MONTHLY_RECURRENCE:
+                                       if (!strcasecmp(bstr("rrmonthtype"), "rrmonthtype_mday")) {
+                                               recur.by_month_day[0] = event_start.day;
+                                               recur.by_month_day[1] = ICAL_RECURRENCE_ARRAY_MAX;
+                                       }
+                                       else if (!strcasecmp(bstr("rrmonthtype"), "rrmonthtype_wday")) {
+                                               recur.by_day[0] = (atoi(bstr("rrmweek")) * 8)
+                                                               + atoi(bstr("rrmweekday")) + 1;
+                                               recur.by_day[1] = ICAL_RECURRENCE_ARRAY_MAX;
+                                       }
+                                       break;
+
+                               case ICAL_YEARLY_RECURRENCE:
+                                       if (!strcasecmp(bstr("rryeartype"), "rryeartype_ymday")) {
+                                               /* no further action is needed here */
+                                       }
+                                       else if (!strcasecmp(bstr("rryeartype"), "rryeartype_ywday")) {
+                                               recur.by_month[0] = atoi(bstr("rrymonth"));
+                                               recur.by_month[1] = ICAL_RECURRENCE_ARRAY_MAX;
+                                               recur.by_day[0] = (atoi(bstr("rrymweek")) * 8)
+                                                               + atoi(bstr("rrymweekday")) + 1;
+                                               recur.by_day[1] = ICAL_RECURRENCE_ARRAY_MAX;
+                                       }
+                                       break;
+
+                               /* This one can't happen either. */
+                               case ICAL_NO_RECURRENCE:
+                                       break;
+                       }
+
+                       if (!strcasecmp(bstr("rrend"), "rrend_count")) {
+                               recur.count = atoi(bstr("rrcount"));
+                       }
+                       else if (!strcasecmp(bstr("rrend"), "rrend_until")) {
+                               icaltime_from_webform_dateonly(&recur.until, "rruntil");
+                       }
+
+                       icalcomponent_add_property(vevent, icalproperty_new_rrule(recur));
+               }
+
+               /* recurrence rules -- end */
+
+               /* See if transparency is indicated */
+               if (havebstr("transp")) {
+                       if (!strcasecmp(bstr("transp"), "opaque")) {
+                               formtransp = ICAL_TRANSP_OPAQUE;
+                       }
+                       else if (!strcasecmp(bstr("transp"), "transparent")) {
+                               formtransp = ICAL_TRANSP_TRANSPARENT;
+                       }
+
+                       while (prop = icalcomponent_get_first_property(vevent, ICAL_TRANSP_PROPERTY),
+                             (prop != NULL)) {
+                               icalcomponent_remove_property(vevent, prop);
+                               icalproperty_free(prop);
+                       }
+
+                       icalcomponent_add_property(vevent, icalproperty_new_transp(formtransp));
+               }
+
+               /* Give this event a UID if it doesn't have one. */
+               if (icalcomponent_get_first_property(vevent,
+                  ICAL_UID_PROPERTY) == NULL) {
+                       generate_uuid(buf);
+                       icalcomponent_add_property(vevent, icalproperty_new_uid(buf));
+               }
+
+               /* Increment the sequence ID */
+               while (prop = icalcomponent_get_first_property(vevent,
+                     ICAL_SEQUENCE_PROPERTY), (prop != NULL) ) {
+                       i = icalproperty_get_sequence(prop);
+                       if (i > sequence) sequence = i;
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+               ++sequence;
+               icalcomponent_add_property(vevent,
+                       icalproperty_new_sequence(sequence)
+               );
+
+               /*
+                * Set the organizer, only if one does not already exist *and*
+                * the form is supplying one
+                */
+               strcpy(buf, bstr("organizer"));
+               if ( (icalcomponent_get_first_property(vevent,
+                  ICAL_ORGANIZER_PROPERTY) == NULL)
+                  && (!IsEmptyStr(buf)) ) {
+
+                       /* set new organizer */
+                       sprintf(organizer_string, "MAILTO:%s", buf);
+                       icalcomponent_add_property(vevent,
+                               icalproperty_new_organizer(organizer_string)
+                       );
+
+               }
+
+               /*
+                * Add any new attendees listed in the web form
+                */
+
+               /* First, strip out the parenthesized partstats.  */
+               strcpy(form_attendees, bstr("attendees"));
+               while ( stripout(form_attendees, '(', ')') != 0);
+
+               /* Next, change any commas to newlines, because we want newline-separated attendees. */
+               j = strlen(form_attendees);
+               for (i=0; i<j; ++i) {
+                       if (form_attendees[i] == ',') {
+                               form_attendees[i] = '\n';
+                               while (isspace(form_attendees[i+1])) {
+                                       strcpy(&form_attendees[i+1], &form_attendees[i+2]);
+                               }
+                       }
+               }
+
+               /* Now iterate! */
+               for (i=0; i<num_tokens(form_attendees, '\n'); ++i) {
+                       extract_token(buf, form_attendees, i, '\n', sizeof buf);
+                       string_trim(buf);
+                       if (!IsEmptyStr(buf)) {
+                               sprintf(attendee_string, "MAILTO:%s", buf);
+                               foundit = 0;
+
+                               for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDEE_PROPERTY); attendee != NULL; attendee = icalcomponent_get_next_property(vevent, ICAL_ATTENDEE_PROPERTY)) {
+                                       ch = icalproperty_get_attendee(attendee);
+                                       if ((ch != NULL) && !strcasecmp(attendee_string, ch))
+                                               ++foundit;
+                               }
+
+
+                               if (foundit == 0) {
+                                       icalcomponent_add_property(vevent,
+                                                                  icalproperty_new_attendee(attendee_string)
+                                       );
+                               }
+                       }
+               }
+
+               /*
+                * Remove any attendees *not* listed in the web form
+                */
+STARTOVER:     for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDEE_PROPERTY); attendee != NULL; attendee = icalcomponent_get_next_property(vevent, ICAL_ATTENDEE_PROPERTY)) {
+                       ch = icalproperty_get_attendee(attendee);
+                       if ((ch != NULL) && !strncasecmp(ch, "MAILTO:", 7)) {
+                               safestrncpy(attendee_string, ch + 7, sizeof(attendee_string));
+                               string_trim(attendee_string);
+                               foundit = 0;
+                               for (i=0; i<num_tokens(form_attendees, '\n'); ++i) {
+                                       extract_token(buf, form_attendees, i, '\n', sizeof buf);
+                                       string_trim(buf);
+                                       if (!strcasecmp(buf, attendee_string)) ++foundit;
+                               }
+                               if (foundit == 0) {
+                                       icalcomponent_remove_property(vevent, attendee);
+                                       icalproperty_free(attendee);
+                                       goto STARTOVER;
+                               }
+                       }
+               }
+
+               /*
+                * Encapsulate event into full VCALENDAR component.  Clone it first,
+                * for two reasons: one, it's easier to just free the whole thing
+                * when we're done instead of unbundling, but more importantly, we
+                * can't encapsulate something that may already be encapsulated
+                * somewhere else.
+                */
+               encaps = ical_encapsulate_subcomponent(icalcomponent_new_clone(vevent));
+
+               /* Set the method to PUBLISH */
+               icalcomponent_set_method(encaps, ICAL_METHOD_PUBLISH);
+
+               /* If the user clicked 'Save' then save it to the server. */
+               if ( (encaps != NULL) && (havebstr("save_button")) ) {
+                       serv_puts("ENT0 1|||4|||1|");
+                       serv_getln(buf, sizeof buf);
+                       switch (buf[0]) {
+                       case '8':
+                               serv_puts("Content-type: text/calendar");
+                               serv_puts("Content-Transfer-Encoding: quoted-printable");
+                               serv_puts("");
+                               Buf = NewStrBufPlain(icalcomponent_as_ical_string(encaps), -1);
+                               text_to_server_qp(Buf);
+                               FreeStrBuf(&Buf);
+//                             serv_puts(icalcomponent_as_ical_string(encaps));
+                               serv_puts("000");
+                       case '4':
+                               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {}
+                               break;
+                       case '2':
+                               AppendImportantMessage(buf + 4, - 1);
+                               break;
+                       default:
+                               break;
+                       }
+                       icalmemory_free_ring ();
+                       icalcomponent_free(encaps);
+                       encaps = NULL;
+               }
+
+               /* Or, check attendee availability if the user asked for that. */
+               if ( (encaps != NULL) && (havebstr("check_button")) ) {
+
+                       /* Call this function, which does the real work */
+                       check_attendee_availability(encaps);
+
+                       /* This displays the form again, with our annotations */
+                       display_edit_individual_event(encaps, msgnum, from, unread, NULL);
+
+                       icalcomponent_free(encaps);
+                       encaps = NULL;
+               }
+               if (encaps != NULL) {
+                       icalcomponent_free(encaps);
+                       encaps = NULL;
+               }
+
+       }
+
+       /*
+        * If the user clicked 'Delete' then delete it.
+        */
+       if ( (havebstr("delete_button")) && (msgnum > 0L) ) {
+               serv_printf("DELE %ld", lbstr("msgnum"));
+               serv_getln(buf, sizeof buf);
+       }
+
+       if (created_new_vevent) {
+               icalcomponent_free(vevent);
+       }
+
+       /* If this was a save or delete, go back to the calendar or summary view. */
+       if (!havebstr("check_button")) {
+               if (!strcasecmp(bstr("calview"), "summary")) {
+                       display_summary_page();
+               }
+               else {
+                       readloop(readfwd, eUseDefault);
+               }
+       }
+}
diff --git a/webcit/feed_generator.c b/webcit/feed_generator.c
new file mode 100644 (file)
index 0000000..00bc507
--- /dev/null
@@ -0,0 +1,294 @@
+/*
+ * RSS feed generator (could be adapted in the future to feed both RSS and Atom)
+ *
+ * Copyright (c) 2010-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+/*
+ * RSS feed generator -- do one message
+ */
+void feed_rss_one_message(long msgnum) {
+       int in_body = 0;
+       int in_messagetext = 0;
+       int found_title = 0;
+       int found_guid = 0;
+       char pubdate[128];
+       StrBuf *messagetext = NULL;
+       int is_top_level_post = 1;
+       const char *BufPtr = NULL;
+       StrBuf *Line = NewStrBufPlain(NULL, 1024);
+       char buf[1024];
+       int permalink_hash = 0;
+
+       /* Phase 1: read the message into memory */
+       serv_printf("MSG4 %ld", msgnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') return;
+       StrBuf *ServerResponse = NewStrBuf();
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               StrBufAppendPrintf(ServerResponse, "%s\n", buf);
+       }
+
+       /* Phase 2: help SkyNet become self-aware */
+       BufPtr = NULL;
+       while (StrBufSipLine(Line, ServerResponse, &BufPtr), ((BufPtr!=StrBufNOTNULL)&&(BufPtr!=NULL)) ) {
+               if (in_body) {
+                       /* do nothing */
+               }
+               else if (StrLength(Line) == 0) {
+                       ++in_body;
+               }
+               else if ((StrLength(Line) > 5) && (!strncasecmp(ChrPtr(Line), "wefw=", 5))) {
+                       is_top_level_post = 0;  /* presence of references means it's a reply/comment */
+               }
+               else if ((StrLength(Line) > 5) && (!strncasecmp(ChrPtr(Line), "msgn=", 5))) {
+                       StrBufCutLeft(Line, 5);
+                       permalink_hash = ThreadIdHash(Line);
+               }
+       }
+
+       /*
+        * Phase 3: output the message in RSS <item> form
+        * (suppress replies [comments] if this is a blog room)
+        */
+       if ( (WC->CurRoom.view != VIEW_BLOG) || (is_top_level_post == 1) ) {
+               wc_printf("<item>");
+               wc_printf("<link>%s/readfwd?go=", ChrPtr(site_prefix));
+               urlescputs(ChrPtr(WC->CurRoom.name));
+               if ((WC->CurRoom.view == VIEW_BLOG) && (permalink_hash != 0)) {
+                       wc_printf("?p=%d", permalink_hash);
+               }
+               else {
+                       wc_printf("?start_reading_at=%ld", msgnum);
+               }
+               wc_printf("</link>");
+       
+               BufPtr = NULL;
+               in_body = 0;
+               in_messagetext = 0;
+               while (StrBufSipLine(Line, ServerResponse, &BufPtr), ((BufPtr!=StrBufNOTNULL)&&(BufPtr!=NULL)) ) {
+                       safestrncpy(buf, ChrPtr(Line), sizeof buf);
+
+                       /* XML parsers can be picky; strip out nonprintable header characters */
+                       if ((strlen(buf)>=6) && (buf[4]=='=')) {
+                               char *p = &buf[5];
+                               while (*p) {
+                                       if (!isprint(*p)) {
+                                               *p = 0;
+                                       }
+                                       ++p;
+                               }
+                       }
+
+                       /* Now output fields */
+                       if (in_body) {
+                               if (in_messagetext) {
+                                       StrBufAppendBufPlain(messagetext, buf, -1, 0);
+                                       StrBufAppendBufPlain(messagetext, HKEY("\r\n"), 0);
+                               }
+                               else if (IsEmptyStr(buf)) {
+                                       in_messagetext = 1;
+                               }
+                       }
+                       else if (!strncasecmp(buf, "subj=", 5)) {
+                               wc_printf("<title>");
+                               escputs(&buf[5]);
+                               wc_printf("</title>");
+                               ++found_title;
+                       }
+                       else if (!strncasecmp(buf, "exti=", 5)) {
+                               wc_printf("<guid isPermaLink=\"false\">");
+                               escputs(&buf[5]);
+                               wc_printf("</guid>");
+                               ++found_guid;
+                       }
+                       else if (!strncasecmp(buf, "time=", 5)) {
+                               http_datestring(pubdate, sizeof pubdate, atol(&buf[5]));
+                               wc_printf("<pubDate>%s</pubDate>", pubdate);
+                       }
+                       else if (!strncasecmp(buf, "text", 4)) {
+                               if (!found_title) {
+                                       wc_printf("<title>Message #%ld</title>", msgnum);
+                               }
+                               if (!found_guid) {
+                                       wc_printf("<guid isPermaLink=\"false\">%ld@%s</guid>",
+                                               msgnum,
+                                               ChrPtr(WC->serv_info->serv_humannode)
+                                       );
+                               }
+                               wc_printf("<description>");
+                               in_body = 1;
+                               messagetext = NewStrBuf();
+                       }
+               }
+       
+               if (in_body) {
+                       cdataout((char*)ChrPtr(messagetext));
+                       FreeStrBuf(&messagetext);
+                       wc_printf("</description>");
+               }
+
+               wc_printf("</item>");
+       }
+
+       FreeStrBuf(&Line);
+       FreeStrBuf(&ServerResponse);
+       return;
+}
+
+
+/*
+ * RSS feed generator -- go through the message list
+ */
+void feed_rss_do_messages(void) {
+       wcsession *WCC = WC;
+       int num_msgs = 0;
+       int i;
+       SharedMessageStatus Stat;
+       message_summary *Msg = NULL;
+
+       memset(&Stat, 0, sizeof Stat);
+       Stat.maxload = INT_MAX;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0);
+       if (num_msgs < 1) return;
+
+       i = num_msgs;                                   /* convention is to feed newest-to-oldest */
+       while (i > 0) {
+               Msg = GetMessagePtrAt(i-1, WCC->summ);
+               if (Msg != NULL) {
+                       feed_rss_one_message(Msg->msgnum);
+               }
+               --i;
+       }
+}
+
+
+/*
+ * Output the room info file of the current room as a <description> for the channel
+ */
+void feed_rss_do_room_info_as_description(void)
+{
+       wc_printf("<description>");
+       escputs(ChrPtr(WC->CurRoom.name));      /* FIXME use the output of RINF instead */
+       wc_printf("</description>\r\n");
+}
+
+
+/*
+ * Entry point for RSS feed generator
+ */
+void feed_rss(void) {
+       char buf[1024];
+
+       output_headers(0, 0, 0, 0, 1, 0);
+       hprintf("Content-type: text/xml; charset=utf-8\r\n");
+       hprintf(
+               "Server: %s / %s\r\n"
+               "Connection: close\r\n"
+       ,
+               PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software)
+       );
+       begin_burst();
+
+       wc_printf("<?xml version=\"1.0\"?>"
+               "<rss version=\"2.0\">"
+               "<channel>"
+       );
+
+       wc_printf("<title>");
+       escputs(ChrPtr(WC->CurRoom.name));
+       wc_printf("</title>");
+
+       wc_printf("<link>");
+       escputs(ChrPtr(site_prefix));
+       wc_printf("/</link>");
+
+       serv_puts("RINF");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               wc_printf("<description>\r\n");
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       escputs(buf);
+                       wc_printf("\r\n");
+               }
+               wc_printf("</description>");
+       }
+
+       wc_printf("<image><title>");
+       escputs(ChrPtr(WC->CurRoom.name));
+       wc_printf("</title><url>");
+       escputs(ChrPtr(site_prefix));
+       wc_printf("/roompic?room=");
+       urlescputs(ChrPtr(WC->CurRoom.name));
+       wc_printf("</url><link>");
+       escputs(ChrPtr(site_prefix));
+       wc_printf("/</link></image>\r\n");
+
+       feed_rss_do_room_info_as_description();
+       feed_rss_do_messages();
+
+       wc_printf("</channel>"
+               "</rss>"
+               "\r\n\r\n"
+       );
+
+       wDumpContent(0);
+}
+
+
+/*
+ * Offer the RSS feed meta tag for this room
+ */
+void tmplput_rssmeta(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+       char feed_link[1024];
+
+       strcpy(feed_link, "/feed_rss?go=");
+       urlesc(&feed_link[20], sizeof(feed_link) - 20, (char *)ChrPtr(WCC->CurRoom.name) );
+       StrBufAppendPrintf(Target,
+               "<link rel=\"alternate\" title=\"RSS\" href=\"%s\" type=\"application/rss+xml\">",
+               feed_link
+       );
+}
+
+
+/*
+ * Offer the RSS feed button for this room
+ */
+void tmplput_rssbutton(StrBuf *Target, WCTemplputParams *TP) 
+{
+       StrBuf *FeedLink = NULL;
+
+       FeedLink = NewStrBufPlain(HKEY("/feed_rss?go="));
+       StrBufUrlescAppend(FeedLink, WC->CurRoom.name, NULL);
+
+       StrBufAppendPrintf(Target, "<a type=\"application/rss+xml\" href=\"");
+       StrBufAppendBuf(Target, FeedLink, 0);
+       StrBufAppendPrintf(Target, "\"><img src=\"static/webcit_icons/essen/16x16/rss.png\" alt=\"RSS\">");
+       StrBufAppendPrintf(Target, "</a>");
+       FreeStrBuf(&FeedLink);
+}
+
+
+void 
+InitModule_RSS
+(void)
+{
+       WebcitAddUrlHandler(HKEY("feed_rss"), "", 0, feed_rss, ANONYMOUS|COOKIEUNNEEDED);
+       RegisterNamespace("THISROOM:FEED:RSS", 0, 0, tmplput_rssbutton, NULL, CTX_NONE);
+       RegisterNamespace("THISROOM:FEED:RSSMETA", 0, 0, tmplput_rssmeta, NULL, CTX_NONE);
+}
diff --git a/webcit/fmt_date.c b/webcit/fmt_date.c
new file mode 100644 (file)
index 0000000..a14c3d5
--- /dev/null
@@ -0,0 +1,313 @@
+/*
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+#ifdef HAVE_USELOCALE
+extern locale_t *wc_locales;
+#endif
+
+typedef unsigned char byte;
+
+#define FALSE 0 /**< no. */
+#define TRUE 1 /**< yes. */
+
+/*
+ * Wrapper around strftime() or strftime_l()
+ * depending upon how our build is configured.
+ *
+ * s           String target buffer
+ * max         Maximum size of string target buffer
+ * format      strftime() format
+ * tm          Input date/time
+ */
+size_t wc_strftime(char *s, size_t max, const char *format, const struct tm *tm)
+{
+
+#ifdef ENABLE_NLS
+#ifdef HAVE_USELOCALE
+       if (wc_locales[WC->selected_language] == NULL) {
+               return strftime(s, max, format, tm);
+       }
+       else {
+               return strftime_l(s, max, format, tm, wc_locales[WC->selected_language]);
+       }
+#else
+       return strftime(s, max, format, tm);
+#endif
+#else
+       return strftime(s, max, format, tm);
+#endif
+}
+
+
+
+/*
+ * Format a date/time stamp for output 
+ */
+long webcit_fmt_date(char *buf, size_t siz, time_t thetime, int Format)
+{
+       long retlen = 0;
+       struct tm tm;
+       struct tm today_tm;
+       time_t today_timet;
+       int time_format;
+
+       time_format = get_time_format_cached ();
+       today_timet = time(NULL);
+       localtime_r(&today_timet, &today_tm);
+
+       localtime_r(&thetime, &tm);
+
+       /*
+        * DATEFMT_FULL:      full display 
+        * DATEFMT_BRIEF:     if date == today, show only the time
+        *                    otherwise, for messages up to 6 months old, 
+        *                 show the month and day, and the time
+        *                    older than 6 months, show only the date
+        * DATEFMT_RAWDATE:   show full date, regardless of age 
+        * DATEFMT_LOCALEDATE:   show full date as prefered for the locale
+        */
+
+       switch (Format) {
+               case DATEFMT_BRIEF:
+                       if ((tm.tm_year == today_tm.tm_year)
+                         &&(tm.tm_mon == today_tm.tm_mon)
+                         &&(tm.tm_mday == today_tm.tm_mday)) {
+                               if (time_format == WC_TIMEFORMAT_24) 
+                                       retlen = wc_strftime(buf, siz, "%k:%M", &tm);
+                               else
+                                       retlen = wc_strftime(buf, siz, "%l:%M%p", &tm);
+                       }
+                       else if (today_timet - thetime < 15552000) {
+                               if (time_format == WC_TIMEFORMAT_24) 
+                                       retlen = wc_strftime(buf, siz, "%b %d %k:%M", &tm);
+                               else
+                                       retlen = wc_strftime(buf, siz, "%b %d %l:%M%p", &tm);
+                       }
+                       else {
+                               retlen = wc_strftime(buf, siz, "%b %d %Y", &tm);
+                       }
+                       break;
+               case DATEFMT_FULL:
+                       if (time_format == WC_TIMEFORMAT_24)
+                               retlen = wc_strftime(buf, siz, "%a %b %d %Y %T %Z", &tm);
+                       else
+                               retlen = wc_strftime(buf, siz, "%a %b %d %Y %r %Z", &tm);
+                       break;
+               case DATEFMT_RAWDATE:
+                       retlen = wc_strftime(buf, siz, "%a %b %d %Y", &tm);
+                       break;
+               case DATEFMT_LOCALEDATE:
+                       retlen = wc_strftime(buf, siz, "%x", &tm);
+                       break;
+       }
+       return retlen;
+}
+
+
+/* 
+ * Try to guess whether the user will prefer 12 hour or 24 hour time based on the locale.
+ */
+long guess_calhourformat(void) {
+       char buf[64];
+       struct tm tm;
+       memset(&tm, 0, sizeof tm);
+       wc_strftime(buf, 64, "%X", &tm);
+       if (buf[strlen(buf)-1] == 'M') {
+               return 12;
+       }
+       return 24;
+}
+
+
+/*
+ * learn the users timeformat preference.
+ */
+int get_time_format_cached (void)
+{
+       long calhourformat;
+       int *time_format_cache;
+       time_format_cache = &(WC->time_format_cache);
+       if (*time_format_cache == WC_TIMEFORMAT_NONE)
+       {
+               get_pref_long("calhourformat", &calhourformat, 99);
+
+               /* If we don't know the user's time format preference yet,
+                * make a guess based on the locale.
+                */
+               if (calhourformat == 99) {
+                       calhourformat = guess_calhourformat();
+               }
+
+               /* Now set the preference */
+               if (calhourformat == 24) 
+                       *time_format_cache = WC_TIMEFORMAT_24;
+               else
+                       *time_format_cache = WC_TIMEFORMAT_AMPM;
+       }
+       return *time_format_cache;
+}
+
+/*
+ * Format TIME ONLY for output 
+ * buf         the output buffer
+ * thetime     time to format into buf
+ */
+void fmt_time(char *buf, size_t siz, time_t thetime)
+{
+       struct tm *tm;
+       int hour;
+       int time_format;
+       
+       time_format = get_time_format_cached ();
+       buf[0] = 0;
+       tm = localtime(&thetime);
+       hour = tm->tm_hour;
+       if (hour == 0)
+               hour = 12;
+       else if (hour > 12)
+               hour = hour - 12;
+
+       if (time_format == WC_TIMEFORMAT_24) {
+               snprintf(buf, siz, "%d:%02d",
+                       tm->tm_hour, tm->tm_min
+               );
+       }
+       else {
+               snprintf(buf, siz, "%d:%02d%s",
+                       hour, tm->tm_min, ((tm->tm_hour > 12) ? "pm" : "am")
+               );
+       }
+}
+
+
+
+
+/*
+ * Break down the timestamp used in HTTP headers
+ * Should read rfc1123 and rfc850 dates OK
+ * FIXME won't read asctime
+ * Doesn't understand timezone, but we only should be using GMT/UTC anyway
+ */
+time_t httpdate_to_timestamp(StrBuf *buf)
+{
+       time_t t = 0;
+       struct tm tt;
+       const char *c;
+
+       /** Skip day of week, to number */
+       for (c = ChrPtr(buf); *c != ' '; c++)
+               ;
+       c++;
+       
+       memset(&tt, 0, sizeof(tt));
+
+       /* Get day of month */
+       tt.tm_mday = atoi(c);
+       for (; *c != ' ' && *c != '-'; c++);
+       c++;
+
+       /* Get month */
+       switch (*c) {
+       case 'A':       /* April, August */
+               tt.tm_mon = (c[1] == 'p') ? 3 : 7;
+               break;
+       case 'D':       /* December */
+               tt.tm_mon = 11;
+               break;
+       case 'F':       /* February */
+               tt.tm_mon = 1;
+               break;
+       case 'M':       /* March, May */
+               tt.tm_mon = (c[2] == 'r') ? 2 : 4;
+               break;
+       case 'J':       /* January, June, July */
+               tt.tm_mon = (c[2] == 'n') ? ((c[1] == 'a') ? 0 : 5) : 6;
+               break;
+       case 'N':       /* November */
+               tt.tm_mon = 10;
+               break;
+       case 'O':       /* October */
+               tt.tm_mon = 9;
+               break;
+       case 'S':       /* September */
+               tt.tm_mon = 8;
+               break;
+       default:
+               return 42;
+               break;  /* NOTREACHED */
+       }
+       c += 4;
+
+       tt.tm_year = 0;
+       /* Get year */
+       tt.tm_year = atoi(c);
+       for (; *c != ' '; c++);
+       c++;
+       if (tt.tm_year >= 1900)
+               tt.tm_year -= 1900;
+
+       /* Get hour */
+       tt.tm_hour = atoi(c);
+       for (; *c != ':'; c++);
+       c++;
+
+       /* Get minute */
+       tt.tm_min = atoi(c);
+       for (; *c != ':'; c++);
+       c++;
+
+       /* Get second */
+       tt.tm_sec = atoi(c);
+       for (; *c && *c != ' '; c++);
+
+       /* Got everything; let's go.  The global 'timezone' variable contains the
+        * local timezone's offset from UTC, in seconds, so we apply that to tm_sec.
+        * This produces an illegal value for tm_sec, but mktime() will normalize
+        * it for us.  This eliminates the need to temporarily switch the environment
+        * variable TZ to UTC, which is good because it fails to switch back on
+        * some systems.
+        */
+       tzset();
+#ifdef __FreeBSD__
+       tt.tm_sec = tt.tm_sec - tt.tm_gmtoff;
+#else
+       tt.tm_sec = tt.tm_sec - (int)timezone;
+#endif
+       t = mktime(&tt);
+       return t;
+}
+
+
+void LoadTimeformatSettingsCache(StrBuf *Preference, long lvalue)
+{
+       int *time_format_cache;
+       
+        time_format_cache = &(WC->time_format_cache);
+        if (lvalue == 24) 
+                *time_format_cache = WC_TIMEFORMAT_24;
+        else
+                *time_format_cache = WC_TIMEFORMAT_AMPM;
+}
+
+
+
+void 
+InitModule_DATETIME
+(void)
+{
+       RegisterPreference("calhourformat", _("Time format"), PRF_INT, LoadTimeformatSettingsCache);
+
+
+}
diff --git a/webcit/gettext.c b/webcit/gettext.c
new file mode 100644 (file)
index 0000000..1bc40c8
--- /dev/null
@@ -0,0 +1,515 @@
+/*
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#define SEARCH_LANG 20         /* how many langs should we parse? */
+
+#ifdef ENABLE_NLS
+/* actual supported locales */
+const char *AvailLang[] = {
+       "en_US",
+       "ar_AE",
+       "bg_BG",
+       "cs_CZ",
+       "en_US",
+       "da_DK",
+       "de_DE",
+       "el_GR",
+       "en_GB",
+       "es_ES",
+       "et_EE",
+       "fi_FI",
+       "fr_FR",
+       "hu_HU",
+       "it_IT",
+       "ko_KO",
+       "nl_NL",
+       "pl_PL",
+       "pt_BR",
+       "ru_RU",
+       "zh_CN",
+       "he_IL",
+       "kk_KK",
+       "ro_RO",
+       "sl_SL",
+       "tr_TR",
+       ""
+};
+
+const char **AvailLangLoaded;
+long nLocalesLoaded = 0;
+
+#ifdef HAVE_USELOCALE
+locale_t *wc_locales; /* here we keep the parsed stuff */
+#endif
+
+/* Keep information about one locale */
+typedef struct _lang_pref {
+       char lang[16];          /* the language locale string */
+       char region[16];        /* the region locale string */
+       long priority;          /* which priority does it have */
+       int availability;       /* do we know it? */
+       int selectedlang;       /* is this the selected language? */
+} LangStruct;
+
+/* parse browser locale header 
+ *
+ * seems as most browsers just do a one after comma value even if more than 10 locales are available. Sample strings:
+ * opera: 
+ * Accept-Language: sq;q=1.0,de;q=0.9,as;q=0.8,ar;q=0.7,bn;q=0.6,zh-cn;q=0.5,kn;q=0.4,ch;q=0.3,fo;q=0.2,gn;q=0.1,ce;q=0.1,ie;q=0.1 
+ * Firefox 
+ * Accept-Language: 'de-de,en-us;q=0.7,en;q=0.3' 
+ * Accept-Language: de,en-ph;q=0.8,en-us;q=0.5,de-at;q=0.3 
+ * Accept-Language: de,en-us;q=0.9,it;q=0.9,de-de;q=0.8,en-ph;q=0.7,de-at;q=0.7,zh-cn;q=0.6,cy;q=0.5,ar-om;q=0.5,en-tt;q=0.4,xh;q=0.3,nl-be;q=0.3,cs;q=0.2,sv;q=0.1,tk;q=0.1 
+ */
+
+void httplang_to_locale(StrBuf *LocaleString, wcsession *sess)
+{
+       LangStruct wanted_locales[SEARCH_LANG];
+       LangStruct *ls;
+
+       long len;
+       int i = 0;
+       int j = 0;
+       /* size_t len = strlen(LocaleString); */
+       long prio;
+       int av;
+       int nBest;
+       int nParts;
+       StrBuf *Buf = NULL;
+       StrBuf *SBuf = NULL;
+
+       nParts = StrBufNum_tokens(LocaleString, ',');
+       for (i=0; ((i<nParts) && (i < SEARCH_LANG)); i++)
+        {
+               char lbuf[32];
+               int blen;
+                       
+               if (Buf == NULL) {
+                       Buf = NewStrBuf();
+                       SBuf = NewStrBuf();
+               }
+               else {
+                       FlushStrBuf(Buf);
+                       FlushStrBuf(SBuf);
+               }
+
+               ls = &wanted_locales[i];
+
+               StrBufExtract_token(Buf, LocaleString, i, ',');
+               /* we are searching, if this list item has something like ;q=n*/
+               if (StrBufNum_tokens(Buf, '=') > 1) {
+                       int sbuflen, k;
+                       StrBufExtract_token(SBuf, Buf, 1, '=');
+                       sbuflen = StrLength(SBuf);
+                       for (k = 0; k < sbuflen; k++) {
+                               if (ChrPtr(SBuf)[k] == '.') {
+                                       StrBufPeek(SBuf, NULL, k, '0');
+                               }
+                       }
+                       ls->priority = StrTol(SBuf);
+               }
+               else {
+                       ls->priority = 1000;
+               }
+
+               /* get the locale part */
+               StrBufExtract_token(SBuf, Buf, 0, ';');
+
+               /* get the lang part, which should be allways there */
+               extract_token(ls->lang, 
+                             ChrPtr(SBuf), 
+                             0, '-', 
+                             sizeof(ls->lang));
+
+               /* get the area code if any. */
+               if (StrBufNum_tokens(SBuf, '-') > 1) {
+                       extract_token(ls->region, 
+                                     ChrPtr(SBuf), 
+                                     1, '-', 
+                                     sizeof(ls->region)
+                       );
+               }
+               else { /* no ara code? use lang code */
+                       blen = strlen(ls->lang);
+                       memcpy(ls->region, ls->lang, blen);
+                       ls->region[blen] = '\0';
+               }
+
+               /* area codes are uppercase */
+               blen = strlen(&ls->region[0]);
+               for (j = 0; j < blen; j++)
+               {
+                       int chars;
+                       chars = toupper(ls->region[j]);
+                       ls->region[j] = (char)chars; /* todo ? */
+               }
+               snprintf(lbuf,
+                        sizeof(lbuf), 
+                        "%s_%s", 
+                        ls->lang, 
+                        ls->region);
+                       
+               /* check if we have this lang */
+               ls->availability = 1;
+               ls->selectedlang = -1;
+               len = strlen(ls->lang);
+               for (j = 0; j < nLocalesLoaded; j++) {
+                       int result;
+                       /* match against the LANG part */
+                       result = strncasecmp(ls->lang, AvailLangLoaded[j], len);
+                       if ((result == 0) && (result < ls->availability)){
+                               ls->availability = result;
+                               ls->selectedlang = j;
+                       }
+                       /* match against lang and locale */
+                       if (0 == strcasecmp(lbuf, AvailLangLoaded[j])){
+                               ls->availability = 0;
+                               ls->selectedlang = j;
+                               j = nLocalesLoaded;
+                       }
+               }
+        }
+       
+       prio = 0;
+       av = -1000;
+       nBest = -1;
+       for (i = 0; ((i < nParts) && (i<SEARCH_LANG)); i++) {
+               ls = &wanted_locales[i];
+               if (    (ls->availability <= 0)
+                       && (av < ls->availability)
+                       && (prio < ls->priority)
+                       && (ls->selectedlang != -1)
+               ) {
+                       nBest = ls->selectedlang;
+                       av = ls->availability;
+                       prio = ls->priority;
+               }
+       }
+       if (nBest == -1) {
+               /* fall back to C */
+               nBest=0;
+       }
+       sess->selected_language = nBest;
+       syslog(LOG_DEBUG, "language found: %s", AvailLangLoaded[sess->selected_language]);
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&SBuf);
+}
+
+
+/*
+ * show the language chooser on the login dialog
+ * depending on the browser locale change the sequence of the 
+ * language chooser.
+ */
+void tmplput_offer_languages(StrBuf *Target, WCTemplputParams *TP)
+{
+       int i;
+#ifndef HAVE_USELOCALE
+       char *Lang = getenv("LANG");
+       
+       if (Lang == NULL)
+               Lang = "C";
+#endif
+
+       if (nLocalesLoaded == 1) {
+               wc_printf("<p>%s</p>", AvailLangLoaded[0]);
+               return;
+       }
+
+       wc_printf("<select name=\"language\" id=\"lname\" size=\"1\" onChange=\"switch_to_lang($('lname').value);\">\n");
+
+       for (i=0; i < nLocalesLoaded; ++i) {
+#ifndef HAVE_USELOCALE
+               if (strcmp(AvailLangLoaded[i], Lang) == 0)
+#endif
+               wc_printf("<option %s value=%s>%s</option>\n",
+                       ((WC->selected_language == i) ? "selected" : ""),
+                       AvailLangLoaded[i],
+                       AvailLangLoaded[i]
+               );
+       }
+
+       wc_printf("</select>\n");
+}
+
+/*
+ * Set the selected language for this session.
+ */
+void set_selected_language(const char *lang) {
+#ifdef HAVE_USELOCALE
+       int i;
+       for (i = 0; i<nLocalesLoaded; ++i) {
+               if (!strcasecmp(lang, AvailLangLoaded[i])) {
+                       WC->selected_language = i;
+                       break;
+               }
+       }
+#endif
+}
+
+/*
+ * Activate the selected language for this session.
+ */
+void go_selected_language(void) {
+#ifdef HAVE_USELOCALE
+       wcsession *WCC = WC;
+       if (WCC->selected_language < 0)
+       {
+               httplang_to_locale(WCC->Hdr->HR.browser_language, WCC);
+               if (WCC->selected_language < 0)
+                       return;
+       }
+       uselocale(wc_locales[WCC->selected_language]);  /* switch locales */
+       textdomain(textdomain(NULL));                   /* clear the cache */
+#else
+       char *language;
+       
+       language = getenv("LANG");
+       setlocale(LC_MESSAGES, language);
+#endif
+}
+
+/*
+ * Deactivate the selected language for this session.
+ */
+void stop_selected_language(void) {
+#ifdef HAVE_USELOCALE
+       uselocale(LC_GLOBAL_LOCALE);                    /* switch locales */
+       textdomain(textdomain(NULL));                   /* clear the cache */
+#endif
+}
+
+#ifdef HAVE_USELOCALE
+       locale_t Empty_Locale;
+#endif
+
+/*
+ * Create a locale_t for each available language
+ */
+void initialize_locales(void) {
+       int nLocales;
+       int i;
+       char buf[32];
+       char *language = NULL;
+
+       nLocales = 0; 
+       while (!IsEmptyStr(AvailLang[nLocales]))
+               nLocales++;
+
+       language = getenv("WEBCIT_LANG");
+       if ((language) && (!IsEmptyStr(language)) && (strcmp(language, "UNLIMITED") != 0)) {
+               syslog(LOG_INFO, "Nailing locale to %s", language);
+       }
+       else language = NULL;
+
+       AvailLangLoaded = malloc (sizeof(char*) * nLocales);
+       memset(AvailLangLoaded, 0, sizeof(char*) * nLocales);
+#ifdef HAVE_USELOCALE
+       wc_locales = malloc (sizeof(locale_t) * nLocales);
+       memset(wc_locales,0, sizeof(locale_t) * nLocales);
+       /* create default locale */
+       Empty_Locale = newlocale(LC_ALL_MASK, NULL, NULL);
+#endif
+
+       for (i = 0; i < nLocales; ++i) {
+               if ((language != NULL) && (strcmp(AvailLang[i], language) != 0))
+                       continue;
+               if (i == 0) {
+                       sprintf(buf, "C");      /* locale 0 (C) is ascii, not utf-8 */
+                       
+               }
+               else {
+                       sprintf(buf, "%s.UTF8", AvailLang[i]);
+               }
+#ifdef HAVE_USELOCALE
+               wc_locales[nLocalesLoaded] = newlocale(
+                       (LC_MESSAGES_MASK|LC_TIME_MASK),
+                       buf,
+                       (((i > 0) && (wc_locales[0] != NULL)) ? wc_locales[0] : Empty_Locale)
+               );
+               if (wc_locales[nLocalesLoaded] == NULL) {
+                       syslog(LOG_NOTICE, "locale for %s disabled: %s", buf, strerror(errno));
+               }
+               else {
+                       syslog(LOG_INFO, "Found locale: %s - %s", buf, AvailLang[i]);
+                       AvailLangLoaded[nLocalesLoaded] = AvailLang[i];
+                       nLocalesLoaded++;
+               }
+#else
+               if ((language != NULL) && (strcmp(language, AvailLang[i]) == 0)) {
+                       setenv("LANG", buf, 1);
+                       AvailLangLoaded[nLocalesLoaded] = AvailLang[i];
+                       setlocale(LC_MESSAGES, AvailLang[i]);
+                       nLocalesLoaded++;
+               }
+               else if (nLocalesLoaded == 0) {
+                       setenv("LANG", buf, 1);
+                       AvailLangLoaded[nLocalesLoaded] = AvailLang[i];
+                       nLocalesLoaded++;
+               }
+#endif
+       }
+       if ((language != NULL) && (nLocalesLoaded == 0)) {
+               syslog(LOG_WARNING, "Your selected locale [%s] isn't available on your system. falling back to C", language);
+#ifdef HAVE_USELOCALE
+               wc_locales[0] = newlocale(
+                       (LC_MESSAGES_MASK|LC_TIME_MASK),
+                       AvailLang[0],
+                       Empty_Locale
+               );
+#else
+               setlocale(LC_MESSAGES, AvailLang[0]);
+               setenv("LANG", AvailLang[0], 1);
+#endif
+               AvailLangLoaded[0] = AvailLang[0];
+               nLocalesLoaded = 1;
+       }
+
+#ifdef ENABLE_NLS
+       setlocale(LC_ALL, "");
+       syslog(LOG_DEBUG, "Text domain: %s", textdomain("webcit"));
+       syslog(LOG_DEBUG, "Text domain Charset: %s", bind_textdomain_codeset("webcit", "UTF8"));
+       syslog(LOG_DEBUG, "Message catalog directory: %s", bindtextdomain(textdomain(NULL), LOCALEDIR"/locale"));
+#endif
+}
+
+
+void 
+ServerShutdownModule_GETTEXT
+(void)
+{
+#ifdef HAVE_USELOCALE
+       int i;
+       for (i = 0; i < nLocalesLoaded; ++i) {
+               if (Empty_Locale != wc_locales[i]) {
+                       freelocale(wc_locales[i]);
+               }
+       }
+       free(wc_locales);
+#endif
+       free(AvailLangLoaded);
+}
+
+#else  /* ENABLE_NLS */
+const char *AvailLang[] = {
+       "C",
+       ""
+};
+
+/* dummy for non NLS enabled systems */
+void 
+ServerShutdownModule_GETTEXT
+(void)
+{
+}
+
+
+void tmplput_offer_languages(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_printf("English (US)");
+}
+
+/* dummy for non NLS enabled systems */
+void set_selected_language(const char *lang) {
+}
+
+/* dummy for non NLS enabled systems */
+void go_selected_language(void) {
+}
+
+/* dummy for non NLS enabled systems */
+void stop_selected_language(void) {
+}
+
+void initialize_locales(void) {
+}
+
+#endif /* ENABLE_NLS */
+
+void TmplGettext(StrBuf *Target, WCTemplputParams *TP)
+{
+       const char *Text = _(TP->Tokens->Params[0]->Start);
+
+       StrBufAppendTemplateStr(Target, TP, Text, 1);
+}
+
+
+/*
+ * Returns the language currently in use.
+ * This function returns a static string, so don't do anything stupid please.
+ */
+const char *get_selected_language(void) {
+#ifdef ENABLE_NLS
+#ifdef HAVE_USELOCALE
+       return AvailLangLoaded[WC->selected_language];
+#else
+       return "en";
+#endif
+#else
+       return "en";
+#endif
+}
+
+
+void Header_HandleAcceptLanguage(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       hdr->HR.browser_language = Line;
+}
+
+
+void 
+InitModule_GETTEXT
+(void)
+{
+       initialize_locales();
+       
+       RegisterHeaderHandler(HKEY("ACCEPT-LANGUAGE"), 
+                             Header_HandleAcceptLanguage);
+                             
+       RegisterNamespace("LANG:SELECT", 0, 0, 
+                         tmplput_offer_languages, NULL, CTX_NONE);
+}
+
+
+void
+SessionNewModule_GETTEXT
+(wcsession *sess)
+{
+#ifdef ENABLE_NLS
+       if (    (sess != NULL)
+               && (!sess->Hdr->HR.Static)
+               && (sess->Hdr->HR.browser_language != NULL)
+       ) {
+               httplang_to_locale(sess->Hdr->HR.browser_language, sess);
+       }
+#endif
+}
+
+void
+SessionAttachModule_GETTEXT
+(wcsession *sess)
+{
+#ifdef ENABLE_NLS
+       go_selected_language();                                 /* set locale */
+#endif
+}
+
+void 
+SessionDestroyModule_GETTEXT
+(wcsession *sess)
+{
+#ifdef ENABLE_NLS
+       stop_selected_language();                               /* unset locale */
+#endif
+}
diff --git a/webcit/graphics.c b/webcit/graphics.c
new file mode 100644 (file)
index 0000000..98b0631
--- /dev/null
@@ -0,0 +1,196 @@
+// Handles HTTP upload of graphics files into the system.
+//
+// Copyright (c) 1996-2022 by the citadel.org team
+//
+// This program is open source software.  You can redistribute it and/or
+// modify it under the terms of the GNU General Public License, version 3.
+//
+// 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.
+
+#include "webcit.h"
+
+extern void output_static(const char* What);
+
+
+// display the picture (icon, photo, whatever) associated with the current room
+void display_roompic(void) {
+       off_t bytes;
+       StrBuf *Buf = NewStrBuf();
+       serv_printf("DLRI");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 6) {
+               StrBufCutLeft(Buf, 4);
+               bytes = StrBufExtract_long(Buf, 0, '|');
+               StrBuf *content_type = NewStrBuf();
+               StrBufExtract_token(content_type, Buf, 3, '|');
+               WC->WBuf = NewStrBuf();
+               StrBuf_ServGetBLOBBuffered(WC->WBuf, bytes);
+               http_transmit_thing(ChrPtr(content_type), 0);
+               FreeStrBuf(&content_type);
+       }
+       else {
+               output_error_pic("", "");
+       }
+       FreeStrBuf(&Buf);
+}
+
+
+// upload the picture (icon, photo, whatever) associated with the current room
+void common_code_for_editroompic_and_editpic(char *servcmd) {
+       if (havebstr("cancel_button")) {
+               AppendImportantMessage(_("Graphics upload has been cancelled."), -1);
+               display_main_menu();
+               return;
+       }
+
+       if (WC->upload_length == 0) {
+               AppendImportantMessage(_("You didn't upload a file."), -1);
+               display_main_menu();
+               return;
+       }
+       
+       serv_printf("%s %ld|%s", servcmd, (long)WC->upload_length, GuessMimeType(ChrPtr(WC->upload), WC->upload_length));
+       StrBuf *Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatusMsg(Line, NULL, 0, 0) == 7) {
+               serv_write(ChrPtr(WC->upload), WC->upload_length);
+               display_success(ChrPtr(Line) + 4);
+       }
+       else {
+               AppendImportantMessage((ChrPtr(Line) + 4), -1);
+               display_main_menu();
+       }
+       FreeStrBuf(&Line);
+}
+
+
+// upload the picture (icon, photo, whatever) associated with the current room
+void editroompic(void) {
+       common_code_for_editroompic_and_editpic("ULRI");
+}
+
+       
+// upload the picture (icon, photo, whatever) associated with the current user
+void editpic(void) {
+       common_code_for_editroompic_and_editpic("ULUI");
+}
+
+
+// display the screen for uploading graphics to the server
+void display_graphics_upload(char *filename) {
+       output_headers(1, 0, 0, 0, 1, 0);
+       do_template("files_graphicsupload");
+       end_burst();
+}
+
+
+void do_graphics_upload(char *filename) {
+       StrBuf *Line;
+       const char *MimeType;
+       wcsession *WCC = WC;
+       int bytes_remaining;
+       int pos = 0;
+       int thisblock;
+       bytes_remaining = WCC->upload_length;
+
+       if (havebstr("cancel_button")) {
+               AppendImportantMessage(_("Graphics upload has been cancelled."), -1);
+               display_main_menu();
+               return;
+       }
+
+       if (WCC->upload_length == 0) {
+               AppendImportantMessage(_("You didn't upload a file."), -1);
+               display_main_menu();
+               return;
+       }
+       
+       MimeType = GuessMimeType(ChrPtr(WCC->upload), bytes_remaining);
+       serv_printf("UIMG 1|%s|%s", MimeType, filename);
+
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatusMsg(Line, NULL, 1, 2) != 2) {
+               display_main_menu();
+               FreeStrBuf(&Line);
+               return;
+       }
+       while (bytes_remaining) {
+               thisblock = ((bytes_remaining > 4096) ? 4096 : bytes_remaining);
+               serv_printf("WRIT %d", thisblock);
+               StrBuf_ServGetln(Line);
+               if (GetServerStatusMsg(Line, NULL, 1, 7) != 7) {
+                       serv_puts("UCLS 0");
+                       StrBuf_ServGetln(Line);
+                       display_main_menu();
+                       FreeStrBuf(&Line);
+                       return;
+               }
+               thisblock = extract_int(ChrPtr(Line) +4, 0);
+               serv_write(&ChrPtr(WCC->upload)[pos], thisblock);
+               pos += thisblock;
+               bytes_remaining -= thisblock;
+       }
+
+       serv_puts("UCLS 1");
+       StrBuf_ServGetln(Line);
+       if (*ChrPtr(Line) != 'x') {
+               display_success(ChrPtr(Line) + 4);
+       
+       }
+       FreeStrBuf(&Line);
+
+}
+
+
+void edithellopic(void)    { do_graphics_upload("hello"); }
+void editgoodbyepic(void) { do_graphics_upload("UIMG 1|%s|goodbye"); }
+
+// The user's photo display / upload facility
+void display_editpic(void) {
+       putbstr("__PICDESC", NewStrBufPlain(_("your photo"), -1));
+       putbstr("__UPLURL", NewStrBufPlain(HKEY("editpic")));
+       display_graphics_upload("editpic");
+}
+
+// room picture dispay / upload facility
+void display_editroompic(void) {
+       putbstr("__PICDESC", NewStrBufPlain(_("the icon for this room"), -1));
+       putbstr("__UPLURL", NewStrBufPlain(HKEY("editroompic")));
+       display_graphics_upload("editroompic");
+}
+
+// the login page graphics
+void display_edithello(void) {
+       putbstr("__WHICHPIC", NewStrBufPlain(HKEY("hello")));
+       putbstr("__PICDESC", NewStrBufPlain(_("graphics to be displayed on the login screen"), -1));
+       putbstr("__UPLURL", NewStrBufPlain(HKEY("edithellopic")));
+       display_graphics_upload("edithellopic");
+}
+
+// the logoff banner
+void display_editgoodbyepic(void) {
+       putbstr("__WHICHPIC", NewStrBufPlain(HKEY("UIMG 0|%s|goodbye")));
+       putbstr("__PICDESC", NewStrBufPlain(_("the Logoff banner picture"), -1));
+       putbstr("__UPLURL", NewStrBufPlain(HKEY("editgoodbyepic")));
+       display_graphics_upload("editgoodbyepic");
+}
+
+
+void 
+InitModule_GRAPHICS
+(void)
+{
+       WebcitAddUrlHandler(HKEY("display_editpic"), "", 0, display_editpic, 0);
+       WebcitAddUrlHandler(HKEY("editpic"), "", 0, editpic, 0);
+       WebcitAddUrlHandler(HKEY("display_editroompic"), "", 0, display_editroompic, 0);
+       WebcitAddUrlHandler(HKEY("editroompic"), "", 0, editroompic, 0);
+       WebcitAddUrlHandler(HKEY("display_edithello"), "", 0, display_edithello, 0);
+       WebcitAddUrlHandler(HKEY("edithellopic"), "", 0, edithellopic, 0);
+       WebcitAddUrlHandler(HKEY("display_editgoodbye"), "", 0, display_editgoodbyepic, 0);
+       WebcitAddUrlHandler(HKEY("editgoodbyepic"), "", 0, editgoodbyepic, 0);
+       WebcitAddUrlHandler(HKEY("roompic"), "", 0, display_roompic, 0);
+}
diff --git a/webcit/html2html.c b/webcit/html2html.c
new file mode 100644 (file)
index 0000000..3122c75
--- /dev/null
@@ -0,0 +1,708 @@
+/*
+ * Output an HTML message, modifying it slightly to make sure it plays nice
+ * with the rest of our web framework.
+ *
+ * Copyright (c) 2005-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+
+/*
+ * Strip surrounding single or double quotes from a string.
+ */
+void stripquotes(char *s)
+{
+       int len;
+
+       if (!s) return;
+
+       len = strlen(s);
+       if (len < 2) return;
+
+       if ( ( (s[0] == '\"') && (s[len-1] == '\"') ) || ( (s[0] == '\'') && (s[len-1] == '\'') ) ) {
+               s[len-1] = 0;
+               strcpy(s, &s[1]);
+       }
+}
+
+
+/*
+ * Check to see if a META tag has overridden the declared MIME character set.
+ *
+ * charset             Character set name (left unchanged if we don't do anything)
+ * meta_http_equiv     Content of the "http-equiv" portion of the META tag
+ * meta_content                Content of the "content" portion of the META tag
+ */
+void extract_charset_from_meta(char *charset, char *meta_http_equiv, char *meta_content)
+{
+       char *ptr;
+       char buf[64];
+
+       if (!charset) return;
+       if (!meta_http_equiv) return;
+       if (!meta_content) return;
+
+
+       if (strcasecmp(meta_http_equiv, "Content-type")) return;
+
+       ptr = strchr(meta_content, ';');
+       if (!ptr) return;
+
+       safestrncpy(buf, ++ptr, sizeof buf);
+       string_trim(buf);
+       if (!strncasecmp(buf, "charset=", 8)) {
+               strcpy(charset, &buf[8]);
+
+               /*
+                * The brain-damaged webmail program in Microsoft Exchange declares
+                * a charset of "unicode" when they really mean "UTF-8".  GNU iconv
+                * treats "unicode" as an alias for "UTF-16" so we have to manually
+                * fix this here, otherwise messages generated in Exchange webmail
+                * show up as a big pile of weird characters.
+                */
+               if (!strcasecmp(charset, "unicode")) {
+                       strcpy(charset, "UTF-8");
+               }
+
+               /* Remove wandering punctuation */
+               if ((ptr=strchr(charset, '\"'))) *ptr = 0;
+               string_trim(charset);
+       }
+}
+
+
+
+/*
+ * Sanitize and enhance an HTML message for display.
+ * Also convert weird character sets to UTF-8 if necessary.
+ * Also fixup img src="cid:..." type inline images to fetch the image
+ *
+ */
+void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, StrBuf *Source, StrBuf *Target) {
+       char buf[SIZ];
+       char *msg;
+       char *ptr;
+       char *msgstart;
+       char *msgend;
+       StrBuf *converted_msg;
+       int buffer_length = 1;
+       int line_length = 0;
+       int content_length = 0;
+       char new_window[SIZ];
+       int brak = 0;
+       int alevel = 0;
+       int scriptlevel = 0;
+       int script_start_pos = (-1);
+       int i;
+       int linklen;
+       char charset[128];
+       StrBuf *BodyArea = NULL;
+#ifdef HAVE_ICONV
+       iconv_t ic = (iconv_t)(-1) ;
+       char *ibuf;                   /* Buffer of characters to be converted */
+       char *obuf;                   /* Buffer for converted characters      */
+       size_t ibuflen;               /* Length of input buffer               */
+       size_t obuflen;               /* Length of output buffer              */
+       char *osav;                   /* Saved pointer to output buffer       */
+#endif
+       if (Target == NULL)
+               Target = WC->WBuf;
+
+       safestrncpy(charset, supplied_charset, sizeof charset);
+       msg = strdup("");
+       sprintf(new_window, "<a target=\"%s\" href=", TARGET);
+
+       if (Source == NULL) while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               line_length = strlen(buf);
+               buffer_length = content_length + line_length + 2;
+               ptr = realloc(msg, buffer_length);
+               if (ptr == NULL) {
+                       StrBufAppendPrintf(Target, "<b>");
+                       StrBufAppendPrintf(Target, _("realloc() error! couldn't get %d bytes: %s"),
+                                       buffer_length + 1,
+                                       strerror(errno));
+                       StrBufAppendPrintf(Target, "</b><br><br>\n");
+                       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               /** flush */
+                       }
+                       free(msg);
+                       return;
+               }
+               msg = ptr;
+               strcpy(&msg[content_length], buf);
+               content_length += line_length;
+               strcpy(&msg[content_length], "\n");
+               content_length += 1;
+       }
+       else {
+               content_length = StrLength(Source);
+               free(msg);
+               msg = (char*) ChrPtr(Source);/* TODO: remove cast */
+               buffer_length = content_length;
+       }
+
+       /** Do a first pass to isolate the message body */
+       ptr = msg + 1;
+       msgstart = msg;
+       msgend = &msg[content_length];
+
+       while (ptr < msgend) {
+
+               /** Advance to next tag */
+               ptr = strchr(ptr, '<');
+               if ((ptr == NULL) || (ptr >= msgend)) break;
+               ++ptr;
+               if ((ptr == NULL) || (ptr >= msgend)) break;
+
+               /*
+                *  Look for META tags.  Some messages (particularly in
+                *  Asian locales) illegally declare a message's character
+                *  set in the HTML instead of in the MIME headers.  This
+                *  is wrong but we have to work around it anyway.
+                */
+               if (!strncasecmp(ptr, "META", 4)) {
+
+                       char *meta_start;
+                       char *meta_end;
+                       int meta_length;
+                       char *meta;
+                       char *meta_http_equiv;
+                       char *meta_content;
+                       char *spaceptr;
+
+                       meta_start = &ptr[4];
+                       meta_end = strchr(ptr, '>');
+                       if ((meta_end != NULL) && (meta_end <= msgend)) {
+                               meta_length = meta_end - meta_start + 1;
+                               meta = malloc(meta_length + 1);
+                               safestrncpy(meta, meta_start, meta_length);
+                               meta[meta_length] = 0;
+                               string_trim(meta);
+                               if (!strncasecmp(meta, "HTTP-EQUIV=", 11)) {
+                                       meta_http_equiv = strdup(&meta[11]);
+                                       spaceptr = strchr(meta_http_equiv, ' ');
+                                       if (spaceptr != NULL) {
+                                               *spaceptr = 0;
+                                               meta_content = strdup(++spaceptr);
+                                               if (!strncasecmp(meta_content, "content=", 8)) {
+                                                       strcpy(meta_content, &meta_content[8]);
+                                                       stripquotes(meta_http_equiv);
+                                                       stripquotes(meta_content);
+                                                       extract_charset_from_meta(charset,
+                                                                       meta_http_equiv, meta_content);
+                                               }
+                                               free(meta_content);
+                                       }
+                                       free(meta_http_equiv);
+                               }
+                               free(meta);
+                       }
+               }
+
+               /*
+                * Any of these tags cause everything up to and including
+                * the tag to be removed.
+                */     
+               if ( (!strncasecmp(ptr, "HTML", 4))
+                               ||(!strncasecmp(ptr, "HEAD", 4))
+                               ||(!strncasecmp(ptr, "/HEAD", 5))
+                               ||(!strncasecmp(ptr, "BODY", 4)) ) {
+                       char *pBody = NULL;
+
+                       if (!strncasecmp(ptr, "BODY", 4)) {
+                               pBody = ptr;
+                       }
+                       ptr = strchr(ptr, '>');
+                       if ((ptr == NULL) || (ptr >= msgend)) break;
+                       if ((pBody != NULL) && (ptr - pBody > 4)) {
+                               char* src;
+                               char *cid_start, *cid_end;
+
+                               *ptr = '\0';
+                               pBody += 4; 
+                               while ((isspace(*pBody)) && (pBody < ptr))
+                                       pBody ++;
+                               BodyArea = NewStrBufPlain(NULL,  ptr - pBody);
+
+                               if (pBody < ptr) {
+                                       src = strstr(pBody, "cid:");
+                                       if (src) {
+                                               cid_start = src + 4;
+                                               cid_end = cid_start;
+                                               while ((*cid_end != '"') && 
+                                                               !isspace(*cid_end) &&
+                                                               (cid_end < ptr))
+                                                       cid_end ++;
+
+                                               /* copy tag and attributes up to src="cid: */
+                                               StrBufAppendBufPlain(BodyArea, pBody, src - pBody, 0);
+
+                                               /* add in /webcit/mimepart/<msgno>/CID/ 
+                                                  trailing / stops dumb URL filters getting excited */
+                                               StrBufAppendPrintf(BodyArea,
+                                                               "/webcit/mimepart/%d/",msgnum);
+                                               StrBufAppendBufPlain(BodyArea, cid_start, cid_end - cid_start, 0);
+
+                                               if (ptr - cid_end > 0)
+                                                       StrBufAppendBufPlain(BodyArea, 
+                                                                       cid_end + 1, 
+                                                                       ptr - cid_end, 0);
+                                       }
+                                       else 
+                                               StrBufAppendBufPlain(BodyArea, pBody, ptr - pBody, 0);
+                               }
+                               *ptr = '>';
+                       }
+                       ++ptr;
+                       if ((ptr == NULL) || (ptr >= msgend)) break;
+                       msgstart = ptr;
+               }
+
+               /*
+                * Any of these tags cause everything including and following
+                * the tag to be removed.
+                */
+               if ( (!strncasecmp(ptr, "/HTML", 5))
+                               ||(!strncasecmp(ptr, "/BODY", 5)) ) {
+                       --ptr;
+                       msgend = ptr;
+                       strcpy(ptr, "");
+
+               }
+
+               ++ptr;
+       }
+       if (msgstart > msg) {
+               strcpy(msg, msgstart);
+       }
+
+       /* Now go through the message, parsing tags as necessary. */
+       converted_msg = NewStrBufPlain(NULL, content_length + 8192);
+
+
+       /** Convert foreign character sets to UTF-8 if necessary. */
+#ifdef HAVE_ICONV
+       if ( (strcasecmp(charset, "us-ascii"))
+                       && (strcasecmp(charset, "UTF-8"))
+                       && (strcasecmp(charset, ""))
+          ) {
+               syslog(LOG_DEBUG, "Converting %s to UTF-8\n", charset);
+               ctdl_iconv_open("UTF-8", charset, &ic);
+               if (ic == (iconv_t)(-1) ) {
+                       syslog(LOG_WARNING, "%s:%d iconv_open() failed: %s\n",
+                                       __FILE__, __LINE__, strerror(errno));
+               }
+       }
+       if  (Source == NULL) {
+               if (ic != (iconv_t)(-1) ) {
+                       ibuf = msg;
+                       ibuflen = content_length;
+                       obuflen = content_length + (content_length / 2) ;
+                       obuf = (char *) malloc(obuflen);
+                       osav = obuf;
+                       iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen);
+                       content_length = content_length + (content_length / 2) - obuflen;
+                       osav[content_length] = 0;
+                       free(msg);
+                       msg = osav;
+                       iconv_close(ic);
+               }
+       }
+       else {
+               if (ic != (iconv_t)(-1) ) {
+                       StrBuf *Buf = NewStrBufPlain(NULL, StrLength(Source) + 8096);;
+                       StrBufConvert(Source, Buf, &ic);
+                       FreeStrBuf(&Buf);
+                       iconv_close(ic);
+                       msg = (char*)ChrPtr(Source); /* TODO: get rid of this. */
+               }
+       }
+
+#endif
+
+       /*
+        *      At this point, the message has been stripped down to
+        *      only the content inside the <BODY></BODY> tags, and has
+        *      been converted to UTF-8 if it was originally in a foreign
+        *      character set.  The text is also guaranteed to be null
+        *      terminated now.
+        */
+
+       if (converted_msg == NULL) {
+               StrBufAppendPrintf(Target, "Error %d: %s<br>%s:%d", errno, strerror(errno), __FILE__, __LINE__);
+               goto BAIL;
+       }
+
+       if (BodyArea != NULL) {
+               StrBufAppendBufPlain(converted_msg, HKEY("<table "), 0);  
+               StrBufAppendBuf(converted_msg, BodyArea, 0);
+               StrBufAppendBufPlain(converted_msg, HKEY(" width=\"100%\"><tr><td>"), 0);
+       }
+       ptr = msg;
+       msgend = strchr(msg, 0);
+       while (ptr < msgend) {
+
+               /** Try to sanitize the html of any rogue scripts */
+               if (!strncasecmp(ptr, "<script", 7)) {
+                       if (scriptlevel == 0) {
+                               script_start_pos = StrLength(converted_msg);
+                       }
+                       ++scriptlevel;
+               }
+               if (!strncasecmp(ptr, "</script", 8)) {
+                       --scriptlevel;
+               }
+
+               /**
+                * Change mailto: links to WebCit mail, by replacing the
+                * link with one that points back to our mail room.  Due to
+                * the way we parse URL's, it'll even handle mailto: links
+                * that have "?subject=" in them.
+                */
+               if (!strncasecmp(ptr, "<a href=\"mailto:", 16)) {
+                       content_length += 64;
+                       StrBufAppendPrintf(converted_msg,
+                                       "<a href=\"display_enter?force_room=_MAIL_?recp=");
+                       ptr = &ptr[16];
+                       ++alevel;
+                       ++brak;
+               }
+               /** Make external links open in a separate window */
+               else if (!strncasecmp(ptr, "<a href=\"", 9)) {
+                       ++alevel;
+                       ++brak;
+                       if ( ((strchr(ptr, ':') < strchr(ptr, '/')))
+                                       &&  ((strchr(ptr, '/') < strchr(ptr, '>'))) 
+                          ) {
+                               /* open external links to new window */
+                               StrBufAppendPrintf(converted_msg, new_window);
+                               ptr = &ptr[8];
+                       }
+                       else if (
+                               (treat_as_wiki)
+                               && (strncasecmp(ptr, "<a href=\"wiki?", 14))
+                               && (strncasecmp(ptr, "<a href=\"dotgoto?", 17))
+                               && (strncasecmp(ptr, "<a href=\"knrooms?", 17))
+                       ) {
+                               content_length += 64;
+                               StrBufAppendPrintf(converted_msg, "<a href=\"wiki?go=");
+                               StrBufUrlescAppend(converted_msg, WC->CurRoom.name, NULL);
+                               StrBufAppendPrintf(converted_msg, "?page=");
+                               ptr = &ptr[9];
+                       }
+                       else {
+                               StrBufAppendPrintf(converted_msg, "<a href=\"");
+                               ptr = &ptr[9];
+                       }
+               }
+               /** Fixup <img src="cid:... ...> to fetch the mime part */
+               else if (!strncasecmp(ptr, "<img ", 5)) {
+                       char *cid_start, *cid_end;
+                       char* tag_end=strchr(ptr,'>');
+                       char* src;
+                       /* FIXME - handle this situation (maybe someone opened an <img cid... 
+                        * and then ended the message)
+                        */
+                       if (!tag_end) {
+                               syslog(LOG_DEBUG, "tag_end is null and ptr is:\n");
+                               syslog(LOG_DEBUG, "%s\n", ptr);
+                               syslog(LOG_DEBUG, "Theoretical bytes remaining: %d\n", (int)(msgend - ptr));
+                       }
+
+                       src=strstr(ptr, "src=\"cid:");
+                       ++brak;
+
+                       if (src
+                           && isspace(*(src-1))
+                               && tag_end
+                               && (cid_start=strchr(src,':'))
+                               && (cid_end=strchr(cid_start,'"'))
+                               && (cid_end < tag_end)
+                       ) {
+                               /* copy tag and attributes up to src="cid: */
+                               StrBufAppendBufPlain(converted_msg, ptr, src - ptr, 0);
+                               cid_start++;
+
+                               /* add in /webcit/mimepart/<msgno>/CID/ 
+                                  trailing / stops dumb URL filters getting excited */
+                               StrBufAppendPrintf(converted_msg,
+                                               " src=\"/webcit/mimepart/%d/",msgnum);
+                               StrBufAppendBufPlain(converted_msg, cid_start, cid_end - cid_start, 0);
+                               StrBufAppendBufPlain(converted_msg, "/\"", -1, 0);
+
+                               ptr = cid_end+1;
+                       }
+                       StrBufAppendBufPlain(converted_msg, ptr, tag_end - ptr, 0);
+                       ptr = tag_end;
+               }
+
+               /**
+                * Turn anything that looks like a URL into a real link, as long
+                * as it's not inside a tag already
+                */
+               else if ( (brak == 0) && (alevel == 0) &&
+                         ( (!strncasecmp(ptr, "http://", 7)) ||
+                           (!strncasecmp(ptr, "https://", 8)))) {
+                       /** Find the end of the link */
+                       int strlenptr;
+                       linklen = 0;
+                               
+                       strlenptr = strlen(ptr);
+                       for (i=0; i<=strlenptr; ++i) {
+                               if ((ptr[i]==0)
+                                   ||(isspace(ptr[i]))
+                                   ||(ptr[i]==10)
+                                   ||(ptr[i]==13)
+                                   ||(ptr[i]=='(')
+                                   ||(ptr[i]==')')
+                                   ||(ptr[i]=='<')
+                                   ||(ptr[i]=='>')
+                                   ||(ptr[i]=='[')
+                                   ||(ptr[i]==']')
+                                   ||(ptr[i]=='"')
+                                   ||(ptr[i]=='\'')
+                                       ) linklen = i;
+                               /* did s.b. send us an entity? */
+                               if (ptr[i] == '&') {
+                                       if ((ptr[i+2] ==';') ||
+                                           (ptr[i+3] ==';') ||
+                                           (ptr[i+5] ==';') ||
+                                           (ptr[i+6] ==';') ||
+                                           (ptr[i+7] ==';'))
+                                               linklen = i;
+                               }
+                               if (linklen > 0) break;
+                       }
+                       if (linklen > 0) {
+                               char *ltreviewptr;
+                               char *nbspreviewptr;
+                               char linkedchar;
+                               int len;
+                                       
+                               len = linklen;
+                               linkedchar = ptr[len];
+                               ptr[len] = '\0';
+                               /* spot for some subject strings tinymce tends to give us. */
+                               ltreviewptr = strchr(ptr, '<');
+                               if (ltreviewptr != NULL) {
+                                       *ltreviewptr = '\0';
+                                       linklen = ltreviewptr - ptr;
+                               }
+
+                               nbspreviewptr = strstr(ptr, "&nbsp;");
+                               if (nbspreviewptr != NULL) {
+                                       /* nbspreviewptr = '\0'; */
+                                       linklen = nbspreviewptr - ptr;
+                               }
+                               if (ltreviewptr != 0)
+                                       *ltreviewptr = '<';
+
+                               ptr[len] = linkedchar;
+
+                               content_length += (32 + linklen);
+                               StrBufAppendPrintf(converted_msg, "%s\"", new_window);
+                               StrBufAppendBufPlain(converted_msg, ptr, linklen, 0);
+                               StrBufAppendPrintf(converted_msg, "\">");
+                               StrBufAppendBufPlain(converted_msg, ptr, linklen, 0);
+                               ptr += linklen;
+                               StrBufAppendPrintf(converted_msg, "</A>");
+                       }
+               }
+               else {
+                       StrBufAppendBufPlain(converted_msg, ptr, 1, 0);
+                       ptr++;
+               }
+
+
+               if ((ptr >= msg) && (ptr <= msgend)) {
+                       /*
+                        * We need to know when we're inside a tag,
+                        * so we don't turn things that look like URL's into
+                        * links, when they're already links - or image sources.
+                        */
+                       if ((ptr > msg) && (*(ptr-1) == '<')) {
+                               ++brak;
+                       }
+                       if ((ptr > msg) && (*(ptr-1) == '>')) {
+                               --brak;
+                               if ((scriptlevel == 0) && (script_start_pos >= 0)) {
+                                       StrBufCutRight(converted_msg, StrLength(converted_msg) - script_start_pos);
+                                       script_start_pos = (-1);
+                               }
+                       }
+                       if (!strncasecmp(ptr, "</A>", 3)) --alevel;
+               }
+       }
+
+       if (BodyArea != NULL) {
+               StrBufAppendBufPlain(converted_msg, HKEY("</td></tr></table>"), 0);  
+               FreeStrBuf(&BodyArea);
+       }
+
+       /**     uncomment these two lines to override conversion        */
+       /**     memcpy(converted_msg, msg, content_length);             */
+       /**     output_length = content_length;                         */
+
+       /** Output our big pile of markup */
+       StrBufAppendBuf(Target, converted_msg, 0);
+
+BAIL:  /** A little trailing vertical whitespace... */
+       StrBufAppendPrintf(Target, "<br><br>\n");
+
+       /** Now give back the memory */
+       FreeStrBuf(&converted_msg);
+       if ((msg != NULL) && (Source == NULL)) free(msg);
+}
+
+
+
+
+
+
+/*
+ * Look for URL's embedded in a buffer and make them linkable.  We use a
+ * target window in order to keep the Citadel session in its own window.
+ */
+void UrlizeText(StrBuf* Target, StrBuf *Source, StrBuf *WrkBuf)
+{
+       int len, UrlLen, Offset, TrailerLen;
+       const char *start, *end, *pos;
+       
+       FlushStrBuf(Target);
+
+       start = NULL;
+       len = StrLength(Source);
+       end = ChrPtr(Source) + len;
+       for (pos = ChrPtr(Source); (pos < end) && (start == NULL); ++pos) {
+               if (!strncasecmp(pos, "http://", 7))
+                       start = pos;
+               else if (!strncasecmp(pos, "ftp://", 6))
+                       start = pos;
+       }
+
+       if (start == NULL) {
+               StrBufAppendBuf(Target, Source, 0);
+               return;
+       }
+       FlushStrBuf(WrkBuf);
+
+       for (pos = ChrPtr(Source) + len; pos > start; --pos) {
+               if (  (!isprint(*pos))
+                  || (isspace(*pos))
+                  || (*pos == '{')
+                  || (*pos == '}')
+                  || (*pos == '|')
+                  || (*pos == '\\')
+                  || (*pos == '^')
+                  || (*pos == '[')
+                  || (*pos == ']')
+                  || (*pos == '`')
+                  || (*pos == '<')
+                  || (*pos == '>')
+                  || (*pos == '(')
+                  || (*pos == ')')
+               ) {
+                       end = pos;
+               }
+       }
+       
+       UrlLen = end - start;
+       StrBufAppendBufPlain(WrkBuf, start, UrlLen, 0);
+
+       Offset = start - ChrPtr(Source);
+       if (Offset != 0)
+               StrBufAppendBufPlain(Target, ChrPtr(Source), Offset, 0);
+       StrBufAppendPrintf(Target, "%ca href=%c%s%c TARGET=%c%s%c%c%s%c/A%c",
+                          LB, QU, ChrPtr(WrkBuf), QU, QU, TARGET, 
+                          QU, RB, ChrPtr(WrkBuf), LB, RB);
+
+       TrailerLen = StrLength(Source) - (end - ChrPtr(Source));
+       if (TrailerLen > 0)
+               StrBufAppendBufPlain(Target, end, TrailerLen, 0);
+}
+
+
+void url(char *buf, size_t bufsize)
+{
+       int len, UrlLen, Offset, TrailerLen, outpos;
+       char *start, *end, *pos;
+       char urlbuf[SIZ];
+       char outbuf[SIZ];
+
+       start = NULL;
+       len = strlen(buf);
+       if (len > bufsize) {
+               syslog(LOG_WARNING, "URL: content longer than buffer!");
+               return;
+       }
+       end = buf + len;
+       for (pos = buf; (pos < end) && (start == NULL); ++pos) {
+               if (!strncasecmp(pos, "http://", 7))
+                       start = pos;
+               if (!strncasecmp(pos, "ftp://", 6))
+                       start = pos;
+       }
+
+       if (start == NULL)
+               return;
+
+       for (pos = buf+len; pos > start; --pos) {
+               if (  (!isprint(*pos))
+                  || (isspace(*pos))
+                  || (*pos == '{')
+                  || (*pos == '}')
+                  || (*pos == '|')
+                  || (*pos == '\\')
+                  || (*pos == '^')
+                  || (*pos == '[')
+                  || (*pos == ']')
+                  || (*pos == '`')
+                  || (*pos == '<')
+                  || (*pos == '>')
+                  || (*pos == '(')
+                  || (*pos == ')')
+               ) {
+                       end = pos;
+               }
+       }
+       
+       UrlLen = end - start;
+       if (UrlLen > sizeof(urlbuf)){
+               syslog(LOG_WARNING, "URL: content longer than buffer!");
+               return;
+       }
+       memcpy(urlbuf, start, UrlLen);
+       urlbuf[UrlLen] = '\0';
+
+       Offset = start - buf;
+       if ((Offset != 0) && (Offset < sizeof(outbuf)))
+               memcpy(outbuf, buf, Offset);
+       outpos = snprintf(&outbuf[Offset], sizeof(outbuf) - Offset,  
+                         "%ca href=%c%s%c TARGET=%c%s%c%c%s%c/A%c",
+                         LB, QU, urlbuf, QU, QU, TARGET, QU, RB, urlbuf, LB, RB);
+       if (outpos >= sizeof(outbuf) - Offset) {
+               syslog(LOG_WARNING, "URL: content longer than buffer!");
+               return;
+       }
+
+       TrailerLen = len - (end - start);
+       if (TrailerLen > 0)
+               memcpy(outbuf + Offset + outpos, end, TrailerLen);
+       if (Offset + outpos + TrailerLen > bufsize) {
+               syslog(LOG_WARNING, "URL: content longer than buffer!");
+               return;
+       }
+       memcpy (buf, outbuf, Offset + outpos + TrailerLen);
+       *(buf + Offset + outpos + TrailerLen) = '\0';
+}
+
diff --git a/webcit/http_datestring.c b/webcit/http_datestring.c
new file mode 100644 (file)
index 0000000..d1f6634
--- /dev/null
@@ -0,0 +1,93 @@
+#include "webcit.h"
+
+#ifdef __FreeBSD__
+/** I like to believe there is a better way to do this. */
+#define HAVE_STRUCT_TM_TM_GMTOFF
+#endif
+/** HTTP Months - do not translate - these are not for human consumption */
+static char *httpdate_months[] = {
+       "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+       "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+
+/** HTTP Weekdays - do not translate - these are not for human consumption */
+static char *httpdate_weekdays[] = {
+       "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+};
+
+
+/**
+ * \brief Supplied with a unix timestamp, generate a textual time/date stamp
+ * \param buf the return buffer
+ * \param n the size of the buffer
+ * \param xtime the time to format as string
+ */
+void http_datestring(char *buf, size_t n, time_t xtime) {
+       struct tm t;
+
+       long offset;
+       char offsign;
+
+       localtime_r(&xtime, &t);
+
+       /** Convert "seconds west of GMT" to "hours/minutes offset" */
+#ifdef HAVE_STRUCT_TM_TM_GMTOFF
+       offset = t.tm_gmtoff;
+#else
+       offset = timezone;
+#endif
+       if (offset > 0) {
+               offsign = '+';
+       }
+       else {
+               offset = 0L - offset;
+               offsign = '-';
+       }
+       offset = ( (offset / 3600) * 100 ) + ( offset % 60 );
+
+       snprintf(buf, n, "%s, %02d %s %04d %02d:%02d:%02d %c%04ld",
+               httpdate_weekdays[t.tm_wday],
+               t.tm_mday,
+               httpdate_months[t.tm_mon],
+               t.tm_year + 1900,
+               t.tm_hour,
+               t.tm_min,
+               t.tm_sec,
+               offsign, offset
+       );
+}
+
+
+void tmplput_nowstr(StrBuf *Target, WCTemplputParams *TP)
+{
+       char buf[64];
+       long bufused;
+       time_t now;
+       
+       now = time(NULL);
+#ifdef HAVE_SOLARIS_LOCALTIME_R
+       asctime_r(localtime(&now), buf, sizeof(buf));
+#else
+       asctime_r(localtime(&now), buf);
+#endif
+       bufused = strlen(buf);
+       if ((bufused > 0) && (buf[bufused - 1] == '\n')) {
+               buf[bufused - 1] = '\0';
+               bufused --;
+       }
+       StrEscAppend(Target, NULL, buf, 0, 0);
+}
+void tmplput_nowno(StrBuf *Target, WCTemplputParams *TP)
+{
+       time_t now;
+       now = time(NULL);
+       StrBufAppendPrintf(Target, "%ld", now);
+}
+
+void 
+InitModule_DATE
+(void)
+{
+       RegisterNamespace("DATE:NOW:STR", 0, 0, tmplput_nowstr, NULL, CTX_NONE);
+       RegisterNamespace("DATE:NOW:NO", 0, 0, tmplput_nowno, NULL, CTX_NONE);
+}
diff --git a/webcit/ical_dezonify.c b/webcit/ical_dezonify.c
new file mode 100644 (file)
index 0000000..de444a9
--- /dev/null
@@ -0,0 +1,239 @@
+/* 
+ * Function to go through an ical component set and convert all non-UTC
+ * date/time properties to UTC.  It also strips out any VTIMEZONE
+ * subcomponents afterwards, because they're irrelevant.
+ *
+ * Everything here will work on both a fully encapsulated VCALENDAR component
+ * or any type of subcomponent.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+/*
+ * Figure out which time zone needs to be used for timestamps that are
+ * not UTC and do not have a time zone specified.
+ *
+ */
+icaltimezone *get_default_icaltimezone(void) {
+
+        icaltimezone *zone = NULL;
+       const char *default_zone_name = ChrPtr(WC->serv_info->serv_default_cal_zone);
+
+        if (!zone) {
+                zone = icaltimezone_get_builtin_timezone(default_zone_name);
+        }
+        if (!zone) {
+               syslog(LOG_WARNING, "Unable to load '%s' time zone.  Defaulting to UTC.\n", default_zone_name);
+                zone = icaltimezone_get_utc_timezone();
+       }
+       if (!zone) {
+               syslog(LOG_ERR, "Unable to load UTC time zone!\n");
+       }
+        return zone;
+}
+
+
+/*
+ * Back end function for ical_dezonify()
+ *
+ * We supply this with the master component, the relevant component,
+ * and the property (which will be a DTSTART, DTEND, etc.)
+ * which we want to convert to UTC.
+ */
+void ical_dezonify_backend(icalcomponent *cal,
+                       icalcomponent *rcal,
+                       icalproperty *prop) {
+
+       icaltimezone *t = NULL;
+       icalparameter *param;
+       const char *tzid = NULL;
+       struct icaltimetype TheTime;
+       int utc_declared_as_tzid = 0;   /* Component declared 'TZID=GMT' instead of using Z syntax */
+
+       /* Give me nothing and I will give you nothing in return. */
+       if (cal == NULL) return;
+
+       /* Hunt for a TZID parameter in this property. */
+       param = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER);
+
+       /* Get the stringish name of this TZID. */
+       if (param != NULL) {
+               tzid = icalparameter_get_tzid(param);
+
+               /* Convert it to an icaltimezone type. */
+               if (tzid != NULL) {
+#ifdef DBG_ICAL
+                       syslog(LOG_DEBUG, "                * Stringy supplied timezone is: '%s'\n", tzid);
+#endif
+                       if ( (!strcasecmp(tzid, "UTC")) || (!strcasecmp(tzid, "GMT")) ) {
+                               utc_declared_as_tzid = 1;
+#ifdef DBG_ICAL
+                               syslog(LOG_DEBUG, "                * ...and we handle that internally.\n");
+#endif
+                       }
+                       else {
+                               /* try attached first */
+                               t = icalcomponent_get_timezone(cal, tzid);
+#ifdef DBG_ICAL
+                               syslog(LOG_DEBUG, "                * ...and I %s have tzdata for that zone.\n",
+                                       (t ? "DO" : "DO NOT")
+                               );
+#endif
+                               /* then try built-in timezones */
+                               if (!t) {
+                                       t = icaltimezone_get_builtin_timezone(tzid);
+#ifdef DBG_ICAL
+                                       if (t) {
+                                               syslog(LOG_DEBUG, "                * Using system tzdata!\n");
+                                       }
+#endif
+                               }
+                       }
+               }
+
+       }
+
+       /* Now we know the timezone.  Convert to UTC. */
+
+       if (icalproperty_isa(prop) == ICAL_DTSTART_PROPERTY) {
+               TheTime = icalproperty_get_dtstart(prop);
+       }
+       else if (icalproperty_isa(prop) == ICAL_DTEND_PROPERTY) {
+               TheTime = icalproperty_get_dtend(prop);
+       }
+       else if (icalproperty_isa(prop) == ICAL_DUE_PROPERTY) {
+               TheTime = icalproperty_get_due(prop);
+       }
+       else if (icalproperty_isa(prop) == ICAL_EXDATE_PROPERTY) {
+               TheTime = icalproperty_get_exdate(prop);
+       }
+       else {
+               return;
+       }
+
+#ifdef DBG_ICAL
+       syslog(LOG_DEBUG, "                * Was: %s\n", icaltime_as_ical_string(TheTime));
+#endif
+
+       if (icaltime_is_utc(TheTime)) {
+#ifdef DBG_ICAL
+               syslog(LOG_DEBUG, "                * This property is ALREADY UTC.\n");
+#endif
+       }
+
+       else if (utc_declared_as_tzid) {
+#ifdef DBG_ICAL
+               syslog(LOG_DEBUG, "                * Replacing '%s' TZID with 'Z' suffix.\n", tzid);
+#endif
+               TheTime.zone = icaltimezone_get_utc_timezone();
+       }
+
+       else {
+               /* Do the conversion. */
+               if (t != NULL) {
+#ifdef DBG_ICAL
+                       syslog(LOG_DEBUG, "                * Timezone prop found.  Converting to UTC.\n");
+#endif
+               }
+               else {
+#ifdef DBG_ICAL
+                       syslog(LOG_DEBUG, "                * Converting default timezone to UTC.\n");
+#endif
+               }
+
+               if (t == NULL) {
+                       t = get_default_icaltimezone();
+               }
+               icaltimezone_convert_time(&TheTime, t, icaltimezone_get_utc_timezone());
+               TheTime.zone = icaltimezone_get_utc_timezone();
+       }
+
+       icalproperty_remove_parameter_by_kind(prop, ICAL_TZID_PARAMETER);
+#ifdef DBG_ICAL
+       syslog(LOG_DEBUG, "                * Now: %s\n", icaltime_as_ical_string(TheTime));
+#endif
+
+       /* Now add the converted property back in. */
+       if (icalproperty_isa(prop) == ICAL_DTSTART_PROPERTY) {
+               icalproperty_set_dtstart(prop, TheTime);
+       }
+       else if (icalproperty_isa(prop) == ICAL_DTEND_PROPERTY) {
+               icalproperty_set_dtend(prop, TheTime);
+       }
+       else if (icalproperty_isa(prop) == ICAL_DUE_PROPERTY) {
+               icalproperty_set_due(prop, TheTime);
+       }
+       else if (icalproperty_isa(prop) == ICAL_EXDATE_PROPERTY) {
+               icalproperty_set_exdate(prop, TheTime);
+       }
+}
+
+
+/*
+ * Recursive portion of ical_dezonify()
+ */
+void ical_dezonify_recurse(icalcomponent *cal, icalcomponent *rcal) {
+       icalcomponent *c;
+       icalproperty *p;
+
+       /*
+        * Recurse through all subcomponents *except* VTIMEZONE ones.
+        */
+       for (c=icalcomponent_get_first_component(
+                                       rcal, ICAL_ANY_COMPONENT);
+               c != NULL;
+               c = icalcomponent_get_next_component(
+                                       rcal, ICAL_ANY_COMPONENT)
+       ) {
+               if (icalcomponent_isa(c) != ICAL_VTIMEZONE_COMPONENT) {
+                       ical_dezonify_recurse(cal, c);
+               }
+       }
+
+       /*
+        * Now look for DTSTART and DTEND properties
+        */
+       for (p=icalcomponent_get_first_property(rcal, ICAL_ANY_PROPERTY);
+               p != NULL;
+               p = icalcomponent_get_next_property(rcal, ICAL_ANY_PROPERTY)
+       ) {
+               if (
+                       (icalproperty_isa(p) == ICAL_DTSTART_PROPERTY)
+                       || (icalproperty_isa(p) == ICAL_DTEND_PROPERTY)
+                       || (icalproperty_isa(p) == ICAL_DUE_PROPERTY)
+                       || (icalproperty_isa(p) == ICAL_EXDATE_PROPERTY)
+                  ) {
+                       ical_dezonify_backend(cal, rcal, p);
+               }
+       }
+}
+
+
+/*
+ * Convert all DTSTART and DTEND properties in all subcomponents to UTC.
+ * This function will search any VTIMEZONE subcomponents to learn the
+ * relevant timezone information.
+ */
+void ical_dezonify(icalcomponent *cal) {
+       icalcomponent *vt = NULL;
+
+#ifdef DBG_ICAL
+       syslog(LOG_DEBUG, "ical_dezonify() started\n");
+#endif
+
+       /* Convert all times to UTC */
+       ical_dezonify_recurse(cal, cal);
+
+       /* Strip out VTIMEZONE subcomponents -- we don't need them anymore */
+       while (vt = icalcomponent_get_first_component(
+                       cal, ICAL_VTIMEZONE_COMPONENT), vt != NULL) {
+               icalcomponent_remove_component(cal, vt);
+               icalcomponent_free(vt);
+       }
+
+#ifdef DBG_ICAL
+       syslog(LOG_DEBUG, "ical_dezonify() completed\n");
+#endif
+}
+
diff --git a/webcit/ical_subst.c b/webcit/ical_subst.c
new file mode 100644 (file)
index 0000000..adb9238
--- /dev/null
@@ -0,0 +1,539 @@
+/*
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+
+extern IcalKindEnumMap icalproperty_kind_map[];
+extern IcalMethodEnumMap icalproperty_method_map[];
+
+HashList *IcalComponentMap = NULL;
+CtxType CTX_ICAL = CTX_NONE;
+CtxType CTX_ICALPROPERTY = CTX_NONE;
+CtxType CTX_ICALMETHOD = CTX_NONE;
+CtxType CTX_ICALTIME = CTX_NONE;
+CtxType CTX_ICALATTENDEE = CTX_NONE;
+CtxType CTX_ICALCONFLICT = CTX_NONE;
+
+void tmplput_ICalItem(StrBuf *Target, WCTemplputParams *TP)
+{
+       icalcomponent *cal = (icalcomponent *) CTX(CTX_ICAL);
+       icalproperty *p;
+       icalproperty_kind Kind;
+       const char *str;
+
+       Kind = (icalproperty_kind) GetTemplateTokenNumber(Target, TP, 0, ICAL_ANY_PROPERTY);
+       p = icalcomponent_get_first_property(cal, Kind);
+       if (p != NULL) {
+               str = icalproperty_get_comment (p);
+               StrBufAppendTemplateStr(Target, TP, str, 1);
+       }
+}
+
+void tmplput_CtxICalProperty(StrBuf *Target, WCTemplputParams *TP)
+{
+       icalproperty *p = (icalproperty *) CTX(CTX_ICALPROPERTY);
+       const char *str;
+
+       str = icalproperty_get_comment (p);
+       StrBufAppendTemplateStr(Target, TP, str, 0);
+}
+
+int ReleaseIcalSubCtx(StrBuf *Target, WCTemplputParams *TP)
+{
+       WCTemplputParams *TPP = TP;
+       UnStackContext(TP);
+       free(TPP);
+       return 0;
+}
+int cond_ICalIsA(StrBuf *Target, WCTemplputParams *TP)
+{
+       icalcomponent *cal = (icalcomponent *) CTX(CTX_ICAL);
+       icalcomponent_kind c = GetTemplateTokenNumber(Target, TP, 2, ICAL_NO_COMPONENT);
+       return icalcomponent_isa(cal) == c;
+}
+
+int cond_ICalHaveItem(StrBuf *Target, WCTemplputParams *TP)
+{
+       icalcomponent *cal = (icalcomponent *) CTX(CTX_ICAL);
+       icalproperty *p;
+       icalproperty_kind Kind;
+
+       Kind = (icalproperty_kind) GetTemplateTokenNumber(Target, TP, 2, ICAL_ANY_PROPERTY);
+       p = icalcomponent_get_first_property(cal, Kind);
+       if (p != NULL) {
+               WCTemplputParams *DynamicTP;
+       
+               DynamicTP = (WCTemplputParams*) malloc(sizeof(WCTemplputParams));
+               StackDynamicContext (TP, 
+                                    DynamicTP, 
+                                    p,
+                                    CTX_ICALPROPERTY,
+                                    0,
+                                    TP->Tokens,
+                                    ReleaseIcalSubCtx,
+                                    TP->Tokens->Params[1]->lvalue);
+
+               return 1;
+       }
+       return 0;
+}
+
+int ReleaseIcalTimeCtx(StrBuf *Target, WCTemplputParams *TP)
+{
+       WCTemplputParams *TPP = TP;
+
+       UnStackContext(TP);
+       free(TPP);
+       return 0;
+}
+
+int cond_ICalHaveTimeItem(StrBuf *Target, WCTemplputParams *TP)
+{
+       icalcomponent *cal = (icalcomponent *) CTX(CTX_ICAL);
+       icalproperty *p;
+       icalproperty_kind Kind;
+
+       Kind = (icalproperty_kind) GetTemplateTokenNumber(Target, TP, 2, ICAL_ANY_PROPERTY);
+       p = icalcomponent_get_first_property(cal, Kind);
+       if (p != NULL) {
+               struct icaltimetype *t;
+               struct icaltimetype tt;
+               WCTemplputParams *DynamicTP;
+
+               DynamicTP = (WCTemplputParams*) malloc(sizeof(WCTemplputParams) + 
+                                                      sizeof(struct icaltimetype));
+               t = (struct icaltimetype *) &DynamicTP[1];
+               memset(&tt, 0, sizeof(struct icaltimetype));
+               switch (Kind)
+               {
+               case ICAL_DTSTART_PROPERTY:
+                       tt = icalproperty_get_dtstart(p);
+                       break;
+               case ICAL_DTEND_PROPERTY:
+                       tt = icalproperty_get_dtend(p);
+                       break;
+               default:
+                       break;
+               }
+               memcpy(t, &tt, sizeof(struct icaltimetype));
+
+               StackDynamicContext (TP, 
+                                    DynamicTP, 
+                                    t,
+                                    CTX_ICALTIME,
+                                    0,
+                                    TP->Tokens,
+                                    ReleaseIcalTimeCtx,
+                                    TP->Tokens->Params[1]->lvalue);
+
+               return 1;
+       }
+       return 0;
+}
+
+
+int cond_ICalTimeIsDate(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct icaltimetype *t = (struct icaltimetype *) CTX(CTX_ICALTIME);
+       return t->is_date;
+}
+
+void tmplput_ICalTime_Date(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct tm d_tm;
+       long len;
+       char buf[256];
+       struct icaltimetype *t = (struct icaltimetype *) CTX(CTX_ICALTIME);
+
+       memset(&d_tm, 0, sizeof d_tm);
+       d_tm.tm_year = t->year - 1900;
+       d_tm.tm_mon = t->month - 1;
+       d_tm.tm_mday = t->day;
+       len = wc_strftime(buf, sizeof(buf), "%x", &d_tm);
+       StrBufAppendBufPlain(Target, buf, len, 0);
+}
+void tmplput_ICalTime_Time(StrBuf *Target, WCTemplputParams *TP)
+{
+       long len;
+       char buf[256];
+       struct icaltimetype *t = (struct icaltimetype *) CTX(CTX_ICALTIME);
+        time_t tt;
+
+       tt = icaltime_as_timet(*t);
+       len = webcit_fmt_date(buf, sizeof(buf), tt, DATEFMT_FULL);
+       StrBufAppendBufPlain(Target, buf, len, 0);
+}
+
+void tmplput_ICalDate(StrBuf *Target, WCTemplputParams *TP)
+{
+       icalcomponent *cal = (icalcomponent *) CTX(CTX_ICAL);
+       icalproperty *p;
+       icalproperty_kind Kind;
+       struct icaltimetype t;
+       time_t tt;
+       char buf[256];
+
+       Kind = (icalproperty_kind) GetTemplateTokenNumber(Target, TP, 0, ICAL_ANY_PROPERTY);
+       p = icalcomponent_get_first_property(cal, Kind);
+       if (p != NULL) {
+               long len;
+               t = icalproperty_get_dtend(p);
+               tt = icaltime_as_timet(t);
+               len = webcit_fmt_date(buf, 256, tt, DATEFMT_FULL);
+               StrBufAppendBufPlain(Target, buf, len, 0);
+       }
+}
+
+void tmplput_CtxICalPropertyDate(StrBuf *Target, WCTemplputParams *TP)
+{
+       icalproperty *p = (icalproperty *) CTX(CTX_ICALPROPERTY);
+       struct icaltimetype t;
+       time_t tt;
+       char buf[256];
+
+       long len;
+       t = icalproperty_get_dtend(p);
+       tt = icaltime_as_timet(t);
+       len = webcit_fmt_date(buf, sizeof(buf), tt, DATEFMT_FULL);
+       StrBufAppendBufPlain(Target, buf, len, 0);
+}
+
+
+
+void render_MIME_ICS_TPL(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       wc_mime_attachment *Mime = CTX(CTX_MIME_ATACH);
+       icalproperty_method the_method = ICAL_METHOD_NONE;
+       icalproperty *method = NULL;
+       icalcomponent *cal = NULL;
+       icalcomponent *c = NULL;
+        WCTemplputParams SubTP;
+        WCTemplputParams SuperTP;
+
+       static int divcount = 0;
+
+       if (StrLength(Mime->Data) == 0) {
+               MimeLoadData(Mime);
+       }
+       if (StrLength(Mime->Data) > 0) {
+               cal = icalcomponent_new_from_string(ChrPtr(Mime->Data));
+       }
+       if (cal == NULL) {
+               StrBufAppendPrintf(Mime->Data, _("There was an error parsing this calendar item."));
+               StrBufAppendPrintf(Mime->Data, "<br>\n");
+               return;
+       }
+
+       putlbstr("divname",  ++divcount);
+
+
+       putbstr("cal_partnum", NewStrBufDup(Mime->PartNum));
+       putlbstr("msgnum", Mime->msgnum);
+
+        memset(&SubTP, 0, sizeof(WCTemplputParams));
+        memset(&SuperTP, 0, sizeof(WCTemplputParams));
+
+       /*//ical_dezonify(cal); */
+
+       /* If the component has subcomponents, recurse through them. */
+       c = icalcomponent_get_first_component(cal, ICAL_ANY_COMPONENT);
+        c = (c != NULL) ? c : cal;
+
+       method = icalcomponent_get_first_property(cal, ICAL_METHOD_PROPERTY);
+       if (method != NULL) {
+               the_method = icalproperty_get_method(method);
+       }
+
+       StackContext (TP,
+                     &SuperTP,
+                     &the_method,
+                     CTX_ICALMETHOD,
+                     0,
+                     TP->Tokens);
+
+       StackContext (&SuperTP, 
+                     &SubTP, 
+                     c,
+                     CTX_ICAL,
+                     0,
+                     SuperTP.Tokens);
+       FlushStrBuf(Mime->Data);
+///    DoTemplate(HKEY("ical_attachment_display"), Mime->Data, &SubTP);
+       DoTemplate(HKEY("ical_edit"), Mime->Data, &SubTP);
+
+       /*/ cal_process_object(Mime->Data, cal, 0, Mime->msgnum, ChrPtr(Mime->PartNum)); */
+
+       /* Free the memory we obtained from libical's constructor */
+       StrBufPlain(Mime->ContentType, HKEY("text/html"));
+       StrBufAppendPrintf(WC->trailing_javascript,
+               "eventEditAllDay();             \n"
+               "RecurrenceShowHide();          \n"
+               "EnableOrDisableCheckButton();  \n"
+       );
+
+       UnStackContext(&SuperTP);
+       UnStackContext(&SubTP);
+       icalcomponent_free(cal);
+}
+void CreateIcalComponendKindLookup(void)
+{
+       int i = 0;
+
+       IcalComponentMap = NewHash (1, NULL);
+       while (icalproperty_kind_map[i].NameLen != 0) {
+               RegisterNS(icalproperty_kind_map[i].Name, 
+                          icalproperty_kind_map[i].NameLen, 
+                          0, 
+                          10, 
+                          tmplput_ICalItem,
+                          NULL, 
+                          CTX_ICAL);
+               Put(IcalComponentMap, 
+                   icalproperty_kind_map[i].Name, 
+                   icalproperty_kind_map[i].NameLen, 
+                   &icalproperty_kind_map[i],
+                   reference_free_handler);
+                          
+                          
+               i++;
+       }
+}
+
+
+
+
+int cond_ICalIsMethod(StrBuf *Target, WCTemplputParams *TP)
+{
+       icalproperty_method *the_method = (icalproperty_method *) CTX(CTX_ICALMETHOD);
+       icalproperty_method which_method;
+
+       which_method = GetTemplateTokenNumber(Target, TP, 2, ICAL_METHOD_X);
+       return *the_method == which_method;
+}
+
+
+typedef struct CalendarConflict
+{
+       long is_update;
+       long existing_msgnum;
+       StrBuf *conflict_event_uid;
+       StrBuf *conflict_event_summary;
+}CalendarConflict;
+void DeleteConflict(void *vConflict)
+{
+       CalendarConflict *c = (CalendarConflict *) vConflict;
+
+       FreeStrBuf(&c->conflict_event_uid);
+       FreeStrBuf(&c->conflict_event_summary);
+       free(c);
+}
+HashList *iterate_FindConflict(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Line;
+       HashList *Conflicts = NULL;
+       CalendarConflict *Conflict;
+       wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+
+       serv_printf("ICAL conflicts|%ld|%s|", Mime->msgnum, ChrPtr(Mime->PartNum));
+
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, NULL) == 1)
+       {
+               const char *Pos = NULL;
+               int Done = 0;
+               int n = 0;
+               Conflicts = NewHash(1, Flathash);
+               while(!Done && (StrBuf_ServGetln(Line) >= 0) )
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else {
+                               Conflict = (CalendarConflict *) malloc(sizeof(CalendarConflict));
+                               Conflict->conflict_event_uid = NewStrBufPlain(NULL, StrLength(Line));
+                               Conflict->conflict_event_summary = NewStrBufPlain(NULL, StrLength(Line));
+
+                               Conflict->existing_msgnum = StrBufExtractNext_long(Line, &Pos, '|');
+                               StrBufSkip_NTokenS(Line, &Pos, '|', 1);
+                               StrBufExtract_NextToken(Conflict->conflict_event_uid, Line, &Pos, '|');
+                               StrBufExtract_NextToken(Conflict->conflict_event_summary, Line, &Pos, '|');
+                               Conflict->is_update = StrBufExtractNext_long(Line, &Pos, '|');
+
+                               Put(Conflicts, IKEY(n), Conflict, DeleteConflict);
+                               n++;
+                               Pos = NULL;
+                       }
+       }
+       FreeStrBuf(&Line);
+       syslog(LOG_DEBUG, "...done.\n");
+       return Conflicts;
+}
+
+
+
+void tmplput_ConflictEventMsgID(StrBuf *Target, WCTemplputParams *TP)
+{
+       CalendarConflict *C = (CalendarConflict *) CTX(CTX_ICALCONFLICT);
+       char buf[sizeof(long) * 16];
+
+       snprintf(buf, sizeof(buf), "%ld", C->existing_msgnum);
+       StrBufAppendTemplateStr(Target, TP, buf, 0);
+}
+void tmplput_ConflictEUID(StrBuf *Target, WCTemplputParams *TP)
+{
+       CalendarConflict *C = (CalendarConflict *) CTX(CTX_ICALCONFLICT);
+       
+       StrBufAppendTemplate(Target, TP, C->conflict_event_uid, 0);
+}
+void tmplput_ConflictSummary(StrBuf *Target, WCTemplputParams *TP)
+{
+       CalendarConflict *C = (CalendarConflict *) CTX(CTX_ICALCONFLICT);
+
+       StrBufAppendTemplate(Target, TP, C->conflict_event_summary, 0);
+}
+int cond_ConflictIsUpdate(StrBuf *Target, WCTemplputParams *TP)
+{
+       CalendarConflict *C = (CalendarConflict *) CTX(CTX_ICALCONFLICT);
+       return C->is_update;
+}
+
+typedef struct CalAttendee
+{
+       StrBuf *AttendeeStr;
+       icalparameter_partstat partstat;
+} CalAttendee;
+
+void DeleteAtt(void *vAtt)
+{
+       CalAttendee *att = (CalAttendee*) vAtt;
+       FreeStrBuf(&att->AttendeeStr);
+       free(vAtt);
+}
+
+HashList *iterate_get_ical_attendees(StrBuf *Target, WCTemplputParams *TP)
+{
+       icalcomponent *cal = (icalcomponent *) CTX(CTX_ICAL);
+       icalparameter *partstat_param;
+       icalproperty *p;
+       CalAttendee *Att;
+       HashList *Attendees = NULL;
+       const char *ch;
+       int n = 0;
+
+       /* If the component has attendees, iterate through them. */
+       for (p = icalcomponent_get_first_property(cal, ICAL_ATTENDEE_PROPERTY); 
+            (p != NULL); 
+            p = icalcomponent_get_next_property(cal, ICAL_ATTENDEE_PROPERTY)) {
+               ch = icalproperty_get_attendee(p);
+               if ((ch != NULL) && !strncasecmp(ch, "MAILTO:", 7)) {
+                       Att = (CalAttendee*) malloc(sizeof(CalAttendee));
+
+                       /** screen name or email address */
+                       Att->AttendeeStr = NewStrBufPlain(ch + 7, -1);
+                       StrBufTrim(Att->AttendeeStr);
+
+                       /** participant status */
+                       partstat_param = icalproperty_get_first_parameter(
+                               p,
+                               ICAL_PARTSTAT_PARAMETER
+                               );
+                       if (partstat_param == NULL) {
+                               Att->partstat = ICAL_PARTSTAT_X;
+                       }
+                       else {
+                               Att->partstat = icalparameter_get_partstat(partstat_param);
+                       }
+                       if (Attendees == NULL)
+                               Attendees = NewHash(1, Flathash);
+                       Put(Attendees, IKEY(n), Att, DeleteAtt);
+                       n++;
+               }
+       }
+       return Attendees;
+}
+
+void tmplput_ICalAttendee(StrBuf *Target, WCTemplputParams *TP)
+{
+       CalAttendee *Att = (CalAttendee*) CTX(CTX_ICALATTENDEE);
+       StrBufAppendTemplate(Target, TP, Att->AttendeeStr, 0);
+}
+int cond_ICalAttendeeState(StrBuf *Target, WCTemplputParams *TP)
+{
+       CalAttendee *Att = (CalAttendee*) CTX(CTX_ICALATTENDEE);
+       icalparameter_partstat which_partstat;
+
+       which_partstat = GetTemplateTokenNumber(Target, TP, 2, ICAL_PARTSTAT_X);
+       return Att->partstat == which_partstat;
+}
+       /* If the component has subcomponents, recurse through them. * /
+       for (c = icalcomponent_get_first_component(cal, ICAL_ANY_COMPONENT);
+            (c != 0);
+            c = icalcomponent_get_next_component(cal, ICAL_ANY_COMPONENT)) {
+               // Recursively process subcomponent
+               cal_process_object(Target, c, recursion_level+1, msgnum, cal_partnum);
+       }
+       */
+
+
+void 
+InitModule_ICAL_SUBST
+(void)
+{
+       RegisterCTX(CTX_ICAL);
+/*
+       RegisterMimeRenderer(HKEY("text/calendar"), render_MIME_ICS_TPL, 1, 501);
+       RegisterMimeRenderer(HKEY("application/ics"), render_MIME_ICS_TPL, 1, 500);
+*/
+
+       CreateIcalComponendKindLookup ();
+       RegisterConditional("COND:ICAL:PROPERTY", 1, cond_ICalHaveItem, CTX_ICAL);
+       RegisterConditional("COND:ICAL:IS:A", 1, cond_ICalIsA, CTX_ICAL);
+
+
+        RegisterIterator("ICAL:CONFLICT", 0, NULL, iterate_FindConflict, 
+                         NULL, DeleteHash, CTX_MIME_ATACH, CTX_ICALCONFLICT, IT_NOFLAG);
+       RegisterNamespace("ICAL:CONFLICT:MSGID", 0, 1, tmplput_ConflictEventMsgID, NULL, CTX_ICALCONFLICT);
+       RegisterNamespace("ICAL:CONFLICT:EUID", 0, 1, tmplput_ConflictEUID, NULL, CTX_ICALCONFLICT);
+       RegisterNamespace("ICAL:CONFLICT:SUMMARY", 0, 1, tmplput_ConflictSummary, NULL, CTX_ICALCONFLICT);
+       RegisterConditional("ICAL:CONFLICT:IS:UPDATE", 0, cond_ConflictIsUpdate, CTX_ICALCONFLICT);
+
+
+       RegisterCTX(CTX_ICALATTENDEE);
+        RegisterIterator("ICAL:ATTENDEES", 0, NULL, iterate_get_ical_attendees, 
+                         NULL, DeleteHash, CTX_ICALATTENDEE, CTX_ICAL, IT_NOFLAG);
+       RegisterNamespace("ICAL:ATTENDEE", 1, 2, tmplput_ICalAttendee, NULL, CTX_ICALATTENDEE);
+       RegisterConditional("COND:ICAL:ATTENDEE", 1, cond_ICalAttendeeState, CTX_ICALATTENDEE);
+
+       RegisterCTX(CTX_ICALPROPERTY);
+       RegisterNamespace("ICAL:ITEM", 1, 2, tmplput_ICalItem, NULL, CTX_ICAL);
+       RegisterNamespace("ICAL:PROPERTY:STR", 0, 1, tmplput_CtxICalProperty, NULL, CTX_ICALPROPERTY);
+       RegisterNamespace("ICAL:PROPERTY:DATE", 0, 1, tmplput_CtxICalPropertyDate, NULL, CTX_ICALPROPERTY);
+
+       RegisterCTX(CTX_ICALMETHOD);
+       RegisterConditional("COND:ICAL:METHOD", 1, cond_ICalIsMethod, CTX_ICALMETHOD);
+
+
+       RegisterCTX(CTX_ICALTIME);
+       RegisterConditional("COND:ICAL:DT:PROPERTY", 1, cond_ICalHaveTimeItem, CTX_ICAL);
+       RegisterConditional("COND:ICAL:DT:ISDATE", 0, cond_ICalTimeIsDate, CTX_ICALTIME);
+       RegisterNamespace("ICAL:DT:DATE", 0, 1, tmplput_ICalTime_Date, NULL, CTX_ICALTIME);
+       RegisterNamespace("ICAL:DT:DATETIME", 0, 1, tmplput_ICalTime_Time, NULL, CTX_ICALTIME);
+}
+
+void 
+ServerShutdownModule_ICAL
+(void)
+{
+       DeleteHash(&IcalComponentMap);
+}
diff --git a/webcit/iconbar.c b/webcit/iconbar.c
new file mode 100644 (file)
index 0000000..e1ea9b0
--- /dev/null
@@ -0,0 +1,343 @@
+/*
+ * Displays and customizes the iconbar.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+
+/* Values for ib_displayas ... don't change these or you will break the templates */
+#define IB_PICTEXT     0       /* picture and text */
+#define IB_PICONLY     1       /* just a picture */
+#define IB_TEXTONLY    2       /* just text */
+
+void DontDeleteThis(void *Data){}
+
+#define IconbarIsEnabled(a, b) IconbarIsENABLED(a, sizeof(a) - 1, b)
+
+
+HashList *IB_Seeting_Order = NULL;
+typedef struct _dflt_IB_Setting {
+       int         DefVal;  /* default value for non-set users */
+       long        n;       /* counter for internal purposes   */
+       const char *Key;     /* Stringvalue */
+       long        len;     /* Length... */
+}dflt_IB_Setting;
+
+long nIBV = 0;
+dflt_IB_Setting IconbarDefaults[] = {
+       {0,  0, HKEY("unused")},
+       {0,  1, HKEY("ib_displayas")},
+       {0,  2, HKEY("ib_logo")},
+       {1,  3, HKEY("ib_summary")},
+       {1,  4, HKEY("ib_inbox")},
+       {1,  5, HKEY("ib_calendar")},
+       {1,  6, HKEY("ib_contacts")},
+       {1,  7, HKEY("ib_notes")},
+       {1,  8, HKEY("ib_tasks")},
+       {1,  9, HKEY("ib_rooms")},
+       {1, 10, HKEY("ib_users")},
+       {1, 11, HKEY("ib_chat")},
+       {1, 12, HKEY("ib_advanced")},
+       {1, 13, HKEY("ib_logoff")},
+       {1, 14, HKEY("ib_citadel")},
+       {0, 15, HKEY("")}
+};
+
+HashList *IBDfl = NULL;
+
+
+long IconbarIsENABLED(long val, const char *key, size_t keylen)
+{
+       void *vIBDfl = NULL;
+       wcsession *WCC = WC;
+
+       if ((WCC != NULL) && 
+           (WCC->IBSettingsVec != NULL) && 
+           (val < nIBV))
+       {
+               return WCC->IBSettingsVec[val];
+       }
+       if (GetHash(IBDfl, key, keylen, &vIBDfl)) {
+               dflt_IB_Setting *Set = (dflt_IB_Setting*)vIBDfl;
+               return Set->DefVal;
+       }
+       else 
+               return 1;
+}
+
+#ifdef DBG_ICONBAR_HASH
+static char nbuf[32];
+inline const char *PrintInt(void *Prefstr)
+{
+       snprintf(nbuf, sizeof(nbuf), "%ld", (long)Prefstr);
+       return nbuf;
+}
+#endif
+
+/* 
+       hprintf("Cache-Control: private\r\n");
+*/
+
+
+int ConditionalIsActiveStylesheet(StrBuf *Target, WCTemplputParams *TP) {
+       long testFor;
+       long lookAt;
+       long ib_displayas;
+
+       lookAt = GetTemplateTokenNumber(Target, TP, 3, IB_PICTEXT);
+       testFor = GetTemplateTokenNumber(Target, TP, 2, IB_PICTEXT);
+
+
+
+       ib_displayas = IconbarIsENABLED(lookAt, TKEY(3));
+/*
+       printf ("%ld == %ld ? %s : %s\n", 
+               testFor, 
+               ib_displayas, 
+               IconbarDefaults[lookAt ].Key, 
+               ChrPtr(TP->Tokens->FlatToken));
+*/
+
+       return (testFor == ib_displayas);
+}
+
+void LoadIconSettings(StrBuf *iconbar, long lvalue)
+{
+       void *vIBDfl;
+       dflt_IB_Setting *Set;
+       const char *pCh = NULL;
+
+       wcsession *WCC = WC;
+       StrBuf *buf;
+       StrBuf *key;
+       long val;
+
+       buf = NewStrBuf();
+       key = NewStrBuf();
+       if (WCC->IBSettingsVec == NULL)
+       {
+               WCC->IBSettingsVec = (long*) malloc (nIBV * sizeof(long));
+       }
+       /*
+        * The initialized values of these variables also happen to
+        * specify the default values for users who haven't customized
+        * their iconbars.  These should probably be set in a master
+        * configuration somewhere.
+        */
+
+       while (StrBufExtract_NextToken(buf, iconbar, &pCh,  ',') >= 0)
+       {
+               StrBufExtract_token(key, buf, 0, '=');
+               val = StrBufExtract_long(buf, 1, '=');
+
+               if (!GetHash(IBDfl, SKEY(key), &vIBDfl)) 
+                       continue;
+               Set = (dflt_IB_Setting*)vIBDfl;
+
+               WCC->IBSettingsVec[Set->n] = val;
+/*             printf("%ld %s %s -> %ld \n", Set->n, Set->Key, IconbarDefaults[Set->n].Key, val);*/
+       }
+#ifdef DBG_ICONBAR_HASH
+       dbg_PrintHash(WCC->IconBarSetttings, PrintInt, NULL);
+#endif
+
+       FreeStrBuf(&key);
+       FreeStrBuf(&buf);
+}
+
+
+/*
+ * save changes to iconbar settings
+ */
+void commit_iconbar(void) {
+       const StrBuf *MimeType;
+       StrBuf *iconbar;
+       StrBuf *buf;
+       int i;
+
+
+       if (!havebstr("ok_button")) {
+               display_main_menu();
+               return;
+       }
+
+       iconbar = NewStrBuf();
+       buf = NewStrBuf();
+       StrBufPrintf(iconbar, "ib_displayas=%d", ibstr("ib_displayas"));
+       for (i=0; i<(sizeof(IconbarDefaults)/sizeof(dflt_IB_Setting )); ++i) {
+               char *Val;
+               if (!strcasecmp(Bstr(IconbarDefaults[i].Key,
+                                    IconbarDefaults[i].len),
+                               "yes")) 
+               {
+                       Val = "1";
+               }
+               else if (!strcasecmp(Bstr(IconbarDefaults[i].Key,
+                                         IconbarDefaults[i].len),
+                                    "yeslist")) 
+               {
+                       Val = "2";
+               }
+               else {
+                       Val = "0";
+               }
+               StrBufPrintf(buf, ",%s=%s", IconbarDefaults[i].Key, Val);
+               StrBufAppendBuf(iconbar, buf, 0);
+
+       }
+       FreeStrBuf(&buf);
+       set_preference("iconbar", iconbar, 1);
+
+
+       begin_burst();
+       MimeType = DoTemplate(HKEY("iconbar_save"), NULL, &NoCtx);
+       http_transmit_thing(ChrPtr(MimeType), 0);
+#ifdef DBG_ICONBAR_HASH
+       dbg_PrintHash(WC->IconBarSetttings, PrintInt, NULL);
+#endif
+}
+
+
+/*
+ * Display the icon bar as long as we have an active session,
+ * and either the user is logged in or the server allows guest mode.
+ */
+void tmplput_iconbar(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       
+        if ( (WCC != NULL)     &&
+             ((WCC->logged_in) ||
+             ((WCC->serv_info != NULL) &&
+              (WCC->serv_info->serv_supports_guest))
+                     ) )
+        {
+               DoTemplate(HKEY("iconbar"), NULL, &NoCtx);
+       }
+}
+
+
+void 
+ServerShutdownModule_ICONBAR
+(void)
+{
+       DeleteHash(&IBDfl);
+}
+
+
+
+void
+ServerStartModule_ICONBAR
+(void)
+{
+       int i = 1;
+       IBDfl = NewHash(1, NULL);
+
+       while (IconbarDefaults[i].len != 0)
+       {
+               Put(IBDfl, 
+                   IconbarDefaults[i].Key, 
+                   IconbarDefaults[i].len, 
+                   &IconbarDefaults[i], 
+                   reference_free_handler);
+               i++;
+       }
+}
+
+
+int ConditionalWholistExpanded(StrBuf *Target, WCTemplputParams *TP)
+{
+       int r = 0;
+       if (WC) r = WC->ib_wholist_expanded;
+       syslog(LOG_DEBUG, "ConditionalWholistExpanded() returns %d", r);
+       return(r);
+}
+
+
+int ConditionalRoomlistExpanded(StrBuf *Target, WCTemplputParams *TP)
+{
+       if (WC) return(WC->ib_roomlist_expanded);
+       return(0);
+}
+
+
+
+/*
+ * Toggle the roomlist expanded state in session memory
+ */
+void toggle_roomlist_expanded_state(void) {
+       wcsession *WCC = WC;
+
+       if (!WCC) {
+               wc_printf("no session");
+               return;
+       }
+
+       WCC->ib_roomlist_expanded = IBSTR("wstate");
+       wc_printf("%d", WCC->ib_roomlist_expanded);
+       syslog(LOG_DEBUG, "ib_roomlist_expanded set to %d", WCC->ib_roomlist_expanded);
+}
+
+
+/*
+ * Toggle the wholist expanded state in session memory
+ */
+void toggle_wholist_expanded_state(void) {
+       wcsession *WCC = WC;
+
+       if (!WCC) {
+               wc_printf("no session");
+               return;
+       }
+
+       WCC->ib_wholist_expanded = IBSTR("wstate");
+       wc_printf("%d", WCC->ib_wholist_expanded);
+       syslog(LOG_DEBUG, "ib_wholist_expanded set to %d", WCC->ib_wholist_expanded);
+}
+
+
+void 
+InitModule_ICONBAR
+(void)
+{
+       long l;
+
+       /*WebcitAddUrlHandler(HKEY("user_iconbar"), "", 0, doUserIconStylesheet, 0); */
+       WebcitAddUrlHandler(HKEY("commit_iconbar"), "", 0, commit_iconbar, 0);
+       WebcitAddUrlHandler(HKEY("toggle_wholist_expanded_state"), "", 0, toggle_wholist_expanded_state, AJAX);
+       WebcitAddUrlHandler(HKEY("toggle_roomlist_expanded_state"), "", 0, toggle_roomlist_expanded_state, AJAX);
+       RegisterConditional("COND:ICONBAR:ACTIVE", 3, ConditionalIsActiveStylesheet, CTX_NONE);
+       RegisterNamespace("ICONBAR", 0, 0, tmplput_iconbar, NULL, CTX_NONE);
+       RegisterConditional("COND:ICONBAR:WHOLISTEXPANDED", 0, ConditionalWholistExpanded, CTX_NONE);
+       RegisterConditional("COND:ICONBAR:ROOMLISTEXPANDED", 0, ConditionalRoomlistExpanded, CTX_NONE);
+
+       RegisterPreference("iconbar", _("Iconbar Setting"), PRF_STRING, LoadIconSettings);
+       l = 1;
+       while (IconbarDefaults[l].len != 0)
+       {
+               RegisterTokenParamDefine(IconbarDefaults[l].Key, 
+                                        IconbarDefaults[l].len, l);
+               l ++;
+       }
+       nIBV = l;
+}
+
+
+
+void 
+SessionDestroyModule_ICONBAR
+(wcsession *sess)
+{
+       if (sess->IBSettingsVec != NULL)
+               free(sess->IBSettingsVec);
+}
+
diff --git a/webcit/icontheme.c b/webcit/icontheme.c
new file mode 100644 (file)
index 0000000..28643ae
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * Displays and customizes the iconbar.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <errno.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stddef.h>
+
+#include "webcit.h"
+#include "webserver.h"
+
+HashList *AvailableThemes = NULL;
+
+const StrBuf *DefaultTheme = NULL;
+void LoadIconthemeSettings(StrBuf *icontheme, long lvalue)
+{
+       wcsession *WCC = WC;
+       void *vTheme;
+       const StrBuf *theme;
+
+       if (GetHash(AvailableThemes, SKEY(icontheme), &vTheme))
+               theme = (StrBuf*)vTheme;
+       else
+               theme = DefaultTheme;
+
+       if (WCC->IconTheme != NULL) 
+               StrBufPlain(WCC->IconTheme, SKEY(theme));
+       else
+               WCC->IconTheme = NewStrBufDup(theme);
+}
+
+
+void tmplput_icontheme(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       if ( (WCC != NULL)     &&
+            (WCC->IconTheme != NULL))
+       {
+                StrBufAppendTemplate(Target, TP, WCC->IconTheme, 0);
+       }
+       else
+       {
+                StrBufAppendTemplate(Target, TP, DefaultTheme, 0);
+       }
+}
+
+
+int LoadThemeDir(const char *DirName)
+{
+       StrBuf *Dir = NULL;
+       DIR *filedir = NULL;
+       struct dirent *d;
+       struct dirent *filedir_entry;
+       int d_type = 0;
+        int d_namelen;
+               
+       filedir = opendir (DirName);
+       if (filedir == NULL) {
+               return 0;
+       }
+
+       d = (struct dirent *)malloc(offsetof(struct dirent, d_name) + PATH_MAX + 1);
+       if (d == NULL) {
+               return 0;
+       }
+
+       while ((readdir_r(filedir, d, &filedir_entry) == 0) &&
+              (filedir_entry != NULL))
+       {
+#ifdef _DIRENT_HAVE_D_NAMELEN
+               d_namelen = filedir_entry->d_namlen;
+               d_type = filedir_entry->d_type;
+#else
+
+#ifndef DT_UNKNOWN
+#define DT_UNKNOWN     0
+#define DT_DIR         4
+#define DT_REG         8
+#define DT_LNK         10
+
+#define IFTODT(mode)   (((mode) & 0170000) >> 12)
+#define DTTOIF(dirtype)        ((dirtype) << 12)
+#endif
+               d_namelen = strlen(filedir_entry->d_name);
+               d_type = DT_UNKNOWN;
+#endif
+               if ((d_namelen > 1) && filedir_entry->d_name[d_namelen - 1] == '~')
+                       continue; /* Ignore backup files... */
+
+               if ((d_namelen == 1) && 
+                   (filedir_entry->d_name[0] == '.'))
+                       continue;
+
+               if ((d_namelen == 2) && 
+                   (filedir_entry->d_name[0] == '.') &&
+                   (filedir_entry->d_name[1] == '.'))
+                       continue;
+
+               if (d_type == DT_UNKNOWN) {
+                       struct stat s;
+                       char path[PATH_MAX];
+                       snprintf(path, PATH_MAX, "%s/%s", 
+                               DirName, filedir_entry->d_name);
+                       if (stat(path, &s) == 0) {
+                               d_type = IFTODT(s.st_mode);
+                       }
+               }
+
+               switch (d_type)
+               {
+               case DT_LNK: /* TODO: check whether its a file or a directory */
+               case DT_DIR:
+                       /* Skip directories we are not interested in... */
+                       if ((strcmp(filedir_entry->d_name, ".svn") == 0) ||
+                           (strcmp(filedir_entry->d_name, "t") == 0))
+                               break;
+                       
+                       Dir = NewStrBufPlain (filedir_entry->d_name, d_namelen);
+                       if (DefaultTheme == NULL)
+                               DefaultTheme = Dir;
+                       Put(AvailableThemes, SKEY(Dir), Dir, HFreeStrBuf);
+                       break;
+               case DT_REG:
+               default:
+                       break;
+               }
+
+
+       }
+       free(d);
+       closedir(filedir);
+
+       return 1;
+}
+
+HashList *GetValidThemeHash(StrBuf *Target, WCTemplputParams *TP)
+{
+       return AvailableThemes;
+}
+void 
+ServerStartModule_ICONTHEME
+(void)
+{
+       AvailableThemes = NewHash(1, NULL);
+}
+void 
+InitModule_ICONTHEME
+(void)
+{
+       StrBuf *Themes = NewStrBufPlain(static_dirs[0], -1);
+
+       StrBufAppendBufPlain(Themes, HKEY("/"), 0);
+       StrBufAppendBufPlain(Themes, HKEY("webcit_icons"), 0);
+       LoadThemeDir(ChrPtr(Themes));
+       FreeStrBuf(&Themes);
+
+       RegisterPreference("icontheme", _("Icon Theme"), PRF_STRING, LoadIconthemeSettings);
+       RegisterNamespace("ICONTHEME", 0, 0, tmplput_icontheme, NULL, CTX_NONE);
+
+       RegisterIterator("PREF:VALID:THEME", 0, NULL, 
+                        GetValidThemeHash, NULL, NULL, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+}
+
+void 
+ServerShutdownModule_ICONTHEME
+(void)
+{
+       DeleteHash(&AvailableThemes);
+}
+
+void 
+SessionDestroyModule_ICONTHEME
+(wcsession *sess)
+{
+       FreeStrBuf(&sess->IconTheme);
+}
+
diff --git a/webcit/inetconf.c b/webcit/inetconf.c
new file mode 100644 (file)
index 0000000..265f3f6
--- /dev/null
@@ -0,0 +1,255 @@
+/* 
+ * Functions which handle Internet domain configuration etc.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+
+typedef enum _e_cfg {
+       ic_localhost,
+       ic_directory,
+       ic_smarthost,
+       ic_fallback,
+       ic_rbl,
+       ic_spamass,
+       ic_masq,
+       ic_clamav,
+       ic_notify,
+       ic_max
+} ECfg;
+
+
+  /* These are server config keywords; do not localize! */
+ConstStr CfgNames[] = {
+       { HKEY("localhost") },
+       { HKEY("directory") },
+       { HKEY("smarthost") },
+       { HKEY("fallbackhost") },
+       { HKEY("rbl") },
+       { HKEY("spamassassin") },
+       { HKEY("masqdomain") },
+       { HKEY("clamav") },
+       { HKEY("notify") }
+};
+
+       
+
+
+/*
+ * display the inet config dialog 
+ */
+void load_inetconf(void)
+{
+       wcsession *WCC = WC;
+       StrBuf *Buf, *CfgToken, *Value;
+       void *vHash;
+       HashList *Hash;
+       char nnn[64];
+       int i, len, nUsed;
+       
+       WCC->InetCfg = NewHash(1, NULL);
+
+       for (i = 0; i < (sizeof(CfgNames) / sizeof(ConstStr)); i++) {
+               Hash = NewHash(1, NULL);
+               Put(WCC->InetCfg, CKEY(CfgNames[i]), Hash, HDeleteHash);
+       }
+
+       serv_printf("CONF GETSYS|application/x-citadel-internet-config");
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+               
+       if (GetServerStatus(Buf, NULL) == 1) {
+               CfgToken = NewStrBuf();
+               while ((len = StrBuf_ServGetln(Buf), ((len >= 0) && ((len != 3) || strcmp(ChrPtr(Buf), "000")))))
+               {
+                       Value = NewStrBuf();
+                       StrBufExtract_token(CfgToken, Buf, 1, '|');
+
+                       // VILE SLEAZY HACK: change obsolete "directory" domains to "localhost" domains
+                       if (!strcasecmp(ChrPtr(CfgToken), "directory")) {
+                               FreeStrBuf(&CfgToken);
+                               CfgToken = NewStrBufPlain(HKEY("localhost"));
+                       }
+
+                       StrBufExtract_token(Value, Buf, 0, '|');
+                       GetHash(WCC->InetCfg, ChrPtr(CfgToken), StrLength(CfgToken), &vHash);
+                       Hash = (HashList*) vHash;
+                       if (Hash == NULL) {
+                               syslog(LOG_WARNING, "ERROR Loading inet config line: [%s]", ChrPtr(Buf));
+                               FreeStrBuf(&Value);
+                               continue;
+                       }
+                       nUsed = GetCount(Hash);
+                       nUsed = snprintf(nnn, sizeof(nnn), "%d", nUsed+1);
+                       Put(Hash, nnn, nUsed, Value, HFreeStrBuf); 
+               }
+               FreeStrBuf(&CfgToken);
+       }
+       FreeStrBuf(&Buf);
+}
+
+
+/*
+ * save changes to the inet config
+ */
+void new_save_inetconf(void) {
+       wcsession *WCC = WC;
+       HashList *Hash;
+       StrBuf *Str;
+       StrBuf *Buf;
+       const StrBuf *eType, *eNum, *eName;
+       char nnn[64];
+       void *vHash, *vStr;
+       int i, nUsed;
+
+       load_inetconf();
+       eType = sbstr("etype");
+
+       GetHash(WCC->InetCfg, ChrPtr(eType), StrLength(eType), &vHash);
+       Hash = (HashList*) vHash;
+       if (Hash == NULL) {
+               AppendImportantMessage(_("Invalid Parameter"), -1);
+               url_do_template();
+               return;
+       }
+
+       if (strcasecmp(bstr("oper"), "delete") == 0) {
+               eNum = sbstr("ename");
+               if (!GetHash(Hash, ChrPtr(eNum), StrLength(eNum), &vStr) ||
+                   (vStr == NULL)) {
+                       AppendImportantMessage(_("Invalid Parameter"), -1);
+                       url_do_template();
+                       return;
+               }
+
+               Str = (StrBuf*)vStr;
+               AppendImportantMessage(SKEY(Str));
+               AppendImportantMessage(_(" has been deleted."), -1);
+               FlushStrBuf(Str);       
+       }
+       else if (!strcasecmp(bstr("oper"), "add")) {
+               StrBuf *name;
+               eName = sbstr("ename");
+               if (eName == NULL) {
+                       AppendImportantMessage(_("Invalid Parameter"), -1);
+                       url_do_template();
+                       return;
+               }
+
+               nUsed = GetCount(Hash);
+               nUsed = snprintf(nnn, sizeof(nnn), "%d", nUsed+1);
+               name = NewStrBufDup(eName);
+               StrBufTrim(name);
+               Put(Hash, nnn, nUsed, name, HFreeStrBuf); 
+               AppendImportantMessage(SKEY(eName));
+               AppendImportantMessage( /*<domain> added status message*/ _(" added."), -1); 
+       }
+
+       Buf = NewStrBuf();
+       serv_printf("CONF PUTSYS|application/x-citadel-internet-config");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 4) {
+               for (i = 0; i < (sizeof(CfgNames) / sizeof(ConstStr)); i++) {
+                       HashPos *where;
+                       const char *Key;
+                       long KeyLen;
+
+                       GetHash(WCC->InetCfg, CKEY(CfgNames[i]), &vHash);
+                       Hash = (HashList*) vHash;
+                       if (Hash == NULL) {
+                               AppendImportantMessage(_("Invalid Parameter"), -1);
+                               url_do_template();
+                               return;
+                       }
+                       if (GetCount(Hash) > 0) {
+                               where = GetNewHashPos(Hash, 0);
+                               while (GetNextHashPos(Hash, where, &KeyLen, &Key, &vStr)) {
+                                       Str = (StrBuf*) vStr;
+                                       if ((Str!= NULL) && (StrLength(Str) > 0))
+                                               serv_printf("%s|%s", ChrPtr(Str), CfgNames[i].Key); 
+                               }
+                               DeleteHashPos(&where);
+                       }                       
+               }
+               serv_puts("000");
+               DeleteHash(&WCC->InetCfg);
+       }
+       FreeStrBuf(&Buf);
+       url_do_template();
+}
+
+
+void DeleteInetConfHash(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+
+       if (WCC->InetCfg != NULL)
+               DeleteHash(&WCC->InetCfg);
+
+}
+
+
+HashList *GetInetConfHash(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       void *vHash;
+
+       if (WCC->InetCfg == NULL)
+               load_inetconf();
+       GetHash(WCC->InetCfg, TKEY(5), &vHash);
+       PutBstr(HKEY("__SERVCFG:INET:TYPE"), NewStrBufPlain(TKEY(5)));
+       return vHash;
+}
+
+
+HashList *GetValidDomainNames(StrBuf *Target, WCTemplputParams *TP) 
+{
+       StrBuf *Line;
+       HashList *ValidDomainNames = NULL;
+       long State;
+       int gvdnlevel = 0;
+       
+       serv_printf("GVDN %d", gvdnlevel);
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, &State) == 1) 
+       {
+               int Done = 0;
+               int n = 0;
+
+               ValidDomainNames = NewHash(1, NULL);
+               while(!Done && (StrBuf_ServGetln(Line) >= 0))
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000"))
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {
+                               Put(ValidDomainNames, 
+                                   IKEY(n),
+                                   NewStrBufDup(Line), 
+                                   HFreeStrBuf);
+                               n++; /* #0 is the type... */
+                       }
+       }
+       else if (State == 550)
+               AppendImportantMessage(_("Higher access is required to access this function."), -1);
+
+       FreeStrBuf(&Line);
+
+       return ValidDomainNames;
+}
+
+
+
+void 
+InitModule_INETCONF
+(void)
+{
+       WebcitAddUrlHandler(HKEY("save_inetconf"), "", 0, new_save_inetconf, 0);
+       RegisterIterator("SERVCFG:INET", 1, NULL, GetInetConfHash, NULL, NULL, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+       RegisterNamespace("SERVCFG:FLUSHINETCFG",0, 0, DeleteInetConfHash, NULL, CTX_NONE);
+       RegisterIterator("ITERATE:VALID:DOMAINNAMES", 1, NULL, GetValidDomainNames, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+}
diff --git a/webcit/install-sh b/webcit/install-sh
new file mode 100755 (executable)
index 0000000..e843669
--- /dev/null
@@ -0,0 +1,250 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/webcit/js/.jshintrc b/webcit/js/.jshintrc
new file mode 100644 (file)
index 0000000..c701f27
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "bitwise": true,
+  "curly": true,
+  "eqeqeq": true,
+  "forin": true,
+  "freeze": true,
+  "immed": true,
+  "laxbreak": true,
+  "newcap": true,
+  "noarg": true,
+  "noempty": true,
+  "nonbsp": true,
+  "nonew": true,
+  "strict": true,
+  "undef": true,
+  "unused": true,
+  "indent": 2,
+  "maxlen": 120
+}
diff --git a/webcit/jsonview_renderer.c b/webcit/jsonview_renderer.c
new file mode 100644 (file)
index 0000000..5a097b0
--- /dev/null
@@ -0,0 +1,74 @@
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+int json_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                               void **ViewSpecific, 
+                               long oper, 
+                               char *cmd, 
+                               long len,
+                               char *filter,
+                               long flen)
+{
+       Stat->defaultsortorder = 2;
+       Stat->sortit = 1;
+       Stat->load_seen = 1;
+       /* Generally using maxmsgs|startmsg is not required
+          in mailbox view, but we have a 'safemode' for clients
+          (*cough* Exploder) that simply can't handle too many */
+       if (havebstr("maxmsgs"))  Stat->maxmsgs  = ibstr("maxmsgs");
+       else                      Stat->maxmsgs  = 9999999;
+       if (havebstr("startmsg")) Stat->startmsg = lbstr("startmsg");
+       snprintf(cmd, len, "MSGS %s|%s||1",
+                (oper == do_search) ? "SEARCH" : "ALL",
+                (oper == do_search) ? bstr("query") : ""
+               );
+
+       return 200;
+}
+int json_MessageListHdr(SharedMessageStatus *Stat, void **ViewSpecific) 
+{
+       /* TODO: make a generic function */
+       hprintf("HTTP/1.1 200 OK\r\n");
+       hprintf("Content-type: application/json; charset=utf-8\r\n");
+       hprintf("Server: %s / %s\r\n", PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software));
+       hprintf("Connection: close\r\n");
+       hprintf("Pragma: no-cache\r\nCache-Control: no-store\r\nExpires:-1\r\n");
+       begin_burst();
+       return 0;
+}
+
+int json_RenderView_or_Tail(SharedMessageStatus *Stat, 
+                           void **ViewSpecific, 
+                           long oper)
+{
+       DoTemplate(HKEY("mailsummary_json"),NULL, NULL);
+       
+       return 0;
+}
+
+int json_Cleanup(void **ViewSpecific)
+{
+       /* Note: wDumpContent() will output one additional </div> tag. */
+       /* We ought to move this out into template */
+       end_burst();
+
+       return 0;
+}
+
+void 
+InitModule_JSONRENDERER
+(void)
+{
+       RegisterReadLoopHandlerset(
+               VIEW_JSON_LIST,
+               json_GetParamsGetServerCall,
+               json_MessageListHdr,
+               NULL, /* TODO: is this right? */
+               ParseMessageListHeaders_Detail,
+               NULL,
+               json_RenderView_or_Tail,
+               json_Cleanup,
+               NULL);
+
+}
diff --git a/webcit/listsub.c b/webcit/listsub.c
new file mode 100644 (file)
index 0000000..95f9ecf
--- /dev/null
@@ -0,0 +1,137 @@
+// Web forms for handling mailing list subscribe/unsubscribe requests.
+//
+// Copyright (c) 1996-2022 by the citadel.org team
+//
+// This program is open source software.  You can redistribute it and/or
+// modify it under the terms of the GNU General Public License, version 3.
+//
+// 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.
+
+#include "webcit.h"
+
+// List subscription handling
+int Conditional_LISTSUB_EXECUTE_SUBSCRIBE(StrBuf *Target, WCTemplputParams *TP) {
+       int rc;
+       StrBuf *Line;
+       const char *ImpMsg;
+       const StrBuf *Room, *Email;
+
+       if (strcmp(bstr("cmd"), "subscribe")) {
+               return 0;
+       }
+
+       Room = sbstr("room");
+       if (Room == NULL) {
+               ImpMsg = _("You need to specify the mailinglist to subscribe to.");
+               AppendImportantMessage(ImpMsg, -1);
+               return 0;
+       }
+       Email = sbstr("email");
+       if (Email == NULL) {
+               ImpMsg = _("You need to specify the email address you'd like to subscribe with.");
+               AppendImportantMessage(ImpMsg, -1);
+               return 0;
+       }
+
+       Line = NewStrBuf();
+       serv_printf("LSUB subscribe|%s|%s|%s/listsub", ChrPtr(Room), ChrPtr(Email), ChrPtr(site_prefix));
+       StrBuf_ServGetln(Line);
+       rc = GetServerStatusMsg(Line, NULL, 1, 2);
+       FreeStrBuf(&Line);
+       if (rc == 2) {
+               putbstr("__FAIL", NewStrBufPlain(HKEY("1")));
+       }
+       return rc == 2;
+}
+
+
+int Conditional_LISTSUB_EXECUTE_UNSUBSCRIBE(StrBuf *Target, WCTemplputParams *TP) {
+       int rc;
+       StrBuf *Line;
+       const char *ImpMsg;
+       const StrBuf *Room, *Email;
+
+       if (strcmp(bstr("cmd"), "unsubscribe")) {
+               return 0;
+       }
+
+       Room = sbstr("room");
+       if (Room == NULL) {
+               ImpMsg = _("You need to specify the mailinglist to subscribe to.");
+               AppendImportantMessage(ImpMsg, -1);
+               return 0;
+       }
+       Email = sbstr("email");
+       if (Email == NULL) {
+               ImpMsg = _("You need to specify the email address you'd like to subscribe with.");
+               AppendImportantMessage(ImpMsg, -1);
+               return 0;
+       }
+
+       serv_printf("LSUB unsubscribe|%s|%s|%s/listsub", ChrPtr(Room), ChrPtr(Email), ChrPtr(site_prefix));
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       rc = GetServerStatusMsg(Line, NULL, 1, 2);
+       FreeStrBuf(&Line);
+       if (rc == 2) {
+               putbstr("__FAIL", NewStrBufPlain(HKEY("1")));
+       }
+       return rc == 2;
+}
+
+
+int confirm_sub_or_unsub(char *cmd, StrBuf *Target, WCTemplputParams *TP) {
+       int rc;
+       StrBuf *Line;
+
+       Line = NewStrBuf();
+       serv_printf("LSUB %s|%s|%s|%s/listsub|%s", cmd, bstr("room"), bstr("email"), ChrPtr(site_prefix), bstr("token"));
+       StrBuf_ServGetln(Line);
+       rc = GetServerStatusMsg(Line, NULL, 1, 2);
+       FreeStrBuf(&Line);
+       if (rc == 2) {
+               putbstr("__FAIL", NewStrBufPlain(HKEY("1")));
+       }
+       return rc == 2;
+}
+
+
+int Conditional_LISTSUB_EXECUTE_CONFIRMSUBSCRIBE(StrBuf *Target, WCTemplputParams *TP) {
+       if (strcmp(bstr("cmd"), "confirm_subscribe")) {
+               return 0;
+       }
+       return(confirm_sub_or_unsub("confirm_subscribe", Target, TP));
+}
+
+
+int Conditional_LISTSUB_EXECUTE_CONFIRMUNSUBSCRIBE(StrBuf *Target, WCTemplputParams *TP) {
+       if (strcmp(bstr("cmd"), "confirm_unsubscribe")) {
+               return 0;
+       }
+       return(confirm_sub_or_unsub("confirm_unsubscribe", Target, TP));
+}
+
+
+void do_listsub(void) {
+       if (!havebstr("cmd")) {
+               putbstr("cmd", NewStrBufPlain(HKEY("choose")));
+       }
+       output_headers(1, 0, 0, 0, 1, 0);
+       do_template("listsub_display");
+       end_burst();
+}
+
+
+void 
+InitModule_LISTSUB
+(void)
+{
+       RegisterConditional("COND:LISTSUB:EXECUTE:SUBSCRIBE", 0, Conditional_LISTSUB_EXECUTE_SUBSCRIBE,  CTX_NONE);
+       RegisterConditional("COND:LISTSUB:EXECUTE:UNSUBSCRIBE", 0, Conditional_LISTSUB_EXECUTE_UNSUBSCRIBE,  CTX_NONE);
+       RegisterConditional("COND:LISTSUB:EXECUTE:CONFIRMSUBSCRIBE", 0, Conditional_LISTSUB_EXECUTE_CONFIRMSUBSCRIBE, CTX_NONE);
+       RegisterConditional("COND:LISTSUB:EXECUTE:CONFIRMUNSUBSCRIBE", 0, Conditional_LISTSUB_EXECUTE_CONFIRMUNSUBSCRIBE, CTX_NONE);
+       WebcitAddUrlHandler(HKEY("listsub"), "", 0, do_listsub, ANONYMOUS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE);
+}
diff --git a/webcit/locate_host.c b/webcit/locate_host.c
new file mode 100644 (file)
index 0000000..d015f53
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Given a socket, supply the name of the host at the other end.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+/*
+ * IPv4/IPv6 locate_host()
+ */
+void locate_host(StrBuf *tbuf, int client_socket)
+{
+       struct sockaddr_in6 clientaddr;
+       unsigned int addrlen = sizeof(clientaddr);
+       char clienthost[NI_MAXHOST] = "";
+
+       getpeername(client_socket, (struct sockaddr *)&clientaddr, &addrlen);
+       getnameinfo((struct sockaddr *)&clientaddr, addrlen, clienthost, sizeof(clienthost), NULL, 0, 0);
+        StrBufAppendBufPlain(tbuf, clienthost, -1, 0);
+       syslog(LOG_DEBUG, "Client is at %s\n", clienthost);
+}
diff --git a/webcit/mailview_renderer.c b/webcit/mailview_renderer.c
new file mode 100644 (file)
index 0000000..3090951
--- /dev/null
@@ -0,0 +1,124 @@
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+static inline void CheckConvertBufs(struct wcsession *WCC)
+{
+       if (WCC->ConvertBuf1 == NULL)
+               WCC->ConvertBuf1 = NewStrBuf();
+       if (WCC->ConvertBuf2 == NULL)
+               WCC->ConvertBuf2 = NewStrBuf();
+}
+
+int ParseMessageListHeaders_Detail(StrBuf *Line, 
+                                  const char **pos, 
+                                  message_summary *Msg, 
+                                  StrBuf *ConversionBuffer,
+                                  void **ViewSpecific)
+{
+       wcsession *WCC = WC;
+       long len;
+       long totallen;
+
+       CheckConvertBufs(WCC);
+
+       totallen = StrLength(Line);
+       Msg->from = NewStrBufPlain(NULL, totallen);
+       len = StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
+       if (len > 0) {
+               /* Handle senders with RFC2047 encoding */
+               StrBuf_RFC822_2_Utf8(Msg->from, 
+                                    ConversionBuffer, 
+                                    WCC->DefaultCharset, 
+                                    NULL, 
+                                    WCC->ConvertBuf1,
+                                    WCC->ConvertBuf2);
+       }
+                       
+       /* node name */
+       len = StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
+       if ((len > 0 ) &&
+           ( ((WCC->CurRoom.QRFlags & QR_NETWORK)
+              || ((strcasecmp(ChrPtr(ConversionBuffer), ChrPtr(WCC->serv_info->serv_nodename))
+                   && (strcasecmp(ChrPtr(ConversionBuffer), ChrPtr(WCC->serv_info->serv_fqdn))))))))
+       {
+               StrBufAppendBufPlain(Msg->from, HKEY(" @ "), 0);
+               StrBufAppendBuf(Msg->from, ConversionBuffer, 0);
+       }
+
+       /* Internet address (not used)
+        *      StrBufExtract_token(Msg->inetaddr, Line, 4, '|');
+        */
+       StrBufSkip_NTokenS(Line, pos, '|', 1);
+       Msg->subj = NewStrBufPlain(NULL, totallen);
+
+       FlushStrBuf(ConversionBuffer);
+       /* we assume the subject is the last parameter inside of the list; 
+        * thus we don't use the tokenizer to fetch it, since it will hick up 
+        * on tokenizer chars inside of the subjects
+       StrBufExtract_NextToken(ConversionBuffer,  Line, pos, '|');
+       */
+       len = 0;
+       if (*pos != StrBufNOTNULL) {
+               len = totallen - (*pos - ChrPtr(Line));
+               StrBufPlain(ConversionBuffer, *pos, len);
+               *pos = StrBufNOTNULL;
+               if ((len > 0) &&
+                   (*(ChrPtr(ConversionBuffer) + len - 1) == '|'))
+                       StrBufCutRight(ConversionBuffer, 1);
+       }
+
+       if (len == 0)
+               StrBufAppendBufPlain(Msg->subj, _("(no subject)"), -1,0);
+       else {
+               StrBuf_RFC822_2_Utf8(Msg->subj, 
+                                    ConversionBuffer, 
+                                    WCC->DefaultCharset, 
+                                    NULL,
+                                    WCC->ConvertBuf1,
+                                    WCC->ConvertBuf2);
+       }
+
+       return 1;
+}
+
+
+int mailview_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                                   void **ViewSpecific, 
+                                   long oper, 
+                                   char *cmd, 
+                                   long len,
+                                   char *filter,
+                                   long flen)
+{
+       DoTemplate(HKEY("msg_listview"),NULL,&NoCtx);
+
+       return 200;
+}
+
+int mailview_Cleanup(void **ViewSpecific)
+{
+       /* Note: wDumpContent() will output one additional </div> tag. */
+       /* We ought to move this out into template */
+       wDumpContent(1);
+
+       return 0;
+}
+
+void 
+InitModule_MAILVIEW_RENDERERS
+(void)
+{
+       RegisterCTX(CTX_MIME_ATACH);
+       RegisterReadLoopHandlerset(
+               VIEW_MAILBOX,
+               mailview_GetParamsGetServerCall,
+               NULL, /* TODO: is this right? */
+               NULL,
+               ParseMessageListHeaders_Detail,
+               NULL,
+               NULL,
+               mailview_Cleanup,
+               NULL);
+
+}
diff --git a/webcit/mainmenu.c b/webcit/mainmenu.c
new file mode 100644 (file)
index 0000000..2c326e0
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * The main menu and other things
+ *
+ * Copyright (c) 1996-2021 by the citadel.org team
+ *
+ * This program is open source software.  We call it open source, not
+ * free software, because Richard Stallman is a communist and an asshole.
+ *
+ * The program is licensed under the General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+
+// The Main Menu
+void display_main_menu(void) {
+       begin_burst();
+       output_headers(1, 0, 0, 0, 1, 0);
+       DoTemplate(HKEY("display_main_menu"), NULL, &NoCtx);
+       end_burst();
+}
+
+
+// System administration menu
+void display_aide_menu(void) {
+       begin_burst();
+       output_headers(1, 0, 0, 0, 1, 0);
+       DoTemplate(HKEY("aide_display_menu"), NULL, &NoCtx);
+       end_burst();
+}
+
+
+// Handle generic server commands, possibly entered from a screen, possibly set up as a way to avoid custom code
+void do_generic(void) {
+        WCTemplputParams SubTP;
+       int Done = 0;
+       StrBuf *Buf;
+       StrBuf *LineBuf;
+       char *junk;
+       size_t len;
+
+       if ( (!havebstr("sc_button")) && (!havebstr("ok_button")) && (!havebstr("cancel_button")) ) {
+               display_main_menu();
+               return;
+       }
+
+       if (havebstr("cancel_button")) {
+               AppendImportantMessage(_("Cancelled.  Changes were not saved."), -1);
+       }
+
+       if (havebstr("ok_button")) {
+               Buf = NewStrBuf();
+               serv_puts(bstr("g_cmd"));
+               StrBuf_ServGetln(Buf);
+               
+               switch (GetServerStatus(Buf, NULL)) {
+               case 8:
+                       serv_puts("\n\n000");
+                       if ( (StrLength(Buf)==3) && 
+                       !strcmp(ChrPtr(Buf), "000")) {
+                               StrBufAppendBufPlain(Buf, HKEY("\000"), 0);
+                               break;
+                       }
+               case 1:
+                       LineBuf = NewStrBuf();
+                       StrBufAppendBufPlain(Buf, HKEY("\n"), 0);
+                       while (!Done) {
+                               if (StrBuf_ServGetln(LineBuf) < 0)
+                                       break;
+                               if ( (StrLength(LineBuf)==3) && 
+                               !strcmp(ChrPtr(LineBuf), "000")) {
+                                       Done = 1;
+                               }
+                               StrBufAppendBuf(Buf, LineBuf, 0);
+                               StrBufAppendBufPlain(Buf, HKEY("\n"), 0);
+                       }
+                       FreeStrBuf(&LineBuf);
+                       break;
+               case 2:
+                       break;
+               case 4:
+                       text_to_server(bstr("g_input"));
+                       serv_puts("000");
+                       break;
+               case 6:
+                       len = atol(&ChrPtr(Buf)[4]);
+                       StrBuf_ServGetBLOBBuffered(Buf, len);
+                       break;
+               case 7:
+                       len = atol(&ChrPtr(Buf)[4]);
+                       junk = malloc(len);
+                       memset(junk, 0, len);
+                       serv_write(junk, len);
+                       free(junk);
+                       break;
+               }
+               FreeStrBuf(&Buf);
+       }
+       
+       // We may have been supplied with instructions regarding the location
+       // to which we must return after posting.  If found, go there.
+       if (havebstr("return_to")) {
+               syslog(LOG_DEBUG, "return_to = %s", bstr("return_to"));
+               http_redirect(bstr("return_to"));
+       }
+
+       // Otherwise, do the generic result screen.
+       else {
+               begin_burst();
+               output_headers(1, 0, 0, 0, 1, 0);
+       
+               StackContext(NULL, &SubTP, Buf, CTX_STRBUF, 0, NULL);
+               {
+                       DoTemplate(HKEY("aide_display_generic_result"), NULL, &SubTP);
+               }
+               UnStackContext(&SubTP);
+               wDumpContent(1);
+       }
+
+}
+
+
+// Display the wait / input dialog while restarting the server.
+void display_shutdown(void) {
+       StrBuf *Line;
+       char *when;
+       
+       Line = NewStrBuf();
+       when=bstr("when");
+       if (strcmp(when, "now") == 0){
+               serv_printf("DOWN 1");
+               StrBuf_ServGetln(Line);
+               GetServerStatusMsg(Line, NULL, 1, 5);
+
+               begin_burst();
+               output_headers(1, 0, 0, 0, 1, 0);
+               DoTemplate(HKEY("aide_display_serverrestart"), NULL, &NoCtx);
+               end_burst();
+               lingering_close(WC->Hdr->http_sock);
+               sleeeeeeeeeep(10);
+               serv_printf("NOOP");
+               serv_printf("NOOP");
+       }
+       else if (strcmp(when, "page") == 0) {
+               char *message;
+              
+               message = bstr("message");
+               if ((message == NULL) || (IsEmptyStr(message)))
+               {
+                       begin_burst();
+                       output_headers(1, 0, 0, 0, 1, 0);
+                       DoTemplate(HKEY("aide_display_serverrestart_page"), NULL, &NoCtx);
+                       end_burst();
+               }
+               else
+               {
+                       serv_printf("SEXP broadcast|%s", message);
+                       StrBuf_ServGetln(Line);
+                       GetServerStatusMsg(Line, NULL, 1, 0);
+
+                       begin_burst();
+                       output_headers(1, 0, 0, 0, 1, 0);
+                       DoTemplate(HKEY("aide_display_serverrestart_page"), NULL, &NoCtx);
+                       end_burst();                    
+               }
+       }
+       else if (!strcmp(when, "idle")) {
+               serv_printf("SCDN 3");
+               StrBuf_ServGetln(Line);
+               GetServerStatusMsg(Line, NULL, 1, 2);
+
+               begin_burst();
+               output_headers(1, 0, 0, 0, 1, 0);
+               DoTemplate(HKEY("aide_display_menu"), NULL, &NoCtx);
+               end_burst();                    
+       }
+       FreeStrBuf(&Line);
+}
+
+
+void 
+InitModule_MAINMENU
+(void)
+{
+       WebcitAddUrlHandler(HKEY("display_aide_menu"), "", 0, display_aide_menu, 0);
+       WebcitAddUrlHandler(HKEY("server_shutdown"), "", 0, display_shutdown, 0);
+       WebcitAddUrlHandler(HKEY("display_main_menu"), "", 0, display_main_menu, 0);
+       WebcitAddUrlHandler(HKEY("do_generic"), "", 0, do_generic, 0);
+}
diff --git a/webcit/marchlist.c b/webcit/marchlist.c
new file mode 100644 (file)
index 0000000..7031d26
--- /dev/null
@@ -0,0 +1,256 @@
+#include "webcit.h"
+#include "webserver.h"
+
+/*
+ * Free a session's march list
+ */
+void free_march_list(wcsession *wcf)
+{
+       struct march *mptr;
+
+       while (wcf->march != NULL) {
+               mptr = wcf->march->next;
+               free(wcf->march);
+               wcf->march = mptr;
+       }
+}
+
+
+
+/*
+ * remove a room from the march list
+ */
+void remove_march(const StrBuf *aaa)
+{
+       struct march *mptr, *mptr2;
+
+       if (WC->march == NULL)
+               return;
+
+       if (!strcasecmp(WC->march->march_name, ChrPtr(aaa))) {
+               mptr = WC->march->next;
+               free(WC->march);
+               WC->march = mptr;
+               return;
+       }
+       mptr2 = WC->march;
+       for (mptr = WC->march; mptr != NULL; mptr = mptr->next) {
+               if (!strcasecmp(mptr->march_name, ChrPtr(aaa))) {
+                       mptr2->next = mptr->next;
+                       free(mptr);
+                       mptr = mptr2;
+               } else {
+                       mptr2 = mptr;
+               }
+       }
+}
+
+
+
+/**
+ * \brief Locate the room on the march list which we most want to go to.  
+ * Each room
+ * is measured given a "weight" of preference based on various factors.
+ * \param desired_floor the room number on the citadel server
+ * \return the roomname
+ */
+char *pop_march(int desired_floor)
+{
+       static char TheRoom[128];
+       int TheWeight = 0;
+       int weight;
+       struct march *mptr = NULL;
+
+       strcpy(TheRoom, "_BASEROOM_");
+       if (WC->march == NULL)
+               return (TheRoom);
+
+       for (mptr = WC->march; mptr != NULL; mptr = mptr->next) {
+               weight = 0;
+               if ((strcasecmp(mptr->march_name, "_BASEROOM_")))
+                       weight = weight + 10000;
+               if (mptr->march_floor == desired_floor)
+                       weight = weight + 5000;
+
+               weight = weight + ((128 - (mptr->march_floor)) * 128);
+               weight = weight + (128 - (mptr->march_order));
+
+               if (weight > TheWeight) {
+                       TheWeight = weight;
+                       strcpy(TheRoom, mptr->march_name);
+/* TODOO: and now????
+                       TheFloor = mptr->march_floor;
+                       TheOrder = mptr->march_order;
+*/
+               }
+       }
+       return (TheRoom);
+}
+
+
+
+/*
+ * Goto next room having unread messages.
+ *
+ * We want to skip over rooms that the user has already been to, and take the
+ * user back to the lobby when done.  The room we end up in is placed in
+ * newroom - which is set to 0 (the lobby) initially.
+ * We start the search in the current room rather than the beginning to prevent
+ * two or more concurrent users from dragging each other back to the same room.
+ */
+void gotonext(void)
+{
+       char buf[256];
+       struct march *mptr = NULL;
+       struct march *mptr2 = NULL;
+       char room_name[128];
+       StrBuf *next_room;
+       int ELoop = 0;
+
+       /*
+        * First check to see if the march-mode list is already allocated.
+        * If it is, pop the first room off the list and go there.
+        */
+       if (havebstr("startmsg")) {
+               readloop(readnew, eUseDefault);
+               return;
+       }
+
+       if (WC->march == NULL) {
+               serv_puts("LKRN");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1')
+                       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               if (IsEmptyStr(buf)) {
+                                       if (ELoop > 10000)
+                                               return;
+                                       if (ELoop % 100 == 0)
+                                               sleeeeeeeeeep(1);
+                                       ELoop ++;
+                                       continue;                                       
+                               }
+                               extract_token(room_name, buf, 0, '|', sizeof room_name);
+                               if (strcasecmp(room_name, ChrPtr(WC->CurRoom.name))) {
+                                       mptr = (struct march *) malloc(sizeof(struct march));
+                                       mptr->next = NULL;
+                                       safestrncpy(mptr->march_name, room_name, sizeof mptr->march_name);
+                                       mptr->march_floor = extract_int(buf, 2);
+                                       mptr->march_order = extract_int(buf, 3);
+                                       if (WC->march == NULL) 
+                                               WC->march = mptr;
+                                       else 
+                                               mptr2->next = mptr;
+                                       mptr2 = mptr;
+                               }
+                               buf[0] = '\0';
+                       }
+               /*
+                * add _BASEROOM_ to the end of the march list, so the user will end up
+                * in the system base room (usually the Lobby>) at the end of the loop
+                */
+               mptr = (struct march *) malloc(sizeof(struct march));
+               mptr->next = NULL;
+               mptr->march_order = 0;
+               mptr->march_floor = 0;
+               strcpy(mptr->march_name, "_BASEROOM_");
+               if (WC->march == NULL) {
+                       WC->march = mptr;
+               } else {
+                       mptr2 = WC->march;
+                       while (mptr2->next != NULL)
+                               mptr2 = mptr2->next;
+                       mptr2->next = mptr;
+               }
+               /*
+                * ...and remove the room we're currently in, so a <G>oto doesn't make us
+                * walk around in circles
+                */
+               remove_march(WC->CurRoom.name);
+       }
+       if (WC->march != NULL) {
+               next_room = NewStrBufPlain(pop_march(-1), -1);/*TODO: migrate march to strbuf */
+               putlbstr("gotonext", 1);
+       } else {
+               next_room = NewStrBufPlain(HKEY("_BASEROOM_"));
+       }
+
+
+       smart_goto(next_room);
+       FreeStrBuf(&next_room);
+}
+
+/*
+ * un-goto the previous room
+ */
+void ungoto(void)
+{
+       StrBuf *Buf;
+
+       if (havebstr("startmsg")) {
+               readloop(readnew, eUseDefault);
+               return;
+       }
+
+       if (!strcmp(WC->ugname, "")) {
+               smart_goto(WC->CurRoom.name);
+               return;
+       }
+       serv_printf("GOTO %s", WC->ugname);
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 2) {
+               smart_goto(WC->CurRoom.name);
+               FreeStrBuf(&Buf);
+               return;
+       }
+       if (WC->uglsn >= 0L) {
+               serv_printf("SLRP %ld", WC->uglsn);
+               StrBuf_ServGetln(Buf);
+       }
+       FlushStrBuf(Buf);
+       StrBufAppendBufPlain(Buf, WC->ugname, -1, 0);
+       strcpy(WC->ugname, "");
+       smart_goto(Buf);
+       FreeStrBuf(&Buf);
+}
+
+
+
+void tmplput_ungoto(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+
+       if ((WCC!=NULL) && 
+           (!IsEmptyStr(WCC->ugname)))
+               StrBufAppendBufPlain(Target, WCC->ugname, -1, 0);
+}
+
+void _gotonext(void) {
+       slrp_highest();
+       gotonext();
+}
+
+
+
+
+int ConditionalHaveUngoto(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       
+       return ((WCC!=NULL) && 
+               (!IsEmptyStr(WCC->ugname)) && 
+               (strcasecmp(WCC->ugname, ChrPtr(WCC->CurRoom.name)) == 0));
+}
+
+
+void 
+InitModule_MARCHLIST
+(void)
+{
+       RegisterConditional("COND:UNGOTO", 0, ConditionalHaveUngoto, CTX_NONE);
+       RegisterNamespace("ROOM:UNGOTO", 0, 0, tmplput_ungoto, NULL, CTX_NONE);
+
+       WebcitAddUrlHandler(HKEY("gotonext"), "", 0, _gotonext, NEED_URL);
+       WebcitAddUrlHandler(HKEY("skip"), "", 0, gotonext, NEED_URL);
+       WebcitAddUrlHandler(HKEY("ungoto"), "", 0, ungoto, NEED_URL);
+}
diff --git a/webcit/messages.c b/webcit/messages.c
new file mode 100644 (file)
index 0000000..7853317
--- /dev/null
@@ -0,0 +1,2092 @@
+// Functions which deal with the fetching and displaying of messages.
+//
+// Copyright (c) 1996-2022 by the citadel.org team
+//
+// This program is open source software.  We call it open source, not
+// free software, because Richard Stallman is a communist and an asshole.
+// No one has done more damage to open source software than Stallman (ok,
+// maybe Nat and Miguel have done more damage, but they were paid by
+// Microsoft to do so).  Richard Stallman is a far-left ultra-communist
+// who hates America, hates freedom, and deserves to be canceled.
+//
+// The program is licensed under the General Public License, version 3.
+//
+// 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.
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+#include "calendar.h"
+
+HashList *MimeRenderHandler = NULL;
+HashList *ReadLoopHandler = NULL;
+int dbg_analyze_msg = 0;
+
+#define SUBJ_COL_WIDTH_PCT             50      /* Mailbox view column width */
+#define SENDER_COL_WIDTH_PCT           30      /* Mailbox view column width */
+#define DATE_PLUS_BUTTONS_WIDTH_PCT    20      /* Mailbox view column width */
+
+void fixview() {
+       /* workaround for json listview; its not useable directly */
+       if (WC->CurRoom.view == VIEW_JSON_LIST) {
+               StrBuf *View = NewStrBuf();
+               StrBufPrintf(View, "%d", VIEW_MAILBOX);
+               putbstr("view", View);;
+       }
+}
+
+
+int load_message(message_summary *Msg, StrBuf *FoundCharset, StrBuf **Error) {
+       StrBuf *Buf;
+       StrBuf *HdrToken;
+       char buf[SIZ];
+       int Done = 0;
+       int state=0;
+       int rc;
+
+       Buf = NewStrBuf();
+       if (Msg->PartNum != NULL) {
+               serv_printf("MSG4 %ld|%s", Msg->msgnum, ChrPtr(Msg->PartNum));
+       }
+       else {
+               serv_printf("MSG4 %ld", Msg->msgnum);
+       }
+
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 1) {
+               *Error = NewStrBuf();
+               StrBufAppendPrintf(*Error, "<strong>");
+               StrBufAppendPrintf(*Error, _("ERROR:"));
+               StrBufAppendPrintf(*Error, "</strong> %s<br>\n", &buf[4]);
+               FreeStrBuf(&Buf);
+               return 0;
+       }
+
+       /* begin everythingamundo table */
+       HdrToken = NewStrBuf();
+       while (!Done && StrBuf_ServGetln(Buf)>=0) {
+               if ( (StrLength(Buf)==3) && 
+                   !strcmp(ChrPtr(Buf), "000")) 
+               {
+                       Done = 1;
+                       if (state < 2) {
+                               if (Msg->MsgBody->Data == NULL)
+                                       Msg->MsgBody->Data = NewStrBuf();
+                               Msg->MsgBody->ContentType = NewStrBufPlain(HKEY("text/html"));
+                               StrBufAppendPrintf(Msg->MsgBody->Data, "<div><i>");
+                               StrBufAppendPrintf(Msg->MsgBody->Data, _("Empty message"));
+                               StrBufAppendPrintf(Msg->MsgBody->Data, "</i><br><br>\n");
+                               StrBufAppendPrintf(Msg->MsgBody->Data, "</div>\n");
+                       }
+                       break;
+               }
+               switch (state) {
+               case 0:/* Citadel Message Headers */
+                       if (StrLength(Buf) == 0) {
+                               state ++;
+                               break;
+                       }
+                       StrBufExtract_token(HdrToken, Buf, 0, '=');
+                       StrBufCutLeft(Buf, StrLength(HdrToken) + 1);
+                       
+                       /* look up one of the examine_* functions to parse the content */
+                       rc =  EvaluateMsgHdr(SKEY(HdrToken), Msg, Buf, FoundCharset);
+                       if (rc == 1) {
+                               state++;
+                       }
+                       /* TODO: 
+                       else LogError(Target, 
+                                     __FUNCTION__,  
+                                     "don't know how to handle message header[%s]\n", 
+                                     ChrPtr(HdrToken));
+                        */
+                       break;
+               case 1:/* Message Mime Header */
+                       if (StrLength(Buf) == 0) {
+                               state++;
+                               if (Msg->MsgBody->ContentType == NULL)
+                                       /* end of header or no header? */
+                                       Msg->MsgBody->ContentType = NewStrBufPlain(HKEY("text/plain"));
+                                /* usual end of mime header */
+                       }
+                       else
+                       {
+                               StrBufExtract_token(HdrToken, Buf, 0, ':');
+                               if (StrLength(HdrToken) > 0) {
+                                       StrBufCutLeft(Buf, StrLength(HdrToken) + 1);
+                                       /* the examine*'s know how to do with mime headers too... */
+                                       EvaluateMsgHdr(SKEY(HdrToken), Msg, Buf, FoundCharset);
+                                       
+                                       break;
+                               }
+                       }
+               case 2: /* Message Body */
+                       
+                       if (Msg->MsgBody->size_known > 0) {
+                               StrBuf_ServGetBLOBBuffered(Msg->MsgBody->Data, Msg->MsgBody->length);
+                               state ++;
+                               /*/ todo: check next line, if not 000, append following lines */
+                       }
+                       else if (1){
+                               if (StrLength(Msg->MsgBody->Data) > 0)
+                                       StrBufAppendBufPlain(Msg->MsgBody->Data, "\n", 1, 0);
+                               StrBufAppendBuf(Msg->MsgBody->Data, Buf, 0);
+                       }
+                       break;
+               case 3:
+                       StrBufAppendBuf(Msg->MsgBody->Data, Buf, 0);
+                       break;
+               }
+       }
+
+       if (Msg->AllAttach == NULL)
+               Msg->AllAttach = NewHash(1,NULL);
+       /* now we put the body mimepart we read above into the mimelist */
+       Put(Msg->AllAttach, SKEY(Msg->MsgBody->PartNum), Msg->MsgBody, DestroyMime);
+       
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&HdrToken);
+       return 1;
+}
+
+
+/*
+ * Display a message to the user
+ *
+ * msgnum              Message number to display
+ * printable_view      Nonzero to display a printable view
+ * section             Optional for encapsulated message/rfc822 submessage
+ */
+int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, const StrBuf *PartNum, const StrBuf **OutMime, WCTemplputParams *TP) {
+       StrBuf *Buf;
+       StrBuf *FoundCharset;
+       HashPos  *it;
+       void *vMime;
+       message_summary *Msg = NULL;
+       void *vHdr;
+       long len;
+       const char *Key;
+       WCTemplputParams SuperTP;
+       WCTemplputParams SubTP;
+       StrBuf *Error = NULL;
+
+       memset(&SuperTP, 0, sizeof(WCTemplputParams));
+       memset(&SubTP, 0, sizeof(WCTemplputParams));
+
+       Buf = NewStrBuf();
+       FoundCharset = NewStrBuf();
+       Msg = (message_summary *)malloc(sizeof(message_summary));
+       if (!Msg) {
+               syslog(LOG_DEBUG, "malloc() error");
+       }
+       memset(Msg, 0, sizeof(message_summary));
+       Msg->msgnum = msgnum;
+       Msg->PartNum = PartNum;
+       Msg->MsgBody =  (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment));
+       if (!Msg->MsgBody) {
+               syslog(LOG_DEBUG, "malloc() error");
+       }
+       memset(Msg->MsgBody, 0, sizeof(wc_mime_attachment));
+       Msg->MsgBody->msgnum = msgnum;
+
+       if (!load_message(Msg, FoundCharset, &Error)) {
+               StrBufAppendBuf(Target, Error, 0);
+               FreeStrBuf(&Error);
+       }
+
+       /* Extract just the content-type (omit attributes such as "charset") */
+       StrBufExtract_token(Buf, Msg->MsgBody->ContentType, 0, ';');
+       StrBufTrim(Buf);
+       StrBufLowerCase(Buf);
+
+       StackContext(TP, &SuperTP, Msg, CTX_MAILSUM, 0, NULL);
+       {
+               /* Locate a renderer capable of converting this MIME part into HTML */
+               if (GetHash(MimeRenderHandler, SKEY(Buf), &vHdr) &&
+                   (vHdr != NULL)) {
+                       RenderMimeFuncStruct *Render;
+                       
+                       StackContext(&SuperTP, &SubTP, Msg->MsgBody, CTX_MIME_ATACH, 0, NULL);
+                       {
+                               Render = (RenderMimeFuncStruct*)vHdr;
+                               Render->f(Target, &SubTP, FoundCharset);
+                       }
+                       UnStackContext(&SubTP);
+               }
+               
+               if (StrLength(Msg->reply_references)> 0) {
+                       /* Trim down excessively long lists of thread references.  We eliminate the
+                        * second one in the list so that the thread root remains intact.
+                        */
+                       int rrtok = num_tokens(ChrPtr(Msg->reply_references), '|');
+                       int rrlen = StrLength(Msg->reply_references);
+                       if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) {
+                               StrBufRemove_token(Msg->reply_references, 1, '|');
+                       }
+               }
+
+               /* now check if we need to translate some mimeparts, and remove the duplicate */
+               it = GetNewHashPos(Msg->AllAttach, 0);
+               while (GetNextHashPos(Msg->AllAttach, it, &len, &Key, &vMime) && 
+                      (vMime != NULL)) {
+                       StackContext(&SuperTP, &SubTP, vMime, CTX_MIME_ATACH, 0, NULL);
+                       {
+                               evaluate_mime_part(Target, &SubTP);
+                       }
+                       UnStackContext(&SubTP);
+               }
+               DeleteHashPos(&it);
+               *OutMime = DoTemplate(tmpl, tmpllen, Target, &SuperTP);
+       }
+       UnStackContext(&SuperTP);
+
+       DestroyMessageSummary(Msg);
+       FreeStrBuf(&FoundCharset);
+       FreeStrBuf(&Buf);
+       return 1;
+}
+
+
+long HttpStatus(long CitadelStatus) {
+       long httpstatus = 502;
+       
+       switch (MAJORCODE(CitadelStatus))
+       {
+       case LISTING_FOLLOWS:
+       case CIT_OK:
+               httpstatus = 201;
+               break;
+       case ERROR:
+               switch (MINORCODE(CitadelStatus))
+               {
+               case INTERNAL_ERROR:
+                       httpstatus = 403;
+                       break;
+                       
+               case TOO_BIG:
+               case ILLEGAL_VALUE:
+               case HIGHER_ACCESS_REQUIRED:
+               case MAX_SESSIONS_EXCEEDED:
+               case RESOURCE_BUSY:
+               case RESOURCE_NOT_OPEN:
+               case NOT_HERE:
+               case INVALID_FLOOR_OPERATION:
+               case FILE_NOT_FOUND:
+               case ROOM_NOT_FOUND:
+                       httpstatus = 409;
+                       break;
+
+               case MESSAGE_NOT_FOUND:
+               case ALREADY_EXISTS:
+                       httpstatus = 403;
+                       break;
+
+               case NO_SUCH_SYSTEM:
+                       httpstatus = 502;
+                       break;
+
+               default:
+               case CMD_NOT_SUPPORTED:
+               case PASSWORD_REQUIRED:
+               case ALREADY_LOGGED_IN:
+               case USERNAME_REQUIRED:
+               case NOT_LOGGED_IN:
+               case SERVER_SHUTTING_DOWN:
+               case NO_SUCH_USER:
+               case ASYNC_GEXP:
+                       httpstatus = 502;
+                       break;
+               }
+               break;
+
+       default:
+       case BINARY_FOLLOWS:
+       case SEND_BINARY:
+       case START_CHAT_MODE:
+       case ASYNC_MSG:
+       case MORE_DATA:
+       case SEND_LISTING:
+               httpstatus = 502; /* aeh... whut? */
+               break;
+       }
+
+       return httpstatus;
+}
+
+
+/*
+ * Unadorned HTML output of an individual message, suitable
+ * for placing in a hidden iframe, for printing, or whatever
+ */
+void handle_one_message(void) {
+       long CitStatus = ERROR + NOT_HERE;
+       int CopyMessage = 0;
+       const StrBuf *Destination;
+       void *vLine;
+       const StrBuf *Mime;
+       long msgnum = 0L;
+       const StrBuf *Tmpl;
+       StrBuf *CmdBuf = NULL;
+       const char *pMsg;
+
+       pMsg = strchr(ChrPtr(WC->Hdr->HR.ReqLine), '/');
+       if (pMsg == NULL) {
+               HttpStatus(CitStatus);
+               return;
+       }
+
+       msgnum = atol(pMsg + 1);
+       StrBufCutAt(WC->Hdr->HR.ReqLine, 0, pMsg);
+       gotoroom(WC->Hdr->HR.ReqLine);
+       switch (WC->Hdr->HR.eReqType)
+       {
+       case eGET:
+       case ePOST:
+               Tmpl = sbstr("template");
+               if (StrLength(Tmpl) > 0) 
+                       read_message(WC->WBuf, SKEY(Tmpl), msgnum, NULL, &Mime, NULL);
+               else 
+                       read_message(WC->WBuf, HKEY("view_message"), msgnum, NULL, &Mime, NULL);
+               http_transmit_thing(ChrPtr(Mime), 0);
+               break;
+       case eDELETE:
+               CmdBuf = NewStrBuf ();
+               if ((WC->CurRoom.RAFlags & UA_ISTRASH) != 0) {  /* Delete from Trash is a real delete */
+                       serv_printf("DELE %ld", msgnum);        
+               }
+               else {                  /* Otherwise move it to Trash */
+                       serv_printf("MOVE %ld|_TRASH_|0", msgnum);
+               }
+               StrBuf_ServGetln(CmdBuf);
+               GetServerStatusMsg(CmdBuf, &CitStatus, 1, 0);
+               HttpStatus(CitStatus);
+               break;
+       case eCOPY:
+               CopyMessage = 1;
+       case eMOVE:
+               if (GetHash(WC->Hdr->HTTPHeaders, HKEY("DESTINATION"), &vLine) &&
+                   (vLine!=NULL)) {
+                       Destination = (StrBuf*) vLine;
+                       serv_printf("MOVE %ld|%s|%d", msgnum, ChrPtr(Destination), CopyMessage);
+                       StrBuf_ServGetln(CmdBuf);
+                       GetServerStatusMsg(CmdBuf, NULL, 1, 0);
+                       GetServerStatus(CmdBuf, &CitStatus);
+                       HttpStatus(CitStatus);
+               }
+               else
+                       HttpStatus(500);
+               break;
+       default:
+               break;
+
+       }
+}
+
+
+/*
+ * Unadorned HTML output of an individual message, suitable
+ * for placing in a hidden iframe, for printing, or whatever
+ */
+void embed_message(void) {
+       const StrBuf *Mime;
+       long msgnum = 0L;
+       const StrBuf *Tmpl;
+       StrBuf *CmdBuf = NULL;
+
+       msgnum = StrBufExtract_long(WC->Hdr->HR.ReqLine, 0, '/');
+       if (msgnum <= 0) return;
+
+       switch (WC->Hdr->HR.eReqType)
+       {
+       case eGET:
+       case ePOST:
+               Tmpl = sbstr("template");
+               if (StrLength(Tmpl) > 0) 
+                       read_message(WC->WBuf, SKEY(Tmpl), msgnum, NULL, &Mime, NULL);
+               else 
+                       read_message(WC->WBuf, HKEY("view_message"), msgnum, NULL, &Mime, NULL);
+               http_transmit_thing(ChrPtr(Mime), 0);
+               break;
+       case eDELETE:
+               CmdBuf = NewStrBuf ();
+               if ((WC->CurRoom.RAFlags & UA_ISTRASH) != 0) {  /* Delete from Trash is a real delete */
+                       serv_printf("DELE %ld", msgnum);        
+               }
+               else {                  /* Otherwise move it to Trash */
+                       serv_printf("MOVE %ld|_TRASH_|0", msgnum);
+               }
+               StrBuf_ServGetln(CmdBuf);
+               GetServerStatusMsg(CmdBuf, NULL, 1, 0);
+               break;
+       default:
+               break;
+
+       }
+}
+
+
+/*
+ * Printable view of a message
+ */
+void print_message(void) {
+       long msgnum = 0L;
+       const StrBuf *Mime;
+
+       msgnum = StrBufExtract_long(WC->Hdr->HR.ReqLine, 0, '/');
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       hprintf("Content-type: text/html\r\n"
+               "Server: " PACKAGE_STRING "\r\n"
+               "Connection: close\r\n");
+
+       begin_burst();
+
+       read_message(WC->WBuf, HKEY("view_message_print"), msgnum, NULL, &Mime, NULL);
+
+       wDumpContent(0);
+}
+
+
+/*
+ * Display a message's headers
+ */
+void display_headers(void) {
+       long msgnum = 0L;
+       char buf[1024];
+
+       msgnum = StrBufExtract_long(WC->Hdr->HR.ReqLine, 0, '/');
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       hprintf("Content-type: text/plain\r\n"
+               "Server: %s\r\n"
+               "Connection: close\r\n",
+               PACKAGE_STRING);
+       begin_burst();
+
+       serv_printf("MSG2 %ld|1", msgnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       wc_printf("%s\n", buf);
+               }
+       }
+
+       wDumpContent(0);
+}
+
+
+/*
+ * load message pointers from the server for a "read messages" operation
+ *
+ * servcmd:            the citadel command to send to the citserver
+ */
+int load_msg_ptrs(const char *servcmd,
+                 const char *filter,
+                 StrBuf *FoundCharset,
+                 SharedMessageStatus *Stat, 
+                 void **ViewSpecific,
+                 load_msg_ptrs_detailheaders LH,
+                 StrBuf *FetchMessageList,
+                 eMessageField *MessageFieldList,
+                 long HeaderCount)
+{
+       message_summary *Msg;
+       StrBuf *Buf, *Buf2;
+       long len;
+       int n;
+       int skipit;
+       const char *Ptr = NULL;
+       int StatMajor;
+
+       Stat->lowest_found = LONG_MAX;
+       Stat->highest_found = LONG_MIN;
+
+       if (WC->summ != NULL) {
+               DeleteHash(&WC->summ);
+       }
+       WC->summ = NewHash(1, Flathash);
+       
+       Buf = NewStrBuf();
+       serv_puts(servcmd);
+       StrBuf_ServGetln(Buf);
+       StatMajor = GetServerStatus(Buf, NULL);
+       switch (StatMajor) {
+       case 1:
+               break;
+       case 8:
+               if (filter != NULL) {
+                       serv_puts(filter);
+                        serv_puts("000");
+                       break;
+               }
+               else if (FetchMessageList != NULL) {
+                       serv_putbuf(FetchMessageList);
+                       break;
+               }
+               /* fall back to empty filter in case of we were fooled... */
+               serv_puts("");
+               serv_puts("000");
+               break;
+       default:
+               FreeStrBuf(&Buf);
+               return (Stat->nummsgs);
+       }
+       Buf2 = NewStrBuf();
+       while (len = StrBuf_ServGetln(Buf), ((len >= 0) && ((len != 3) || strcmp(ChrPtr(Buf), "000")!= 0))) {
+               if (Stat->nummsgs < Stat->maxload) {
+                       skipit = 0;
+                       Ptr = NULL;
+                       Msg = (message_summary*)malloc(sizeof(message_summary));
+                       if (!Msg) {
+                               syslog(LOG_DEBUG, "malloc() error");
+                       }
+                       memset(Msg, 0, sizeof(message_summary));
+
+                       Msg->msgnum = StrBufExtractNext_long(Buf, &Ptr, '|');
+                       Msg->date = StrBufExtractNext_long(Buf, &Ptr, '|');
+                       if (MessageFieldList != NULL) {
+                               long i;
+                               for (i = 0; i < HeaderCount; i++) {
+                                       StrBufExtract_NextToken(Buf2, Buf, &Ptr, '|');
+                                       if (StrLength(Buf2) > 0) {
+                                               EvaluateMsgHdrEnum(MessageFieldList[i], Msg, Buf2, FoundCharset);
+                                       }
+                               }
+                       }
+                       else {
+                               if (Stat->nummsgs == 0) {
+                                       if (Msg->msgnum < Stat->lowest_found) {
+                                               Stat->lowest_found = Msg->msgnum;
+                                       }
+                                       if (Msg->msgnum > Stat->highest_found) {
+                                               Stat->highest_found = Msg->msgnum;
+                                       }
+                               }
+
+                               if ((Msg->msgnum == 0) && (StrLength(Buf) < 32)) {
+                                       free(Msg);
+                                       continue;
+                               }
+                       }
+                       /* 
+                        * as citserver probably gives us messages in forward date sorting
+                        * nummsgs should be the same order as the message date.
+                        */
+                       if (Msg->date == 0) {
+                               Msg->date = Stat->nummsgs;
+                               if (StrLength(Buf) < 32) 
+                                       skipit = 1;
+                       }
+                       if ((!skipit) && (LH != NULL)) {
+                               if (!LH(Buf, &Ptr, Msg, Buf2, ViewSpecific)){
+                                       free(Msg);
+                                       continue;
+                               }                                       
+                       }
+                       n = Msg->msgnum;
+                       Put(WC->summ, (const char *)&n, sizeof(n), Msg, DestroyMessageSummary);
+               }
+               Stat->nummsgs++;
+       }
+       FreeStrBuf(&Buf2);
+       FreeStrBuf(&Buf);
+       return (Stat->nummsgs);
+}
+
+
+/*
+ * sets FlagToSet for each of ScanMe that appears in MatchMSet
+ * ScanMe:      List of BasicMsgStruct to be searched it MatchSet
+ * MatchMSet:   MSet we want to flag
+ * FlagToSet:   Flag to set on each BasicMsgStruct->Flags if in MSet
+ */
+long SetFlagsFromMSet(HashList *ScanMe, MSet *MatchMSet, int FlagToSet, int Reverse) {
+       const char *HashKey;
+       long HKLen;
+       long count = 0;
+       HashPos *at;
+       void *vMsg;
+       message_summary *Msg;
+
+       at = GetNewHashPos(ScanMe, 0);
+       while (GetNextHashPos(ScanMe, at, &HKLen, &HashKey, &vMsg)) {
+               /* Are you a new message, or an old message? */
+               Msg = (message_summary*) vMsg;
+               if (Reverse && IsInMSetList(MatchMSet, Msg->msgnum)) {
+                       Msg->Flags = Msg->Flags | FlagToSet;
+                       count++;
+               }
+               else if (!Reverse && !IsInMSetList(MatchMSet, Msg->msgnum)) {
+                       Msg->Flags = Msg->Flags | FlagToSet;
+                       count++;
+               }
+       }
+       DeleteHashPos(&at);
+       return count;
+}
+
+
+long load_seen_flags(void) {
+       long count = 0;
+       StrBuf *OldMsg;
+       MSet *MatchMSet;
+
+       OldMsg = NewStrBuf();
+       serv_puts("GTSN");
+       StrBuf_ServGetln(OldMsg);
+       if (GetServerStatus(OldMsg, NULL) == 2) {
+               StrBufCutLeft(OldMsg, 4);
+       }
+       else {
+               FreeStrBuf(&OldMsg);
+               return 0;
+       }
+
+       if (ParseMSet(&MatchMSet, OldMsg))
+       {
+               count = SetFlagsFromMSet(WC->summ, MatchMSet, MSGFLAG_READ, 0);
+       }
+       DeleteMSet(&MatchMSet);
+       FreeStrBuf(&OldMsg);
+       return count;
+}
+
+extern readloop_struct rlid[];
+
+typedef struct _RoomRenderer{
+       int RoomType;
+
+       GetParamsGetServerCall_func GetParamsGetServerCall;
+       
+       PrintViewHeader_func PrintPageHeader;
+       PrintViewHeader_func PrintViewHeader;
+       LoadMsgFromServer_func LoadMsgFromServer;
+       RenderView_or_Tail_func RenderView_or_Tail;
+       View_Cleanup_func ViewCleanup;
+       load_msg_ptrs_detailheaders LHParse;
+       long HeaderCount;
+       StrBuf *FetchMessageList;
+       eMessageField *MessageFieldList;
+} RoomRenderer;
+
+
+/*
+ * command loop for reading messages
+ *
+ * Set oper to "readnew" or "readold" or "readfwd" or "headers" or "readgt" or "readlt" or "do_search"
+ */
+void readloop(long oper, eCustomRoomRenderer ForceRenderer) {
+       RoomRenderer *ViewMsg;
+       void *vViewMsg;
+       void *vMsg;
+       message_summary *Msg;
+       char cmd[256] = "";
+       char filter[256] = "";
+       int i, r;
+       HashPos *at;
+       const char *HashKey;
+       long HKLen;
+       WCTemplputParams SubTP;
+       SharedMessageStatus Stat;
+       void *ViewSpecific = NULL;
+
+       if (havebstr("is_summary") && (1 == (ibstr("is_summary")))) {
+               WC->CurRoom.view = VIEW_MAILBOX;
+       }
+
+       if (havebstr("view")) {
+               WC->CurRoom.view = ibstr("view");
+       }
+
+       memset(&Stat, 0, sizeof(SharedMessageStatus));
+       Stat.maxload = 10000;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       if (ForceRenderer == eUseDefault)
+               GetHash(ReadLoopHandler, IKEY(WC->CurRoom.view), &vViewMsg);
+       else 
+               GetHash(ReadLoopHandler, IKEY(ForceRenderer), &vViewMsg);
+       if (vViewMsg == NULL) {
+               WC->CurRoom.view = VIEW_BBS;
+               GetHash(ReadLoopHandler, IKEY(WC->CurRoom.view), &vViewMsg);
+       }
+       if (vViewMsg == NULL) {
+               return;                 /* TODO: print message */
+       }
+
+       ViewMsg = (RoomRenderer*) vViewMsg;
+       if (ViewMsg->PrintPageHeader == NULL)
+               output_headers(1, 1, 1, 0, 0, 0);
+       else 
+               ViewMsg->PrintPageHeader(&Stat, ViewSpecific);
+
+       if (ViewMsg->GetParamsGetServerCall != NULL) {
+               r = ViewMsg->GetParamsGetServerCall(
+                      &Stat,
+                      &ViewSpecific,
+                      oper,
+                      cmd, sizeof(cmd),
+                      filter, sizeof(filter)
+               );
+       } else {
+               r = 0;
+       }
+
+       switch(r)
+       {
+       case 400:
+       case 404:
+
+               return;
+       case 300: /* the callback hook should do the work for us here, since he knows what to do. */
+               return;
+       case 200:
+       default:
+               break;
+       }
+       if (!IsEmptyStr(cmd)) {
+               const char *p = NULL;
+               StrBuf *FoundCharset = NULL;
+               if (!IsEmptyStr(filter))
+                       p = filter;
+               if (ViewMsg->HeaderCount > 0) {
+                       FoundCharset = NewStrBuf();
+               }
+               Stat.nummsgs = load_msg_ptrs(cmd, p,
+                                            FoundCharset,
+                                            &Stat,
+                                            &ViewSpecific,
+                                            ViewMsg->LHParse,
+                                            ViewMsg->FetchMessageList,
+                                            ViewMsg->MessageFieldList,
+                                            ViewMsg->HeaderCount);
+               FreeStrBuf(&FoundCharset);
+       }
+
+       if (Stat.sortit) {
+               CompareFunc SortIt;
+               StackContext(NULL, &SubTP, NULL, CTX_MAILSUM, 0, NULL);
+               {
+                       SortIt =  RetrieveSort(&SubTP,
+                                              NULL, 0,
+                                              HKEY("date"),
+                                              Stat.defaultsortorder);
+               }
+               UnStackContext(&SubTP);
+               if (SortIt != NULL)
+                       SortByPayload(WC->summ, SortIt);
+       }
+       if (Stat.startmsg < 0) {
+               Stat.startmsg =  0;
+       }
+
+       if (Stat.load_seen) Stat.numNewmsgs = load_seen_flags();
+       
+        /*
+        * Print any inforation above the message list...
+        */
+       if (ViewMsg->PrintViewHeader != NULL)
+               ViewMsg->PrintViewHeader(&Stat, &ViewSpecific);
+
+       WC->startmsg =  Stat.startmsg;
+       WC->maxmsgs = Stat.maxmsgs;
+       WC->num_displayed = 0;
+
+       /* Put some helpful data in vars for mailsummary_json */
+       {
+               StrBuf *Foo;
+               
+               Foo = NewStrBuf ();
+               StrBufPrintf(Foo, "%ld", Stat.nummsgs);
+               PutBstr(HKEY("__READLOOP:TOTALMSGS"), NewStrBufDup(Foo)); /* keep Foo! */
+
+               StrBufPrintf(Foo, "%ld", Stat.numNewmsgs);
+               PutBstr(HKEY("__READLOOP:NEWMSGS"), NewStrBufDup(Foo)); /* keep Foo! */
+
+               StrBufPrintf(Foo, "%ld", Stat.startmsg);
+               PutBstr(HKEY("__READLOOP:STARTMSG"), Foo); /* store Foo elsewhere, descope it here. */
+       }
+
+       /*
+        * iterate over each message. if we need to load an attachment, do it here. 
+        */
+
+       if ((ViewMsg->LoadMsgFromServer != NULL) && (!IsEmptyStr(cmd))) {
+               at = GetNewHashPos(WC->summ, 0);
+               Stat.num_displayed = i = 0;
+               while ( GetNextHashPos(WC->summ, at, &HKLen, &HashKey, &vMsg)) {
+                       Msg = (message_summary*) vMsg;          
+                       if ((Msg->msgnum >= Stat.startmsg) && (Stat.num_displayed <= Stat.maxmsgs)) {
+                               ViewMsg->LoadMsgFromServer(&Stat, 
+                                                          &ViewSpecific, 
+                                                          Msg, 
+                                                          (Msg->Flags & MSGFLAG_READ) != 0, 
+                                                          i);
+                       } 
+                       i++;
+               }
+               DeleteHashPos(&at);
+       }
+
+       /*
+        * Done iterating the message list. now tasks we want to do after.
+        */
+       if (ViewMsg->RenderView_or_Tail != NULL)
+               ViewMsg->RenderView_or_Tail(&Stat, &ViewSpecific, oper);
+
+       if (ViewMsg->ViewCleanup != NULL)
+               ViewMsg->ViewCleanup(&ViewSpecific);
+
+       WC->startmsg = 0;
+       WC->maxmsgs = 0;
+       if (WC->summ != NULL) {
+               DeleteHash(&WC->summ);
+       }
+}
+
+
+// Back end for post_message()
+// This is where the actual message gets transmitted to the server.
+void post_mime_to_server(void) {
+       char top_boundary[SIZ];
+       char alt_boundary[SIZ];
+       int is_multipart = 0;
+       static int seq = 0;
+       wc_mime_attachment *att;
+       char *encoded;
+       size_t encoded_length;
+       size_t encoded_strlen;
+       char *txtmail = NULL;
+       int include_text_alt = 0;       /* Set to nonzero to include multipart/alternative text/plain */
+
+       sprintf(top_boundary, "Citadel--Multipart--%s--%04x--%04x",
+               ChrPtr(WC->serv_info->serv_fqdn),
+               getpid(),
+               ++seq
+       );
+       sprintf(alt_boundary, "Citadel--Multipart--%s--%04x--%04x",
+               ChrPtr(WC->serv_info->serv_fqdn),
+               getpid(),
+               ++seq
+       );
+
+       /* RFC2045 requires this, and some clients look for it... */
+       serv_puts("MIME-Version: 1.0");
+       serv_puts("X-Mailer: " PACKAGE_STRING);
+
+       /* If there are attachments, we have to do multipart/mixed */
+       syslog(LOG_DEBUG, "This message will have %d attachments", GetCount(WC->attachments));
+       if (GetCount(WC->attachments) > 0) {
+               is_multipart = 1;
+       }
+
+       /* Only do multipart/alternative for mailboxes.  BBS and Wiki rooms don't need it. */
+       if ((WC->CurRoom.view == VIEW_MAILBOX) || (WC->CurRoom.view == VIEW_JSON_LIST)) {
+               include_text_alt = 1;
+       }
+
+       if (is_multipart) {
+               /* Remember, serv_printf() appends an extra newline */
+               serv_printf("Content-type: multipart/mixed; boundary=\"%s\"\n", top_boundary);
+               serv_printf("This is a multipart message in MIME format.\n");
+               serv_printf("--%s", top_boundary);
+       }
+
+       /* Remember, serv_printf() appends an extra newline */
+       if (include_text_alt) {
+               StrBuf *Buf;
+               serv_printf("Content-type: multipart/alternative; boundary=\"%s\"\n", alt_boundary);
+               serv_printf("This is a multipart message in MIME format.\n");
+               serv_printf("--%s", alt_boundary);
+
+               serv_puts("Content-type: text/plain; charset=utf-8");
+               serv_puts("Content-Transfer-Encoding: quoted-printable");
+               serv_puts("");
+               txtmail = html_to_ascii(bstr("msgtext"), 0, 80, 0);
+               Buf = NewStrBufPlain(txtmail, -1);
+               free(txtmail);
+
+               text_to_server_qp(Buf);     /* Transmit message in quoted-printable encoding */
+               FreeStrBuf(&Buf);
+               serv_printf("\n--%s", alt_boundary);
+       }
+
+       serv_puts("Content-type: text/html; charset=utf-8");
+       serv_puts("Content-Transfer-Encoding: quoted-printable");
+       serv_puts("");
+       serv_puts("<html><body>\r\n");
+       text_to_server_qp(sbstr("msgtext"));    /* Transmit message in quoted-printable encoding */
+       serv_puts("</body></html>\r\n");
+
+       if (include_text_alt) {
+               serv_printf("--%s--", alt_boundary);
+       }
+       
+       if (is_multipart) {
+               long len;
+               const char *Key; 
+               void *vAtt;
+               HashPos  *it;
+
+               /* Add in the attachments */
+               it = GetNewHashPos(WC->attachments, 0);
+               while (GetNextHashPos(WC->attachments, it, &len, &Key, &vAtt)) {
+                       att = (wc_mime_attachment *)vAtt;
+                       if (att->length == 0)
+                               continue;
+
+                       encoded_length = att->length + (att->length / 2);       // make it 150% of the original size for encoding
+                       encoded = malloc(encoded_length);
+                       if (!encoded) {
+                               syslog(LOG_ERR, "malloc() error");
+                               break;
+                       }
+                       syslog(LOG_DEBUG, "Attachment: raw len %d", StrLength(att->Data));
+                       encoded_strlen = CtdlEncodeBase64(encoded, ChrPtr(att->Data), StrLength(att->Data), BASE64_YES_LINEBREAKS);
+                       syslog(LOG_DEBUG, "Attachment: encoded len %d", encoded_strlen);
+
+                       serv_printf("--%s", top_boundary);
+                       serv_printf("Content-type: %s", ChrPtr(att->ContentType));
+                       serv_printf("Content-disposition: attachment; filename=\"%s\"", ChrPtr(att->FileName));
+                       serv_puts("Content-transfer-encoding: base64");
+                       serv_puts("");
+                       serv_write(encoded, encoded_strlen);
+                       serv_puts("");
+                       serv_puts("");
+                       free(encoded);
+               }
+               serv_printf("--%s--", top_boundary);
+               DeleteHashPos(&it);
+       }
+
+       serv_puts("000");
+}
+
+
+/*
+ * Post message (or don't post message)
+ *
+ * Note regarding the "dont_post" variable:
+ * A random value (actually, it's just a timestamp) is inserted as a hidden
+ * field called "postseq" when the display_enter page is generated.  This
+ * value is checked when posting, using the static variable dont_post.  If a
+ * user attempts to post twice using the same dont_post value, the message is
+ * discarded.  This prevents the accidental double-saving of the same message
+ * if the user happens to click the browser "back" button.
+ */
+void post_message(void) {
+       StrBuf *UserName;
+       StrBuf *EmailAddress;
+       StrBuf *EncBuf;
+       char buf[1024];
+       StrBuf *encoded_subject = NULL;
+       static long dont_post = (-1L);
+       int is_anonymous = 0;
+       const StrBuf *display_name = NULL;
+       StrBuf *Buf;
+       
+       if (havebstr("force_room")) {
+               gotoroom(sbstr("force_room"));
+       }
+
+       if (havebstr("display_name")) {
+               display_name = sbstr("display_name");
+               if (!strcmp(ChrPtr(display_name), "__ANONYMOUS__")) {
+                       display_name = NULL;
+                       is_anonymous = 1;
+               }
+       }
+
+       if (!strcasecmp(bstr("submit_action"), "cancel")) {
+               AppendImportantMessage(_("Cancelled.  Message was not posted."), -1);
+       } else if (lbstr("postseq") == dont_post) {
+               AppendImportantMessage(
+                       _("Automatically cancelled because you have already "
+                         "saved this message."), -1);
+       } else {
+               const char CMD[] = "ENT0 1|%s|%d|4|%s|%s||%s|%s|%s|%s|%s";
+               StrBuf *Recp = NULL; 
+               StrBuf *Cc = NULL;
+               StrBuf *Bcc = NULL;
+               StrBuf *wikipage = NULL;
+               const StrBuf *my_email_addr = NULL;
+               StrBuf *CmdBuf = NULL;
+               StrBuf *references = NULL;
+               int saving_to_drafts = 0;
+               long HeaderLen = 0;
+
+               saving_to_drafts = !strcasecmp(bstr("submit_action"), "draft");
+               Buf = NewStrBuf();
+
+               if (saving_to_drafts) {
+                       /* temporarily change to the drafts room */
+                       serv_puts("GOTO _DRAFTS_");
+                       StrBuf_ServGetln(Buf);
+                       if (GetServerStatusMsg(Buf, NULL, 1, 2) != 2) {
+                               /* You probably don't even have a dumb Drafts folder */
+                               syslog(LOG_DEBUG, "%s:%d: server save to drafts error: %s\n", __FILE__, __LINE__, ChrPtr(Buf) + 4);
+                               AppendImportantMessage(_("Saved to Drafts failed: "), -1);
+                               display_enter();
+                               FreeStrBuf(&Buf);
+                               return;
+                       }
+               }
+
+               if (havebstr("references"))
+               {
+                       const StrBuf *ref = sbstr("references");
+                       references = NewStrBufDup(ref);
+                       if (*ChrPtr(references) == '|') {       /* remove leading '|' if present */
+                               StrBufCutLeft(references, 1);
+                       }
+                       StrBufReplaceChars(references, '|', '!');
+               }
+               if (havebstr("subject")) {
+                       const StrBuf *Subj;
+                       /*
+                        * make enough room for the encoded string; 
+                        * plus the QP header 
+                        */
+                       Subj = sbstr("subject");
+                       
+                       StrBufRFC2047encode(&encoded_subject, Subj);
+               }
+               UserName = NewStrBuf();
+               EmailAddress = NewStrBuf();
+               EncBuf = NewStrBuf();
+
+               Recp = StrBufSanitizeEmailRecipientVector(sbstr("recp"), UserName, EmailAddress, EncBuf);
+               Cc = StrBufSanitizeEmailRecipientVector(sbstr("cc"), UserName, EmailAddress, EncBuf);
+               Bcc = StrBufSanitizeEmailRecipientVector(sbstr("bcc"), UserName, EmailAddress, EncBuf);
+
+               FreeStrBuf(&UserName);
+               FreeStrBuf(&EmailAddress);
+               FreeStrBuf(&EncBuf);
+
+               wikipage = NewStrBufDup(sbstr("page"));
+               str_wiki_index(wikipage);
+               my_email_addr = sbstr("my_email_addr");
+               
+               HeaderLen = StrLength(Recp) + 
+                       StrLength(encoded_subject) +
+                       StrLength(Cc) +
+                       StrLength(Bcc) + 
+                       StrLength(wikipage) +
+                       StrLength(my_email_addr) + 
+                       StrLength(references);
+               CmdBuf = NewStrBufPlain(NULL, sizeof (CMD) + HeaderLen);
+               StrBufPrintf(CmdBuf, 
+                            CMD,
+                            saving_to_drafts?"":ChrPtr(Recp),
+                            is_anonymous,
+                            ChrPtr(encoded_subject),
+                            ChrPtr(display_name),
+                            saving_to_drafts?"":ChrPtr(Cc),
+                            saving_to_drafts?"":ChrPtr(Bcc),
+                            ChrPtr(wikipage),
+                            ChrPtr(my_email_addr),
+                            ChrPtr(references));
+               FreeStrBuf(&references);
+               FreeStrBuf(&encoded_subject);
+               free(wikipage);
+
+               if ((HeaderLen + StrLength(sbstr("msgtext")) < 10) && 
+                   (GetCount(WC->attachments) == 0)){
+                       AppendImportantMessage(_("Refusing to post empty message.\n"), -1);
+                       FreeStrBuf(&CmdBuf);
+                               
+               }
+               else 
+               {
+                       syslog(LOG_DEBUG, "%s\n", ChrPtr(CmdBuf));
+                       serv_puts(ChrPtr(CmdBuf));
+                       FreeStrBuf(&CmdBuf);
+
+                       StrBuf_ServGetln(Buf);
+                       if (GetServerStatus(Buf, NULL) == 4) {
+                               if (saving_to_drafts) {
+                                       if (  (havebstr("recp"))
+                                             || (havebstr("cc"  ))
+                                             || (havebstr("bcc" )) ) {
+                                               /* save recipient headers or room to post to */
+                                               serv_printf("To: %s", ChrPtr(Recp));
+                                               serv_printf("Cc: %s", ChrPtr(Cc));
+                                               serv_printf("Bcc: %s", ChrPtr(Bcc));
+                                       } else {
+                                               serv_printf("X-Citadel-Room: %s", ChrPtr(WC->CurRoom.name));
+                                       }
+                               }
+                               post_mime_to_server();
+                               if (saving_to_drafts) {
+                                       AppendImportantMessage(_("Message has been saved to Drafts.\n"), -1);
+                                       gotoroom(WC->CurRoom.name);
+                                       fixview();
+                                       readloop(readnew, eUseDefault);
+                                       FreeStrBuf(&Buf);
+                                       return;
+                               } else if (  (havebstr("recp"))
+                                            || (havebstr("cc"  ))
+                                            || (havebstr("bcc" ))
+                                       ) {
+                                       AppendImportantMessage(_("Message has been sent.\n"), -1);
+                               }
+                               else {
+                                       AppendImportantMessage(_("Message has been posted.\n"), -1);
+                               }
+                               dont_post = lbstr("postseq");
+                       } else {
+                               syslog(LOG_DEBUG, "%s:%d: server post error: %s", __FILE__, __LINE__, ChrPtr(Buf) + 4);
+                               AppendImportantMessage(ChrPtr(Buf) + 4, StrLength(Buf) - 4);
+                               display_enter();
+                               if (saving_to_drafts) gotoroom(WC->CurRoom.name);
+                               FreeStrBuf(&Recp);
+                               FreeStrBuf(&Buf);
+                               FreeStrBuf(&Cc);
+                               FreeStrBuf(&Bcc);
+                               return;
+                       }
+               }
+               FreeStrBuf(&Recp);
+               FreeStrBuf(&Buf);
+               FreeStrBuf(&Cc);
+               FreeStrBuf(&Bcc);
+       }
+
+       DeleteHash(&WC->attachments);
+
+       /*
+        *  We may have been supplied with instructions regarding the location
+        *  to which we must return after posting.  If found, go there.
+        */
+       if (havebstr("return_to")) {
+               http_redirect(bstr("return_to"));
+       }
+       /*
+        *  If we were editing a page in a wiki room, go to that page now.
+        */
+       else if (havebstr("page")) {
+               snprintf(buf, sizeof buf, "wiki?page=%s", bstr("page"));
+               http_redirect(buf);
+       }
+       /*
+        *  Otherwise, just go to the "read messages" loop.
+        */
+       else {
+               fixview();
+               readloop(readnew, eUseDefault);
+       }
+}
+
+
+/*
+ * Client is uploading an attachment
+ */
+void upload_attachment(void) {
+       const char *pch;
+       int n;
+       const char *newn;
+       long newnlen;
+       void *v;
+       wc_mime_attachment *att;
+       const StrBuf *Tmpl = sbstr("template");
+       const StrBuf *MimeType = NULL;
+       const StrBuf *UID;
+
+       begin_burst();
+       syslog(LOG_DEBUG, "upload_attachment()");
+       if (!Tmpl) {
+               wc_printf("upload_attachment()<br>\n");
+       }
+
+       if (WC->upload_length <= 0) {
+               syslog(LOG_DEBUG, "ERROR no attachment was uploaded\n");
+               if (Tmpl) {
+                       putlbstr("UPLOAD_ERROR", 1);
+                       MimeType = DoTemplate(SKEY(Tmpl), NULL, &NoCtx);
+               }
+               else {
+                       wc_printf("ERROR no attachment was uploaded<br>\n");
+               }
+               http_transmit_thing(ChrPtr(MimeType), 0);
+
+               return;
+       }
+
+       syslog(LOG_DEBUG, "Client has uploaded %d bytes", WC->upload_length);
+       if (Tmpl) {
+               putlbstr("UPLOAD_LENGTH", WC->upload_length);
+       }
+       else {
+               wc_printf("Client is uploading %d bytes<br>\n", WC->upload_length);
+       }
+
+       att = (wc_mime_attachment*)malloc(sizeof(wc_mime_attachment));
+       if (!att) {
+               syslog(LOG_DEBUG, "malloc() error");
+       }
+       memset(att, 0, sizeof(wc_mime_attachment ));
+       att->length = WC->upload_length;
+       att->ContentType = NewStrBufPlain(WC->upload_content_type, -1);
+       att->FileName = NewStrBufDup(WC->upload_filename);
+       UID = sbstr("qquuid");
+       if (UID) {
+               att->PartNum = NewStrBufDup(UID);
+       }
+
+       syslog(LOG_DEBUG, "attachment length: %d", att->length);
+       syslog(LOG_DEBUG, "att. content type: %s", ChrPtr(att->ContentType));
+       syslog(LOG_DEBUG, "att upload buffer: %s", ((WC->upload == NULL) ? "null" : "not null"));
+
+
+       if (WC->attachments == NULL) {
+               WC->attachments = NewHash(1, Flathash);
+       }
+
+       /* And add it to the list. */
+       n = 0;
+       if ((GetCount(WC->attachments) > 0) && GetHashAt(WC->attachments, GetCount(WC->attachments) -1, &newnlen, &newn, &v)) {
+               n = *((int*) newn) + 1;
+       }
+       Put(WC->attachments, IKEY(n), att, DestroyMime);
+
+       /*
+        * Mozilla sends a simple filename, which is what we want,
+        * but Satan's Browser sends an entire pathname.  Reduce
+        * the path to just a filename if we need to.
+        */
+       pch = strrchr(ChrPtr(att->FileName), '/');
+       if (pch != NULL) {
+               StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1);
+       }
+       pch = strrchr(ChrPtr(att->FileName), '\\');
+       if (pch != NULL) {
+               StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1);
+       }
+
+       /*
+        * Transfer control of this memory from the upload struct
+        * to the attachment struct.
+        */
+       att->Data = WC->upload;
+       WC->upload = NULL;
+       WC->upload_length = 0;
+       
+       if (Tmpl) MimeType = DoTemplate(SKEY(Tmpl), NULL, &NoCtx);
+       http_transmit_thing(ChrPtr(MimeType), 0);
+}
+
+
+/*
+ * Remove an attachment from the message currently being composed.
+ *
+ * Currently we identify the attachment to be removed by its filename.
+ * There is probably a better way to do this.
+ */
+void remove_attachment(void) {
+       wc_mime_attachment *att;
+       void *vAtt;
+       StrBuf *WhichAttachment;
+       HashPos *at;
+       long len;
+       int found=0;
+       const char *key;
+
+       WhichAttachment = NewStrBufDup(sbstr("which_attachment"));
+       if (ChrPtr(WhichAttachment)[0] == '/')
+               StrBufCutLeft(WhichAttachment, 1);
+       StrBufUnescape(WhichAttachment, 0);
+       at = GetNewHashPos(WC->attachments, 0);
+       do {
+               vAtt = NULL;
+               GetHashPos(WC->attachments, at, &len, &key, &vAtt);
+
+               att = (wc_mime_attachment*) vAtt;
+               if ((att != NULL) &&
+                   (
+                           !strcmp(ChrPtr(WhichAttachment), ChrPtr(att->FileName)) ||
+                   ((att->PartNum != NULL) &&
+                    !strcmp(ChrPtr(WhichAttachment), ChrPtr(att->PartNum)))
+                           ))
+               {
+                       DeleteEntryFromHash(WC->attachments, at);
+                       found=1;
+                       break;
+               }
+       }
+       while (NextHashPos(WC->attachments, at));
+
+       FreeStrBuf(&WhichAttachment);
+       wc_printf("remove_attachment(%d) completed\n", found);
+}
+
+
+const char *ReplyToModeStrings [3] = {
+       "reply",
+       "replyall",
+       "forward"
+};
+typedef enum _eReplyToNodes {
+       eReply,
+       eReplyAll,
+       eForward
+}eReplyToNodes;
+
+
+/*
+ * display the message entry screen
+ */
+void display_enter(void) {
+       const char *ReplyingModeStr;
+       eReplyToNodes ReplyMode = eReply;
+       StrBuf *Line;
+       long Result;
+       int rc;
+       const StrBuf *display_name = NULL;
+       int recipient_required = 0;
+       int subject_required = 0;
+       int is_anonymous = 0;
+       int i = 0;
+       long replying_to;
+
+       if (havebstr("force_room")) {
+               gotoroom(sbstr("force_room"));
+       }
+
+       display_name = sbstr("display_name");
+       if (!strcmp(ChrPtr(display_name), "__ANONYMOUS__")) {
+               display_name = NULL;
+               is_anonymous = 1;
+       }
+
+       /*
+        * First, do we have permission to enter messages in this room at all?
+        */
+       Line = NewStrBuf();
+       serv_puts("ENT0 0");
+       StrBuf_ServGetln(Line);
+       rc = GetServerStatusMsg(Line, &Result, 0, 2);
+
+       if (Result == 570) {            /* 570 means that we need a recipient here */
+               recipient_required = 1;
+       }
+       else if (rc != 2) {             /* Any other error means that we cannot continue */
+               rc = GetServerStatusMsg(Line, &Result, 0, 2);
+               fixview();
+               readloop(readnew, eUseDefault);
+               FreeStrBuf(&Line);
+               return;
+       }
+
+       /* Is the server strongly recommending that the user enter a message subject? */
+       if (StrLength(Line) > 4) {
+               subject_required = extract_int(ChrPtr(Line) + 4, 1);
+       }
+
+       /*
+        * Are we perhaps in an address book view?  If so, then an "enter
+        * message" command really means "add new entry."
+        */
+       if (WC->CurRoom.defview == VIEW_ADDRESSBOOK) {
+               do_edit_vcard(-1, "", NULL, NULL, "",  ChrPtr(WC->CurRoom.name));
+               FreeStrBuf(&Line);
+               return;
+       }
+
+       /*
+        * Are we perhaps in a calendar room?  If so, then an "enter message" command really means "add new calendar item."
+        */
+       if (WC->CurRoom.defview == VIEW_CALENDAR) {
+               display_edit_event();
+               FreeStrBuf(&Line);
+               return;
+       }
+
+       /*
+        * Are we perhaps in a tasks view?  If so, then an "enter
+        * message" command really means "add new task."
+        */
+       if (WC->CurRoom.defview == VIEW_TASKS) {
+               display_edit_task();
+               FreeStrBuf(&Line);
+               return;
+       }
+
+       ReplyingModeStr = bstr("replying_mode");
+       if (ReplyingModeStr != NULL) {
+               for (i = 0; i < 3; i++) {
+                       if (strcmp(ReplyingModeStr, ReplyToModeStrings[i]) == 0) {
+                               ReplyMode = (eReplyToNodes) i;
+                               break;
+                       }
+               }
+       }
+
+       /*
+        * If the "replying_to" variable is set, it refers to a message
+        * number from which we must extract some header fields...
+        */
+       replying_to = lbstr("replying_to");
+       if (replying_to > 0) {
+               long len;
+               StrBuf *wefw = NULL;
+               StrBuf *msgn = NULL;
+               StrBuf *from = NULL;
+               StrBuf *rfca = NULL;
+               StrBuf *rcpt = NULL;
+               StrBuf *cccc = NULL;
+               StrBuf *replyto = NULL;
+               StrBuf *nvto = NULL;
+               int message_originated_locally = 0;
+               serv_printf("MSG0 %ld|1", replying_to); 
+
+               StrBuf_ServGetln(Line);
+               if (GetServerStatusMsg(Line, NULL, 0, 0) == 1)
+                       while (len = StrBuf_ServGetln(Line), (len >= 0) && ((len != 3) || strcmp(ChrPtr(Line), "000"))) {
+                               eMessageField which;
+                               if ((StrLength(Line) > 4) && (ChrPtr(Line)[4] == '=') && GetFieldFromMnemonic(&which, ChrPtr(Line))) switch (which) {
+                                       case eMsgSubject: {
+                                               StrBuf *subj = NewStrBuf();
+                                               StrBuf *FlatSubject;
+
+                                               if (ReplyMode == eForward) {
+                                                       if (strncasecmp(ChrPtr(Line) + 5, "Fw:", 3)) {
+                                                               StrBufAppendBufPlain(subj, HKEY("Fw: "), 0);
+                                                       }
+                                               }
+                                               else {
+                                                       if (strncasecmp(ChrPtr(Line) + 5, "Re:", 3)) {
+                                                               StrBufAppendBufPlain(subj, HKEY("Re: "), 0);
+                                                       }
+                                               }
+                                               StrBufAppendBufPlain(subj, 
+                                                                    ChrPtr(Line) + 5, 
+                                                                    StrLength(Line) - 5, 0);
+                                               FlatSubject = NewStrBufPlain(NULL, StrLength(subj));
+                                               StrBuf_RFC822_to_Utf8(FlatSubject, subj, NULL, NULL);
+
+                                               PutBstr(HKEY("subject"), FlatSubject);
+                                       }
+                                               break;
+
+                                       case eIsLocal: {
+                                               message_originated_locally = 1;
+                                               break;
+                                       }
+
+                                       case eWeferences:
+                                       {
+                                               int rrtok;
+                                               int rrlen;
+
+                                               wefw = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                       
+                                               /* Trim down excessively long lists of thread references.  We eliminate the
+                                                * second one in the list so that the thread root remains intact.
+                                                */
+                                               rrtok = num_tokens(ChrPtr(wefw), '|');
+                                               rrlen = StrLength(wefw);
+                                               if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) {
+                                                       StrBufRemove_token(wefw, 1, '|');
+                                               }
+                                               break;
+                                       }
+
+                                       case emessageId:
+                                               msgn = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                               break;
+
+                                       case eAuthor: {
+                                               StrBuf *FlatFrom;
+                                               from = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                               FlatFrom = NewStrBufPlain(NULL, StrLength(from));
+                                               StrBuf_RFC822_to_Utf8(FlatFrom, from, NULL, NULL);
+                                               FreeStrBuf(&from);
+                                               from = FlatFrom;
+                                               for (i=0; i<StrLength(from); ++i) {
+                                                       if (ChrPtr(from)[i] == ',')
+                                                               StrBufPeek(from, NULL, i, ' ');
+                                               }
+                                               break;
+                                       }
+                                       case eRecipient:
+                                               rcpt = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                               break;
+                                       case eCarbonCopY:
+                                               cccc = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                               break;
+                                       case eReplyTo:
+                                               replyto = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                               break;
+                                       case erFc822Addr: {
+                                               StrBuf *FlatRFCA;
+                                               rfca = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                               FlatRFCA = NewStrBufPlain(NULL, StrLength(rfca));
+                                               StrBuf_RFC822_to_Utf8(FlatRFCA, rfca, NULL, NULL);
+                                               FreeStrBuf(&rfca);
+                                               rfca = FlatRFCA;
+                                               break;
+                                       }
+                                       case eenVelopeTo:
+                                               nvto = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                               putbstr("nvto", nvto);
+                                               break;
+                                       case eXclusivID:
+                                       case eJournal:
+                                       case eListID:
+                                       case eMesageText:
+                                       case eMessagePath:
+                                       case eSpecialField:
+                                       case eTimestamp:
+                                       case eHeaderOnly:
+                                       case eFormatType:
+                                       case eMessagePart:
+                                       case eSubFolder:
+                                       case eLastHeader:
+                                               break;
+
+                                       }
+                       }
+
+
+               if (StrLength(wefw) + StrLength(msgn) > 0) {
+                       StrBuf *refs = NewStrBuf();
+                       if (StrLength(wefw) > 0) {
+                               StrBufAppendBuf(refs, wefw, 0);
+                       }
+                       if ( (StrLength(wefw) > 0) && 
+                            (StrLength(msgn) > 0) ) 
+                       {
+                               StrBufAppendBufPlain(refs, HKEY("|"), 0);
+                       }
+                       if (StrLength(msgn) > 0) {
+                               StrBufAppendBuf(refs, msgn, 0);
+                       }
+                       PutBstr(HKEY("references"), refs);
+               }
+
+               /*
+                * If this is a Reply or a ReplyAll, copy the sender's email into the To: field
+                */
+               if ((ReplyMode == eReply) || (ReplyMode == eReplyAll)) {
+                       StrBuf *to_rcpt;
+
+                       if ((StrLength(replyto) > 0) && (ReplyMode == eReplyAll)) {
+                               to_rcpt = NewStrBuf();
+                               StrBufAppendBuf(to_rcpt, replyto, 0);
+                       }
+
+                       else if ( (StrLength(rfca) > 0) && (message_originated_locally == 0) ) {
+                               to_rcpt = NewStrBuf();
+                               StrBufAppendBuf(to_rcpt, from, 0);
+                               StrBufAppendBufPlain(to_rcpt, HKEY(" <"), 0);
+                               StrBufAppendBuf(to_rcpt, rfca, 0);
+                               StrBufAppendBufPlain(to_rcpt, HKEY(">"), 0);
+                       }
+
+                       else {
+                               to_rcpt =  from;
+                               from = NULL;
+                       }
+                       PutBstr(HKEY("recp"), to_rcpt);
+               }
+
+               /*
+                * Only if this is a ReplyAll, copy all recipients into the Cc: field
+                */
+               if (ReplyMode == eReplyAll) {
+                       StrBuf *cc_rcpt = rcpt;
+                       rcpt = NULL;
+                       if ((StrLength(cccc) > 0) && (StrLength(replyto) == 0)) {
+                               if (cc_rcpt != NULL)  {
+                                       StrBufAppendPrintf(cc_rcpt, ", ");
+                                       StrBufAppendBuf(cc_rcpt, cccc, 0);
+                               }
+                               else {
+                                       cc_rcpt = cccc;
+                                       cccc = NULL;
+                               }
+                       }
+                       if (cc_rcpt != NULL) {
+                               PutBstr(HKEY("cc"), cc_rcpt);
+                       }
+               }
+
+               // We might not need these logs anymore.
+               syslog(LOG_DEBUG, "wefw = %s", ChrPtr(wefw));
+               syslog(LOG_DEBUG, "msgn = %s", ChrPtr(msgn));
+               syslog(LOG_DEBUG, "from = %s", ChrPtr(from));
+               syslog(LOG_DEBUG, "rfca = %s", ChrPtr(rfca));
+               syslog(LOG_DEBUG, "rcpt = %s", ChrPtr(rcpt));
+               syslog(LOG_DEBUG, "cccc = %s", ChrPtr(cccc));
+               syslog(LOG_DEBUG, "replyto = %s", ChrPtr(replyto));
+               syslog(LOG_DEBUG, "nvto = %s", ChrPtr(nvto));
+               syslog(LOG_DEBUG, "local = %d" , message_originated_locally);
+
+               FreeStrBuf(&wefw);
+               FreeStrBuf(&msgn);
+               FreeStrBuf(&from);
+               FreeStrBuf(&rfca);
+               FreeStrBuf(&rcpt);
+               FreeStrBuf(&cccc);
+       }
+       FreeStrBuf(&Line);
+
+       /*
+        * Otherwise proceed normally.
+        * Do a custom room banner with no navbar...
+        */
+       if (recipient_required) {
+               const StrBuf *Recp = NULL; 
+               const StrBuf *Cc = NULL;
+               const StrBuf *Bcc = NULL;
+               StrBuf *wikipage = NULL;
+               StrBuf *CmdBuf = NULL;
+               const char CMD[] = "ENT0 0|%s|%d|0||%s||%s|%s|%s";
+               
+               Recp = sbstr("recp");
+               Cc = sbstr("cc");
+               Bcc = sbstr("bcc");
+               wikipage = NewStrBufDup(sbstr("page"));
+               str_wiki_index(wikipage);
+               
+               CmdBuf = NewStrBufPlain(NULL, 
+                                       sizeof (CMD) + 
+                                       StrLength(Recp) + 
+                                       StrLength(display_name) +
+                                       StrLength(Cc) +
+                                       StrLength(Bcc) + 
+                                       StrLength(wikipage));
+
+               StrBufPrintf(CmdBuf, 
+                            CMD,
+                            ChrPtr(Recp), 
+                            is_anonymous,
+                            ChrPtr(display_name),
+                            ChrPtr(Cc), 
+                            ChrPtr(Bcc), 
+                            ChrPtr(wikipage)
+               );
+               serv_puts(ChrPtr(CmdBuf));
+               StrBuf_ServGetln(CmdBuf);
+               free(wikipage);
+
+               rc = GetServerStatusMsg(CmdBuf, &Result, 0, 0);
+
+               if (    (Result == 570)         /* invalid or missing recipient(s) */
+                       || (Result == 550)      /* higher access required to send Internet mail */
+               ) {
+                       /* These errors will have been displayed and are excusable */
+               }
+               else if (rc != 2) {     /* Any other error means that we cannot continue */
+                       AppendImportantMessage(ChrPtr(CmdBuf) + 4, StrLength(CmdBuf) - 4);
+                       FreeStrBuf(&CmdBuf);
+                       fixview();
+                       readloop(readnew, eUseDefault);
+                       return;
+               }
+               FreeStrBuf(&CmdBuf);
+       }
+       if (recipient_required)
+               PutBstr(HKEY("__RCPTREQUIRED"), NewStrBufPlain(HKEY("1")));
+       if (recipient_required || subject_required)
+               PutBstr(HKEY("__SUBJREQUIRED"), NewStrBufPlain(HKEY("1")));
+
+       begin_burst();
+       output_headers(1, 0, 0, 0, 1, 0);
+       DoTemplate(HKEY("edit_message"), NULL, &NoCtx);
+       end_burst();
+
+       return;
+}
+
+
+/*
+ * delete a message
+ */
+void delete_msg(void) {
+       long msgid;
+       StrBuf *Line;
+       
+       msgid = lbstr("msgid");
+       Line = NewStrBuf();
+       if ((WC->CurRoom.RAFlags & UA_ISTRASH) != 0) {  /* Delete from Trash is a real delete */
+               serv_printf("DELE %ld", msgid); 
+       }
+       else {                  /* Otherwise move it to Trash */
+               serv_printf("MOVE %ld|_TRASH_|0", msgid);
+       }
+
+       StrBuf_ServGetln(Line);
+       GetServerStatusMsg(Line, NULL, 1, 0);
+
+       fixview();
+
+       readloop(readnew, eUseDefault);
+}
+
+
+/*
+ * move a message to another room
+ */
+void move_msg(void) {
+       long msgid;
+
+       msgid = lbstr("msgid");
+
+       if (havebstr("move_button")) {
+               StrBuf *Line;
+               serv_printf("MOVE %ld|%s", msgid, bstr("target_room"));
+               Line = NewStrBuf();
+               StrBuf_ServGetln(Line);
+               GetServerStatusMsg(Line, NULL, 1, 0);
+               FreeStrBuf(&Line);
+       } else {
+               AppendImportantMessage(_("The message was not moved."), -1);
+       }
+
+       fixview();
+       readloop(readnew, eUseDefault);
+}
+
+
+/*
+ * Generic function to output an arbitrary MIME attachment from
+ * message being composed
+ *
+ * partnum             The MIME part to be output
+ * filename            Fake filename to give
+ * force_download      Nonzero to force set the Content-Type: header to "application/octet-stream"
+ */
+void postpart(StrBuf *partnum, StrBuf *filename, int force_download) {
+       void *vPart;
+       StrBuf *content_type;
+       wc_mime_attachment *part;
+       int i;
+
+       i = StrToi(partnum);
+       if (GetHash(WC->attachments, IKEY(i), &vPart) &&
+           (vPart != NULL)) {
+               part = (wc_mime_attachment*) vPart;
+               if (force_download) {
+                       content_type = NewStrBufPlain(HKEY("application/octet-stream"));
+               }
+               else {
+                       content_type = NewStrBufDup(part->ContentType);
+               }
+               StrBufAppendBuf(WC->WBuf, part->Data, 0);
+               http_transmit_thing(ChrPtr(content_type), 0);
+       } else {
+               hprintf("HTTP/1.1 404 %s\n", ChrPtr(partnum));
+               output_headers(0, 0, 0, 0, 0, 0);
+               hprintf("Content-Type: text/plain\r\n");
+               begin_burst();
+               wc_printf(_("An error occurred while retrieving this part: %s/%s\n"), 
+                       ChrPtr(partnum), ChrPtr(filename));
+               end_burst();
+       }
+       FreeStrBuf(&content_type);
+}
+
+
+// Generic function to output an arbitrary MIME part from an arbitrary
+// message number on the server.
+//
+// msgnum              message number on the citadel server
+// partnum             MIME part number to be output
+// force_download      Nonzero to force set the Content-Type: header to "application/octet-stream"
+
+void view_or_download_mimepart(int force_download) {
+       long msgnum;
+       off_t bytes;
+       StrBuf *Buf;
+       StrBuf *ContentType;
+       StrBuf *PartNum;
+
+       PartNum = NewStrBuf();
+
+       msgnum = StrBufExtract_long(WC->Hdr->HR.ReqLine, 0, '/');
+       StrBufExtract_token(PartNum, WC->Hdr->HR.ReqLine, 1, '/');
+
+       Buf = NewStrBuf();
+       serv_printf("DLAT %ld|%s", msgnum, ChrPtr(PartNum));    // DLAT will return: 6XX length|-1|filename|cbtype|cbcharset
+       StrBuf_ServGetln(Buf);
+       FreeStrBuf(&PartNum);
+
+       if (GetServerStatus(Buf, NULL) != 6) {
+               FreeStrBuf(&Buf);
+               hprintf("HTTP/1.1 500 error\r\n"
+                       "Pragma: no-cache\r\n"
+                       "Cache-Control: no-store\r\n"
+                       "Expires: -1\r\n"
+                       "Content-Type: text/plain\r\n"
+               );
+               begin_burst();
+               wc_printf(_("An error occurred while retrieving this part: %s\n"), "--");
+               return;
+       }
+
+       StrBufCutLeft(Buf, 4);
+       bytes = StrBufExtract_long(Buf, 0, '|');
+
+       if (force_download) {
+               ContentType = NewStrBufPlain(HKEY("application/octet-stream"));
+       }
+       else {
+               ContentType = NewStrBuf();
+               StrBufExtract_token(ContentType, Buf, 3, '|');
+       }
+
+       FreeStrBuf(&Buf);
+       Buf = NewStrBuf();
+       StrBuf_ServGetBLOBBuffered(Buf, bytes);
+
+       WC->WBuf = Buf;
+       Buf = NULL;
+       http_transmit_thing(ChrPtr(ContentType), 0);
+       FreeStrBuf(&ContentType);
+}
+
+
+/*
+ * Read any MIME part of a message, from the server, into memory.
+ */
+StrBuf *load_mimepart(long msgnum, char *partnum) {
+       off_t bytes;
+       StrBuf *Buf;
+       
+       Buf = NewStrBuf();
+       serv_printf("DLAT %ld|%s", msgnum, partnum);
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 6) {
+               StrBufCutLeft(Buf, 4);
+               bytes = StrBufExtract_long(Buf, 0, '|');
+               FreeStrBuf(&Buf);
+               Buf = NewStrBuf();
+               StrBuf_ServGetBLOBBuffered(Buf, bytes);
+               return(Buf);
+       }
+       else {
+               FreeStrBuf(&Buf);
+               return(NULL);
+       }
+}
+
+
+/*
+ * Read any MIME part of a message, from the server, into memory.
+ */
+void MimeLoadData(wc_mime_attachment *Mime) {
+       StrBuf *Buf;
+       const char *Ptr;
+       off_t bytes;
+
+       serv_printf("DLAT %ld|%s", Mime->msgnum, ChrPtr(Mime->PartNum));
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 6) {
+               Ptr = &(ChrPtr(Buf)[4]);
+               bytes = StrBufExtractNext_long(Buf, &Ptr, '|');
+               StrBufSkip_NTokenS(Buf, &Ptr, '|', 3);  /* filename, cbtype, mimetype */
+               if (Mime->Charset == NULL) Mime->Charset = NewStrBuf();
+               StrBufExtract_NextToken(Mime->Charset, Buf, &Ptr, '|');
+               
+               if (Mime->Data == NULL) {
+                       Mime->Data = NewStrBufPlain(NULL, bytes);
+               }
+               StrBuf_ServGetBLOBBuffered(Mime->Data, bytes);
+       }
+       else {
+               FlushStrBuf(Mime->Data);
+       }
+       FreeStrBuf(&Buf);
+}
+
+
+void view_mimepart(void) {
+       view_or_download_mimepart(0);
+}
+
+
+void download_mimepart(void) {
+       view_or_download_mimepart(1);
+}
+
+
+void view_postpart(void) {
+       StrBuf *filename = NewStrBuf();
+       StrBuf *partnum = NewStrBuf();
+
+       StrBufExtract_token(partnum, WC->Hdr->HR.ReqLine, 0, '/');
+       StrBufExtract_token(filename, WC->Hdr->HR.ReqLine, 1, '/');
+
+       postpart(partnum, filename, 0);
+
+       FreeStrBuf(&filename);
+       FreeStrBuf(&partnum);
+}
+
+
+void download_postpart(void) {
+       StrBuf *filename = NewStrBuf();
+       StrBuf *partnum = NewStrBuf();
+
+       StrBufExtract_token(partnum, WC->Hdr->HR.ReqLine, 0, '/');
+       StrBufExtract_token(filename, WC->Hdr->HR.ReqLine, 1, '/');
+
+       postpart(partnum, filename, 1);
+
+       FreeStrBuf(&filename);
+       FreeStrBuf(&partnum);
+}
+
+
+void show_num_attachments(void) {
+       wc_printf("%d", GetCount(WC->attachments));
+}
+
+
+void h_readnew(void) { readloop(readnew, eUseDefault);}
+void h_readold(void) { readloop(readold, eUseDefault);}
+void h_readfwd(void) { readloop(readfwd, eUseDefault);}
+void h_headers(void) { readloop(headers, eUseDefault);}
+void h_do_search(void) { readloop(do_search, eUseDefault);}
+void h_readgt(void) { readloop(readgt, eUseDefault);}
+void h_readlt(void) { readloop(readlt, eUseDefault);}
+
+
+/* Output message list in JSON format */
+void jsonMessageList(void) {
+       StrBuf *View = NewStrBuf();
+       const StrBuf *room = sbstr("room");
+       long oper = (havebstr("query")) ? do_search : readnew;
+       StrBufPrintf(View, "%d", VIEW_JSON_LIST);
+       putbstr("view", View);; 
+       gotoroom(room);
+       readloop(oper, eUseDefault);
+}
+
+
+void FreeReadLoopHandlerSet(void *v) {
+       RoomRenderer *Handler = (RoomRenderer *) v;
+       FreeStrBuf(&Handler->FetchMessageList);
+       if (Handler->MessageFieldList != NULL) {
+               free(Handler->MessageFieldList);
+       }
+       free(Handler);
+}
+
+
+void RegisterReadLoopHandlerset(
+       int RoomType,
+       GetParamsGetServerCall_func GetParamsGetServerCall,
+       PrintViewHeader_func PrintPageHeader,
+       PrintViewHeader_func PrintViewHeader,
+       load_msg_ptrs_detailheaders LH,
+       LoadMsgFromServer_func LoadMsgFromServer,
+       RenderView_or_Tail_func RenderView_or_Tail,
+       View_Cleanup_func ViewCleanup,
+       const char **browseListFields
+       )
+{
+       long count = 0;
+       long i = 0;
+       RoomRenderer *Handler;
+
+       Handler = (RoomRenderer*) malloc(sizeof(RoomRenderer));
+
+       Handler->RoomType = RoomType;
+       Handler->GetParamsGetServerCall = GetParamsGetServerCall;
+       Handler->PrintPageHeader = PrintPageHeader;
+       Handler->PrintViewHeader = PrintViewHeader;
+       Handler->LoadMsgFromServer = LoadMsgFromServer;
+       Handler->RenderView_or_Tail = RenderView_or_Tail;
+       Handler->ViewCleanup = ViewCleanup;
+       Handler->LHParse = LH;
+
+       if (browseListFields != NULL) {
+               while (browseListFields[count] != NULL) {
+                       count ++;
+               }
+               Handler->HeaderCount = count;
+               Handler->MessageFieldList = (eMessageField*) malloc(sizeof(eMessageField) * count);
+               Handler->FetchMessageList = NewStrBufPlain(NULL, 5 * count + 4 + 5);
+               StrBufPlain(Handler->FetchMessageList, HKEY("time\n"));
+               for (i = 0; i < count; i++) {
+                       if (!GetFieldFromMnemonic(&Handler->MessageFieldList[i], browseListFields[i])) {
+                               fprintf(stderr, "Unknown message header: %s\n", browseListFields[i]);
+                               exit(1);
+                       }
+                       StrBufAppendBufPlain(Handler->FetchMessageList, browseListFields[i], 4, 0);
+                       StrBufAppendBufPlain(Handler->FetchMessageList, HKEY("\n"), 0);
+               }
+               StrBufAppendBufPlain(Handler->FetchMessageList, HKEY("000"), 0);
+       }
+       else {
+               Handler->FetchMessageList = NULL;
+               Handler->MessageFieldList = NULL;
+       }
+
+       Put(ReadLoopHandler, IKEY(RoomType), Handler, FreeReadLoopHandlerSet);
+}
+
+void 
+InitModule_MSG
+(void)
+{
+       RegisterPreference("use_sig",
+                          _("Attach signature to email messages?"), 
+                          PRF_YESNO, 
+                          NULL);
+       RegisterPreference("signature", _("Use this signature:"), PRF_QP_STRING, NULL);
+       RegisterPreference("default_header_charset",
+                          _("Default character set for email headers:"), 
+                          PRF_STRING, 
+                          NULL);
+       RegisterPreference("defaultfrom", _("Preferred email address"), PRF_STRING, NULL);
+       RegisterPreference("defaultname", 
+                          _("Preferred display name for email messages"), 
+                          PRF_STRING, 
+                          NULL);
+       RegisterPreference("defaulthandle", 
+                          _("Preferred display name for bulletin board posts"), 
+                          PRF_STRING, 
+                          NULL);
+       RegisterPreference("mailbox",_("Mailbox view mode"), PRF_STRING, NULL);
+
+       WebcitAddUrlHandler(HKEY("readnew"), "", 0, h_readnew, ANONYMOUS|NEED_URL);
+       WebcitAddUrlHandler(HKEY("readold"), "", 0, h_readold, ANONYMOUS|NEED_URL);
+       WebcitAddUrlHandler(HKEY("readfwd"), "", 0, h_readfwd, ANONYMOUS|NEED_URL);
+       WebcitAddUrlHandler(HKEY("headers"), "", 0, h_headers, NEED_URL);
+       WebcitAddUrlHandler(HKEY("readgt"), "", 0, h_readgt, ANONYMOUS|NEED_URL);
+       WebcitAddUrlHandler(HKEY("readlt"), "", 0, h_readlt, ANONYMOUS|NEED_URL);
+       WebcitAddUrlHandler(HKEY("do_search"), "", 0, h_do_search, 0);
+       WebcitAddUrlHandler(HKEY("display_enter"), "", 0, display_enter, 0);
+       WebcitAddUrlHandler(HKEY("post"), "", 0, post_message, PROHIBIT_STARTPAGE);
+       WebcitAddUrlHandler(HKEY("move_msg"), "", 0, move_msg, PROHIBIT_STARTPAGE);
+       WebcitAddUrlHandler(HKEY("delete_msg"), "", 0, delete_msg, PROHIBIT_STARTPAGE);
+       WebcitAddUrlHandler(HKEY("msg"), "", 0, embed_message, NEED_URL);
+       WebcitAddUrlHandler(HKEY("message"), "", 0, handle_one_message, NEED_URL|XHTTP_COMMANDS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE);
+       WebcitAddUrlHandler(HKEY("printmsg"), "", 0, print_message, NEED_URL);
+       WebcitAddUrlHandler(HKEY("msgheaders"), "", 0, display_headers, NEED_URL);
+
+       WebcitAddUrlHandler(HKEY("mimepart"), "", 0, view_mimepart, NEED_URL);
+       WebcitAddUrlHandler(HKEY("mimepart_download"), "", 0, download_mimepart, NEED_URL);
+       WebcitAddUrlHandler(HKEY("postpart"), "", 0, view_postpart, NEED_URL|PROHIBIT_STARTPAGE);
+       WebcitAddUrlHandler(HKEY("postpart_download"), "", 0, download_postpart, NEED_URL|PROHIBIT_STARTPAGE);
+       WebcitAddUrlHandler(HKEY("upload_attachment"), "", 0, upload_attachment, AJAX);
+       WebcitAddUrlHandler(HKEY("remove_attachment"), "", 0, remove_attachment, AJAX);
+       WebcitAddUrlHandler(HKEY("show_num_attachments"), "", 0, show_num_attachments, AJAX);
+
+       /* json */
+       WebcitAddUrlHandler(HKEY("roommsgs"), "", 0, jsonMessageList,0);
+}
+
+void
+SessionDetachModule_MSG
+(wcsession *sess)
+{
+       DeleteHash(&sess->summ);
+}
diff --git a/webcit/messages.h b/webcit/messages.h
new file mode 100644 (file)
index 0000000..def0899
--- /dev/null
@@ -0,0 +1,338 @@
+/*
+ * Copyright (c) 1996-2020 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+#ifndef MESSAGES_H
+#define MESSAGES_H
+
+extern CtxType CTX_MAILSUM;
+extern CtxType CTX_MIME_ATACH;
+extern HashList *MimeRenderHandler;
+extern HashList *ReadLoopHandler;
+typedef struct wc_mime_attachment wc_mime_attachment;
+typedef void (*RenderMimeFunc)(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset);
+typedef struct _RenderMimeFuncStruct {
+       RenderMimeFunc f;
+} RenderMimeFuncStruct;
+
+struct wc_mime_attachment {
+       int level;
+       StrBuf *Name;
+       StrBuf *FileName;
+       StrBuf *PartNum;
+       StrBuf *Disposition;
+       StrBuf *ContentType;
+       StrBuf *Charset;
+       StrBuf *Data;
+       size_t length;          /* length of the mimeattachment */
+       long size_known;
+       long lvalue;            /* if we put a long... */
+       long msgnum;            /* the message number on the citadel server derived from message_summary */
+       const RenderMimeFuncStruct *Renderer;
+};
+void DestroyMime(void *vMime);
+
+#define MSGFLAG_READ (1<<0)
+
+typedef struct _message_summary {
+       long msgnum;                            // the message number on the citadel server
+       int Flags;
+       time_t date;                            // its creation date
+       int nhdr;
+       int format_type;
+       StrBuf *euid;
+       StrBuf *from;                           // display name of message author
+       StrBuf *to;                             // the recipient
+       StrBuf *subj;                           // title / subject
+       StrBuf *reply_inreplyto;
+       long reply_inreplyto_hash;
+       StrBuf *reply_references;
+       long reply_references_hash;
+       StrBuf *ReplyTo;
+       StrBuf *cccc;
+       StrBuf *AllRcpt;
+       StrBuf *Room;
+       StrBuf *Rfca;                           // UPN or email address of message author
+       StrBuf *EnvTo;
+       const StrBuf *PartNum;
+       HashList *Attachments;                  // list of attachments
+       HashList *Submessages;
+       HashList *AttachLinks;
+       HashList *AllAttach;
+       int hasattachments;
+       int is_local;                           // nonzero if the message originated on the local system
+       wc_mime_attachment *MsgBody;            // the MIME part of the message
+} message_summary;
+
+void DestroyMessageSummary(void *vMsg);
+
+/* some of these fields map to msgkeys[] in msgbase.c ... others don't */
+
+/* I think these are supposed to align with fieldMnemonics in msg_renderers.c
+ * So if you change one you have to change the other.
+ * TODO: figure out who did this and beat them with a wet noodle.
+ */
+typedef enum _eMessageField {
+       eAuthor,
+       eXclusivID,
+       erFc822Addr,
+       emessageId,
+       eJournal,
+       eReplyTo,
+       eListID,
+       eMesageText,
+       eIsLocal,
+       eMessagePath,
+       eRecipient,
+       eSpecialField,
+       eTimestamp,
+       eMsgSubject,
+       eenVelopeTo,
+       eWeferences,
+       eCarbonCopY,
+       eHeaderOnly,
+       eFormatType,
+       eMessagePart,
+       eSubFolder,
+       eLastHeader
+} eMessageField;
+
+extern const char* fieldMnemonics[];
+
+int GetFieldFromMnemonic(eMessageField *f, const char* c);
+int EvaluateMsgHdr(const char *HeaderName, long HdrNLen, message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset);
+int EvaluateMsgHdrEnum(eMessageField f, message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset);
+
+
+static inline message_summary* GetMessagePtrAt(int n, HashList *Summ) {
+       const char *Key;
+       long HKLen;
+       void *vMsg;
+
+       if (Summ == NULL) {
+               return NULL;
+       }
+       GetHashAt(Summ, n, &HKLen, &Key, &vMsg);
+       return (message_summary*) vMsg;
+}
+
+
+typedef void (*ExamineMsgHeaderFunc)(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset);
+void evaluate_mime_part(StrBuf *Target, WCTemplputParams *TP);
+
+typedef enum _eCustomRoomRenderer {
+       eUseDefault = VIEW_JOURNAL + 100, 
+       eReadEUIDS
+} eCustomRoomRenderer;
+
+enum {
+       do_search,
+       headers,
+       readfwd,
+       readnew,
+       readold,
+       readgt,
+       readlt
+};
+
+/**
+ * @brief function to parse the | separated message headers list
+ * @param Line the raw line with your message data
+ * @param Msg put your parser results here...
+ * @param ConversionBuffer if you need some workbuffer, don't free me!
+ * @param ViewSpecific your view specific context data
+ * @returns 0: failure, trash this message. 1: all right, store it
+ */
+typedef int (*load_msg_ptrs_detailheaders) (StrBuf *Line, 
+                                           const char **pos, 
+                                           message_summary *Msg, 
+                                           StrBuf *ConversionBuffer,
+                                           void **ViewSpecific);
+
+typedef void (*readloop_servcmd)(char *buf, long bufsize);
+
+typedef struct _readloopstruct {
+       ConstStr name;
+       readloop_servcmd cmd;
+} readloop_struct;
+
+extern readloop_struct rlid[];
+
+void readloop(long oper, eCustomRoomRenderer ForceRenderer);
+int read_message(StrBuf *Target, 
+                const char *tmpl, long tmpllen, 
+                long msgnum, 
+                const StrBuf *section, 
+                const StrBuf **OutMime,
+                WCTemplputParams *TP);
+int load_message(message_summary *Msg, 
+                StrBuf *FoundCharset,
+                StrBuf **Error);
+
+
+
+
+typedef struct _SharedMessageStatus {
+       long load_seen;        /* should read information be loaded */
+       long sortit;           /* should we sort it using the standard sort API? */
+       long defaultsortorder; /* if we should sort it, which direction should be the default? */
+
+       long maxload;          /* how many headers should we accept from the server? defaults to 10k */
+       long maxmsgs;          /* how many message bodies do you want to load at most?*/
+
+       long startmsg;         /* which is the start message? */
+       long nummsgs;          /* How many messages are available to your view? */
+       long numNewmsgs;       /* if you load the seen-status, this is the count of them. */
+       long num_displayed;    /* counted up for LoadMsgFromServer */ /* TODO: unclear who should access this and why */
+
+       long lowest_found;     /* smallest Message ID found;  */
+       long highest_found;    /* highest Message ID found;  */
+
+} SharedMessageStatus;
+
+int load_msg_ptrs(const char *servcmd,
+                 const char *filter,
+                 StrBuf *FoundCharset,
+                 SharedMessageStatus *Stat,
+                 void **ViewSpecific,
+                 load_msg_ptrs_detailheaders LH,
+                 StrBuf *FetchMessageList,
+                 eMessageField *MessageFieldList,
+                 long HeaderCount);
+
+typedef int (*GetParamsGetServerCall_func)(SharedMessageStatus *Stat, 
+                                          void **ViewSpecific, 
+                                          long oper, 
+                                          char *cmd, 
+                                          long len,
+                                          char *filter,
+                                          long flen);
+
+typedef int (*PrintViewHeader_func)(SharedMessageStatus *Stat, void **ViewSpecific);
+
+typedef int (*LoadMsgFromServer_func)(SharedMessageStatus *Stat, 
+                                     void **ViewSpecific, 
+                                     message_summary* Msg, 
+                                     int is_new, 
+                                     int i);
+
+typedef int (*RenderView_or_Tail_func)(SharedMessageStatus *Stat, 
+                                      void **ViewSpecific, 
+                                      long oper);
+typedef int (*View_Cleanup_func)(void **ViewSpecific);
+
+void RegisterReadLoopHandlerset(
+       /**
+        * RoomType: which View definition are you going to be called for
+        */
+       int RoomType,
+
+       /**
+        * GetParamsGetServerCall should do the following:
+        *  * allocate your private context structure
+        *  * evaluate your commandline arguments, put results to your private struct.
+        *  * fill cmd with the command to load the message pointer list:
+        *    * might depend on bstr/oper depending on your needs
+        *    * might stay empty if no list should loaded and LoadMsgFromServer 
+        *      is skipped.
+        *  * influence the behaviour by presetting values on SharedMessageStatus
+        */
+       GetParamsGetServerCall_func GetParamsGetServerCall,
+
+       /**
+        * PrintpageHeader prints the surrounding information like iconbar, header etc.
+        * by default, output_headers() is called.
+        *
+        */
+       PrintViewHeader_func PrintPageHeader,
+
+       /**
+        * PrintViewHeader is here to print informations infront of your messages.
+        * The message list is already loaded & sorted (if) so you can evaluate 
+        * its result on the SharedMessageStatus struct.
+        */
+       PrintViewHeader_func PrintViewHeader,
+
+       /**
+        * LH is the function, you specify if you want to load more than just message
+        * numbers from the server during the listing fetch operation.
+        */
+       load_msg_ptrs_detailheaders LH,
+
+       /**
+        * LoadMsgFromServer is called for every message in the message list:
+        *  * which is 
+        *    * after 'startmsg'  
+        *    * up to 'maxmsgs' after your 'startmsg'
+        *  * it should load and parse messages from citserer.
+        *  * depending on your needs you might want to print your message here...
+        *  * if cmd was empty, its skipped alltogether.
+        */
+       LoadMsgFromServer_func LoadMsgFromServer,
+
+       /**
+        * RenderView_or_Tail is called last; 
+        *  * if you used PrintViewHeader to print messages, you might want to print 
+        *    trailing information here
+        *  * if you just pre-loaded your messages, put your render code here.
+        */
+       RenderView_or_Tail_func RenderView_or_Tail,
+
+       /**
+        * ViewCleanup should just clear your private data so all your mem can go back to 
+        * VALgrindHALLA.
+        * it also should release the content for delivery via end_burst() or wDumpContent(1);
+        */
+       View_Cleanup_func ViewCleanup,
+       /**
+        * brofwseListFields schould be a NULL-terminated list of message field mnemonics
+        * that will be the browse vector for the message header list.
+        */
+       const char **browseListFields
+       );
+/*
+GetParamsGetServerCall
+
+PrintViewHeader
+
+LoadMsgFromServer
+
+RenderView_or_Tail
+*/
+
+
+int ParseMessageListHeaders_Detail(StrBuf *Line, 
+                                  const char **pos, 
+                                  message_summary *Msg, 
+                                  StrBuf *ConversionBuffer,
+                                  void **ViewSpecific);
+
+/**
+ * @brief function to register the availability to render a specific message
+ * @param HeaderName Mimetype we know howto display
+ * @param HdrNLen length...
+ * @param InlineRenderable Should we announce to citserver that we want to receive these mimeparts immediately?
+ * @param Priority if multipart/alternative; which mimepart/Renderer should be prefered? (only applies if InlineRenderable)
+ */
+void RegisterMimeRenderer(const char *HeaderName, long HdrNLen, 
+                         RenderMimeFunc MimeRenderer,
+                         int InlineRenderable,
+                         int Priority);
+
+
+/**
+ * @brief fill the header parts of Msg with the headers loaded by MSG0
+ * @param Msg empty message struct, only preinitialized with the msgid
+ * @param FoundCharset buffer with the prefered charset of the headers
+ * @param buf linebuffer used to buffer citserver replies
+ */
+int ReadOneMessageSummary(message_summary *Msg, StrBuf *FoundCharset, StrBuf *Buf);
+
+#endif
diff --git a/webcit/missing b/webcit/missing
new file mode 100755 (executable)
index 0000000..c15067b
--- /dev/null
@@ -0,0 +1,188 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License, version 3.
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# 
+# 
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing - GNU libit 0.0"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`configure.in'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`configure.in'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`configure.in'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in`
+    if test -z "$files"; then
+      files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in`
+      test -z "$files" || files="$files.in"
+    else
+      files=`echo "$files" | sed -e 's/:/ /g'`
+    fi
+    test -z "$files" && files="config.h.in"
+    touch $files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print \
+      | sed 's/^\(.*\).am$/touch \1.in/' \
+      | sh
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f y.tab.h ]; then
+       echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/webcit/mkinstalldirs b/webcit/mkinstalldirs
new file mode 100755 (executable)
index 0000000..d2d5f21
--- /dev/null
@@ -0,0 +1,111 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage" 1>&2
+      exit 0
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+case $dirmode in
+  '')
+    if mkdir -p -- . 2>/dev/null; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    fi
+    ;;
+esac
+
+for file
+do
+  set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+  shift
+
+  pathcomp=
+  for d
+  do
+    pathcomp="$pathcomp$d"
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+       errstatus=$lasterr
+      else
+       if test ! -z "$dirmode"; then
+         echo "chmod $dirmode $pathcomp"
+         lasterr=""
+         chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+         if test ! -z "$lasterr"; then
+           errstatus=$lasterr
+         fi
+       fi
+      fi
+    fi
+
+    pathcomp="$pathcomp/"
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# End:
+# mkinstalldirs ends here
diff --git a/webcit/msg_renderers.c b/webcit/msg_renderers.c
new file mode 100644 (file)
index 0000000..eef21cf
--- /dev/null
@@ -0,0 +1,1586 @@
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+CtxType CTX_MAILSUM = CTX_NONE;
+CtxType CTX_MIME_ATACH = CTX_NONE;
+
+HashList *MsgHeaderHandler = NULL;
+HashList *DflMsgHeaderHandler = NULL;
+HashList *DflEnumMsgHeaderHandler = NULL;
+
+
+static inline void CheckConvertBufs(struct wcsession *WCC)
+{
+       if (WCC->ConvertBuf1 == NULL)
+               WCC->ConvertBuf1 = NewStrBuf();
+       if (WCC->ConvertBuf2 == NULL)
+               WCC->ConvertBuf2 = NewStrBuf();
+}
+
+/*
+ * message index functions
+ */
+
+
+void DestroyMimeParts(wc_mime_attachment *Mime)
+{
+       FreeStrBuf(&Mime->Name);
+       FreeStrBuf(&Mime->FileName);
+       FreeStrBuf(&Mime->PartNum);
+       FreeStrBuf(&Mime->Disposition);
+       FreeStrBuf(&Mime->ContentType);
+       FreeStrBuf(&Mime->Charset);
+       FreeStrBuf(&Mime->Data);
+}
+
+void DestroyMime(void *vMime)
+{
+       wc_mime_attachment *Mime = (wc_mime_attachment*)vMime;
+       DestroyMimeParts(Mime);
+       free(Mime);
+}
+
+void DestroyMessageSummary(void *vMsg)
+{
+       message_summary *Msg = (message_summary*) vMsg;
+
+       FreeStrBuf(&Msg->from);
+       FreeStrBuf(&Msg->to);
+       FreeStrBuf(&Msg->subj);
+       FreeStrBuf(&Msg->reply_inreplyto);
+       FreeStrBuf(&Msg->reply_references);
+       FreeStrBuf(&Msg->cccc);
+       FreeStrBuf(&Msg->ReplyTo);
+       FreeStrBuf(&Msg->AllRcpt);
+       FreeStrBuf(&Msg->Room);
+       FreeStrBuf(&Msg->Rfca);
+       FreeStrBuf(&Msg->EnvTo);
+       DeleteHash(&Msg->Attachments);  /* list of Attachments */
+       DeleteHash(&Msg->Submessages);
+       DeleteHash(&Msg->AttachLinks);
+       DeleteHash(&Msg->AllAttach);
+       free(Msg);
+}
+
+int EvaluateMsgHdrEnum(eMessageField f, message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       void *vHdr;
+       headereval* Hdr = NULL;
+       if (GetHash(DflEnumMsgHeaderHandler, IKEY(f), &vHdr) &&
+           (vHdr != NULL)) {
+               Hdr = (headereval*)vHdr;
+       }
+       if (Hdr == NULL)
+               return -1;
+       Hdr->evaluator(Msg, HdrLine, FoundCharset);
+       return Hdr->Type;
+}
+
+int EvaluateMsgHdr(const char *HeaderName, long HdrNLen, message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       void *vHdr;
+       headereval* Hdr = NULL;
+       if (HdrNLen == 4) {
+               if (GetHash(DflMsgHeaderHandler, HeaderName, HdrNLen, &vHdr) &&
+                   (vHdr != NULL)) {
+                       Hdr = (headereval*)vHdr;
+               }
+       }
+       if (Hdr == NULL && GetHash(MsgHeaderHandler, HeaderName, HdrNLen, &vHdr) &&
+           (vHdr != NULL)) {
+               Hdr = (headereval*)vHdr;
+       }
+       if (Hdr == NULL)
+               return -1;
+       Hdr->evaluator(Msg, HdrLine, FoundCharset);
+       return Hdr->Type;
+}
+
+void RegisterMsgHdr(const char *HeaderName, long HdrNLen, ExamineMsgHeaderFunc evaluator, int type)
+{
+       headereval *ev;
+       ev = (headereval*) malloc(sizeof(headereval));
+       ev->evaluator = evaluator;
+       ev->Type = type;
+
+       if (HdrNLen == 4) {
+               eMessageField f;
+               if (GetFieldFromMnemonic(&f, HeaderName)) {
+                       Put(DflMsgHeaderHandler, HeaderName, HdrNLen, ev, NULL);
+                       Put(DflEnumMsgHeaderHandler, IKEY(f), ev, reference_free_handler);
+                       return;
+               }
+       }
+       Put(MsgHeaderHandler, HeaderName, HdrNLen, ev, NULL);
+}
+
+void RegisterMimeRenderer(const char *HeaderName, long HdrNLen, 
+                         RenderMimeFunc MimeRenderer,
+                         int InlineRenderable,
+                         int Priority)
+{
+       RenderMimeFuncStruct *f;
+
+       f = (RenderMimeFuncStruct*) malloc(sizeof(RenderMimeFuncStruct));
+       f->f = MimeRenderer;
+       Put(MimeRenderHandler, HeaderName, HdrNLen, f, NULL);
+       if (InlineRenderable)
+               RegisterEmbeddableMimeType(HeaderName, HdrNLen, 10000 - Priority);
+}
+
+/*----------------------------------------------------------------------------*/
+
+/*
+ *  comparator for two longs in descending order.
+ */
+int longcmp_r(const void *s1, const void *s2) {
+       long l1;
+       long l2;
+
+       l1 = *(long *)GetSearchPayload(s1);
+       l2 = *(long *)GetSearchPayload(s2);
+
+       if (l1 > l2) return(-1);
+       if (l1 < l2) return(+1);
+       return(0);
+}
+
+/*
+ *  comparator for longs; descending order.
+ */
+int qlongcmp_r(const void *s1, const void *s2) {
+       long l1 = (long) s1;
+       long l2 = (long) s2;
+
+       if (l1 > l2) return(-1);
+       if (l1 < l2) return(+1);
+       return(0);
+}
+
+/*
+ * comparator for message summary structs by ascending subject.
+ */
+int summcmp_subj(const void *s1, const void *s2) {
+       message_summary *summ1;
+       message_summary *summ2;
+       
+       summ1 = (message_summary *)GetSearchPayload(s1);
+       summ2 = (message_summary *)GetSearchPayload(s2);
+       return strcasecmp(ChrPtr(summ1->subj), ChrPtr(summ2->subj));
+}
+
+/*
+ * comparator for message summary structs by descending subject.
+ */
+int summcmp_rsubj(const void *s1, const void *s2) {
+       message_summary *summ1;
+       message_summary *summ2;
+       
+       summ1 = (message_summary *)GetSearchPayload(s1);
+       summ2 = (message_summary *)GetSearchPayload(s2);
+       return strcasecmp(ChrPtr(summ2->subj), ChrPtr(summ1->subj));
+}
+/*
+ * comparator for message summary structs by descending subject.
+ */
+int groupchange_subj(const void *s1, const void *s2) {
+       message_summary *summ1;
+       message_summary *summ2;
+       
+       summ1 = (message_summary *)s1;
+       summ2 = (message_summary *)s2;
+       return ChrPtr(summ2->subj)[0] != ChrPtr(summ1->subj)[0];
+}
+
+/*
+ * comparator for message summary structs by ascending sender.
+ */
+int summcmp_sender(const void *s1, const void *s2) {
+       message_summary *summ1;
+       message_summary *summ2;
+       
+       summ1 = (message_summary *)GetSearchPayload(s1);
+       summ2 = (message_summary *)GetSearchPayload(s2);
+       return strcasecmp(ChrPtr(summ1->from), ChrPtr(summ2->from));
+}
+
+/*
+ * comparator for message summary structs by descending sender.
+ */
+int summcmp_rsender(const void *s1, const void *s2) {
+       message_summary *summ1;
+       message_summary *summ2;
+       
+       summ1 = (message_summary *)GetSearchPayload(s1);
+       summ2 = (message_summary *)GetSearchPayload(s2);
+       return strcasecmp(ChrPtr(summ2->from), ChrPtr(summ1->from));
+}
+/*
+ * comparator for message summary structs by descending sender.
+ */
+int groupchange_sender(const void *s1, const void *s2) {
+       message_summary *summ1;
+       message_summary *summ2;
+       
+       summ1 = (message_summary *)s1;
+       summ2 = (message_summary *)s2;
+       return strcasecmp(ChrPtr(summ2->from), ChrPtr(summ1->from)) != 0;
+
+}
+
+/*
+ * comparator for message summary structs by ascending date.
+ */
+int summcmp_date(const void *s1, const void *s2) {
+       message_summary *summ1;
+       message_summary *summ2;
+       
+       summ1 = (message_summary *)GetSearchPayload(s1);
+       summ2 = (message_summary *)GetSearchPayload(s2);
+
+       if (summ1->date < summ2->date) return -1;
+       else if (summ1->date > summ2->date) return +1;
+       else return 0;
+}
+
+/*
+ * comparator for message summary structs by descending date.
+ */
+int summcmp_rdate(const void *s1, const void *s2) {
+       message_summary *summ1;
+       message_summary *summ2;
+       
+       summ1 = (message_summary *)GetSearchPayload(s1);
+       summ2 = (message_summary *)GetSearchPayload(s2);
+
+       if (summ1->date < summ2->date) return +1;
+       else if (summ1->date > summ2->date) return -1;
+       else return 0;
+}
+
+/*
+ * comparator for message summary structs by descending date.
+ */
+const long DAYSECONDS = 24 * 60 * 60;
+int groupchange_date(const void *s1, const void *s2) {
+       message_summary *summ1;
+       message_summary *summ2;
+       
+       summ1 = (message_summary *)s1;
+       summ2 = (message_summary *)s2;
+
+       return (summ1->date % DAYSECONDS) != (summ2->date %DAYSECONDS);
+}
+
+
+/* Stub handlers for MIME parser */
+void examine_pref(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {return;}
+void examine_suff(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {return;}
+void examine_path(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {return;}
+
+void examine_content_encoding(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+/* nothing to do here */
+}
+
+
+void examine_exti(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+/* nothing to do here */
+}
+
+void examine_nhdr(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       Msg->nhdr = 0;
+       if (!strncasecmp(ChrPtr(HdrLine), "yes", 8))
+               Msg->nhdr = 1;
+}
+int Conditional_ANONYMOUS_MESSAGE(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return Msg->nhdr != 0;
+}
+
+void examine_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       Msg->format_type = StrToi(HdrLine);
+                       
+}
+
+void examine_from(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       CheckConvertBufs(WC);
+       FreeStrBuf(&Msg->from);
+       Msg->from = NewStrBufPlain(NULL, StrLength(HdrLine));
+       StrBuf_RFC822_2_Utf8(Msg->from, 
+                            HdrLine, 
+                            WC->DefaultCharset, 
+                            FoundCharset,
+                            WC->ConvertBuf1,
+                            WC->ConvertBuf2);
+}
+void tmplput_MAIL_SUMM_FROM(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->from, 0);
+}
+
+void examine_subj(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       CheckConvertBufs(WC);
+       FreeStrBuf(&Msg->subj);
+       Msg->subj = NewStrBufPlain(NULL, StrLength(HdrLine));
+       StrBuf_RFC822_2_Utf8(Msg->subj, 
+                            HdrLine, 
+                            WC->DefaultCharset, 
+                            FoundCharset,
+                            WC->ConvertBuf1,
+                            WC->ConvertBuf2);
+}
+void tmplput_MAIL_SUMM_SUBJECT(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+
+       if (TP->Tokens->nParameters == 4)
+       {
+               const char *pch;
+               long len;
+               
+               GetTemplateTokenString(Target, TP, 3, &pch, &len);
+               if ((len > 0)&&
+                   (strstr(ChrPtr(Msg->subj), pch) == NULL))
+               {
+                       GetTemplateTokenString(Target, TP, 2, &pch, &len);
+                       StrBufAppendBufPlain(Target, pch, len, 0);
+               }
+       }
+       StrBufAppendTemplate(Target, TP, Msg->subj, 0);
+}
+
+/*
+ * Conditional returns true if the message has a Subject and it is nonzero in length
+ */
+int Conditional_MAIL_SUMM_SUBJECT(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return StrLength(Msg->subj) > 0;
+}
+
+
+/*
+ * Conditional returns true if the message originated on the local system
+ */
+int Conditional_MAIL_LOCAL(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return (Msg->is_local ? 1 : 0);
+}
+
+
+void examine_msgn(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       long Offset = 0;
+       const char *pOffset;
+
+       CheckConvertBufs(WC);
+       FreeStrBuf(&Msg->reply_inreplyto);
+       Msg->reply_inreplyto = NewStrBufPlain(NULL, StrLength(HdrLine));
+       pOffset = strchr(ChrPtr(HdrLine), '/');
+       if (pOffset != NULL) {
+               Offset = pOffset - ChrPtr(HdrLine);
+       }
+       Msg->reply_inreplyto_hash = ThreadIdHashOffset(HdrLine, Offset);
+       StrBuf_RFC822_2_Utf8(Msg->reply_inreplyto, 
+                            HdrLine, 
+                            WC->DefaultCharset,
+                            FoundCharset,
+                            WC->ConvertBuf1,
+                            WC->ConvertBuf2);
+}
+
+
+void tmplput_MAIL_SUMM_INREPLYTO(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->reply_inreplyto, 0);
+}
+
+
+int Conditional_MAIL_SUMM_UNREAD(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return (Msg->Flags & MSGFLAG_READ) != 0;
+}
+
+
+void examine_wefw(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       wcsession *WCC = WC;
+       long Offset = 0;
+       const char *pOffset;
+
+       CheckConvertBufs(WCC);
+       FreeStrBuf(&Msg->reply_references);
+       Msg->reply_references = NewStrBufPlain(NULL, StrLength(HdrLine));
+       pOffset = strchr(ChrPtr(HdrLine), '/');
+       if (pOffset != NULL) {
+               Offset = pOffset - ChrPtr(HdrLine);
+       }
+       Msg->reply_references_hash = ThreadIdHashOffset(HdrLine, Offset);
+       StrBuf_RFC822_2_Utf8(Msg->reply_references, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
+}
+
+
+void tmplput_MAIL_SUMM_REFIDS(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->reply_references, 0);
+}
+
+
+void examine_replyto(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
+       FreeStrBuf(&Msg->ReplyTo);
+       Msg->ReplyTo = NewStrBufPlain(NULL, StrLength(HdrLine));
+       StrBuf_RFC822_2_Utf8(Msg->ReplyTo, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
+       if (Msg->AllRcpt == NULL)
+               Msg->AllRcpt = NewStrBufPlain(NULL, StrLength(HdrLine));
+       if (StrLength(Msg->AllRcpt) > 0) {
+               StrBufAppendBufPlain(Msg->AllRcpt, HKEY(", "), 0);
+       }
+       StrBufAppendBuf(Msg->AllRcpt, Msg->ReplyTo, 0);
+}
+
+
+void tmplput_MAIL_SUMM_REPLYTO(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->ReplyTo, 0);
+}
+
+
+void examine_cccc(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
+       FreeStrBuf(&Msg->cccc);
+       Msg->cccc = NewStrBufPlain(NULL, StrLength(HdrLine));
+       StrBuf_RFC822_2_Utf8(Msg->cccc, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
+       if (Msg->AllRcpt == NULL)
+               Msg->AllRcpt = NewStrBufPlain(NULL, StrLength(HdrLine));
+       if (StrLength(Msg->AllRcpt) > 0) {
+               StrBufAppendBufPlain(Msg->AllRcpt, HKEY(", "), 0);
+       }
+       StrBufAppendBuf(Msg->AllRcpt, Msg->cccc, 0);
+}
+
+
+void tmplput_MAIL_SUMM_CCCC(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->cccc, 0);
+}
+
+
+void examine_room(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       if ((StrLength(HdrLine) > 0) &&
+           (strcasecmp(ChrPtr(HdrLine), ChrPtr(WC->CurRoom.name)))) {
+               FreeStrBuf(&Msg->Room);
+               Msg->Room = NewStrBufDup(HdrLine);              
+       }
+}
+
+
+void tmplput_MAIL_SUMM_ORGROOM(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->Room, 0);
+}
+
+
+void examine_rfca(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       FreeStrBuf(&Msg->Rfca);
+       Msg->Rfca = NewStrBufDup(HdrLine);
+}
+
+
+void examine_locl(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       Msg->is_local = 1;
+}
+
+
+void tmplput_MAIL_SUMM_RFCA(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->Rfca, 0);
+}
+
+
+int Conditional_MAIL_SUMM_RFCA(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return StrLength(Msg->Rfca) > 0;
+}
+
+
+int Conditional_MAIL_SUMM_CCCC(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return StrLength(Msg->cccc) > 0;
+}
+
+
+int Conditional_MAIL_SUMM_REPLYTO(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return StrLength(Msg->ReplyTo) > 0;
+}
+
+
+void examine_nvto(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
+       FreeStrBuf(&Msg->EnvTo);
+       Msg->EnvTo = NewStrBufPlain(NULL, StrLength(HdrLine));
+       StrBuf_RFC822_2_Utf8(Msg->EnvTo, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
+}
+
+
+void examine_rcpt(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
+       FreeStrBuf(&Msg->to);
+       Msg->to = NewStrBufPlain(NULL, StrLength(HdrLine));
+       StrBuf_RFC822_2_Utf8(Msg->to, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
+       if (Msg->AllRcpt == NULL)
+               Msg->AllRcpt = NewStrBufPlain(NULL, StrLength(HdrLine));
+       if (StrLength(Msg->AllRcpt) > 0) {
+               StrBufAppendBufPlain(Msg->AllRcpt, HKEY(", "), 0);
+       }
+       StrBufAppendBuf(Msg->AllRcpt, Msg->to, 0);
+}
+
+
+void tmplput_MAIL_SUMM_TO(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->to, 0);
+}
+
+
+int Conditional_MAIL_SUMM_TO(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return StrLength(Msg->to) != 0;
+}
+
+
+int Conditional_MAIL_SUMM_SUBJ(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return StrLength(Msg->subj) != 0;
+}
+
+
+void tmplput_MAIL_SUMM_ALLRCPT(StrBuf *Target, WCTemplputParams *TP) {
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->AllRcpt, 0);
+}
+
+
+void tmplput_SUMM_COUNT(StrBuf *Target, WCTemplputParams *TP) {
+       StrBufAppendPrintf(Target, "%d", GetCount( WC->summ));
+}
+
+
+HashList *iterate_get_mailsumm_All(StrBuf *Target, WCTemplputParams *TP) {
+       return WC->summ;
+}
+
+
+void examine_time(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {
+       Msg->date = StrTol(HdrLine);
+}
+
+
+void tmplput_MAIL_SUMM_DATE_BRIEF(StrBuf *Target, WCTemplputParams *TP)
+{
+       char datebuf[64];
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       webcit_fmt_date(datebuf, 64, Msg->date, DATEFMT_BRIEF);
+       StrBufAppendBufPlain(Target, datebuf, -1, 0);
+}
+
+void tmplput_MAIL_SUMM_EUID(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->euid, 0);
+}
+
+void tmplput_MAIL_SUMM_DATE_FULL(StrBuf *Target, WCTemplputParams *TP)
+{
+       char datebuf[64];
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       webcit_fmt_date(datebuf, 64, Msg->date, DATEFMT_FULL);
+       StrBufAppendBufPlain(Target, datebuf, -1, 0);
+}
+void tmplput_MAIL_SUMM_DATE_NO(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendPrintf(Target, "%ld", Msg->date, 0);
+}
+
+
+
+void render_MAIL(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+       const StrBuf *TemplateMime;
+
+       if (Mime->Data == NULL) 
+               Mime->Data = NewStrBufPlain(NULL, Mime->length);
+       else 
+               FlushStrBuf(Mime->Data);
+       read_message(Mime->Data, HKEY("view_submessage"), Mime->msgnum, Mime->PartNum, &TemplateMime, TP);
+/*
+       if ( (!IsEmptyStr(mime_submessages)) && (!section[0]) ) {
+               for (i=0; i<num_tokens(mime_submessages, '|'); ++i) {
+                       extract_token(buf, mime_submessages, i, '|', sizeof buf);
+                       / ** use printable_view to suppress buttons * /
+                       wc_printf("<blockquote>");
+                       read_message(Mime->msgnum, 1, ChrPtr(Mime->Section));
+                       wc_printf("</blockquote>");
+               }
+       }
+*/
+}
+
+void render_MIME_ICS(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+       if (StrLength(Mime->Data) == 0) {
+               MimeLoadData(Mime);
+       }
+       if (StrLength(Mime->Data) > 0) {
+               cal_process_attachment(Mime);
+       }
+}
+
+
+
+void examine_mime_part(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       const char *Ptr = NULL;
+       wc_mime_attachment *Mime;
+       StrBuf *Buf;
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);  
+       Mime = (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment));
+       memset(Mime, 0, sizeof(wc_mime_attachment));
+       Mime->msgnum = Msg->msgnum;
+       Buf = NewStrBuf();
+
+       Mime->Name = NewStrBuf();
+       StrBufExtract_NextToken(Buf, HdrLine, &Ptr, '|');
+       StrBuf_RFC822_2_Utf8(Mime->Name, 
+                            Buf, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
+       StrBufTrim(Mime->Name);
+
+       StrBufExtract_NextToken(Buf, HdrLine, &Ptr, '|');
+       Mime->FileName = NewStrBuf();
+       StrBuf_RFC822_2_Utf8(Mime->FileName, 
+                            Buf, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
+       StrBufTrim(Mime->FileName);
+
+       Mime->PartNum = NewStrBuf();
+       StrBufExtract_NextToken(Mime->PartNum, HdrLine, &Ptr, '|');
+       StrBufTrim(Mime->PartNum);
+       if (strchr(ChrPtr(Mime->PartNum), '.') != NULL) 
+               Mime->level = 2;
+       else
+               Mime->level = 1;
+
+       Mime->Disposition = NewStrBuf();
+       StrBufExtract_NextToken(Mime->Disposition, HdrLine, &Ptr, '|');
+
+       Mime->ContentType = NewStrBuf();
+       StrBufExtract_NextToken(Mime->ContentType, HdrLine, &Ptr, '|');
+       StrBufTrim(Mime->ContentType);
+       StrBufLowerCase(Mime->ContentType);
+       if (!strcmp(ChrPtr(Mime->ContentType), "application/octet-stream")) {
+               StrBufPlain(Mime->ContentType, 
+                           GuessMimeByFilename(SKEY(Mime->FileName)), -1);
+       }
+
+       Mime->length = StrBufExtractNext_int(HdrLine, &Ptr, '|');
+
+       StrBufSkip_NTokenS(HdrLine, &Ptr, '|', 1);  /* cbid?? */
+
+       Mime->Charset = NewStrBuf();
+       StrBufExtract_NextToken(Mime->Charset, HdrLine, &Ptr, '|');
+
+
+       if ( (StrLength(Mime->FileName) == 0) && (StrLength(Mime->Name) > 0) ) {
+               StrBufAppendBuf(Mime->FileName, Mime->Name, 0);
+       }
+
+       if (StrLength(Msg->PartNum) > 0) {
+               StrBuf *tmp;
+               StrBufPrintf(Buf, "%s.%s", ChrPtr(Msg->PartNum), ChrPtr(Mime->PartNum));
+               tmp = Mime->PartNum;
+               Mime->PartNum = Buf;
+               Buf = tmp;
+       }
+
+       if (Msg->AllAttach == NULL)
+               Msg->AllAttach = NewHash(1,NULL);
+       Put(Msg->AllAttach, SKEY(Mime->PartNum), Mime, DestroyMime);
+       FreeStrBuf(&Buf);
+}
+
+
+void evaluate_mime_part(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+       void *vMimeRenderer;
+
+       /* just print the root-node */
+       if ((Mime->level >= 1) &&
+           GetHash(MimeRenderHandler, SKEY(Mime->ContentType), &vMimeRenderer) &&
+           vMimeRenderer != NULL)
+       {
+               Mime->Renderer = (RenderMimeFuncStruct*) vMimeRenderer;
+               if (Msg->Submessages == NULL)
+                       Msg->Submessages = NewHash(1,NULL);
+               Put(Msg->Submessages, SKEY(Mime->PartNum), Mime, reference_free_handler);
+       }
+       else if ((Mime->level >= 1) &&
+                (!strcasecmp(ChrPtr(Mime->Disposition), "inline"))
+                && (!strncasecmp(ChrPtr(Mime->ContentType), "image/", 6)) ){
+               if (Msg->AttachLinks == NULL)
+                       Msg->AttachLinks = NewHash(1,NULL);
+               Put(Msg->AttachLinks, SKEY(Mime->PartNum), Mime, reference_free_handler);
+       }
+       else if ((Mime->level >= 1) &&
+                (StrLength(Mime->ContentType) > 0) &&
+                 ( (!strcasecmp(ChrPtr(Mime->Disposition), "attachment")) 
+                   || (!strcasecmp(ChrPtr(Mime->Disposition), "inline"))
+                   || (!strcasecmp(ChrPtr(Mime->Disposition), ""))))
+       {               
+               if (Msg->AttachLinks == NULL)
+                       Msg->AttachLinks = NewHash(1,NULL);
+               Put(Msg->AttachLinks, SKEY(Mime->PartNum), Mime, reference_free_handler);
+               if ((strcasecmp(ChrPtr(Mime->ContentType), "application/octet-stream") == 0) && 
+                   (StrLength(Mime->FileName) > 0)) {
+                       FlushStrBuf(Mime->ContentType);
+                       StrBufAppendBufPlain(Mime->ContentType,
+                                            GuessMimeByFilename(SKEY(Mime->FileName)),
+                                            -1, 0);
+               }
+       }
+}
+
+void tmplput_MAIL_SUMM_NATTACH(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendPrintf(Target, "%ld", GetCount(Msg->Attachments));
+}
+
+void examine_text(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       if (Msg->MsgBody->Data == NULL)
+               Msg->MsgBody->Data = NewStrBufPlain(NULL, SIZ);
+       else
+               FlushStrBuf(Msg->MsgBody->Data);
+}
+
+void examine_msg4_partnum(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       Msg->MsgBody->PartNum = NewStrBufDup(HdrLine);
+       StrBufTrim(Msg->MsgBody->PartNum);
+}
+
+void examine_content_lengh(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       Msg->MsgBody->length = StrTol(HdrLine);
+       Msg->MsgBody->size_known = 1;
+}
+
+void examine_content_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       StrBuf *Token;
+       StrBuf *Value;
+       const char* sem;
+       const char *eq;
+       int len;
+       StrBufTrim(HdrLine);
+       Msg->MsgBody->ContentType = NewStrBufDup(HdrLine);
+       sem = strchr(ChrPtr(HdrLine), ';');
+
+       if (sem != NULL) {
+               Token = NewStrBufPlain(NULL, StrLength(HdrLine));
+               Value = NewStrBufPlain(NULL, StrLength(HdrLine));
+               len = sem - ChrPtr(HdrLine);
+               StrBufCutAt(Msg->MsgBody->ContentType, len, NULL);
+               while (sem != NULL) {
+                       while (isspace(*(sem + 1)))
+                               sem ++;
+                       StrBufCutLeft(HdrLine, sem - ChrPtr(HdrLine));
+                       sem = strchr(ChrPtr(HdrLine), ';');
+                       if (sem != NULL)
+                               len = sem - ChrPtr(HdrLine);
+                       else
+                               len = StrLength(HdrLine);
+                       FlushStrBuf(Token);
+                       FlushStrBuf(Value);
+                       StrBufAppendBufPlain(Token, ChrPtr(HdrLine), len, 0);
+                       eq = strchr(ChrPtr(Token), '=');
+                       if (eq != NULL) {
+                               len = eq - ChrPtr(Token);
+                               StrBufAppendBufPlain(Value, eq + 1, StrLength(Token) - len - 1, 0); 
+                               StrBufCutAt(Token, len, NULL);
+                               StrBufTrim(Value);
+                       }
+                       StrBufTrim(Token);
+
+                       if (EvaluateMsgHdr(SKEY(Token), Msg, Value, FoundCharset) < 0)
+                               syslog(LOG_WARNING, "don't know how to handle content type sub-header[%s]\n", ChrPtr(Token));
+               }
+               FreeStrBuf(&Token);
+               FreeStrBuf(&Value);
+       }
+}
+
+
+int ReadOneMessageSummary(message_summary *Msg, StrBuf *FoundCharset, StrBuf *Buf)
+{
+       const char *buf;
+       const char *ebuf;
+       int nBuf;
+       long len;
+       
+       serv_printf("MSG0 %ld|1", Msg->msgnum); /* ask for headers only */
+       
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 1) {
+               return 0;
+       }
+
+       while (len = StrBuf_ServGetln(Buf),
+              (len >= 0) && 
+              ((len != 3)  ||
+               strcmp(ChrPtr(Buf), "000")))
+       {
+               buf = ChrPtr(Buf);
+               ebuf = strchr(ChrPtr(Buf), '=');
+               nBuf = ebuf - buf;
+               
+               if (EvaluateMsgHdr(buf, nBuf, Msg, Buf, FoundCharset) < 0)
+                       syslog(LOG_INFO, "Don't know how to handle Message Headerline [%s]", ChrPtr(Buf));
+       }
+       return 1;
+}
+
+void tmplput_MAIL_SUMM_N(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendPrintf(Target, "%ld", Msg->msgnum);
+}
+
+
+void tmplput_MAIL_SUMM_PERMALINK(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBuf *perma_link;
+       const StrBuf *View;
+
+       perma_link = NewStrBufPlain(HKEY("/readfwd?go="));
+       StrBufUrlescAppend(perma_link, WC->CurRoom.name, NULL);
+       View = sbstr("view");
+       if (View != NULL) {
+               StrBufAppendBufPlain(perma_link, HKEY("?view="), 0);
+               StrBufAppendBuf(perma_link, View, 0);
+       }
+       StrBufAppendBufPlain(perma_link, HKEY("?start_reading_at="), 0);
+       StrBufAppendPrintf(perma_link, "%ld#%ld", Msg->msgnum, Msg->msgnum);
+       StrBufAppendBuf(Target, perma_link, 0);
+       FreeStrBuf(&perma_link);
+}
+
+
+int Conditional_MAIL_MIME_ALL(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return GetCount(Msg->Attachments) > 0;
+}
+
+int Conditional_MAIL_MIME_SUBMESSAGES(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return GetCount(Msg->Submessages) > 0;
+}
+
+int Conditional_MAIL_MIME_ATTACHLINKS(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return GetCount(Msg->AttachLinks) > 0;
+}
+
+int Conditional_MAIL_MIME_ATTACH(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return GetCount(Msg->AllAttach) > 0;
+}
+
+void tmplput_QUOTED_MAIL_BODY(StrBuf *Target, WCTemplputParams *TP)
+{
+       const StrBuf *Mime;
+        long MsgNum;
+       StrBuf *Buf;
+
+       MsgNum = LBstr(TKEY(0));
+       Buf = NewStrBuf();
+       read_message(Buf, HKEY("view_message_replyquote"), MsgNum, NULL, &Mime, TP);
+       StrBufAppendTemplate(Target, TP, Buf, 1);
+       FreeStrBuf(&Buf);
+}
+
+void tmplput_EDIT_MAIL_BODY(StrBuf *Target, WCTemplputParams *TP)
+{
+       const StrBuf *Mime;
+        long MsgNum;
+       StrBuf *Buf;
+
+       MsgNum = LBstr(TKEY(0));
+       Buf = NewStrBuf();
+       read_message(Buf, HKEY("view_message_edit"), MsgNum, NULL, &Mime, TP);
+       StrBufAppendTemplate(Target, TP, Buf, 1);
+       FreeStrBuf(&Buf);
+}
+
+void tmplput_EDIT_WIKI_BODY(StrBuf *Target, WCTemplputParams *TP)
+{
+       const StrBuf *Mime;
+        long msgnum;
+       StrBuf *Buf;
+
+       /* Insert the existing content of the wiki page into the editor.  But we only want
+        * to do this the first time -- if the user is uploading an attachment we don't want
+        * to do it again.
+        */
+       if (!havebstr("attach_button")) {
+               StrBuf *wikipage = NewStrBufDup(sbstr("page"));
+               putbstr("format", NewStrBufPlain(HKEY("plain")));
+               str_wiki_index(wikipage);
+               msgnum = locate_message_by_uid(ChrPtr(wikipage));
+               FreeStrBuf(&wikipage);
+               if (msgnum >= 0L) {
+                       Buf = NewStrBuf();
+                       read_message(Buf, HKEY("view_message_wikiedit"), msgnum, NULL, &Mime, TP);
+                       StrBufAppendTemplate(Target, TP, Buf, 1);
+                       FreeStrBuf(&Buf);
+               }
+       }
+}
+
+void tmplput_MAIL_BODY(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       StrBufAppendTemplate(Target, TP, Msg->MsgBody->Data, 0);
+}
+
+
+void render_MAIL_variformat(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       /* Messages in legacy Citadel variformat get handled thusly... */
+       wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+       StrBuf *TTarget = NewStrBufPlain(NULL, StrLength(Mime->Data));
+       FmOut(TTarget, "JUSTIFY", Mime->Data);
+       FreeStrBuf(&Mime->Data);
+       Mime->Data = TTarget;
+}
+
+void render_MAIL_text_plain(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+       const char *ptr, *pte;
+       const char *BufPtr = NULL;
+       StrBuf *Line;
+       StrBuf *Line1;
+       StrBuf *Line2;
+       StrBuf *TTarget;
+       long Linecount;
+       long nEmptyLines;
+       int bn = 0;
+       int bq = 0;
+       int i;
+       long len;
+#ifdef HAVE_ICONV
+       StrBuf *cs = NULL;
+       int ConvertIt = 1;
+       iconv_t ic = (iconv_t)(-1) ;
+#endif
+
+       if ((StrLength(Mime->Data) == 0) && (Mime->length > 0)) {
+               FreeStrBuf(&Mime->Data);
+               MimeLoadData(Mime);
+       }
+
+#ifdef HAVE_ICONV
+       if (ConvertIt) {
+               if (StrLength(Mime->Charset) != 0)
+                       cs = Mime->Charset;
+               else if (StrLength(FoundCharset) > 0)
+                       cs = FoundCharset;
+               else if (StrLength(WC->DefaultCharset) > 0)
+                       cs = WC->DefaultCharset;
+               if (cs == NULL) {
+                       ConvertIt = 0;
+               }
+               else if (!strcasecmp(ChrPtr(cs), "utf-8")) {
+                       ConvertIt = 0;
+               }
+               else if (!strcasecmp(ChrPtr(cs), "us-ascii")) {
+                       ConvertIt = 0;
+               }
+               else {
+                       ctdl_iconv_open("UTF-8", ChrPtr(cs), &ic);
+                       if (ic == (iconv_t)(-1) ) {
+                               syslog(LOG_WARNING, "%s:%d iconv_open(UTF-8, %s) failed: %s\n",
+                                       __FILE__, __LINE__, ChrPtr(Mime->Charset), strerror(errno));
+                       }
+               }
+       }
+#endif
+       Line = NewStrBufPlain(NULL, SIZ);
+       Line1 = NewStrBufPlain(NULL, SIZ);
+       Line2 = NewStrBufPlain(NULL, SIZ);
+       TTarget = NewStrBufPlain(NULL, StrLength(Mime->Data));
+       Linecount = 0;
+       nEmptyLines = 0;
+       if (StrLength(Mime->Data) > 0) 
+               do 
+               {
+                       StrBufSipLine(Line, Mime->Data, &BufPtr);
+                       bq = 0;
+                       i = 0;
+                       ptr = ChrPtr(Line);
+                       len = StrLength(Line);
+                       pte = ptr + len;
+               
+                       while ((ptr < pte) &&
+                              ((*ptr == '>') ||
+                               isspace(*ptr)))
+                       {
+                               if (*ptr == '>')
+                                       bq++;
+                               ptr ++;
+                               i++;
+                       }
+                       if (i > 0) StrBufCutLeft(Line, i);
+               
+                       if (StrLength(Line) == 0) {
+                               if (Linecount == 0)
+                                       continue;
+                               StrBufAppendBufPlain(TTarget, HKEY("<tt></tt><br>\n"), 0);
+
+                               nEmptyLines ++;
+                               continue;
+                       }
+                       nEmptyLines = 0;
+                       for (i = bn; i < bq; i++)                               
+                               StrBufAppendBufPlain(TTarget, HKEY("<blockquote>"), 0);
+                       for (i = bq; i < bn; i++)                               
+                               StrBufAppendBufPlain(TTarget, HKEY("</blockquote>"), 0);
+#ifdef HAVE_ICONV
+                       if (ConvertIt) {
+                               StrBufConvert(Line, Line1, &ic);
+                       }
+#endif
+                       StrBufAppendBufPlain(TTarget, HKEY("<tt>"), 0);
+                       UrlizeText(Line1, Line, Line2);
+
+                       StrEscAppend(TTarget, Line1, NULL, 0, 0);
+                       StrBufAppendBufPlain(TTarget, HKEY("</tt><br>\n"), 0);
+                       bn = bq;
+                       Linecount ++;
+               }
+       while ((BufPtr != StrBufNOTNULL) &&
+              (BufPtr != NULL));
+
+       if (nEmptyLines > 0)
+               StrBufCutRight(TTarget, nEmptyLines * (sizeof ("<tt></tt><br>\n") - 1));
+       for (i = 0; i < bn; i++)                                
+               StrBufAppendBufPlain(TTarget, HKEY("</blockquote>"), 0);
+
+       StrBufAppendBufPlain(TTarget, HKEY("</i><br>"), 0);
+#ifdef HAVE_ICONV
+       if (ic != (iconv_t)(-1) ) {
+               iconv_close(ic);
+       }
+#endif
+
+       FreeStrBuf(&Mime->Data);
+       Mime->Data = TTarget;
+       FlushStrBuf(Mime->ContentType);
+       StrBufAppendBufPlain(Mime->ContentType, HKEY("text/html"), 0);
+       FlushStrBuf(Mime->Charset);
+       StrBufAppendBufPlain(Mime->Charset, HKEY("UTF-8"), 0);
+       FreeStrBuf(&Line);
+       FreeStrBuf(&Line1);
+       FreeStrBuf(&Line2);
+}
+
+void render_MAIL_html(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+       StrBuf *Buf;
+
+       if (StrLength(Mime->Data) == 0)
+               return;
+
+       Buf = NewStrBufPlain(NULL, StrLength(Mime->Data));
+
+       /* HTML is fun, but we've got to strip it first */
+       output_html(ChrPtr(Mime->Charset), 
+                   (WC->CurRoom.view == VIEW_WIKI ? 1 : 0), 
+                   Mime->msgnum,
+                   Mime->Data, Buf);
+       FreeStrBuf(&Mime->Data);
+       Mime->Data = Buf;
+}
+
+
+void render_MAIL_UNKNOWN(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+       /* Unknown weirdness */
+       FlushStrBuf(Mime->Data);
+       StrBufAppendBufPlain(Mime->Data, _("I don't know how to display "), -1, 0);
+       StrBufAppendBuf(Mime->Data, Mime->ContentType, 0);
+       StrBufAppendBufPlain(Mime->Data, HKEY("<br>\n"), 0);
+}
+
+
+HashList *iterate_get_mime_All(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return Msg->Attachments;
+}
+HashList *iterate_get_mime_Submessages(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return Msg->Submessages;
+}
+HashList *iterate_get_mime_AttachLinks(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return Msg->AttachLinks;
+}
+HashList *iterate_get_mime_Attachments(StrBuf *Target, WCTemplputParams *TP)
+{
+       message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM);
+       return Msg->AllAttach;
+}
+
+void tmplput_MIME_Name(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       StrBufAppendTemplate(Target, TP, mime->Name, 0);
+}
+
+void tmplput_MIME_FileName(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       StrBufAppendTemplate(Target, TP, mime->FileName, 0);
+}
+
+void tmplput_MIME_PartNum(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       StrBufAppendTemplate(Target, TP, mime->PartNum, 0);
+}
+
+void tmplput_MIME_MsgNum(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       StrBufAppendPrintf(Target, "%ld", mime->msgnum);
+}
+
+void tmplput_MIME_Disposition(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       StrBufAppendTemplate(Target, TP, mime->Disposition, 0);
+}
+
+void tmplput_MIME_ContentType(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       StrBufAppendTemplate(Target, TP, mime->ContentType, 0);
+}
+
+void examine_charset(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       Msg->MsgBody->Charset = NewStrBufDup(HdrLine);
+}
+
+void tmplput_MIME_Charset(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       StrBufAppendTemplate(Target, TP, mime->Charset, 0);
+}
+
+void tmplput_MIME_Data(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       if (mime->Renderer != NULL)
+               mime->Renderer->f(Target, TP, NULL);
+       StrBufAppendTemplate(Target, TP, mime->Data, 0);
+       /* TODO: check whether we need to load it now? */
+}
+
+void tmplput_MIME_LoadData(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;    
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       wc_mime_attachment *att;
+       
+       if (( (!strcasecmp(ChrPtr(mime->Disposition), "inline"))||
+             (!strcasecmp(ChrPtr(mime->Disposition), "attachment"))) && 
+           (strcasecmp(ChrPtr(mime->ContentType), "application/ms-tnef")!=0))
+       {
+               
+               int n;
+               char N[64];
+               /* steal this mime part... */
+               att = malloc(sizeof(wc_mime_attachment));
+               memcpy(att, mime, sizeof(wc_mime_attachment));
+               memset(mime, 0, sizeof(wc_mime_attachment));
+
+               if (att->Data == NULL) 
+                       MimeLoadData(att);
+
+               if (WCC->attachments == NULL)
+                       WCC->attachments = NewHash(1, NULL);
+               /* And add it to the list. */
+               n = snprintf(N, sizeof N, "%d", GetCount(WCC->attachments) + 1);
+               Put(WCC->attachments, N, n, att, DestroyMime);
+       }
+}
+
+void tmplput_MIME_Length(StrBuf *Target, WCTemplputParams *TP)
+{
+       wc_mime_attachment *mime = (wc_mime_attachment*) CTX(CTX_MIME_ATACH);
+       StrBufAppendPrintf(Target, "%ld", mime->length);
+}
+
+HashList *iterate_get_registered_Attachments(StrBuf *Target, WCTemplputParams *TP)
+{
+       return WC->attachments;
+}
+
+void get_registered_Attachments_Count(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBufAppendPrintf(Target, "%ld", GetCount (WC->attachments));
+}
+
+void servcmd_do_search(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS SEARCH|%s", bstr("query"));
+}
+
+void servcmd_headers(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS ALL");
+}
+
+void servcmd_readfwd(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS ALL");
+}
+
+void servcmd_readgt(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS GT|%s", bstr("gt"));
+}
+
+void servcmd_readlt(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS LT|%s", bstr("lt"));
+}
+
+void servcmd_readnew(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS NEW");
+}
+
+void servcmd_readold(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS OLD");
+}
+
+
+/* DO NOT REORDER OR REMOVE ANY OF THESE */
+readloop_struct rlid[] = {
+       { {HKEY("do_search")},  servcmd_do_search       },
+       { {HKEY("headers")},    servcmd_headers         },
+       { {HKEY("readfwd")},    servcmd_readfwd         },
+       { {HKEY("readnew")},    servcmd_readnew         },
+       { {HKEY("readold")},    servcmd_readold         },
+       { {HKEY("readgt")},     servcmd_readgt          },
+       { {HKEY("readlt")},     servcmd_readlt          }
+};
+
+
+/* I think these are supposed to align with _eMessageField in messages.h
+ * So if you change one you have to change the other.
+ * TODO: figure out who did this and beat them with a wet noodle.
+ */
+const char *fieldMnemonics[] = {
+       "from", /* A -> eAuthor       */
+       "exti", /* E -> eXclusivID    */
+       "rfca", /* F -> erFc822Addr   */
+       "msgn", /* I -> emessageId    */
+       "jrnl", /* J -> eJournal      */
+       "rep2", /* K -> eReplyTo      */
+       "list", /* L -> eListID       */
+       "text", /* M -> eMesageText   */
+       "locl", /*      eIsLocal      */
+       "path", /* P -> eMessagePath  */
+       "rcpt", /* R -> eRecipient    */
+       "spec", /* S -> eSpecialField */
+       "time", /* T -> eTimestamp    */
+       "subj", /* U -> eMsgSubject   */
+       "nvto", /* V -> eenVelopeTo   */
+       "wefw", /* W -> eWeferences   */
+       "cccc", /* Y -> eCarbonCopY   */
+       "nhdr", /*      eHeaderOnly   */
+       "type", /*      eFormatType   */
+       "part", /*      eMessagePart  */
+       "suff"  /*      eSubFolder    */
+};
+HashList *msgKeyLookup = NULL;
+
+
+int GetFieldFromMnemonic(eMessageField *f, const char *c) {
+       void *v = NULL;
+       if (GetHash(msgKeyLookup, c, 4, &v)) {
+               *f = (eMessageField) v;
+               return 1;
+       }
+       return 0;
+}
+
+
+void FillMsgKeyLookupTable(void) {
+       long i = 0;
+
+       msgKeyLookup = NewHash (1, FourHash);
+       for (i=0; i<eLastHeader; ++i) {
+               if (fieldMnemonics[i] != NULL) {
+                       Put(msgKeyLookup, fieldMnemonics[i], 4, (void*)i, reference_free_handler);
+               }
+       }
+}
+
+
+void 
+InitModule_MSGRENDERERS
+(void)
+{
+       RegisterCTX(CTX_MAILSUM);
+       RegisterCTX(CTX_MIME_ATACH);
+
+       RegisterSortFunc(HKEY("date"), 
+                        NULL, 0,
+                        summcmp_date,
+                        summcmp_rdate,
+                        groupchange_date,
+                        CTX_MAILSUM);
+       RegisterSortFunc(HKEY("subject"), 
+                        NULL, 0,
+                        summcmp_subj,
+                        summcmp_rsubj,
+                        groupchange_subj,
+                        CTX_MAILSUM);
+       RegisterSortFunc(HKEY("sender"),
+                        NULL, 0,
+                        summcmp_sender,
+                        summcmp_rsender,
+                        groupchange_sender,
+                        CTX_MAILSUM);
+
+       RegisterNamespace("SUMM:COUNT", 0, 0, tmplput_SUMM_COUNT, NULL, CTX_NONE);
+
+       /* iterate over all known mails in WC->summ */
+       RegisterIterator("MAIL:SUMM:MSGS", 0, NULL, iterate_get_mailsumm_All, NULL,NULL, CTX_MAILSUM, CTX_NONE, IT_NOFLAG);
+
+       RegisterNamespace("MAIL:SUMM:EUID", 0, 1, tmplput_MAIL_SUMM_EUID, NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:DATEBRIEF", 0, 0, tmplput_MAIL_SUMM_DATE_BRIEF, NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:DATEFULL", 0, 0, tmplput_MAIL_SUMM_DATE_FULL, NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:DATENO",  0, 0, tmplput_MAIL_SUMM_DATE_NO,  NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:N",       0, 0, tmplput_MAIL_SUMM_N,        NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:PERMALINK", 0, 0, tmplput_MAIL_SUMM_PERMALINK, NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:FROM",    0, 2, tmplput_MAIL_SUMM_FROM,     NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:TO",      0, 2, tmplput_MAIL_SUMM_TO,       NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:SUBJECT", 0, 4, tmplput_MAIL_SUMM_SUBJECT,  NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:NTATACH", 0, 0, tmplput_MAIL_SUMM_NATTACH,  NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:CCCC", 0, 2, tmplput_MAIL_SUMM_CCCC, NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:REPLYTO", 0, 2, tmplput_MAIL_SUMM_REPLYTO, NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:ALLRCPT", 0, 2, tmplput_MAIL_SUMM_ALLRCPT,  NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:ORGROOM", 0, 2, tmplput_MAIL_SUMM_ORGROOM,  NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:RFCA", 0, 2, tmplput_MAIL_SUMM_RFCA, NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:REFIDS", 0, 1, tmplput_MAIL_SUMM_REFIDS,  NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:SUMM:INREPLYTO", 0, 2, tmplput_MAIL_SUMM_INREPLYTO,  NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:BODY", 0, 2, tmplput_MAIL_BODY,  NULL, CTX_MAILSUM);
+       RegisterNamespace("MAIL:QUOTETEXT", 1, 2, tmplput_QUOTED_MAIL_BODY,  NULL, CTX_NONE);
+       RegisterNamespace("MAIL:EDITTEXT", 1, 2, tmplput_EDIT_MAIL_BODY,  NULL, CTX_NONE);
+       RegisterNamespace("MAIL:EDITWIKI", 1, 2, tmplput_EDIT_WIKI_BODY,  NULL, CTX_NONE);
+       RegisterConditional("COND:MAIL:SUMM:RFCA", 0, Conditional_MAIL_SUMM_RFCA,  CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:SUMM:CCCC", 0, Conditional_MAIL_SUMM_CCCC,  CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:SUMM:REPLYTO", 0, Conditional_MAIL_SUMM_REPLYTO,  CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:SUMM:UNREAD", 0, Conditional_MAIL_SUMM_UNREAD, CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:SUMM:SUBJECT", 0, Conditional_MAIL_SUMM_SUBJECT, CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:ANON", 0, Conditional_ANONYMOUS_MESSAGE, CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:TO", 0, Conditional_MAIL_SUMM_TO, CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:SUBJ", 0, Conditional_MAIL_SUMM_SUBJ, CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:LOCAL", 0, Conditional_MAIL_LOCAL, CTX_MAILSUM);
+
+       /* do we have mimetypes to iterate over? */
+       RegisterConditional("COND:MAIL:MIME:ATTACH", 0, Conditional_MAIL_MIME_ALL, CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:MIME:ATTACH:SUBMESSAGES", 0, Conditional_MAIL_MIME_SUBMESSAGES, CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:MIME:ATTACH:LINKS", 0, Conditional_MAIL_MIME_ATTACHLINKS, CTX_MAILSUM);
+       RegisterConditional("COND:MAIL:MIME:ATTACH:ATT", 0, Conditional_MAIL_MIME_ATTACH, CTX_MAILSUM);
+       RegisterIterator("MAIL:MIME:ATTACH", 0, NULL, iterate_get_mime_All, NULL, NULL, CTX_MIME_ATACH, CTX_MAILSUM, IT_NOFLAG);
+       RegisterIterator("MAIL:MIME:ATTACH:SUBMESSAGES", 0, NULL, iterate_get_mime_Submessages, NULL, NULL, CTX_MIME_ATACH, CTX_MAILSUM, IT_NOFLAG);
+       RegisterIterator("MAIL:MIME:ATTACH:LINKS", 0, NULL, iterate_get_mime_AttachLinks, NULL, NULL, CTX_MIME_ATACH, CTX_MAILSUM, IT_NOFLAG);
+       RegisterIterator("MAIL:MIME:ATTACH:ATT", 0, NULL, iterate_get_mime_Attachments, NULL, NULL, CTX_MIME_ATACH, CTX_MAILSUM, IT_NOFLAG);
+
+       /* Parts of a mime attachent */
+       RegisterNamespace("MAIL:MIME:NAME", 0, 2, tmplput_MIME_Name, NULL, CTX_MIME_ATACH);
+       RegisterNamespace("MAIL:MIME:FILENAME", 0, 2, tmplput_MIME_FileName, NULL, CTX_MIME_ATACH);
+       RegisterNamespace("MAIL:MIME:PARTNUM", 0, 2, tmplput_MIME_PartNum, NULL, CTX_MIME_ATACH);
+       RegisterNamespace("MAIL:MIME:MSGNUM", 0, 2, tmplput_MIME_MsgNum, NULL, CTX_MIME_ATACH);
+       RegisterNamespace("MAIL:MIME:DISPOSITION", 0, 2, tmplput_MIME_Disposition, NULL, CTX_MIME_ATACH);
+       RegisterNamespace("MAIL:MIME:CONTENTTYPE", 0, 2, tmplput_MIME_ContentType, NULL, CTX_MIME_ATACH);
+       RegisterNamespace("MAIL:MIME:CHARSET", 0, 2, tmplput_MIME_Charset, NULL, CTX_MIME_ATACH);
+       RegisterNamespace("MAIL:MIME:LENGTH", 0, 2, tmplput_MIME_Length, NULL, CTX_MIME_ATACH);
+       RegisterNamespace("MAIL:MIME:DATA", 0, 2, tmplput_MIME_Data, NULL, CTX_MIME_ATACH);
+
+       /* load the actual attachment into WC->attachments; no output!!! */
+       RegisterNamespace("MAIL:MIME:LOADDATA", 0, 0, tmplput_MIME_LoadData, NULL, CTX_MIME_ATACH);
+
+       /* iterate the WC->attachments; use the above tokens for their contents */
+       RegisterIterator("MSG:ATTACHNAMES", 0, NULL, iterate_get_registered_Attachments, NULL, NULL, CTX_MIME_ATACH, CTX_NONE, IT_NOFLAG);
+       RegisterNamespace("MSG:NATTACH", 0, 0, get_registered_Attachments_Count,  NULL, CTX_NONE);
+
+       /* mime renderers translate an attachment into webcit viewable html text */
+       RegisterMimeRenderer(HKEY("message/rfc822"), render_MAIL, 0, 150);
+//*
+       RegisterMimeRenderer(HKEY("text/calendar"), render_MIME_ICS, 1, 501);
+       RegisterMimeRenderer(HKEY("application/ics"), render_MIME_ICS, 1, 500);
+//*/
+       RegisterMimeRenderer(HKEY("text/x-citadel-variformat"), render_MAIL_variformat, 1, 2);
+       RegisterMimeRenderer(HKEY("text/plain"), render_MAIL_text_plain, 1, 3);
+       RegisterMimeRenderer(HKEY("text"), render_MAIL_text_plain, 1, 1);
+       RegisterMimeRenderer(HKEY("text/x-markdown"), render_MAIL_text_plain, 1, 1);
+       RegisterMimeRenderer(HKEY("text/html"), render_MAIL_html, 1, 100);
+       RegisterMimeRenderer(HKEY(""), render_MAIL_UNKNOWN, 0, 0);
+
+       /* these headers are citserver replies to MSG4 and friends. one evaluator for each */
+       RegisterMsgHdr(HKEY("nhdr"), examine_nhdr, 0);
+       RegisterMsgHdr(HKEY("exti"), examine_exti, 0);
+       RegisterMsgHdr(HKEY("type"), examine_type, 0);
+       RegisterMsgHdr(HKEY("from"), examine_from, 0);
+       RegisterMsgHdr(HKEY("subj"), examine_subj, 0);
+       RegisterMsgHdr(HKEY("msgn"), examine_msgn, 0);
+       RegisterMsgHdr(HKEY("wefw"), examine_wefw, 0);
+       RegisterMsgHdr(HKEY("cccc"), examine_cccc, 0);
+       RegisterMsgHdr(HKEY("rep2"), examine_replyto, 0);
+       RegisterMsgHdr(HKEY("room"), examine_room, 0);
+       RegisterMsgHdr(HKEY("rfca"), examine_rfca, 0);
+       RegisterMsgHdr(HKEY("rcpt"), examine_rcpt, 0);
+       RegisterMsgHdr(HKEY("nvto"), examine_nvto, 0);
+       RegisterMsgHdr(HKEY("time"), examine_time, 0);
+       RegisterMsgHdr(HKEY("part"), examine_mime_part, 0);
+       RegisterMsgHdr(HKEY("locl"), examine_locl, 0);
+       RegisterMsgHdr(HKEY("text"), examine_text, 1);
+
+       /* these are the content-type headers we get in front of a message; put it into the same hash since it doesn't clash. */
+       RegisterMsgHdr(HKEY("X-Citadel-MSG4-Partnum"), examine_msg4_partnum, 0);
+       RegisterMsgHdr(HKEY("Content-type"), examine_content_type, 0);
+       RegisterMsgHdr(HKEY("Content-length"), examine_content_lengh, 0);
+       RegisterMsgHdr(HKEY("Content-transfer-encoding"), examine_content_encoding, 0); /* do we care? */
+       RegisterMsgHdr(HKEY("charset"), examine_charset, 0);
+
+       /* Don't care about these... */
+       RegisterMsgHdr(HKEY("pref"), examine_pref, 0);
+       RegisterMsgHdr(HKEY("suff"), examine_suff, 0);
+       RegisterMsgHdr(HKEY("path"), examine_path, 0);
+}
+
+void 
+InitModule2_MSGRENDERERS
+(void)
+{
+       /* and finalize the anouncement to the server... */
+       CreateMimeStr();
+}
+void 
+ServerStartModule_MSGRENDERERS
+(void)
+{
+       DflMsgHeaderHandler = NewHash (1, FourHash);
+       DflEnumMsgHeaderHandler = NewHash (1, Flathash);
+       MsgHeaderHandler = NewHash(1, NULL);
+       MimeRenderHandler = NewHash(1, NULL);
+       ReadLoopHandler = NewHash(1, NULL);
+       FillMsgKeyLookupTable();
+}
+
+void 
+ServerShutdownModule_MSGRENDERERS
+(void)
+{
+       DeleteHash(&DflMsgHeaderHandler);
+       DeleteHash(&DflEnumMsgHeaderHandler);
+
+
+       DeleteHash(&MsgHeaderHandler);
+       DeleteHash(&MimeRenderHandler);
+       DeleteHash(&ReadLoopHandler);
+       DeleteHash(&msgKeyLookup);
+}
+
+void 
+SessionDestroyModule_MSGRENDERERS
+(wcsession *sess)
+{
+       DeleteHash(&sess->attachments);
+       FreeStrBuf(&sess->ConvertBuf1);
+       FreeStrBuf(&sess->ConvertBuf2);
+}
diff --git a/webcit/netconf.c b/webcit/netconf.c
new file mode 100644 (file)
index 0000000..83c3914
--- /dev/null
@@ -0,0 +1,306 @@
+#include "webcit.h"
+
+void display_netconf(void);
+
+CtxType CTX_NODECONF = CTX_NONE;
+/*----------------------------------------------------------------------*/
+/*              Business Logic                                          */
+/*----------------------------------------------------------------------*/
+
+typedef struct _nodeconf {
+       int DeleteMe;
+       StrBuf *NodeName;
+       StrBuf *Secret;
+       StrBuf *Host;
+       StrBuf *Port;
+}NodeConf;
+
+void DeleteNodeConf(void *vNode)
+{
+       NodeConf *Node = (NodeConf*) vNode;
+       FreeStrBuf(&Node->NodeName);
+       FreeStrBuf(&Node->Secret);
+       FreeStrBuf(&Node->Host);
+       FreeStrBuf(&Node->Port);
+       free(Node);
+}
+
+NodeConf *NewNode(StrBuf *SerializedNode)
+{
+       NodeConf *Node;
+
+       if (StrLength(SerializedNode) < 8) 
+               return NULL; /** we need at least 4 pipes and some other text so its invalid. */
+       Node = (NodeConf *) malloc(sizeof(NodeConf));
+       Node->DeleteMe = 0;
+       Node->NodeName=NewStrBuf();
+       StrBufExtract_token(Node->NodeName, SerializedNode, 0, '|');
+       Node->Secret=NewStrBuf();
+       StrBufExtract_token(Node->Secret, SerializedNode, 1, '|');
+       Node->Host=NewStrBuf();
+       StrBufExtract_token(Node->Host, SerializedNode, 2, '|');
+       Node->Port=NewStrBuf();
+       StrBufExtract_token(Node->Port, SerializedNode, 3, '|');
+       return Node;
+}
+
+NodeConf *HttpGetNewNode(void)
+{
+       NodeConf *Node;
+
+       if (!havebstr("node") || 
+           !havebstr("secret")||
+           !havebstr("host")||
+           !havebstr("port"))
+               return NULL;
+
+       Node = (NodeConf *) malloc(sizeof(NodeConf));
+       Node->DeleteMe = 0;
+       Node->NodeName = NewStrBufDup(sbstr("node"));
+       Node->Secret = NewStrBufDup(sbstr("secret"));
+       Node->Host = NewStrBufDup(sbstr("host"));
+       Node->Port = NewStrBufDup(sbstr("port"));
+       return Node;
+}
+
+void SerializeNode(NodeConf *Node, StrBuf *Buf)
+{
+       StrBufPrintf(Buf, "%s|%s|%s|%s", 
+                    ChrPtr(Node->NodeName),
+                    ChrPtr(Node->Secret),
+                    ChrPtr(Node->Host),
+                    ChrPtr(Node->Port));
+}
+
+
+HashList *load_netconf(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Buf;
+       HashList *Hash;
+       char nnn[64];
+       char buf[SIZ];
+       int nUsed;
+       NodeConf *Node;
+
+       serv_puts("CONF getsys|application/x-citadel-ignet-config");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               Hash = NewHash(1, NULL);
+
+               Buf = NewStrBuf();
+               while (StrBuf_ServGetln(Buf), strcmp(ChrPtr(Buf), "000")) {
+                       Node = NewNode(Buf);
+                       if (Node != NULL) {
+                               nUsed = GetCount(Hash);
+                               nUsed = snprintf(nnn, sizeof(nnn), "%d", nUsed+1);
+                               Put(Hash, nnn, nUsed, Node, DeleteNodeConf); 
+                       }
+               }
+               FreeStrBuf(&Buf);
+               return Hash;
+       }
+       return NULL;
+}
+
+
+
+void save_net_conf(HashList *Nodelist)
+{
+       char buf[SIZ];
+       StrBuf *Buf;
+       HashPos *where;
+       void *vNode;
+       NodeConf *Node;
+       const char *Key;
+       long KeyLen;
+
+       serv_puts("CONF putsys|application/x-citadel-ignet-config");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '4') {
+               if ((Nodelist != NULL) && (GetCount(Nodelist) > 0)) {
+                       where = GetNewHashPos(Nodelist, 0);
+                       Buf = NewStrBuf();
+                       while (GetNextHashPos(Nodelist, where, &KeyLen, &Key, &vNode)) {
+                               Node = (NodeConf*) vNode;
+                               if (Node->DeleteMe==0) { 
+                                       SerializeNode(Node, Buf);
+                                       serv_putbuf(Buf);
+                               }
+                       }
+                       FreeStrBuf(&Buf);
+                       DeleteHashPos(&where);
+               }
+               serv_puts("000");
+       }
+}
+
+
+
+/*----------------------------------------------------------------------*/
+/*              WEB Handlers                                            */
+/*----------------------------------------------------------------------*/
+
+
+
+/*
+ * edit a network node
+ */
+void edit_node(void) {
+       HashList *NodeConfig;
+       const StrBuf *Index;
+       NodeConf *NewNode;
+
+       if (havebstr("ok_button")) {
+               Index = sbstr("index");
+               NewNode = HttpGetNewNode();
+               if ((NewNode == NULL) || (Index == NULL)) {
+                       AppendImportantMessage(_("Invalid Parameter"), -1);
+                       url_do_template();
+                       return;
+               }
+                       
+               NodeConfig = load_netconf(NULL, &NoCtx);
+               Put(NodeConfig, ChrPtr(Index), StrLength(Index), NewNode, DeleteNodeConf);
+               save_net_conf(NodeConfig);
+               DeleteHash(&NodeConfig);
+       }
+       url_do_template();
+}
+
+
+/*
+ * modify an existing node
+ */
+void display_edit_node(void)
+{
+       WCTemplputParams SubTP;
+       HashList *NodeConfig;
+       const StrBuf *Index;
+       void *vNode;
+       const StrBuf *Tmpl;
+
+       Index = sbstr("index");
+       if (Index == NULL) {
+               AppendImportantMessage(_("Invalid Parameter"), -1);
+               url_do_template();
+               return;
+       }
+
+       NodeConfig = load_netconf(NULL, &NoCtx);
+       if (!GetHash(NodeConfig, ChrPtr(Index), StrLength(Index), &vNode) || 
+           (vNode == NULL)) {
+               AppendImportantMessage(_("Invalid Parameter"), -1);
+               url_do_template();
+               DeleteHash(&NodeConfig);
+               return;
+       }
+       StackContext(NULL, &SubTP, vNode, CTX_NODECONF, 0, NULL);
+       {
+               begin_burst();
+               Tmpl = sbstr("template");
+               output_headers(1, 0, 0, 0, 1, 0);
+               DoTemplate(SKEY(Tmpl), NULL, &SubTP);
+               end_burst();
+       }
+       UnStackContext(&SubTP);
+       DeleteHash(&NodeConfig);
+       
+}
+
+
+/*
+ * display all configured nodes
+ */
+void display_netconf(void)
+{
+       wDumpContent(1);
+}
+
+/*
+ * display the dialog to verify the deletion
+ */
+void display_confirm_delete_node(void)
+{
+       wDumpContent(1);
+}
+
+
+/*
+ * actually delete the node
+ */
+void delete_node(void)
+{
+       HashList *NodeConfig;
+       const StrBuf *Index;
+       NodeConf *Node;
+       void *vNode;
+
+       Index = sbstr("index");
+       if (Index == NULL) {
+               AppendImportantMessage(_("Invalid Parameter"), -1);
+               url_do_template();
+               return;
+       }
+
+       NodeConfig = load_netconf(NULL, &NoCtx);
+       if (!GetHash(NodeConfig, ChrPtr(Index), StrLength(Index), &vNode) || 
+           (vNode == NULL)) {
+               AppendImportantMessage(_("Invalid Parameter"), -1);
+               url_do_template();
+               DeleteHash(&NodeConfig);
+               return;
+       }
+       Node = (NodeConf *) vNode;
+       Node->DeleteMe = 1;
+               save_net_conf(NodeConfig);
+       DeleteHash(&NodeConfig);
+       
+       url_do_template();
+
+}
+
+
+void tmplput_NodeName(StrBuf *Target, WCTemplputParams *TP)
+{
+       NodeConf *Node = (NodeConf*) CTX(CTX_NODECONF); 
+       StrBufAppendTemplate(Target, TP, Node->NodeName, 0);
+}
+
+void tmplput_Secret(StrBuf *Target, WCTemplputParams *TP)
+{
+       NodeConf *Node = (NodeConf*) CTX(CTX_NODECONF);
+       StrBufAppendTemplate(Target, TP, Node->Secret, 0);
+}
+
+void tmplput_Host(StrBuf *Target, WCTemplputParams *TP) 
+{
+       NodeConf *Node= (NodeConf*) CTX(CTX_NODECONF);
+       StrBufAppendTemplate(Target, TP, Node->Host, 0);
+}
+
+void tmplput_Port(StrBuf *Target, WCTemplputParams *TP)
+{
+       NodeConf *Node= (NodeConf*) CTX(CTX_NODECONF);
+       StrBufAppendTemplate(Target, TP, Node->Port, 0);
+}
+
+void 
+InitModule_NETCONF
+(void)
+{
+       RegisterCTX(CTX_NODECONF);
+       WebcitAddUrlHandler(HKEY("display_edit_node"), "", 0, display_edit_node, 0);
+
+       WebcitAddUrlHandler(HKEY("aide_ignetconf_edit_node"), "", 0, edit_node, 0);
+       WebcitAddUrlHandler(HKEY("display_netconf"), "", 0, display_netconf, 0);
+       WebcitAddUrlHandler(HKEY("display_confirm_delete_node"), "", 0, display_confirm_delete_node, 0);
+       WebcitAddUrlHandler(HKEY("delete_node"), "", 0, delete_node, 0);
+
+                                                                                          
+        RegisterNamespace("CFG:IGNET:NODE", 0, 1, tmplput_NodeName, NULL, CTX_NODECONF);
+        RegisterNamespace("CFG:IGNET:SECRET", 0, 1, tmplput_Secret, NULL, CTX_NODECONF);
+        RegisterNamespace("CFG:IGNET:HOST", 0, 1, tmplput_Host, NULL, CTX_NODECONF);
+        RegisterNamespace("CFG:IGNET:PORT", 0, 1, tmplput_Port, NULL, CTX_NODECONF);
+
+       RegisterIterator("NODECONFIG", 0, NULL, load_netconf, NULL, DeleteHash, CTX_NODECONF, CTX_NONE, IT_NOFLAG);
+}
diff --git a/webcit/nogz-mimetypes.txt b/webcit/nogz-mimetypes.txt
new file mode 100644 (file)
index 0000000..f50249a
--- /dev/null
@@ -0,0 +1,152 @@
+# all mimetypes enlisted in this file won't be gzipped on the fly.
+
+application/gzip
+application/java-archive
+application/java-serialized-object
+application/java-vm
+application/ogg
+application/zip
+application/vnd.android.package-archive
+application/vnd.audiograph
+application/vnd.debian.binary-package
+application/vnd.google-earth.kmz
+application/vnd.oasis.opendocument.chart
+application/vnd.oasis.opendocument.database
+application/vnd.oasis.opendocument.formula
+application/vnd.oasis.opendocument.graphics
+application/vnd.oasis.opendocument.graphics-template
+application/vnd.oasis.opendocument.image
+application/vnd.oasis.opendocument.presentation
+application/vnd.oasis.opendocument.presentation-template
+application/vnd.oasis.opendocument.spreadsheet
+application/vnd.oasis.opendocument.spreadsheet-template
+application/vnd.oasis.opendocument.text
+application/vnd.oasis.opendocument.text-master
+application/vnd.oasis.opendocument.text-template
+application/vnd.oasis.opendocument.text-web
+application/vnd.openxmlformats-officedocument.presentationml.presentation
+application/vnd.openxmlformats-officedocument.presentationml.slide
+application/vnd.openxmlformats-officedocument.presentationml.slideshow
+application/vnd.openxmlformats-officedocument.presentationml.template
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
+application/vnd.openxmlformats-officedocument.spreadsheetml.template
+application/vnd.openxmlformats-officedocument.wordprocessingml.document
+application/vnd.openxmlformats-officedocument.wordprocessingml.template
+application/zlib
+application/x-7z-compressed
+application/x-cab
+application/x-debian-package
+application/x-gtar-compressed
+application/x-iso9660-image
+application/x-java-applet
+application/x-java-bean
+application/x-lha
+application/x-lzh
+application/x-lzx
+application/x-redhat-package-manager
+application/x-tar
+application/x-videolan
+application/x-wingz
+application/x-xpinstall
+application/x-xz
+
+audio/32kadpcm
+audio/3gpp
+audio/amr
+audio/amr-wb
+audio/annodex
+audio/basic
+audio/csound
+audio/flac
+audio/g.722.1
+audio/l16
+audio/midi
+audio/mp4a-latm
+audio/mpa-robust
+audio/mpeg
+audio/mpegurl
+audio/ogg
+audio/parityfec
+audio/prs.sid
+audio/telephone-event
+audio/tone
+audio/vnd.cisco.nse
+audio/vnd.cns.anp1
+audio/vnd.cns.inf1
+audio/vnd.digital-winds
+audio/vnd.everad.plj
+audio/vnd.lucent.voice
+audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800
+audio/vnd.nuera.ecelp7470
+audio/vnd.nuera.ecelp9600
+audio/vnd.octel.sbc
+audio/vnd.qcelp
+audio/vnd.rhetorex.32kadpcm
+audio/vnd.vmx.cvsd
+audio/x-aiff
+audio/x-gsm
+audio/x-mpegurl
+audio/x-ms-wma
+audio/x-ms-wax
+audio/x-pn-realaudio-plugin
+audio/x-pn-realaudio
+audio/x-realaudio
+audio/x-scpls
+audio/x-sd2
+audio/x-wav
+
+
+image/cgm
+image/g3fax
+image/jp2
+image/jpeg
+image/jpm
+image/jpx
+image/naplps
+image/png
+image/prs.btif
+image/prs.pti
+image/vnd.cns.inf2
+image/vnd.djvu
+image/vnd.fastbidsheet
+image/vnd.fpx
+image/vnd.fst
+image/x-jng
+
+text/h323
+
+video/3gpp
+video/annodex
+video/dl
+video/dv
+video/fli
+video/gl
+video/mpeg
+video/MP2T
+video/mp4
+video/quicktime
+video/mkv
+video/mp4v-es
+video/ogg
+video/parityfec
+video/pointer
+video/webm
+video/vnd.fvt
+video/vnd.motorola.video
+video/vnd.motorola.videop
+video/vnd.mpegurl
+video/vnd.mts
+video/vnd.nokia.interleaved-multimedia
+video/vnd.vivo
+video/x-flv
+video/x-la-asf
+video/x-mng
+video/x-ms-asf
+video/x-ms-wm
+video/x-ms-wmv
+video/x-ms-wmx
+video/x-ms-wvx
+video/x-msvideo
+video/x-sgi-movie
+video/x-matroska
diff --git a/webcit/notes.c b/webcit/notes.c
new file mode 100644 (file)
index 0000000..584e8d9
--- /dev/null
@@ -0,0 +1,508 @@
+
+#include "webcit.h"
+#include "dav.h"
+#include "webserver.h"
+
+CtxType CTX_VNOTE = CTX_NONE;
+
+int pastel_palette[9][3] = {
+       { 0x80, 0x80, 0x80 },
+       { 0xff, 0x80, 0x80 },
+       { 0x80, 0x80, 0xff },
+       { 0xff, 0xff, 0x80 },
+       { 0x80, 0xff, 0x80 },
+       { 0xff, 0x80, 0xff },
+       { 0x80, 0xff, 0xff },
+       { 0xff, 0x80, 0x80 },
+       { 0x80, 0x80, 0x80 }
+};
+
+
+/*
+ * Fetch a message from the server and extract a vNote from it
+ */
+struct vnote *vnote_new_from_msg(long msgnum,int unread) 
+{
+       StrBuf *Buf;
+       StrBuf *Data = NULL;
+       const char *bptr;
+       int Done = 0;
+       char uid_from_headers[256];
+       char mime_partnum[256];
+       char mime_filename[256];
+       char mime_content_type[256];
+       char mime_disposition[256];
+       char relevant_partnum[256];
+       int phase = 0;                          /* 0 = citadel headers, 1 = mime headers, 2 = body */
+       char msg4_content_type[256] = "";
+       char msg4_content_encoding[256] = "";
+       int msg4_content_length = 0;
+       struct vnote *vnote_from_body = NULL;
+       int vnote_inline = 0;                   /* 1 = MSG4 gave us a text/x-vnote top level */
+
+       relevant_partnum[0] = '\0';
+       serv_printf("MSG4 %ld", msgnum);        /* we need the mime headers */
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 1) {
+               FreeStrBuf (&Buf);
+               return NULL;
+       }
+       while ((StrBuf_ServGetln(Buf)>=0) && !Done) {
+               if ( (StrLength(Buf)==3) && 
+                    !strcmp(ChrPtr(Buf), "000")) {
+                       Done = 1;
+                       break;
+               }
+               bptr = ChrPtr(Buf);
+               switch (phase) {
+               case 0:
+                       if (!strncasecmp(bptr, "exti=", 5)) {
+                               safestrncpy(uid_from_headers, &(ChrPtr(Buf)[5]), sizeof uid_from_headers);
+                       }
+                       else if (!strncasecmp(bptr, "part=", 5)) {
+                               extract_token(mime_filename, &bptr[5], 1, '|', sizeof mime_filename);
+                               extract_token(mime_partnum, &bptr[5], 2, '|', sizeof mime_partnum);
+                               extract_token(mime_disposition, &bptr[5], 3, '|', sizeof mime_disposition);
+                               extract_token(mime_content_type, &bptr[5], 4, '|', sizeof mime_content_type);
+
+                               if (!strcasecmp(mime_content_type, "text/vnote")) {
+                                       strcpy(relevant_partnum, mime_partnum);
+                               }
+                       }
+                       else if ((phase == 0) && (!strncasecmp(bptr, "text", 4))) {
+                               phase = 1;
+                       }
+               break;
+               case 1:
+                       if (!IsEmptyStr(bptr)) {
+                               if (!strncasecmp(bptr, "Content-type: ", 14)) {
+                                       safestrncpy(msg4_content_type, &bptr[14], sizeof msg4_content_type);
+                                       string_trim(msg4_content_type);
+                               }
+                               else if (!strncasecmp(bptr, "Content-transfer-encoding: ", 27)) {
+                                       safestrncpy(msg4_content_encoding, &bptr[27], sizeof msg4_content_encoding);
+                                       string_trim(msg4_content_type);
+                               }
+                               else if ((!strncasecmp(bptr, "Content-length: ", 16))) {
+                                       msg4_content_length = atoi(&bptr[16]);
+                               }
+                               break;
+                       }
+                       else {
+                               phase++;
+                               if ((msg4_content_length > 0)
+                                   && ( !strcasecmp(msg4_content_encoding, "7bit"))
+                                   && (!strcasecmp(msg4_content_type, "text/vnote"))
+                               ) { 
+                                       vnote_inline = 1;
+                               }
+                       }
+               case 2:
+                       if (vnote_inline) {
+                               Data = NewStrBufPlain(NULL, msg4_content_length * 2);
+                               if (msg4_content_length > 0) {
+                                       StrBuf_ServGetBLOBBuffered(Data, msg4_content_length);
+                                       phase ++;
+                               }
+                               else {
+                                       StrBufAppendBuf(Data, Buf, 0);
+                                       StrBufAppendBufPlain(Data, "\r\n", 1, 0);
+                               }
+                       }
+               case 3:
+                       if (vnote_inline) {
+                               StrBufAppendBuf(Data, Buf, 0);
+                       }
+               }
+       }
+       FreeStrBuf(&Buf);
+
+       /* If MSG4 didn't give us the part we wanted, but we know that we can find it
+        * as one of the other MIME parts, attempt to load it now.
+        */
+       if ((!vnote_inline) && (!IsEmptyStr(relevant_partnum))) {
+               Data = load_mimepart(msgnum, relevant_partnum);
+       }
+
+       if (StrLength(Data) > 0) {
+               if (IsEmptyStr(uid_from_headers)) {
+                       /* Convert an old-style note to a vNote */
+                       vnote_from_body = vnote_new();
+                       vnote_from_body->uid = strdup(uid_from_headers);
+                       vnote_from_body->color_red = pastel_palette[3][0];
+                       vnote_from_body->color_green = pastel_palette[3][1];
+                       vnote_from_body->color_blue = pastel_palette[3][2];
+                       vnote_from_body->body = malloc(StrLength(Data) + 1);
+                       vnote_from_body->body[0] = 0;
+                       memcpy(vnote_from_body->body, ChrPtr(Data), StrLength(Data) + 1);
+                       FreeStrBuf(&Data);
+                       return vnote_from_body;
+               }
+               else {
+                       char *Buf = SmashStrBuf(&Data);
+                       
+                       struct vnote *v = vnote_new_from_str(Buf);
+                       free(Buf);
+                       return(v);
+               }
+       }
+       return NULL;
+}
+
+
+
+/*
+ * Serialize a vnote and write it to the server
+ */
+void write_vnote_to_server(struct vnote *v) 
+{
+       char buf[1024];
+       char *pch;
+       char boundary[256];
+       static int seq = 0;
+
+       snprintf(boundary, sizeof boundary, "Citadel--Multipart--%s--%04x--%04x",
+               ChrPtr(WC->serv_info->serv_fqdn),
+               getpid(),
+               ++seq
+       );
+
+       serv_puts("ENT0 1|||4");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '4') {
+               /* Remember, serv_printf() appends an extra newline */
+               serv_printf("Content-type: multipart/alternative; "
+                       "boundary=\"%s\"\n", boundary);
+               serv_printf("This is a multipart message in MIME format.\n");
+               serv_printf("--%s", boundary);
+       
+               serv_puts("Content-type: text/plain; charset=utf-8");
+               serv_puts("Content-Transfer-Encoding: 7bit");
+               serv_puts("");
+               serv_puts(v->body);
+               serv_puts("");
+       
+               serv_printf("--%s", boundary);
+               serv_puts("Content-type: text/vnote");
+               serv_puts("Content-Transfer-Encoding: 7bit");
+               serv_puts("");
+               pch = vnote_serialize(v);
+               serv_puts(pch);
+               free(pch);
+               serv_printf("--%s--", boundary);
+               serv_puts("000");
+       }
+}
+
+
+
+
+/*
+ * Background ajax call to receive updates from the browser when a note is moved, resized, or updated.
+ */
+void ajax_update_note(void) {
+
+       char buf[1024];
+       int msgnum;
+       struct vnote *v = NULL;
+
+        if (!havebstr("note_uid")) {
+               begin_ajax_response();
+               wc_printf("Received ajax_update_note() request without a note UID.");
+               end_ajax_response();
+               return;
+       }
+
+       serv_printf("EUID %s", bstr("note_uid"));
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               begin_ajax_response();
+               wc_printf("Cannot find message containing vNote with the requested uid!");
+               end_ajax_response();
+               return;
+       }
+       msgnum = atol(&buf[4]);
+       
+       /* Was this request a delete operation?  If so, nuke it... */
+       if (havebstr("deletenote")) {
+               if (!strcasecmp(bstr("deletenote"), "yes")) {
+                       serv_printf("DELE %d", msgnum);
+                       serv_getln(buf, sizeof buf);
+                       begin_ajax_response();
+                       wc_printf("%s", buf);
+                       end_ajax_response();
+                       return;
+               }
+       }
+
+       /* If we get to this point it's an update, not a delete */
+       v = vnote_new_from_msg(msgnum, 0);
+       if (!v) {
+               begin_ajax_response();
+               wc_printf("Cannot locate a vNote within message %d\n", msgnum);
+               end_ajax_response();
+               return;
+       }
+
+       /* Make any requested changes */
+        if (havebstr("top")) {
+               v->pos_top = atoi(bstr("top"));
+       }
+        if (havebstr("left")) {
+               v->pos_left = atoi(bstr("left"));
+       }
+        if (havebstr("height")) {
+               v->pos_height = atoi(bstr("height"));
+       }
+        if (havebstr("width")) {
+               v->pos_width = atoi(bstr("width"));
+       }
+        if (havebstr("red")) {
+               v->color_red = atoi(bstr("red"));
+       }
+        if (havebstr("green")) {
+               v->color_green = atoi(bstr("green"));
+       }
+        if (havebstr("blue")) {
+               v->color_blue = atoi(bstr("blue"));
+       }
+        if (havebstr("value")) {       /* I would have preferred 'body' but InPlaceEditor hardcodes 'value' */
+               if (v->body) free(v->body);
+               v->body = strdup(bstr("value"));
+       }
+
+       /* Serialize it and save it to the message base.  Server will delete the old one. */
+       write_vnote_to_server(v);
+
+       begin_ajax_response();
+       if (v->body) {
+               escputs(v->body);
+       }
+       end_ajax_response();
+
+       vnote_free(v);
+}
+
+
+
+
+/*
+ * display sticky notes
+ *
+ * msgnum = Message number on the local server of the note to be displayed
+ */
+/*TODO: wrong hook */
+int notes_LoadMsgFromServer(SharedMessageStatus *Stat, 
+                           void **ViewSpecific, 
+                           message_summary* Msg, 
+                           int is_new, 
+                           int i)
+{
+       struct vnote *v;
+       WCTemplputParams TP;
+
+       memset(&TP, 0, sizeof(WCTemplputParams));
+       TP.Filter.ContextType = CTX_VNOTE;
+       v = vnote_new_from_msg(Msg->msgnum, is_new);
+       if (v) {
+               TP.Context = v;
+               DoTemplate(HKEY("vnoteitem"),
+                          WC->WBuf, &TP);
+                       
+
+               /* uncomment these lines to see ugly debugging info 
+               StrBufAppendPrintf(WC->trailing_javascript,
+                       "document.write('L: ' + $('note-%s').style.left + '; ');", v->uid);
+               StrBufAppendPrintf(WC->trailing_javascript,
+                       "document.write('T: ' + $('note-%s').style.top + '; ');", v->uid);
+               StrBufAppendPrintf(WC->trailing_javascript,
+                       "document.write('W: ' + $('note-%s').style.width + '; ');", v->uid);
+               StrBufAppendPrintf(WC->trailing_javascript,
+                       "document.write('H: ' + $('note-%s').style.height + '<br>');", v->uid);
+               */
+
+               vnote_free(v);
+       }
+       return 0;
+}
+
+
+
+/*
+ * Create a new note
+ */
+void add_new_note(void) {
+       struct vnote *v;
+
+       v = vnote_new();
+       if (v) {
+               v->uid = malloc(128);
+               generate_uuid(v->uid);
+               v->color_red = pastel_palette[3][0];
+               v->color_green = pastel_palette[3][1];
+               v->color_blue = pastel_palette[3][2];
+               v->body = strdup(_("Click on any note to edit it."));
+               write_vnote_to_server(v);
+               vnote_free(v);
+       }
+       
+       readloop(readfwd, eUseDefault);
+}
+
+
+void tmpl_vcard_put_posleft(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrBufAppendPrintf(Target, "%d", v->pos_left);
+}
+
+void tmpl_vcard_put_postop(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrBufAppendPrintf(Target, "%d", v->pos_top);
+}
+
+void tmpl_vcard_put_poswidth(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrBufAppendPrintf(Target, "%d", v->pos_width);
+}
+
+void tmpl_vcard_put_posheight(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrBufAppendPrintf(Target, "%d", v->pos_height);
+}
+
+void tmpl_vcard_put_posheight2(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrBufAppendPrintf(Target, "%d", (v->pos_height / 16) - 5);
+}
+
+void tmpl_vcard_put_width2(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrBufAppendPrintf(Target, "%d", (v->pos_width / 9) - 1);
+}
+
+void tmpl_vcard_put_color(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrBufAppendPrintf(Target, "%02X%02X%02X", v->color_red, v->color_green, v->color_blue);
+}
+
+void tmpl_vcard_put_bgcolor(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrBufAppendPrintf(Target, "%02X%02X%02X", v->color_red/2, v->color_green/2, v->color_blue/2);
+}
+
+void tmpl_vcard_put_message(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrEscAppend(Target, NULL, v->body, 0, 0); /*TODO?*/
+}
+
+void tmpl_vcard_put_uid(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct vnote *v = (struct vnote *) CTX(CTX_VNOTE);
+       StrBufAppendBufPlain(Target, v->uid, -1, 0);
+}
+
+
+
+
+int notes_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                                void **ViewSpecific, 
+                                long oper, 
+                                char *cmd, 
+                                long len,
+                                char *filter,
+                                long flen)
+{
+       strcpy(cmd, "MSGS ALL");
+       Stat->maxmsgs = 32767;
+       wc_printf("<div id=\"new_notes_here\"></div>\n");
+       return 200;
+
+}
+
+int notes_Cleanup(void **ViewSpecific)
+{
+       wDumpContent(1);
+       return 0;
+}
+
+void render_MIME_VNote(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       wc_mime_attachment *Mime = CTX(CTX_MIME_ATACH);
+
+       if (StrLength(Mime->Data) == 0)
+               MimeLoadData(Mime);
+       if (StrLength(Mime->Data) > 0) {
+               struct vnote *v;
+               StrBuf *Buf;
+               char *vcard;
+
+               Buf = NewStrBuf();
+               vcard = SmashStrBuf(&Mime->Data);
+               v = vnote_new_from_str(vcard);
+               free (vcard);
+               if (v) {
+                       WCTemplputParams TP;
+                       
+                       memset(&TP, 0, sizeof(WCTemplputParams));
+                       TP.Filter.ContextType = CTX_VNOTE;
+                       TP.Context = v;
+                       DoTemplate(HKEY("mail_vnoteitem"),
+                                  Buf, &TP);
+                       
+                       vnote_free(v);
+                       Mime->Data = Buf;
+               }
+               else {
+                       if (Mime->Data == NULL)
+                               Mime->Data = NewStrBuf();
+                       else
+                               FlushStrBuf(Mime->Data);
+               }
+       }
+}
+
+
+
+void 
+InitModule_NOTES
+(void)
+{
+       RegisterCTX(CTX_VNOTE);
+
+       RegisterReadLoopHandlerset(
+               VIEW_NOTES,
+               notes_GetParamsGetServerCall,
+               NULL,
+               NULL,
+               NULL,
+               notes_LoadMsgFromServer,
+               NULL,
+               notes_Cleanup,
+               NULL);
+
+       WebcitAddUrlHandler(HKEY("add_new_note"), "", 0, add_new_note, 0);
+       WebcitAddUrlHandler(HKEY("ajax_update_note"), "", 0, ajax_update_note, 0);
+
+       RegisterNamespace("VNOTE:POS:LEFT", 0, 0, tmpl_vcard_put_posleft, NULL, CTX_VNOTE);
+       RegisterNamespace("VNOTE:POS:TOP", 0, 0, tmpl_vcard_put_postop, NULL, CTX_VNOTE);
+       RegisterNamespace("VNOTE:POS:WIDTH", 0, 0, tmpl_vcard_put_poswidth, NULL, CTX_VNOTE);
+       RegisterNamespace("VNOTE:POS:HEIGHT", 0, 0, tmpl_vcard_put_posheight, NULL, CTX_VNOTE);
+       RegisterNamespace("VNOTE:POS:HEIGHT2", 0, 0, tmpl_vcard_put_posheight2, NULL, CTX_VNOTE);
+       RegisterNamespace("VNOTE:POS:WIDTH2", 0, 0, tmpl_vcard_put_width2, NULL, CTX_VNOTE);
+       RegisterNamespace("VNOTE:COLOR", 0, 0, tmpl_vcard_put_color, NULL, CTX_VNOTE);
+       RegisterNamespace("VNOTE:BGCOLOR", 0, 0,tmpl_vcard_put_bgcolor, NULL, CTX_VNOTE);
+       RegisterNamespace("VNOTE:MSG", 0, 1, tmpl_vcard_put_message, NULL, CTX_VNOTE);
+       RegisterNamespace("VNOTE:UID", 0, 0, tmpl_vcard_put_uid, NULL, CTX_VNOTE);
+
+       RegisterMimeRenderer(HKEY("text/vnote"), render_MIME_VNote, 1, 300);
+}
diff --git a/webcit/openid.c b/webcit/openid.c
new file mode 100644 (file)
index 0000000..ca71d67
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+/*
+ * Display the OpenIDs associated with an account
+ */
+void display_openids(void)
+{
+       wcsession *WCC = WC;
+       char buf[1024];
+       int bg = 0;
+
+       output_headers(1, 1, 1, 0, 0, 0);
+
+       do_template("box_begin_1");
+       StrBufAppendBufPlain(WCC->WBuf, _("Manage Account/OpenID Associations"), -1, 0);
+       do_template("box_begin_2");
+
+       if (WCC->serv_info->serv_supports_openid) {
+
+               wc_printf("<table class=\"altern\">");
+       
+               serv_puts("OIDL");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       bg = 1 - bg;
+                       wc_printf("<tr class=\"%s\">", (bg ? "even" : "odd"));
+                       wc_printf("<td><img src=\"static/webcit_icons/openid-small.gif\"></td><td>");
+                       escputs(buf);
+                       wc_printf("</td><td>");
+                       wc_printf("<a href=\"openid_detach?id_to_detach=");
+                       urlescputs(buf);
+                       wc_printf("\" onClick=\"return confirm('%s');\">",
+                               _("Do you really want to delete this OpenID?"));
+                       wc_printf("%s</a>", _("(delete)"));
+                       wc_printf("</td></tr>\n");
+               }
+       
+               wc_printf("</table><br>\n");
+       
+               wc_printf("<form method=\"POST\" action=\"openid_attach\">\n");
+               wc_printf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WCC->nonce);
+               wc_printf(_("Add an OpenID: "));
+               wc_printf("<input type=\"text\" name=\"openid_url\" class=\"openid_urlarea\" size=\"40\">\n");
+               wc_printf("<input type=\"submit\" name=\"attach_button\" value=\"%s\">"
+                       "</form></center>\n", _("Attach"));
+       }
+
+       else {
+               wc_printf(_("%s does not permit authentication via OpenID."), ChrPtr(WCC->serv_info->serv_humannode));
+       }
+
+       do_template("box_end");
+       wDumpContent(2);
+}
+
+
+/*
+ * Attempt to attach an OpenID to an existing, logged-in account
+ */
+void openid_attach(void) {
+       char buf[4096];
+
+       if (havebstr("attach_button")) {
+
+               syslog(LOG_DEBUG, "Attempting to attach %s\n", bstr("openid_url"));
+
+               snprintf(buf, sizeof buf,
+                       "OIDS %s|%s/finalize_openid_login?attach_existing=1|%s",
+                       bstr("openid_url"),
+                       ChrPtr(site_prefix),
+                       ChrPtr(site_prefix)
+               );
+
+               serv_puts(buf);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       syslog(LOG_DEBUG, "OpenID server contacted; redirecting to %s\n", &buf[4]);
+                       http_redirect(&buf[4]);
+                       return;
+               }
+               else {
+                       syslog(LOG_DEBUG, "OpenID attach failed: %s\n", &buf[4]);
+               }
+       }
+
+       /* If we get to this point then something failed. */
+       display_openids();
+}
+
+
+/*
+ * Detach an OpenID from the currently logged-in account
+ */
+void openid_detach(void) {
+       StrBuf *Line;
+
+       if (havebstr("id_to_detach")) {
+               serv_printf("OIDD %s", bstr("id_to_detach"));
+               Line = NewStrBuf();
+               StrBuf_ServGetln(Line);
+               GetServerStatusMsg(Line, NULL, 1, 2);
+               FreeStrBuf(&Line);
+       }
+
+       display_openids();
+}
+
+void 
+InitModule_OPENID
+(void)
+{
+       WebcitAddUrlHandler(HKEY("display_openids"), "", 0, display_openids, 0);
+       WebcitAddUrlHandler(HKEY("openid_attach"), "", 0, openid_attach, 0);
+       WebcitAddUrlHandler(HKEY("openid_detach"), "", 0, openid_detach, 0);
+}
diff --git a/webcit/packageversion b/webcit/packageversion
new file mode 100644 (file)
index 0000000..0cfbf08
--- /dev/null
@@ -0,0 +1 @@
+2
diff --git a/webcit/paging.c b/webcit/paging.c
new file mode 100644 (file)
index 0000000..4b3dc21
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * This module handles instant message related functions.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+
+/*
+ * display the form for paging (x-messaging) another user
+ */
+void display_page(void)
+{
+       char recp[SIZ];
+
+       strcpy(recp, bstr("recp"));
+
+        output_headers(1, 1, 1, 0, 0, 0);
+        wc_printf("<div id=\"room_banner_override\">\n");
+        wc_printf("<h1>");
+       wc_printf(_("Send instant message"));
+       wc_printf("</h1>");
+        wc_printf("</div>\n");
+
+       wc_printf("<div id=\"content\" class=\"service\">\n");
+
+       wc_printf("<table class=\"paging_background\"><tr><td>\n");
+
+       wc_printf(_("Send an instant message to: "));
+       escputs(recp);
+       wc_printf("<br>\n");
+
+       wc_printf("<FORM METHOD=\"POST\" action=\"page_user\">\n");
+       wc_printf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
+       wc_printf("<input type=\"hidden\" name=\"template\" value=\"who\">\n");
+
+       wc_printf("<TABLE border=0 width=100%%><TR><TD>\n");
+
+       wc_printf("<INPUT TYPE=\"hidden\" NAME=\"recp\" VALUE=\"");
+       escputs(recp);
+       wc_printf("\">\n");
+
+       wc_printf(_("Enter message text:"));
+       wc_printf("<br>");
+
+       wc_printf("<TEXTAREA NAME=\"msgtext\" wrap=soft ROWS=5 COLS=40 "
+               "WIDTH=40></TEXTAREA>\n");
+
+       wc_printf("</TD></TR></TABLE><br>\n");
+
+       wc_printf("<INPUT TYPE=\"submit\" NAME=\"send_button\" VALUE=\"%s\">", _("Send message"));
+       wc_printf("<br><a href=\"javascript:window.close();\"%s</A>\n", _("Cancel"));
+
+       wc_printf("</FORM></CENTER>\n");
+       wc_printf("</td></tr></table>\n");
+       wDumpContent(1);
+}
+
+/*
+ * page another user
+ */
+void page_user(void)
+{
+       char recp[256];
+       StrBuf *Line;
+
+       safestrncpy(recp, bstr("recp"), sizeof recp);
+
+       if (!havebstr("send_button")) {
+               AppendImportantMessage(_("Message was not sent."), -1);
+       } else {
+               Line = NewStrBuf();
+               serv_printf("SEXP %s|-", recp);
+               StrBuf_ServGetln(Line);
+               if (GetServerStatusMsg(Line, NULL, 0, 0) == 4) {
+                       char buf[256];
+                       text_to_server(bstr("msgtext"));
+                       serv_puts("000");
+                       stresc(buf, 256, recp, 0, 0);
+                       AppendImportantMessage(buf, -1);
+                       AppendImportantMessage(_("Message has been sent to "), -1);
+               }
+       }
+
+       url_do_template();
+}
+
+
+
+/*
+ * display page popup
+ * If there are instant messages waiting, and we notice that we haven't checked them in
+ * a while, it probably means that we need to open the instant messenger window.
+ */
+int Conditional_PAGE_WAITING(StrBuf *Target, WCTemplputParams *TP)
+{
+       int len;
+       char buf[SIZ];
+
+       /** JavaScript function to alert the user that popups are probably blocked */
+       /** First, do the check as part of our page load. */
+       serv_puts("NOOP");
+       len = serv_getln(buf, sizeof buf);
+       if ((len >= 3) && (buf[3] == '*')) {
+               if ((time(NULL) - WC->last_pager_check) > 60) {
+                       return 1;
+               }
+       }
+       return 0;
+       /* Then schedule it to happen again a minute from now if the user is idle. */
+}
+
+
+void ajax_send_instant_message(void) {
+       char recp[256];
+       char buf[256];
+
+       safestrncpy(recp, bstr("recp"), sizeof recp);
+
+       serv_printf("SEXP %s|-", recp);
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] == '4') {
+               text_to_server(bstr("msg"));
+               serv_puts("000");
+       }
+
+       escputs(buf);   /* doesn't really matter what we return - the client ignores it */
+}
+
+
+void 
+InitModule_PAGING
+(void)
+{
+       WebcitAddUrlHandler(HKEY("display_page"), "", 0, display_page, 0);
+       WebcitAddUrlHandler(HKEY("page_user"), "", 0, page_user, 0);
+       WebcitAddUrlHandler(HKEY("ajax_send_instant_message"), "", 0, ajax_send_instant_message, AJAX);
+       RegisterConditional("COND:PAGE:WAITING", 0, Conditional_PAGE_WAITING, CTX_NONE);
+}
+
+
+void 
+SessionDestroyModule_PAGING
+(wcsession *sess)
+{
+       /* nothing here anymore */
+}
diff --git a/webcit/paramhandling.c b/webcit/paramhandling.c
new file mode 100644 (file)
index 0000000..1e07fcf
--- /dev/null
@@ -0,0 +1,801 @@
+/*
+ * parse urlparts and post data
+ *
+ * Copyright (c) 1996-2019 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+/* uncomment to see all parameters sent to the server by the browser. */
+/* #define DEBUG_URLSTRINGS */
+
+
+void free_url(void *U)
+{
+       urlcontent *u = (urlcontent*) U;
+       FreeStrBuf(&u->url_data);
+       if (u->sub != NULL) {
+               DeleteHash(&u->sub);
+       }
+       free(u);
+}
+
+void PutSubstructUrlKey(HashList *list, urlcontent *u, char **keys, long *lengths, int max, int which){
+       void *vUrl;
+       urlcontent *subu;
+       HashList *thisList = list;
+       if (GetHash(list, keys[which], lengths[which], &vUrl) &&
+           (vUrl != NULL))
+       {
+               subu = (urlcontent*) vUrl;
+               if (subu->sub == NULL) {
+                       subu->sub = NewHash(1, NULL);
+               }
+               thisList = subu->sub;
+       } 
+       else if (which < max) {
+               subu = (urlcontent *) malloc(sizeof(urlcontent));
+               
+               memcpy(subu->url_key, keys[which], lengths[which]);
+               subu->klen = lengths[which];
+               subu->url_data = NULL;
+               subu->sub = NewHash(1, NULL);
+               
+               Put(list, subu->url_key, subu->klen, subu, free_url);
+               thisList = subu->sub;
+       }
+       if (which >= max) {
+               Put(thisList, keys[which], lengths[which], u, free_url);
+       }
+       else {
+               PutSubstructUrlKey(subu->sub, u, keys, lengths, max, which + 1);
+       }
+}
+
+void PutUrlKey(HashList *urlstrings, urlcontent *u, int have_colons) {
+       if (have_colons == 0) {
+               Put(urlstrings, u->url_key, u->klen, u, free_url);
+       }
+       else {
+               char *keys[10];
+               long lengths[10];
+               int i = 0;
+               char *pch;
+               char *pchs;
+               char *pche;
+
+               memset(&keys, 0, sizeof(keys));
+               memset(&lengths, 0, sizeof(lengths));
+               pchs = pch = u->url_key;
+               pche = u->url_key + u->klen;
+               while ((i < 10) && (pch <= pche)) {
+                       if ((have_colons == 2) &&
+                           (*pch == '%') &&
+                           (*(pch + 1) == '3') && 
+                           ((*(pch + 2) == 'A') ||
+                            (*(pch + 1) == 'a')
+                                   ))
+                       {
+                               *pch = '\0';
+
+                               if (i == 0) {
+                                       /* Separate the toplevel key : */
+                                       u->klen = pch - pchs;
+                               }
+
+                               /* sub-section: */
+                               keys[i] = pchs;
+                               lengths[i] = pch - pchs;
+
+                               pch += 3;
+
+                               pchs = pch;
+                               i++;
+                       }
+                       else if ((have_colons == 1) &&
+                                (*pch == ':')) {
+                               *pch = '\0';
+                               if (i == 0) {
+                                       /* Separate the toplevel key : */
+                                       u->klen = pch - pchs;
+                               }
+                               /* sub-section: */
+                               keys[i] = pchs;
+                               lengths[i] = pch - pchs;
+                       
+                               pch++;
+                               pchs = pch;
+                               i++;
+                       }
+                       else if (pch == pche){
+                               /* sub-section: */
+                               keys[i] = pchs;
+                               lengths[i] = pch - pchs;
+                               i++;
+                               break;
+                       }
+                       else {
+                               pch ++;
+                       }
+               }
+               
+               PutSubstructUrlKey(urlstrings, u, keys, lengths, i - 1, 0);
+       }
+}
+
+/*
+ * Extract variables from the URL.
+ */
+void ParseURLParams(StrBuf *url)
+{
+       const char *aptr, *bptr, *eptr, *up = NULL;
+       int len, keylen = 0;
+       urlcontent *u = NULL;
+       wcsession *WCC = WC;
+
+       if (WCC->Hdr->urlstrings == NULL) {
+               WCC->Hdr->urlstrings = NewHash(1, NULL);
+       }
+       eptr = ChrPtr(url) + StrLength(url);
+       up = ChrPtr(url);
+       while ((up < eptr) && (!IsEmptyStr(up))) {
+               int have_colon = 0;
+               aptr = up;
+               while ((aptr < eptr) && (*aptr != '\0') && (*aptr != '=')) {
+                       if (*aptr == ':') {
+                               have_colon = 1;
+                       }
+                       else if ((*aptr == '%') &&
+                                (*(aptr + 1) == '3') && 
+                                ((*(aptr + 2) == 'A') ||
+                                 (*(aptr + 1) == 'a')
+                                        ))
+                       {
+                               have_colon = 2;
+                       }
+                       aptr++;
+               }
+               if (*aptr != '=') {
+                       return;
+               }
+               aptr++;
+               bptr = aptr;
+               while ((bptr < eptr) && (*bptr != '\0')
+                     && (*bptr != '&') && (*bptr != '?') && (*bptr != ' ')) {
+                       bptr++;
+               }
+               keylen = aptr - up - 1; /* -1 -> '=' */
+               if (keylen > sizeof(u->url_key)) {
+                       syslog(LOG_WARNING, "%s:%d: invalid url_key of size %d in string size %ld",
+                               __FILE__, __LINE__, keylen, (long)sizeof(u->url_key)
+                       );
+                       free(u);
+                       return;
+               }
+
+               if (keylen < 0) {
+                       syslog(LOG_WARNING, "%s:%d: invalid url_key of size %d", __FILE__, __LINE__, keylen);
+                       free(u);
+                       return;
+               }
+               
+               u = (urlcontent *) malloc(sizeof(urlcontent));
+               memcpy(u->url_key, up, keylen);
+               u->url_key[keylen] = '\0';
+               u->klen = keylen;
+               u->sub = NULL;
+
+               if (strncmp(u->url_key, "__", 2) != 0)
+               {
+                       len = bptr - aptr;
+                       u->url_data = NewStrBufPlain(aptr, len);
+                       StrBufUnescape(u->url_data, 1);
+#ifdef DEBUG_URLSTRINGS
+                       syslog(LOG_DEBUG, "%s = [%d]  %s\n", 
+                               u->url_key, 
+                               StrLength(u->url_data), 
+                               ChrPtr(u->url_data)); 
+#endif
+                       PutUrlKey(WCC->Hdr->urlstrings, u, have_colon);
+               }
+               else {
+                       len = bptr - aptr;
+                       u->url_data = NewStrBufPlain(aptr, len);
+                       StrBufUnescape(u->url_data, 1);
+                       syslog(LOG_WARNING, "REJECTED because of __ is internal only: %s = [%d]  %s\n", 
+                               u->url_key, 
+                               StrLength(u->url_data), 
+                               ChrPtr(u->url_data)); 
+                       
+                       free_url(u);
+               }
+               up = bptr;
+               ++up;
+       }
+}
+
+/*
+ * free urlstring memory
+ */
+void free_urls(void)
+{
+       DeleteHash(&WC->Hdr->urlstrings);
+}
+
+/*
+ * Diagnostic function to display the contents of all variables
+ */
+
+void dump_vars(void)
+{
+       wcsession *WCC = WC;
+       urlcontent *u;
+       void *U;
+       long HKLen;
+       const char *HKey;
+       HashPos *Cursor;
+       
+       Cursor = GetNewHashPos (WCC->Hdr->urlstrings, 0);
+       while (GetNextHashPos(WCC->Hdr->urlstrings, Cursor, &HKLen, &HKey, &U)) {
+               u = (urlcontent*) U;
+               wc_printf("%38s = %s\n", u->url_key, ChrPtr(u->url_data));
+       }
+}
+
+/*
+ * Return the value of a variable supplied to the current web page (from the url or a form)
+ */
+
+const char *XBstr(const char *key, size_t keylen, size_t *len)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, keylen, &U)) {
+               *len = StrLength(((urlcontent *)U)->url_data);
+               return ChrPtr(((urlcontent *)U)->url_data);
+       }
+       else {
+               *len = 0;
+               return ("");
+       }
+}
+
+const char *XBSTR(const char *key, size_t *len)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) &&
+           GetHash(WC->Hdr->urlstrings, key, strlen (key), &U)){
+               *len = StrLength(((urlcontent *)U)->url_data);
+               return ChrPtr(((urlcontent *)U)->url_data);
+       }
+       else {
+               *len = 0;
+               return ("");
+       }
+}
+
+
+const char *BSTR(const char *key)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) &&
+           GetHash(WC->Hdr->urlstrings, key, strlen (key), &U))
+               return ChrPtr(((urlcontent *)U)->url_data);
+       else    
+               return ("");
+}
+
+const char *Bstr(const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, keylen, &U))
+               return ChrPtr(((urlcontent *)U)->url_data);
+       else    
+               return ("");
+}
+
+const StrBuf *SBSTR(const char *key)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) &&
+           GetHash(WC->Hdr->urlstrings, key, strlen (key), &U))
+               return ((urlcontent *)U)->url_data;
+       else    
+               return NULL;
+}
+
+const StrBuf *SBstr(const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, keylen, &U))
+               return ((urlcontent *)U)->url_data;
+       else    
+               return NULL;
+}
+
+long LBstr(const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, keylen, &U))
+               return StrTol(((urlcontent *)U)->url_data);
+       else    
+               return (0);
+}
+
+int IBstr(const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, keylen, &U))
+               return StrTol(((urlcontent *)U)->url_data);
+       else    
+               return (0);
+}
+
+int IBSTR(const char *key)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, strlen(key), &U))
+               return StrToi(((urlcontent *)U)->url_data);
+       else    
+               return (0);
+}
+
+int HaveBstr(const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, keylen, &U))
+               return (StrLength(((urlcontent *)U)->url_data) != 0);
+       else    
+               return (0);
+}
+
+int YesBstr(const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, keylen, &U))
+               return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
+       else    
+               return (0);
+}
+
+int YESBSTR(const char *key)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, strlen(key), &U))
+               return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
+       else    
+               return (0);
+}
+
+
+/*
+ * Return a sub array that was separated by a colon:
+ */
+HashList* getSubStruct(const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((WC->Hdr->urlstrings != NULL) && 
+           GetHash(WC->Hdr->urlstrings, key, strlen(key), &U))
+               return ((urlcontent *)U)->sub;
+       else    
+               return NULL;
+}
+
+
+/*
+ * Return the value of a variable of a substruct provided by getSubStruct
+ */
+const char *XSubBstr(HashList *sub, const char *key, size_t keylen, size_t *len)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               *len = StrLength(((urlcontent *)U)->url_data);
+               return ChrPtr(((urlcontent *)U)->url_data);
+       }
+       else {
+               *len = 0;
+               return ("");
+       }
+}
+
+const char *SubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return ChrPtr(((urlcontent *)U)->url_data);
+       }
+       else    
+               return ("");
+}
+
+const StrBuf *SSubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return ((urlcontent *)U)->url_data;
+       }
+       else    
+               return NULL;
+}
+
+long LSubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return StrTol(((urlcontent *)U)->url_data);
+       }
+       else    
+               return (0);
+}
+
+int ISubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return StrTol(((urlcontent *)U)->url_data);
+       }
+       else    
+               return (0);
+}
+
+int HaveSubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return (StrLength(((urlcontent *)U)->url_data) != 0);
+       }
+       else    
+               return (0);
+}
+
+int YesSubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
+       }
+       else    
+               return (0);
+}
+
+
+/*
+ * This function is called by the MIME parser to handle data uploaded by
+ * the browser.  Form data, uploaded files, and the data from HTTP PUT
+ * operations (such as those found in GroupDAV) all arrive this way.
+ *
+ * name                Name of the item being uploaded
+ * filename    Filename of the item being uploaded
+ * partnum     MIME part identifier (not needed)
+ * disp                MIME content disposition (not needed)
+ * content     The actual data
+ * cbtype      MIME content-type
+ * cbcharset   Character set
+ * length      Content length
+ * encoding    MIME encoding type (not needed)
+ * cbid                Content ID (not needed)
+ * userdata    Not used here
+ */
+void upload_handler(char *name, char *filename, char *partnum, char *disp,
+                       void *content, char *cbtype, char *cbcharset,
+                       size_t length, char *encoding, char *cbid, void *userdata)
+{
+       wcsession *WCC = WC;
+       urlcontent *u;
+       long keylen;
+
+#ifdef DEBUG_URLSTRINGS
+       syslog(LOG_DEBUG, "upload_handler() name=%s, type=%s, len="SIZE_T_FMT, name, cbtype, length);
+#endif
+       if (WCC->Hdr->urlstrings == NULL)
+               WCC->Hdr->urlstrings = NewHash(1, NULL);
+
+       /* Form fields */
+       if ( (length > 0) && (IsEmptyStr(cbtype)) ) {
+               u = (urlcontent *) malloc(sizeof(urlcontent));
+               
+               keylen = safestrncpy(u->url_key, name, sizeof(u->url_key));
+               u->url_data = NewStrBufPlain(content, length);
+               u->klen = keylen;
+               u->sub = NULL;
+               
+               if (strncmp(u->url_key, "__", 2) != 0)
+               {
+                       PutUrlKey(WCC->Hdr->urlstrings, u, (strchr(u->url_key, ':') != NULL));
+               }
+               else {
+                       syslog(LOG_INFO, "REJECTED because of __ is internal only: %s = [%d]  %s\n", 
+                               u->url_key, 
+                               StrLength(u->url_data), 
+                               ChrPtr(u->url_data)); 
+                       
+                       free_url(u);
+               }
+#ifdef DEBUG_URLSTRINGS
+               syslog(LOG_DEBUG, "Key: <%s> len: [%d] Data: <%s>", 
+                       u->url_key, 
+                       StrLength(u->url_data), 
+                       ChrPtr(u->url_data));
+#endif
+       }
+
+       /* Uploaded files */
+       if ( (length > 0) && (!IsEmptyStr(cbtype)) ) {
+               WCC->upload = NewStrBufPlain(content, length);
+               WCC->upload_length = length;
+               WCC->upload_filename = NewStrBufPlain(filename, -1);
+               safestrncpy(WCC->upload_content_type, cbtype, sizeof(WC->upload_content_type));
+#ifdef DEBUG_URLSTRINGS
+               syslog(LOG_DEBUG, "File: <%s> len: [%ld]", filename, (long int)length);
+#endif
+               
+       }
+
+}
+
+void PutBstr(const char *key, long keylen, StrBuf *Value)
+{
+       urlcontent *u;
+
+       if(keylen >= sizeof(u->url_key)) {
+               syslog(LOG_WARNING, "%s:%d: invalid url_key of size %ld", __FILE__, __LINE__, keylen);
+               FreeStrBuf(&Value);
+               return;
+       }
+       u = (urlcontent*)malloc(sizeof(urlcontent));
+       memcpy(u->url_key, key, keylen + 1);
+       u->klen = keylen;
+       u->url_data = Value;
+       u->sub = NULL;
+       Put(WC->Hdr->urlstrings, u->url_key, keylen, u, free_url);
+}
+void PutlBstr(const char *key, long keylen, long Value)
+{
+       StrBuf *Buf;
+
+       Buf = NewStrBufPlain(NULL, sizeof(long) * 16);
+       StrBufPrintf(Buf, "%ld", Value);
+       PutBstr(key, keylen, Buf);
+}
+
+
+
+int ConditionalBstr(StrBuf *Target, WCTemplputParams *TP)
+{
+       if(TP->Tokens->nParameters == 3)
+               return HaveBstr(TKEY(2));
+       else {
+               if (IS_NUMBER(TP->Tokens->Params[3]->Type))
+               {
+                       return LBstr(TKEY(2)) == 
+                               GetTemplateTokenNumber(Target, 
+                                                      TP, 
+                                                      3, 
+                                                      0);
+               }
+               else {
+                       const char *pch;
+                       long len;
+
+                       GetTemplateTokenString (Target, TP, 3, &pch, &len);
+                       return strcmp(Bstr(TKEY(2)), pch) == 0;
+               }
+       }
+}
+
+void tmplput_bstr(StrBuf *Target, WCTemplputParams *TP)
+{
+       const StrBuf *Buf = SBstr(TKEY(0));
+       if (Buf != NULL)
+               StrBufAppendTemplate(Target, TP, Buf, 1);
+}
+
+
+void tmplput_bstrforward(StrBuf *Target, WCTemplputParams *TP)
+{
+       const StrBuf *Buf = SBstr(TKEY(0));
+       if (Buf != NULL) {
+               StrBufAppendBufPlain(Target, HKEY("?"), 0);             
+               StrBufAppendBufPlain(Target, TKEY(0), 0);
+               StrBufAppendBufPlain(Target, HKEY("="), 0);             
+               StrBufAppendTemplate(Target, TP, Buf, 1);
+       }
+}
+
+void diagnostics(void)
+{
+       output_headers(1, 1, 1, 0, 0, 0);
+       wc_printf("Session: %d<hr />\n", WC->wc_session);
+       wc_printf("Command: <br><PRE>\n");
+/*     
+StrEscAppend(WC->WBuf, NULL, WC->UrlFragment1, 0, 0);
+       wc_printf("<br>\n");
+StrEscAppend(WC->WBuf, NULL, WC->UrlFragment12 0, 0);
+       wc_printf("<br>\n");
+StrEscAppend(WC->WBuf, NULL, WC->UrlFragment3, 0, 0);
+*/
+       wc_printf("</PRE><hr />\n");
+       wc_printf("Variables: <br><PRE>\n");
+       dump_vars();
+       wc_printf("</PRE><hr />\n");
+       wDumpContent(1);
+}
+
+
+void tmplput_url_part(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Name = NULL;
+       StrBuf *UrlBuf = NULL;
+       wcsession *WCC = WC;
+       
+       if (WCC != NULL) {
+               long n;
+
+               n = GetTemplateTokenNumber(Target, TP, 0, 0);
+               if (n == 0) {
+                       if (WCC->Hdr->HR.Handler != NULL)
+                               UrlBuf = Name = WCC->Hdr->HR.Handler->Name;
+               }
+               else if (n == 1) {
+                       UrlBuf = NewStrBuf();
+                       StrBufExtract_token(UrlBuf, WCC->Hdr->HR.ReqLine, 0, '/');
+               }
+               else {
+                       UrlBuf = NewStrBuf();
+                       StrBufExtract_token(UrlBuf, WCC->Hdr->HR.ReqLine, 1, '/');
+               }
+
+               if (UrlBuf == NULL)  {
+                       LogTemplateError(Target, "urlbuf", ERR_PARM1, TP, "not set.");
+               }
+               StrBufAppendTemplate(Target, TP, UrlBuf, 2);
+               if (Name == NULL) FreeStrBuf(&UrlBuf);
+       }
+}
+
+typedef struct __BstrPair {
+       StrBuf *x;
+       StrBuf *y;
+}BstrPair;
+CtxType CTX_BSTRPAIRS = CTX_NONE;
+void HFreeBstrPair(void *pv)
+{
+       BstrPair *p = (BstrPair*) pv;
+       FreeStrBuf(&p->x);
+       FreeStrBuf(&p->y);
+       free(pv);
+}
+
+HashList *iterate_GetBstrPairs(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *X, *Y;
+        const char *ch = NULL;
+        long len;
+       const StrBuf *TheBStr;
+       BstrPair *OnePair;
+        HashList *List;
+       const char *Pos = NULL;
+       int i = 0;
+
+       if (HaveTemplateTokenString(NULL, TP, 2, &ch, &len))
+        {
+                GetTemplateTokenString(Target, TP, 2, &ch, &len);
+        }
+       else 
+       {
+               return NULL;
+       }
+
+       TheBStr = SBstr(ch, len);
+       if ((TheBStr == NULL) || (StrLength(TheBStr) == 0))
+               return NULL;
+       List = NewHash(1, NULL);
+       while (Pos != StrBufNOTNULL)
+       {
+               X = NewStrBufPlain(NULL, StrLength(TheBStr));
+               StrBufExtract_NextToken(X, TheBStr, &Pos, '|');
+               if (Pos == StrBufNOTNULL) {
+                       FreeStrBuf(&X);
+                       DeleteHash(&List);
+                       return NULL;
+               }
+               Y = NewStrBufPlain(NULL, StrLength(TheBStr));
+               StrBufExtract_NextToken(Y, TheBStr, &Pos, '|');
+               OnePair = (BstrPair*)malloc(sizeof(BstrPair));
+               OnePair->x = X;
+               OnePair->y = Y;
+               Put(List, IKEY(i), OnePair, HFreeBstrPair);
+               i++;
+       }
+       return List;
+}
+
+
+void tmplput_bstr_pair(StrBuf *Target, WCTemplputParams *TP, int XY)
+{
+       BstrPair *Pair = (BstrPair*) CTX(CTX_BSTRPAIRS);
+
+       StrBufAppendTemplate(Target, TP, (XY)?Pair->y:Pair->x, 0);
+}
+
+void tmplput_bstr_pair_x(StrBuf *Target, WCTemplputParams *TP)
+{      tmplput_bstr_pair(Target, TP, 0); }
+void tmplput_bstr_pair_y(StrBuf *Target, WCTemplputParams *TP)
+{      tmplput_bstr_pair(Target, TP, 1); }
+
+void 
+InitModule_PARAMHANDLING
+(void)
+{
+       RegisterCTX(CTX_BSTRPAIRS);
+       WebcitAddUrlHandler(HKEY("diagnostics"), "", 0, diagnostics, NEED_URL);
+
+       RegisterIterator("ITERATE:BSTR:PAIR", 1, NULL, iterate_GetBstrPairs, NULL, DeleteHash, CTX_BSTRPAIRS, CTX_NONE, IT_NOFLAG);
+       RegisterNamespace("BSTR:PAIR:X", 1, 2, tmplput_bstr_pair_x, NULL, CTX_BSTRPAIRS);
+       RegisterNamespace("BSTR:PAIR:Y", 1, 2, tmplput_bstr_pair_y, NULL, CTX_BSTRPAIRS);
+
+       RegisterConditional("COND:BSTR", 1, ConditionalBstr, CTX_NONE);
+       RegisterNamespace("BSTR", 1, 2, tmplput_bstr, NULL, CTX_NONE);
+       RegisterNamespace("BSTR:FORWARD", 1, 2, tmplput_bstrforward, NULL, CTX_NONE);
+       RegisterNamespace("URLPART", 1, 2, tmplput_url_part, NULL, CTX_NONE);
+}
+
+
+void
+SessionAttachModule_PARAMHANDLING
+(wcsession *sess)
+{
+       sess->Hdr->urlstrings = NewHash(1,NULL);
+}
+
+void
+SessionDetachModule_PARAMHANDLING
+(wcsession *sess)
+{
+       DeleteHash(&sess->Hdr->urlstrings);
+       FreeStrBuf(&sess->upload_filename);
+}
diff --git a/webcit/paramhandling.h b/webcit/paramhandling.h
new file mode 100644 (file)
index 0000000..1b2f62d
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+/* URL / Mime Post parsing -> paramhandling.c */
+void upload_handler(char *name, char *filename, char *partnum, char *disp,
+                   void *content, char *cbtype, char *cbcharset,
+                   size_t length, char *encoding, char *cbid, void *userdata);
+
+void ParseURLParams(StrBuf *url);
+
+
+/* These may return NULL if not foud */
+#define sbstr(a) SBstr(a, sizeof(a) - 1)
+const StrBuf *SBstr(const char *key, size_t keylen);
+
+#define xbstr(a, b) (char*) XBstr(a, sizeof(a) - 1, b)
+const char *XBstr(const char *key, size_t keylen, size_t *len);
+const char *XBSTR(const char *key, size_t *len);
+
+#define lbstr(a) LBstr(a, sizeof(a) - 1)
+long LBstr(const char *key, size_t keylen);
+
+#define ibstr(a) IBstr(a, sizeof(a) - 1)
+#define ibcstr(a) IBstr(a.Key, a.len)
+int IBstr(const char *key, size_t keylen);
+int IBSTR(const char *key);
+
+#define havebstr(a) HaveBstr(a, sizeof(a) - 1)
+int HaveBstr(const char *key, size_t keylen);
+
+#define yesbstr(a) YesBstr(a, sizeof(a) - 1)
+int YesBstr(const char *key, size_t keylen);
+int YESBSTR(const char *key);
+
+HashList* getSubStruct(const char *key, size_t keylen);
+
+/* These may return NULL if not foud */
+#define ssubbstr(s, a) SSubBstr(s, a, sizeof(a) - 1)
+const StrBuf *SSubBstr(HashList *sub, const char *key, size_t keylen);
+
+#define xsubbstr(s, a, b) (char*) XSubBstr(s, a, sizeof(a) - 1, b)
+const char *XSubBstr(HashList *sub, const char *key, size_t keylen, size_t *len);
+
+#define lsubbstr(s, a) LSubBstr(s, a, sizeof(a) - 1)
+long LSubBstr(HashList *sub, const char *key, size_t keylen);
+
+#define isubbstr(s, a) ISubBstr(s, a, sizeof(a) - 1)
+#define isubbcstr(s, a) ISubBstr(s, a.Key, a.len)
+int ISubBstr(HashList *sub, const char *key, size_t keylen);
+
+#define havesubbstr(s, a) HaveSubBstr(s, a, sizeof(a) - 1)
+int HaveSubBstr(HashList *sub, const char *key, size_t keylen);
+
+#define yessubbstr(s, a) YesSubBstr(s, a, sizeof(a) - 1)
+int YesSubBstr(HashList *sub, const char *key, size_t keylen);
+
+
+
+
+/* TODO: get rid of the non-const-typecast */
+#define bstr(a) (char*) Bstr(a, sizeof(a) - 1)
+const char *BSTR(const char *key);
+const char *Bstr(const char *key, size_t keylen);
+/* if you want to ease some parts by just parametring yourself... */
+#define putbstr(a, b) PutBstr(a, sizeof(a) - 1, b)
+void PutBstr(const char *key, long keylen, StrBuf *Value);
+
+#define putlbstr(a, b) PutlBstr(a, sizeof(a) - 1, b)
+void PutlBstr(const char *key, long keylen, long Value);
+
diff --git a/webcit/po/webcit/Makefile.in b/webcit/po/webcit/Makefile.in
new file mode 100644 (file)
index 0000000..801ac9c
--- /dev/null
@@ -0,0 +1,16 @@
+SRCS:=  $(wildcard *.po)
+OBJS:=  $(patsubst %.po, ../../locale/%/LC_MESSAGES/webcit.mo, $(SRCS))
+
+.SUFFIXES: .po .mo
+
+.PHONY: all
+
+all: $(OBJS)
+
+clean:
+       rm -r ../../locale/*
+
+../../locale/%/LC_MESSAGES/webcit.mo: %.po
+       mkdir -p $(patsubst %.po, ../../locale/%/LC_MESSAGES, $<)
+       msgfmt -o $@ $<
+
diff --git a/webcit/po/webcit/ar.po b/webcit/po/webcit/ar.po
new file mode 100644 (file)
index 0000000..ca9f75b
--- /dev/null
@@ -0,0 +1,4361 @@
+# Arabic translation for citadel
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2013-03-05 06:12+0000\n"
+"Last-Translator: husamuldeen <hussam.shabeeb@alamoodengineering.com>\n"
+"Language-Team: Arabic <ar@li.org>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-06 05:06+0000\n"
+"X-Generator: Launchpad (build 16514)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "تم الحذف"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "مستخدم جديد"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "مستخدم مشاكس"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "مستخدم داخلي"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "مستخدم شبكة"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "مستخدم مفضل"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "مدير"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "حدث خطأ."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "التحقق من صحة المستخدمين"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "ولا مستخدم مطلوب التحقق من صحته في هذا الوقت"
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "جدا ضعيف"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "ضعيف"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "حسنا"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "قوي"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "مستوى الوصول الحالي : %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "اختار مستوى الوصول لهذا المستخدم"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "تم الالغاء لم يتم تغير كلمة السر"
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "لم يتم التطابق لكلمة السر , ولم يتم تغير كلمة السر"
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "غير مسموح ان تكون كلمة السر فارغة"
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "حالة الوجود غير معروفة"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "خالي"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "مشغول"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "اذهب لللصفحة "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "أول"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "آخر"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "دعوة لقاء"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "المدعون اجابوا دعوتك"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "نشر الحدث"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "هذا هو نوع غير معروف من عنصر التقويم"
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "الملخص:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "الموقع :"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "تاريخ:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "تاريخ ووقت البدء"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "تاريخ الانتهاء"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "الوصف:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "تكرار"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "هذا هو الحدث المتكرر"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "الحاضرين"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "هذا تخديث لل '%s' والذي هوة موجود اصلا في  تقويمك"
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr "هذا تخديث سيتعارض لل '%s' والذي هوة موجود اصلا في  تقويمك"
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "تحديث:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "تضارب"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "لاتوجد ترجمة لحد الان"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "موافق"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "مؤقت"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "رفض"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr "اضغط <i>تحديث</i> لقبول هذه الاجابة وتحديث التقويمr."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "حدّث"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "تجاهل"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "حصل خطا في تحليل عنصر التقويم"
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr "لقد قبلت دعوة الاجتماع وقد تم ادخالها في تقويمك"
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr "لقد قبلت هذه الدعوة مبدئيا وتم  كتابتها في التقويم الخاص بك"
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr "لقد رفضت دعوة الاجتماع <b>ولم</b>  يتم اضافتها الى التقويم الخاص بك"
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "تم ارسال اجابتك لمنظم الاجتماع"
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "تم تحديث التقويم ليعكس اجابة الطلب"
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr "لقد اختاريت عدم ارسال اجابة للطلب و لم يتم تحديث التقويم"
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "يبدء يوم عرض التقويم في"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "يتهي يوم عرض التقويم في"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "يبدأ الأسبوع في:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "الساعة "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "الدقائق "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "الحالة غير معروفة"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "اتخاذ اللازم"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "مقبول"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "الغاء"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "الاطر النسبية"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "تفويض"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "اكتمال"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "قيد التنفيذ"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(بدون)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "حدث بغير عنوان"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "من"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "تاريخ وقت البدء"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "تاريخ الانتهاء"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "الوقت / التاريخ"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "ملاحظات"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "السابقة"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "التّالي"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "الأسبوع"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "الساعات"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "الموضوع"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "أبدء"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "نهاية"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "جميع أحداث اليوم"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "الحدث الجاري"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "مهمة غير معنونة"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "لقد حصل خطاء عند محاولة استعادة هذا الملف :%s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "ثوان/ثانية"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "دقيقة/دقائق"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "ساعات"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "أيام"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "أسابيع"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "أشهر"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "سنوات"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "أبداً"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "الأوّل"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "ثانية"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "الثّالث"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "الرّابع"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "الخامس"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "حدث"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "الحضور"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "اضف او حرر حدث"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "موجز"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "الموقع"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "ملاحظات"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "المنظِّم"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "انتة المنظم"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "اظهر الوقت ك"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "حرّ"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "مشغول"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "شخص واحد في كل خط"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "جهات الاتصال"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "تكرار الحكم"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "تكرار كل"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "في هذه الايام من الاسبوع"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "في هذه %s%d%s الايام من الشهر"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "في هذه "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "من هذا الشهر"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "كل "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "السنة في هذا التاريخ"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "من"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "تكرار مجموعة"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "بلا تاريخ انتهاء"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "كرر هذا الحدث"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "مرات"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "كرر هذا الحدث الى "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "حفظ"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "حذف"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "افحص وجود الحاضرين"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "نسق الوقت"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "تم الغاء تحميل الرسومات"
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "لم تقم برفع ملف"
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "صورتك"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "ايقونة هذه الغرفة"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "صورة التحية لواجهة الدخول"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "صورة  بنر الخروج"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "ealloc() خطاء! لانستطيع الحصول %d بايت: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "اعدادات شريط الايقونات"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "ادخال عنوان خاطء"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr " تم المسح"
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr " تمت الاضافة"
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "صلاحية اعلى للسماح بالوصل لهذه الوظيفة"
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr "يجب تحديد القائمة البريدية للاشتراك بها"
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "يجب عليك تحديد العناوين البريدية التي تنوي الاشتراك بها"
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(بدون موضوع)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "خطأ:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "رسالة فارغة"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "تم الالغاء لم يتم اضافة الرسالة"
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "تم الالغاء تلقائيا وذلك بسبب كونك حفظت مسبقا"
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "فشل الحفظ للمسودات "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "رفض اضافة رسالة فارغة\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "تم حفظ الرسالة للمسودات\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "تم ارسال الرسالة بنجاح\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "تم نشر الرسالة بنجاح\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "لم يتم نقل الرسالة"
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "لقد حصل خطا عندما تم محاولة استرجاع هذا %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "لقد حصل خطا عندما تم محاولة استرجاع هذا %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "ادخال توقيع للرسالة"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "استخدم التوقيع"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "الصفة الافتراضية المستخدمة لعنوان الرسالة"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "عناوين البريد الالكتروني المفضلة"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "الاسم المفضل لرسائل البريد الالكتروني"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "اسم العرض المفضل لوظائف لوحة الإعلانات"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "طريقة عرض البريد الالكتروني"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "لا اعرف كيف اعرض "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "اضغط على اي من الملاحضات للتعديل عليها"
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "ادارة الحساب / اسم المعرف"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "هل انتة متاكد تريد مسح هذا الاسم المعرف"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "مسح"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "اضافة معرف - مستخدم "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "إرفاق ملف"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "غير مسموح للتوثيق باستخدتم هذا المعرف - المستخدم %s"
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "ارسل رسالة فورية"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "ارسل رسالة فورية الى "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "ادخل رسالة نصية"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "إرسال رسالة"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "لم يتم ارسال الرسالة"
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "تم ارسال الرسالة "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "الغاء لم يتم تغير اي من الاعدادات"
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "اجعل هذه صفحة البداية"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "هذه غير مسموح لكي تكون صفحة البداية"
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "لم تعود تملك صفحة بداية مختارة"
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "صفحة البداية المفضلة"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "مجلداتي"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "الغاء لن يتم حفظ البيانات"
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "التغيرات التي قمت بها تم حفظها"
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "المستخدم '%s' تم طرده من الغرفة '%s'."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "المستخدم '%s' تم دعوته '%s'."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "الغام لم يتم انشاء غرفة جديدة"
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "تم مسح الطابق"
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "تم انشاء طابق جديد"
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "عرض قائمة الغرفة"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "اضهر الطوابق الفارغة"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "ملف"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "ملفات"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "نشرة الأخبار لمجلس الإدارة"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "مجلد البريد"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "دفتر العناوين"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "التقويم"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "قائمة المهام"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "قائمة الملاحظات"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "المعرفة"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "قائمة التقويم"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "السجل اليومي"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "المسودّات"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "المدونة"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"هذا الخادم يقوم بخدمة اقصى عدد ممكن من المستخدمين ولا يقبل محاولات دخول "
+"جديدة في هذا الوقت يرجى المحاولة لاحقا او الاتصال بمدير النظام ."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "استقبال اجابة غير متوقعة من سيرفر كاتاديل مخرج الحسابات"
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "تم تحديث اعدادتك للخادم"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr "المحاولة الاولى معلقة"
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(بدون)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "لاشيء"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "تم الالغاء %s لم يتم حفظ البيانات"
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr " تم الحفظ"
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "معلومات الغرفة"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "اكتمل"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "اسم المهمة"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "الى تاريخ"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "القسم"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "إظهار الكل"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "تحرير مهمة"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "تاريخ البداية:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "بلا تاريخ"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "أو"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "الوقت الازم"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "تاريخ الاستحقاق:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "اكتمال"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "الصنف"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr "حدث خطأ أثناء محاولة إنشاء أو تحرير إدخال دفتر العناوين هذا."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "لم يتم حفظ التغيرات"
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "تم انشاء مستخدم جديد"
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"تحاول إنشاء مستخدم جديد من داخل القلعة أثناء تشغيل في وضع المضيف المصادقة "
+"القائمة. في هذا الوضع، يجب إنشاء مستخدمين جدد على النظام المضيف، وليس داخل "
+"القلعة"
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "تعذر فك التشفير الصورة\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "خطأ"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "غير قادر على الدخول للغرفة لحفظ الرسائل"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "الغاء العملية"
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(بلا اسم)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "حرر"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "التوثيق مطلوب"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"المصادر التي تحاول الوصول اليها تطلب ادخال اسم المستخدم وكلمة السر لا تستطيع "
+"الدخول %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"لايستطيع البرنامج الاتصال او البقاء متصلا بخادم كاتديل رجاء ابلغ مدير النظام "
+"بهذه المشكلة"
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "اقراء المزيد"
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' هذه ليست غرفة معرفة"
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "تاريخ"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "المؤلف"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "عرض"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "النسخة الحالية"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "العودة"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "عنوان الصفحة"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "ادخل ايعاز الخادم"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"هذه النافذة تسمح لك ادخال الاوامر لخادم كاتيديل والتي هي غير مدعومة عن طريق "
+"المتصفح اذا كنت لاتعلم مايعني هذا  اذن لن تكون هذه النافذة ذات اهمية لك"
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "ادخل الاوامر"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "مدخل الاوامر اذا تطب ارسل  SEND_LISTING transfer mode"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr "الكشف عن راس المضيف "
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "نتائج ايعاز الخادم"
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr "ادخل ايعاز اخر"
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr "العودة للقائمة"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "إعدادات الشبكة"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "اضافة عقدة جديدة"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "الاعدادات الحالية للعقد"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "قائمة مدير النظام"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr "قائمة مدير الغرفة"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "الأسماء المستعارة للمضيف المحلي"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "المضيفين الاذكياء"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr "اشعار المضيفين"
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "مضيفين قاتل البريد المزعج"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr "المجالات القابلة للتنكر"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "لإعدادات العالمية"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "ادارة حساب المستخدم"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "اطفاء خادم كاتي ديل"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "الغرف والطوابق"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr "اعادة تشغيل خادم كاتيديل"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "رسالة للمستخدمين"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "ضبط الموقع"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr "يجب ان تكون المعاون لعرض هذا"
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "عام"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "اعدادات شريط الايقونات"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3 نوع ملقم البريد الالكتروني"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "ادفع- اظغط البريد"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "فهرسة / يوميات"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "الوصول"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr "الدليل:"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "التنظيف التلقائي"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr "لانشاء مستخدم جديد ادخل اسم المستخدم المعني في الحقل واضغط انشاء"
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "مستخدم جديد "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr "لتحرير حساب مستخدم موجود اختار اسم المستخدم من القائمة واضغط تحرير"
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "حر حساب مستخدم "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "اسم المستخدم:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "كلمة السر"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "الاذونات لارسال بريد داخلي"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "العنوان البريدي الرئيسي"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "عناوين البريد المستعارة"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "عدد محاولات الدخول"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "تم تقديم الرسالة"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "مستوى الوصول"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "رقم معرف المستخدم"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "تاريخ ووقت اخر محاولة دخول"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "التطهير الاوتماتيكي بعد عدة ايام"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "حرر او امسح مستخدم"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "إضافة مستخدمين"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "اضافة او مسح يوزر"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "اضافة تعديل مسح طوابق"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "اسم العقدة"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "كلمة السر  المشتركة بين طرفين"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "عنوان الانترنت Ip للمضيف"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "رقم المنفذ"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "اكد المسح"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "هل انتة متاكد من رغبتك بالمسح "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "نعم"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "كلا"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr "تحرير"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "مسح"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "المجالات لهذا المستخدم لاستقبال البريد"
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "المستخدمين مفعلين خدمة   ClamAV"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "المجالات المعين مع عناوني عالمية"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+"ارسل البريد الالكتروني الى هؤلاء  المضيفين فقط في حالة فشل الاستلام المباشر"
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "المجالات التنكرية المسموحة للمستخدمين"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr "الروابط المستخدمة للابلاغ عند استلام بريد الكتروني جديد"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "المضيفين الذي يعملون في الوقت الحالي من القائمة السوداء"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr "اذا مسموح اعادة توجيه جميع البريد الصادر الى احد من المضيفين"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "المضيفين مفعلين خدمة قاتل البريد المزعج"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "إعادة التشغيل الآن"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "اعادة التشغيل بعد ترحيل المستخدمين"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "اعادة التشغيل عندما يكون جميع المستخدمين متوقفين عن العمل"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "الرجاء الانتظار ... نقوم باعدة تشغيل خادم كاتيديل ... "
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+"الرجاء الانتظار بينما يتم ترحيلها المستخدمين الخاص بك، سيتم إعادة تشغيل "
+"الملقم بعد ذلك خادم كاتيديل "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "عناصر التحكم في الوصول وإعدادات سياسة الموقع"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "حجب الرسائل عن المستخدمين المزعجين والمثيرين للمشاكل"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "اسم غرفة حجب الرسائل"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "اسم الغرف المسجلة للصفحات"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr "وضع الترابط"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr "احتواء الذاتية"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr "استنادا للمضيف"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr "السماح للضيوف الغريبين بالدخول"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "اولوية  مستوى الوصول لجميع المستخدمين"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "مستوى الوصول مطلوب لانشاء غرف"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr "تلقائيا اعطاء حالة المساعد  للمستخدمين الذين يقومون بانشاء غرف خاصة"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr "تلقائيا اعطاء حالة المساعد  للمستخدمين الذين يقومون بانشاء غرف مدونات"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "تقيد الوصول للبريد الالكتروني"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "تعطيل خدمة انشاء حساب مستخدم  بنفسه"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr "تلميح لا تقوم باختيار الاثنين معا"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "التسجيل مطلوب للمستخدمين الجدد"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "تهيئة وقت انتهاء اوتماتيكي للرسئل القديمة"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr "قد يتم تجاوز هذه الإعدادات على أساس لكل الطابق أو في الغرفة"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "الساعات لتفعيل النضام التنضيف الاوتماتيكي لقاعدة البيانات"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "رسالة الانتهاء الافتراضية للغرف العامة"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "ابدا لا تسمح بانتهاء الرسائل"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "انهاء الرسائل عن طريق العداد"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "انهاء الرسائل عن طريق عمر الرسالة"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "عدد الرسائل أو أيام "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr "السياسة الافتراضية لانهاء صناديق البريد الخاصة"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "نفس السياسة المتبعة في الغرف العامة"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "وقت التنضي الافتراضي للمستخدم الايام"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "الوقت الافتراضي للتنظيف الايام"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "تكوين رابط Ldap لخادم  كاتيديل"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"التعديلات التي تم عملها سوف لن تاخذ مجرها حتى عمل اعادة تشغيل لخادم كاتيديل"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"ملاحظة: تم بناء هذا الخادم القلعة دون دعم LDAP. وهذه الخيارات ليس لها أي أثر."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "اسم المضيف لخادم Ldab  اترك فارغ لتعطيل الميزة"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "رقم المنفذ لخادم Ldap اترك فارغ لتعطيل الميزة"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "قاعدة دي إن (DN)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "ربط dn"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "كلمة السر لربط dn"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "الاعدادت العامة للموقع"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "تغير شعار الدخول"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "تغير شعار الخروج"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "اسم النطاق المؤهل الكامل"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "اسم العقد القابل للقراء"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "رقم الهاتف"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "الواجه المخصصة لاستخدام النصوص للمستخدمين"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "موقع الرسومات لهذا النظام"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "اسم مدير النظام"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+"وقت المنطقة الافتراضي لعناصر البريد الالكتروني الغير موضوعة ضمن منطقة معينة"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "IMAP   رقم منفذ      (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "IMAP over SSL port (-1 to disable)  منفذ"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "الفهرسة واليوميات"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "تحذير: هذه المراكز تتطلب موارد كثيرة."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "تفعيل فهرسة النص المتكامل"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "تنفيذ يوميات رسائل البريد الإلكتروني"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "تنفيذ يوميات لغير رسائل البريد اللاكتروني"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "وجهات الابريد الالكتروني ليوميات البريد او الرسائل"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr "تردد الاحضار في الثانية \t POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "سرعة تردد الاحضار POP3 في الثانية"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr "اسم المضيف لخادم Funambol  اترك فارغ للتعطيل"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "منفذ خادم Funambol "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "مصدر مزامنة خادم Funambol"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "تفاصيل التوثيق لخادم Funambol"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr "اداة التنضيف الخارجية  اترك فارغ للتعطيل"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "خدمات الشبكة"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "عنوان الخادم 0.0.0.0"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "IMAP   رقم منفذ      (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "IMAP   رقم منفذ      (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "الاعدادات المتقدمة مسيطرات التوليف  للخادم"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "اقصى طول للرسالة"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "وقت الاتصال بدون عمل على الخادم بالثانية"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "تردد عمل الشبكة بالثانية"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "اقصى عدد للجلسات المتزامنة (0 = لا حدود)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "اقصى عدد من مؤشرات ترابط العمل"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "اقصى عدد من مؤشرات ترابط العمل"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "تلقائيا امسح بيانات السجل المتلازمة"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "SMTP MSA port (-1 to disable)  منفذ"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTP over SSL port (-1 to disable)  منفذ"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "ضع علامة على البريد المزعج بدل من رفضه"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+"السماح للعملاء SMTP غير مصادق الى المخادعة ومشاهدة بيانات  هذه المجالات "
+"المواقع"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "اقامة فورم صحيح خلال عملية توثيق ال smtp"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr "Postfix TCP Dictionary Port منفذ القاموس"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "اضف غير امسح الحسابات"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "تحرير اعدادات في كافة أنحاء الموقع"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "اعدادات المجالات و البريد الالكتروني"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "عناوين البريد المستعارة"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "اعرض حجز الخرج  لبروتكول SMTP"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "خروج"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "الاوامر الاساسية"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "معلوماتك"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "اوامر الغرفة المتقدمة"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "جارٍ التحميل"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "مجهول"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "انشر الرسالة"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr "حفظ للمسودات"
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "مرفقات:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "من"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "في"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "إلى:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "نسخة إلى:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "نسخة مطابقة إلى:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "الموضوع اختياري"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "الموضوع:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "اعادة توجيه"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "إغلاق النافذة"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "الملف المرفق"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr "حذف"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "الملفات الجاهزة للتحميل"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "رفع ملف"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "اسم الملف"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "الحجم"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "المحتوى"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "الوصف"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "رفع صورة"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "تستطيع رفع صورة مباشرتا من حاسبتك"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "الرجاء اختيار ملف للرفع"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "عرض الشرائح"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "اضف او عدل او امسح الطوابق"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "رقم الطابق"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "اسم الطابق"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "عدد الغرف"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "تصميم الغرف"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "الطابق الافتراضي"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "يجب عليك تسجيل الدخول للوصول الى هذه القائمة"
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "تسجيل الدخول باستخدام اسم وكلمة المرور"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "كلمة السر:"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "تسجيل الدخول"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "اسم مستخدم سجل الان"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+"أدخل الاسم وكلمة المرور التي ترغب في استخدامها، ثم انقر على \"مستخدم جديد\". "
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "الدخول باستخدام المعرف الخاص بك"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "رابط المعرف الخاص بك"
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr "الدخول باستخدام كوكل"
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr "الدخول باستخدام ياهوو"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr "الدخول باستخدام AOL او AIM"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr "ادخل اسم  AOL او AIM الخاص بك"
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "إنتظر من فضلك"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "هذا تخديث لل '%s' والذي هوة موجود اصلا في  تقويمك"
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr "هذا تخديث سيتعارض لل '%s' والذي هوة موجود اصلا في  تقويمك"
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "اللغة:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "البريد الإلكتروني"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "المهام"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "الغرف"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "المستخدمون المتواجدون حالياً"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "محادثات"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "الخيارات المتقدمة"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "الإدارة"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "تخصيص هذه القائمة"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "تبديل الى قائمة الغرف"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "تبديل الى قائمة"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "مجلداتي"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "تخصيص شريط الايقونات"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "عرض  على شكل"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "الصورة والنص"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "الصورة فقط"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "النص فقط"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"حدد الرموز التي تود أن ترى في عرض قائمة \"شريط رمز\" على الجانب الأيسر من "
+"الشاشة."
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "شعار الموقع"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "ايقونة تصف الموقع"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "ملخص الصفحة الخاص بك"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "البريد الوارد"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "طريق مختصر لصندوق البريد الخاص بك"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "دفتر العناوين الخاص بك"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "ملاحظتك"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "طريق مختصر لتقويمك الخاص"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "طريق مختصر لقائمة المهام الخاصة بك"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr "الضغط على هذه الايقونة يعرض جميع الغرف او الحافظات في حالة وجودها"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "من هو موجود الان ؟"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+"الضغط على هذه الايقونة  يعرض قائمة لجميع المستخدمين المسجلين الدخول حاليا"
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"النقر على هذه الايقونة يسمح لكم بالدخول في حالة المراسلة الحية مع المستخدمين "
+"في نفس الغرفة"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "خيارات متقدمة"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "الوصول لكامل القائمة ووضائفها في كاتيديل"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "شعار بريد كاتيديل"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "عرض  ايقونة مقدم من كاتيديل"
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr "لقد تم تحديث شريط الايقونات الريجا اختيار احد الاختيارات للاستمرار"
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr "تستيطع عمل تحديث عن طريق  (SHIFT-F5)>  من اجل ان تاخذ التغيرات مفعولها"
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "قائمة المشتركين"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "قائمة المشتركين والغير المشتركين"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "تم ارسال طلب التاكيد"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr "انتة مشترك "
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr " في "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr " القائمة البريدية"
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+"قائمة الخادم  ارسلت لك بريد الكتروني مع معلومات اضافية رابط الكتروني يجب "
+"الضغط عليها لتاكيد اشتراكك"
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+"هذه الخطوة الاضفاة هي من اجل حمايتك  لمنع الاخرين من اضافتك في قائمة بريدية "
+"من دون اذنك"
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr "الرجاء الضغط على الرابط - الذي تم ارساله لك وسيتم تاكيد اشتراكك"
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "الرجوع"
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr "خطأ"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr "انتة الان غير مشترك"
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr "من"
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr "قائمة البريد"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+"قائمة الخادم ارسلت لك بريد الكتروني يحتوي على رابط يجب عليك الضغط على الرابط "
+"لتاكيد الغاء اشتراكك من القائمة البريدية"
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+"الخطوة الاضافية لحمايتك من الاخرين لالغاء اشتراكك من القوائم بدون موافقتك"
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+"الرجاء الضغط على الرابط الذي تم ارساله لك و سيتم تاكيد الغاء الاشتراك من "
+"القائمة البريدية"
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr "الرجوع"
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr "تم التاكيد بنجاح"
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr "فشلت عملية التاكيد"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr "هذا قد يعني واحد من اثنين"
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+"لقد تاخرت في تاكيد اشتراكك او عدم اشتراكك هذا الرابط  غير صالح - رابط "
+"التاكيد صالح لمدة ثلاثة ايام فقط يرجى اعادة الطلب"
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+"لقد قمت مسبقا وبنجاح تاكيد اشتراكك او عدم اشتراكك وانتة تحاول هذا مجددا"
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr "الخطاء المرسل من الخادم كان "
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr "اسم القائمة:"
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr "عنوان  البريد الالكتروني"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr "اذا تم الاشتراك النسق المفضل: "
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr "رسالة واحد في الوقت"
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr "خلاصة التنسيق"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+"عند محاولتك للاشتراك او عدم الاشتراك في قائمة البريد سوف تستلم برمد يحتوي "
+"على معلومات اضافية  اضغط عليها للتاكيد النهائي"
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+"هذه الخطوة الاضافية من اجل حمايتك لمنع الاخرين من اضافتك او الغاء اشتراكك في "
+"قائمة بريدية"
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr "تم تسجيل الدخول باسم"
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr "لم يتم تسجيل الدخول."
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "مدعوم من"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "تسجيل الدخول مجددا"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "تحرير او حذف الغرفة"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "الذهاب الى الغرفة المخفية"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "انشاء اسم غرفة جديد"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "انشاء اسم غرفة جديد"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "الغرفة المخفية zap"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "اضهار جميع الغرف المحمية zap"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "قراءة الرسائل الجديدة"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "قائمة الغرف المعروفة"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "اين استطيع الذهاب من هنا"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "الذهاب لغرفة اخرى"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "مع ... <EM> غير مقروءة </ EM> رسائل"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "التخطي الى غرفة اخرى"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "حاول العودة لاحقا"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "عدم الذهاب الى"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "للاسف الدهاب الى "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "قراءة الرسائل الجديدة"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "هل هذه الغرفة"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "قراءة جميع الرسائل"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "و<EM> القديمة ... </ EM> جديد"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "ادخل الرسالة"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(نشر في هذه الغرفة)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "مكتبة الملفات"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "قائمة الملفات المتوفرة للتحميل"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "ملخص الصفحة"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "ملخص حسابي"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "قائمة المستخدمين"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "جميع المستخدمين المسجلين"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "وداعا!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "تغيير كلمة سرّك"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "ادخل كلمة السر الجديدة"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "ادخل المعلومات مرة اخرى للتاكيد"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "تغير اعدادتك المفضلة"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "حدث معلومات المستخدمين"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "ادخل معلومات Bio"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "ادخل صورة التواجد الخاصة بك"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "عرض / تحرير جهة الخادم فلاتر البريد"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "تحرير اعدادات البريد"
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr "ادارة المعرف الخاص بك"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "اكد  نقل الرسالة"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "انقل الرسالة الى"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "قراءة #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "رسائل"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "الترتيب من القديم للحديث"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "الترتيب من الحديث للقديم"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "المرسِل"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "تحميل الرسائل من الخادم يرجى الانتضار"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "افتح في نافذة جديدة"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "نقل"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "إنسخ"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "طباعة"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "عرض المستخدمين"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "إضافة جهاة اتصال جديدة"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "طريقة عرض اليوم"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "طريقة عرض الشهر"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "اضافة حدث جديد"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "قائمة التقويم"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "اضهار المهام"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "اضافة مهمة جديدة"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "اضهار الملاحظات"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "اضافة ملاحضة جديدة"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "اعادت تحديث قائمة الرسائل"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "كتابة بريد"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "صفحة المعرفة"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "حرر الصفحة"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "السجل للعمليات السابقة الهستوري"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr "مشاركة جديدة في المدونة"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "تخطي هذه الغرفة"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "صفحة بداية جديدة"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "صفحة البدء الخاصة بك تم تغيرها"
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+"ملاحظة: هذا لا يغير الصفحة الرئيسية في المتصفح لديك. يتغير الصفحة التي تبدأ  "
+"عند تسجيل الدخول"
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "لاتوجد رسائل جديدة"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "معرف حسابك"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "تم التحقق بنجاح"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr "على كل حال"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "تضارب مع مستخدم موجود اصلا"
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "الرجاء تحديد اسم المستخدم الذي تنوي استخدامها"
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "الاعدادات والمفضلات"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "عرض الحافضات على شكل شجرة"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "عرض الغرف على شكل جدول"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12   ساعة"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 ساعة"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "اﻷحد"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "الأثنين"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "بدون توقيع"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "كامل الوضائف"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "الوضع الامن"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr "الوضع الامن هو اقل حمل على خادم البريد لكن لايعمل بجميع الميزات"
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr "اعداد بريد الدفع"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "اعداد دفع ال رسائل القصير والبريد الالكتروني"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+"اذا المدير فعل هذه الوظيفية سيرفر كاتيديل يستيطع ابلاغ خادم  Funambol  بانه "
+"تم استقبال بريد الكتروني جديد تلقائيا ويقوم بالمزامنة مع اي جهاز مع  مستخدم "
+"Funambol  مركب"
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+"بدلا من ذلك، إذا قام المدير العام باعداده ، يمكن خادم  إرسال رسالة نصية إليك "
+"عند وصول بريد جديد."
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr "ابلغ خادم  Funambol"
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr "ارسال رسالة نصية الى"
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr "استخدم الشكل الدولي بدون اصفار او مسافات مثل +61415011501"
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr "استخدم  ابلاغ مخصص مهيئة عن طريق المدير"
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr "لاترسل اي تنبيهات"
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "اسم الغرفة "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "يتواجد في طابق "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "العرض الافتراضي للغرفة "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "انواع الغرف"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "عام تلقائيا يضهر للجميع"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "خاص - مخفي قابل للوصول من قبل اي شخص يعرف الاسم"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "خاص يطلب كلمة مرور "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "خاص عن طريق الدعوات"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "شخصي - صندوق بريد لك فقط"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "انشاء اسم غرفة جديد"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "اسم الغرفة "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "العرض الافتراضي للغرفة "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "انواع الغرف"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "تحرير ملف معلومات الغرفة"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr "في النص المهيئ لقارئة المتصفخ الخط الجديد يتم فرض خط جديد فارغ"
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "اذهب للغرفة المخفية"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"اذا كنت تعرف الاسم المخفي واسم الضيف او كلمة السر او كلمة سر الغرفة تستطيع "
+"الدخول للغرفة بالضغط على الاسم وعند حصولك صلاحية الوصول لهذه الغرفة سوف تضهر "
+"في قائمة الغرف الاعتيادية لديك"
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "ادخل اسم الغرفة"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "ادخل كلمة السر للغرفة"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "الإعدادات"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "سياسة انهاء الرسائل"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "السيطرة على الوصول"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "المشاركة"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "خدمة قائمة البريد"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "الاسترجاع عن بعد"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "حذف"
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"المستخدمين المدرجين ادناه لهم صلاحية الوصول لهذه الغرفة لمسح مستخدم من قائمة "
+"الصلاحيات حدد اسم المستخدم من القائمة المدرجة واضغط طرد"
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"لمنح مستخدم اخر صلاحية الوصول لهذه الغرفة ادخل اسم المستخدم  في الحقل واضغط "
+"ادعو"
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "ادعو"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "المستخدمون"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "مسح هذه الغرفة"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr "تهيئة او تغير ايقونة بنر الغرفة"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr "تحرير ملف معلومات الغرفة"
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr "اسم الغرفة "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "اذا خاص سبب جميع المستخدمين لنسيان هذه الغرفة"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "المستخدمين المفضلين فقط"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "غرفة للقراءة فقط"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "مسموع لجميع المستخدمين المشاركة و حذف الرسائل"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "ملف دليل الغرف"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "اسم الدليل "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "الرفع مسموح"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "مسموح التحميل"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "ابقاء الرسائل في الخادم"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "الدليل المرئي"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "غرفة المشاركة عن طريق الشبكة"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "مسموح  او مستثنى لا تقوم بالتنظيف التلقائي"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "اسم الموضوع مطلوب اجبر المستخدمين على تحديد موضوع الرسالة"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "الرسائل من الغرباء"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "لا توجد رسائل من الغرباء"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "جميع الرسائل من غرباء"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "مطالبة المستخدم عن الدخول للرسائل"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "معاون الغرفة "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "سياسة انها الرسائل  لهذه الغرفة"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "استخدم السياسة الافتراضية لهذا الطابق"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "سياسة انهاء الرسائل في هذا الطابق"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "اعادة النضام الى الوضع الافتراضي"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr "استرداد الرسائل من حسابات POP3 البعيد هذه وتخزينها في هذه الغرفة:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "اسماء المضيفين البعيدة"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "اسم المستخدم"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "ابقاء الرسائل في الخادم"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "الفترة"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "جلب rss التالية وتخزينها في هذه الغرفة:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "رابط التغذية"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<I> محتويات هذه الغرفة <B>تم ارسالها بالبريد كرسائل الفردية </ B> إلى "
+"المستلمين القائمة التالية: </ I> <BR> <BR>"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<I> محتويات هذه الغرفة <B> تم الارسال بالبريد في شكل خلاصة </ B> إلى "
+"المستلمين القائمة التالية: </ I> <BR> <BR>"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "جميع المستلمين من المستخدمين او من دفتر العناوين"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "السماح لغير المشتركين في البريد لهذه الغرفة"
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "المشاركة في الغرف تحتاج لصلاحيات  المدير"
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr "السماح للطلبات بخدمة الاشتراك وعدم الاشرتاك  الذاتية التفعيل"
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "عنوان الرابط للاشتراك او عدم الاشتراك هو "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "عدم المشاركة مع"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "المشاركة مع"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "اسم العقدة البعيدة"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "اسم الغرفة البعيدة"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "إجراءات"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"عند مشاركة الغرفة، يجب أن تكون مشتركة من كلا الجانبين. إضافة إلى قائمة عقدة "
+"'المشتركة' يرسل رسائل، ولكن من أجل الحصول على الرسائل، يجب أن يتم تكوين "
+"العقد الأخرى لإرسال رسائل إلى النظام الخاص بك أيضا. <li> إذا اسم الغرفة عن "
+"بعد فارغة، يفترض أن اسم الغرفة مطابق على عقدة البعيد. <li> إذا اسم الغرفة "
+"البعيد مختلفة، يجب تكوين العقدة البعيدة أيضا اسم الغرفة هنا."
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "معلومات الغرفة"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "نسيان الغاء الاشتراك للغرفة الحالية"
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr "اذا ضغطت على هذا الخيار"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr "سوف تختفي من قائمة الغرف هل هو هذا ما تود عمله ؟"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "غرف المتحركين المنسية"
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "اضغط على اي غرفة لفتحها وثم اذهب للغرفة"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "جديد من"
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "اختار صفحة "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "بحث: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "جميع"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "اضف او حرر نص برمجي سكربت"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "اضافة سكربت - نص برمجي"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"لاضافة سكربت - فطعة برمجية - ادخل اسم القطعة البرمجية في هذا الحقل واضغط "
+"انشاء"
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "اسم السكربت - القطعة البرمجية "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "تحرير السكربت - القطعة البرمجية"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "الرجوع الى شاشة فائمة تحرير"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "مسح السكربتات - القطع البرمجية"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"لمسح سكربت - قطعة برمجية موجودة مسبقا اختار اسم السكربت من القائمة ثم اضغط "
+"مسح"
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "اذا"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "الى او مع"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "اجابة الى"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "اعد ارسال الفورم"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "اعد الارسال الى"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "شكل المضروف"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "مضروف الى"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "الريد - اكس"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "علامة - البريد المزعج -اكس"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "حالة البريد المزعج - اكس"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "قائمة المعرفين"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "حجم الرسالة"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "يحتوي على"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "لا يحتوي على"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "يكون"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "لا يكون"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "مطابق"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "لا يطابق"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "جميع الرسائل"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "هوة اكبر من"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "أقل من"
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr "بايتات"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "حفظ"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "تجاهل بصمت"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "رفض"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "انقل الرسالة الى"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "مرّر إلى"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "اجازة - عطلة"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "الرسالة:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "ثم اضف"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "مستمر بالمعالجة"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "توقف"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "عند وصل البريد الجديد "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "فلتر تبعا للقوانين المختارة هنا"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "اتركه في صندوق البريد بدون فلترة"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr "فلتر بصور يدوية - وحرر النص - مستخدم متقدم فقط"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "أضف قاعدة"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"هذا التنصيب للخادم بدون اي دعم فني - الرجاء الاتصال بمدير النظام في حالة "
+"رغبتك بالحصول على هذه الميزة"
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "الرسائل القديمة"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "رسائل جديدة"
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr "ملخص الصفحة "
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "الرسائل"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "اليوم هو في التقويم"
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "من هوة متواجد الان"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "حول هذا الخادم"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr "انتة متصل ب"
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr "يعمل"
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr "مع"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr "بناء الخادم"
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr "وموجود في"
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr "اسم مدير النظام هو"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"الانتباه رجاءا , الجافا سكربت معطلة في المتصفح العديد من الوظائف لهذا النضام "
+"لن تعمل بصورة صحيحة"
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "ادخل معلومات Bio"
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr "قائمة المستخدمين لاجل "
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "إسم المستخدم"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "عدد"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "مستوى الوصول"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "آخر دخول"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "مجمع محاولات الدخول"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "مجموع المشاركات"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "الملف الشخصي للمستخدم"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr "اضغط هنا لارسال رسالة فورية"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "تحرير معلومات المستخدم"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "البادئة"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "الاسم الأول"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "الاسم الأوسط"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "الاسم الأخير"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "اللاحقة"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "اسم العرض:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ": العنوان"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "المنظمة/الشركة:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "صندوق البريد:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "العنوان:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "المدينة:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "الولاية:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "الرمز البريدي"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "البلد:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "هاتف المنزل"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "هاتف العمل"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "الهاتف المحمول"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "رقم الفاكس"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "دفتر العناوين فارغ"
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "حدث خطا داخلي"
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "كتابة تعليق"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "احدث المشاركات"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "مشاركات أقدم"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d تعليقات"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "الرابط الثابت"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "جديد من"
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "ليس لديك الصلاحية لعرض هذه المصادر"
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "قائمة المعالجة فارغة"
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "اعادة تحديث الصفحة"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "اسماء المضيفين البعيدة"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "الولاية:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "مستمر بالمعالجة"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr "اصلا تمت المشاركة في "
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "عنوان الرسالة"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "وقت وتاريخ التقديم"
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr "المحاولة القادمة"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "المتسلمون"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "مِن "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "إلى"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "تحرير"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "الرد"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "الرد باقتباس"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "الرد على  الجميع"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "إعادة توجيه"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "رؤوس"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "عرض"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "نزّل"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "عرض ك"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "المستخدمون يعملون حاليا "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr "اضغط على الاسم لقراءة معلومات المستخدم اضغط تشغيل"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "لارسال رسالة فورية لهذا المستخدم"
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "اقضي على العملية"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "غرفة"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "من المضيف"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "حرر جلسة العرض"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"هذه الشاشة تسمح لك بتغيير طريقة جلستك يظهر في 'المتواجدون الآن' القائمة. "
+"لإيقاف أي 'وهمية' اسم قمت بتعيينها مسبقا، يكفي النقر على المناسبة \"التغيير"
+"\" زر دون كتابة أي شيء في المربع المقابل. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "اسم الغرفة"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "اسم المضيف:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr "المستخدمين الذي يعملون حاليا"
+
+#: ../../static/t/who/section.html:5
+#, fuzzy
+msgid "Edit configuration"
+msgstr "ضبط الموقع"
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "دفتر العناوين فارغ"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "في هذه "
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr "اختار تحرير الصفحة واربط مع بنر الغرفة اذا كنت تريد انشاء هذه الصفحة"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "لاتوجد صفحة تدعى '%s' هنا"
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr "قائمة اخر تعديلات اجريتها لهذه الصفحة history"
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr "قائمة بصفحات المعرفة"
+
+#~ msgid "the icon for this floor"
+#~ msgstr "ايقونة هذا الطابق"
+
+#~ msgid "Edit %s"
+#~ msgstr "تحرير %s"
+
+#~ msgid "Save changes"
+#~ msgstr "حفظ التغييرات"
+
+#~ msgid " (work)"
+#~ msgstr " عمل"
+
+#~ msgid " (home)"
+#~ msgstr " الرئيسي"
+
+#~ msgid " (cell)"
+#~ msgstr " الخلية"
+
+#~ msgid "Telephone:"
+#~ msgstr "الهاتف:"
+
+#~ msgid "E-mail:"
+#~ msgstr "البريد الإلكتروني:"
+
+#~ msgid "Directory domains"
+#~ msgstr "دليل المجالات"
+
+#~ msgid "Fallback smart hosts"
+#~ msgstr "النسخ الاحتياطي للمضيفين الاذكياء"
+
+#, fuzzy
+#~ msgid "Create new room"
+#~ msgstr "انشاء اسم غرفة جديد"
+
+#, fuzzy
+#~ msgid "Zap this room"
+#~ msgstr "تخطي هذه الغرفة"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "غرفة المشاركة عن طريق الشبكة"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "اضافة عقدة جديدة"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "دقيقة/دقائق"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "مؤقت"
+
+#, fuzzy
+#~ msgid "Send"
+#~ msgstr "المرسِل"
+
+#, fuzzy
+#~ msgid "Delete this message?"
+#~ msgstr "مسح هذه الغرفة"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "معلومات الغرفة"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "الصورة فقط"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "رفع ملف"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "هل انتة متاكد من رغبتك بالمسح "
+
+#~ msgid "Upload"
+#~ msgstr "رفع"
+
+#~ msgid "Add"
+#~ msgstr "إضافة"
+
+#, fuzzy
+#~ msgid "Invite"
+#~ msgstr "ادعو"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "المستخدمون"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "دفتر العناوين"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "مسح السكربتات - القطع البرمجية"
+
+#, fuzzy
+#~ msgid "Delete this user?"
+#~ msgstr "مسح هذه الغرفة"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "حذف"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "البريد القادم لن تتم فلترته عن طريق اي نص برمجي سكربت معد مسبقا"
+
+#~ msgid "The currently active script is: "
+#~ msgstr "النصوص البرمجية المفعلة الان "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "اعدادات النسخ التمائلي بين خادمين كاتيديل"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "عرض  ايقونة مقدم من كاتيديل"
+
+#, fuzzy
+#~ msgid "Go to your email inbox"
+#~ msgstr "طريق مختصر لصندوق البريد الخاص بك"
+
+#, fuzzy
+#~ msgid "Go to your personal calendar"
+#~ msgstr "طريق مختصر لتقويمك الخاص"
+
+#, fuzzy
+#~ msgid "Go to your personal address book"
+#~ msgstr "دفتر العناوين الخاص بك"
+
+#, fuzzy
+#~ msgid "Go to your personal notes"
+#~ msgstr "ملاحظتك"
+
+#, fuzzy
+#~ msgid "Go to your personal task list"
+#~ msgstr "طريق مختصر لقائمة المهام الخاصة بك"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "اضهار جميع الغرف المحمية zap"
+
+#, fuzzy
+#~ msgid "Room and system administration functions"
+#~ msgstr "اسم مدير النظام هو"
+
+#, fuzzy
+#~ msgid "Reset form"
+#~ msgstr "خلاصة التنسيق"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "مسح هذه الغرفة"
+
+#, fuzzy
+#~ msgid "Create new floor"
+#~ msgstr "انشاء اسم غرفة جديد"
+
+#, fuzzy
+#~ msgid "Delete rule"
+#~ msgstr "حذف"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "تحرير الرسوم"
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "غير اسم الغرفة"
+
+#, fuzzy
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "هل انتة متاكد من رغبتك بالمسح "
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "ادخل الاوامر"
+
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "اسم المستخدم الرئيسي الماستر"
+
+#~ msgid "Master user password"
+#~ msgstr "كلمة السر للمستخدم الرئيسي الماستر"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "مسح هذه الغرفة"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "قائمة المعرفين"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "خلاصة التنسيق"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "الموضوع"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "هل انتة متاكد تريد مسح هذا الاسم المعرف"
+
+#, fuzzy
+#~ msgid "Share"
+#~ msgstr "المشاركة"
+
+#~ msgid "Change password"
+#~ msgstr "تغيير كلمة المرور"
+
+#~ msgid "Change room name"
+#~ msgstr "غير اسم الغرفة"
+
+#~ msgid "Change host name"
+#~ msgstr "تغير اسم المضيف"
+
+#~ msgid "Change user name"
+#~ msgstr "تغير اسم المستخدم"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "حفظ التغييرات"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> انتة متشرك to the في "
+#~ "القائمة البريدية تم ارسال بريد لكم من قائمة السيرفير لتاكيد اشتراكك  يرجى "
+#~ "الضغط على الرابط المرسل لتاكيد اشتراكك.<br><br>Please click on the link "
+#~ "which is being e-mailed to you and your subscription will be confirmed."
+#~ "<br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr "فشل تحلي العرض لبرمجة الخادم هل قمت بتشغيل خادم جديد ؟"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "هذه الغرفة تدعى '%s'"
+
+#~ msgid "Network"
+#~ msgstr "الشبكة"
+
+#~ msgid "Tuning"
+#~ msgstr "ضبط"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "على الفور محو الرسائل المحذوفة في IMAP"
diff --git a/webcit/po/webcit/bg.po b/webcit/po/webcit/bg.po
new file mode 100644 (file)
index 0000000..dcd4810
--- /dev/null
@@ -0,0 +1,4013 @@
+# Bulgarian translation for citadel
+# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2012-03-12 09:09+0000\n"
+"Last-Translator: Валери Фиков <v@fikov.com>\n"
+"Language-Team: Bulgarian <bg@li.org>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-03-21 04:47+0000\n"
+"X-Generator: Launchpad (build 14981)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr ""
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr ""
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr ""
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr ""
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr ""
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr ""
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr ""
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr ""
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr ""
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr ""
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr ""
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr ""
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr ""
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr ""
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr ""
+
+#: ../../availability.c:169
+msgid "free"
+msgstr ""
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr ""
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr ""
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr ""
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr ""
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr ""
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr ""
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr ""
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr ""
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr ""
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr ""
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr ""
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr ""
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr ""
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr ""
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr ""
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr ""
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr ""
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr ""
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr ""
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr ""
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr ""
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr ""
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr ""
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr ""
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr ""
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr ""
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr ""
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr ""
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr ""
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr ""
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr ""
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr ""
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr ""
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr ""
+
+#: ../../event.c:89
+msgid "Event"
+msgstr ""
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr ""
+
+#: ../../event.c:222
+msgid "Location"
+msgstr ""
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr ""
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr ""
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr ""
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr ""
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr ""
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr ""
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr ""
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr ""
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr ""
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr ""
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr ""
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr ""
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr ""
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr ""
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr ""
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr ""
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr ""
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr ""
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr ""
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Този сървър е вече обслужва максимален брой потребители и не може да "
+"обслужва повече потребители в този момент. Моля, опитайте отново по-късно "
+"или се свържете с вашия системен администратор."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Вие сте свързан към Citadel сървър работещ с Citadel %d.%02d. \n"
+"За да стартирате тази версия на WebCit, трябва да имате също Citadel %d.%02d "
+"или по-нова.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr ""
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr ""
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr ""
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr ""
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr ""
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr ""
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr ""
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr ""
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr ""
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr ""
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr ""
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr ""
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr ""
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr ""
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr ""
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr ""
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr ""
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr "Глобални имейл псевдоними"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Трябва да сте влезли в системата за достъп до тази страница."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Нов потребител? Регистрирайте се сега"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr ""
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr ""
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "по-нови мнения"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+msgid "Name of the blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr ""
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr ""
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr ""
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Публикувай коментар"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "по-нови мнения"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "по-възрастните мнения"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "Публикувай коментар"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "Постоянна връзка"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr ""
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "'here"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "There is no page called '"
+msgstr ""
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
diff --git a/webcit/po/webcit/create-pot.sh b/webcit/po/webcit/create-pot.sh
new file mode 100755 (executable)
index 0000000..b3d942d
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+CSOURCES=`find ../.. -name \*.c`
+HSOURCES=`find ../.. -name \*.html`
+JSOURCES=`find ../.. -name \*.js`
+
+echo Updating webcit.pot from strings in the source code ...
+xgettext \
+       --copyright-holder='The Citadel Project - http://www.citadel.org' \
+        --from-code='utf-8' \
+       -k_ \
+       -o webcit.pot \
+       --add-comments \
+       $CSOURCES $HSOURCES
+
+for x in *.po
+do
+       echo Merging webcit.pot into $x ...
+       msgmerge $x webcit.pot -o $x
+done
diff --git a/webcit/po/webcit/cs.po b/webcit/po/webcit/cs.po
new file mode 100644 (file)
index 0000000..96023ba
--- /dev/null
@@ -0,0 +1,4384 @@
+# Czech translation for citadel
+# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2013-08-20 09:48+0000\n"
+"Last-Translator: Vilem Kebrt <vilem.kebrt@gmail.com>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-08-21 04:32+0000\n"
+"X-Generator: Launchpad (build 16731)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Smazáno"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Nový uživatel"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Problémový uživatel"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Klasický uživatel"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Síťový uživatel"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Preferovaný uživatel"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Poradce"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Došlo k chybě."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Potvrdit nové uživatele"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Žádný uživatel právě nevyžaduje potvrzení."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "velmi slabé"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "slabé"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "dobré"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "silné"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Aktuální úroveň přístupových práv: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Úroveň přístupových práv tohoto uživatele:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Zrušeno. Heslo se nezmění."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Hesla nesouhlasí. Heslo nezměněno."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Heslo nemůže být prázdné."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "dostupnost neznámá"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "volný"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "ZAMĚSTNANÝ"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Jdi na stranu: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "První"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Poslední"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Pozvánka na schůzku"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Odpověď účastníka na pozvánku"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Publikovaná událost"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Toto je neznámý typ kalendářového objektu."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Shrnutí:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Umístění:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Datum:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Počáteční datum/čas:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Konečný datum/čas:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Popis:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Opakování"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Toto je opakující se událost"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Účastník:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Toto je aktualizace události '%s' která už je ve vašem kalendáři."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr "Tato událost bude v konfliktu s '%s' která už je ve vašem kalendáři."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Aktualizace:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "KONFLIFT:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Jak odpovědět na toto pozvání?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Potvrdit"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Předběžné"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Zamítnout"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Klikněte na <i>Aktualizovat</i> pro potvrzení a aktualizování kalendáře."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Aktualizovat"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignorovat"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Chyba při zpracování této kalendářové položky."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr "Provedeno potvrzení na pozvánku. Událost byla vložena do kalendáře."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Byl jste předběžně přijat na tuto schůzku. Tato schůzka byla poznačena ve "
+"vašem kalendáři."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Zamítl jste pozvání na tuto schůzku. Schůzka nebyla poznačena v kalendáři."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Odpověď byla zaslána organizátorovi."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Kalendář byl aktualizován na základě RSVP."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"Rozhodli jste se ignorovat tento \"RSVP.\" Váš kalendář <b>nebyl</b> "
+"aktualizován."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Začáteční den kalendáře:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Koncový den kalendáře:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Týden začíná v:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Hodina: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minuta: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(neznámý stav)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(potřebuje akci)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(přijato)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(zamítnuto)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(předběžně)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(delegováno)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(dokončeno)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(zpracovává se)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(nic)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Nepojmenovaná akce"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "Z"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Počáteční datum:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Konečné datum:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Datum/čas:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Poznámky:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "předchozí"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "další"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Týden"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Hodiny"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Předmět"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Start"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Konec"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Celodenní událost"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Probíhající akce"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Nepojmenovaná úloha"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "Došlo k chybě během získávání souboru: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "sekundy"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minuty"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "hodiny"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "dny"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "týdny"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "měsíce"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "let"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "nikdy"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "první"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "druhý"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "třetí"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "čtvrtý"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "pátý"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Událost"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Účastníci"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Přidat nebo upravit událost"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Přehled"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Umístění"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Poznámky"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organizátor"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(jste organizátor)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Ukaž čas jako:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Volný"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Obsazený"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(jeden na řádku)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Kontakty"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Pravidlo pro opakování"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Opakovat vždy"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "v těchto dnech"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "v dni %s%d%s měsíce"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "na "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "měsíce"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "každý "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "ročně"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "z"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Délka opakování"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Chybí datum ukončení"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Opakovat tuto událost"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "krát"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Opakovat do "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Uložit"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Odstranit"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Zkontrolovat dostupnost účastníka"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Formát času"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Nahrání obrázku bylo zrušeno."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Nenahrál jste soubor."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "fotografie"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "ikona této místnosti"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "Uvítací obrázek pro přihlášení"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "obrázek - odhlášení"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "chyba v realloc() nelze získat %d bytes: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Nastavení Iconbaru"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Neplatný parametr"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr " bylo smazáno."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr " přidáno."
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Pro přístup k této funkci jsou zapotřebí vyšší práva."
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr "Musíte zadat poštovní seznam, který chcete použít."
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "Musíte zadat poštovní adresu, kterou chcete použít."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(bez předmětu)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "CHYBA:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Prázdná zpráva"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Zrušeno. Zpráva nebyla odeslána."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Automaticky zrušeno, jelikož zpráva už byla uložena."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "Uložení do Konceptů selhalo: "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "Odmítám odeslat prázdnou zprávu.\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "Zpráva byla uložena do Konceptů.\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Zpráva byla odeslána.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Zpráva byla vystavena.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Zpráva nebyla přesunuta."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "Vyskytla se chyba při zpracování této části: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Vyskytla se chyba při zpracování této části: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Připojit podpis k e-mailu?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Použít tento podpis:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Základní kódování pro hlavičku e-mailu:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Preferovaná e-mailová adresa"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Zobrazené jméno pro e-maily"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Preferovaný pohled na zobrazení příspěvků na BBS"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Zobrazení pošty"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Nevím jak zobrazit "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Klikněte na poznámku pro její úpravu."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Nastavení účtu/OpenID associace"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Chcete opravdu smazat toto OpenID?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(smazat)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Přidat OpenID: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Připojit"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s nepodporuje přihlášení přes OpenID."
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Odeslat okamžitou zprávu"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Odeslat okamžitou zprávu: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Zadejte text zprávy:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Odeslat zprávu"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Zpráva nebyla odeslána."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Zpráva byla odeslána na "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Zrušeno. Nastavení se nezměnilo."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Toto bude má startovní stránka"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "Toto nemůže být startovní stránkou"
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Nyní nemáte nastavenou startovací stránku."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "Upřednostňovaná startovní stránka"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Mé složky"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Zrušeno. Změny se neuloží."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Vaše změny byly uloženy."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Uživatel '%s' byl vykopnut z místnosti '%s'."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Uživatel '%s' pozván do místnosti '%s'."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Zrušeno. Nová místnost nebyla vytvořena"
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Podlaží bylo vymazáno."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Nové podlaží bylo vytvořeno."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Pohled na místnosti"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Zobrazit prázdná podlaží"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "soubor"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "soubory"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Nástěnka"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Poštovní složka"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Adresář"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Kalendář"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Seznam úkolů"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Seznam poznámek"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Kalendářní pohled"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Deník"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Koncepty"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Tento server již obsluhuje nejvyšší možný počet uživatelů a nyní nemůže "
+"příjmat žádná další přihlášení. Zkuste to, prosím, později, nebo kontaktujte "
+"správce systému."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "Přijata neočekávaná odpověď od Citadel servru; zachraňuji se."
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Jste připojeni k Citadel serveru verze %d.%02d. \n"
+"Pro možný běh této verze WebCit musíte mít Citadel verze %d.%02d nebo "
+"novější.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Vaše systémová konfigurace byla změněna"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr "První pokus probíhá"
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Žádný)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Nic)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Zrušeno. %s se neuloží."
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr " byl uložen."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Informace o místnosti"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "biografii"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Dokončeno?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Název úlohy"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Plánované dokončení"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Kategorie"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Zobrazit vše"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Upravit úlohu"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Začátek:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Žádné datum"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "nebo"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Přiřazený čas"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Konec:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Dokončeno:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Kategorie:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr "Vznikla chyba při vytváření nebo úpravě položky v adresáři."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Změny nebyly uloženy."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Nový uživatel byl vytvořen."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"Pokoušíte se vytvořit uživatele v Citadel avšak systém je nastaven na HOST "
+"autentifikaci. V tomto módu musíte vytvořit uživatele na servru/hostu."
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Nepodařilo se dekódovat VCard fotografii\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Chyba"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Nelze vstoupit do této místnosti pro uložení zprávy"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Přerušuji."
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(beze jména)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "upravit"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Vyžadována autorizace"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"Pro přístup je potřeba platné uživatelské jméno a heslo. Nemohl jste být "
+"přihlášen: %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Tento program neměl možnost se připojit nebo zůstat připojený k Citadel "
+"servru. Prosím ohlašte tento problém vašemu administrátorovi."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Přečtěte více…"
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' není wiki místnost"
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Datum"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Autor:"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(zobrazit)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Aktuální verze"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(vrátit zpět)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Název stránky"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Vložte příkaz pro server"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Tato část umožňuje vložit příkaz pro Citadel server, který není podporován "
+"přes WebCit. Pokud nevíte co to znamená, tato stránka pro vás nebude moc "
+"užitečná."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Vložte příkaz:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Vstupní příkaz (pokud požaduje SEND_LISTING přenosový mód):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr "Detekovaná hlavička hosta je "
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Výsledek příkazu"
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr "Vložte další příkaz"
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr "Zpět do menu"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Nastavení sítě"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Přidat nový uzel"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Současné uzly"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "Systémové Administrační menu"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr "Menu poradce pro pokoj"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Lokální alias klienta"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr "Oznámení hostů"
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr "Domény, mající povolenou maškarádu"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Globální Configurace"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Nastavení uživatelů"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "Vypnout Citadel"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Místnosti a podlaží"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr "Restartovat Citadel"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "Zpráva pro uživatele:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Nastavení webu"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr "Musíte být Admin pro zobrazení tohoto."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "Obecné"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Nastavení Iconbaru"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "Odeslat Email"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indexování/žurnálovaní"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Přístup"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr "Adresář"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Automatické čištění"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Pro vytvoření nového uživatelského účtu vložte požadované jméno do textového "
+"pole dole a klikněte 'Vytvořit'"
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Nový uživatel: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Pro upravení existujícího uživatelského účtu, vyberte jméno ze seznamu a "
+"klikněte na 'Upravit'"
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Upravit nastavení uživatele: "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Uživatelské jméno:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Heslo:"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Oprávnění pro odeslání Internetového e-mailu"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Primární e-mailová adresa"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Ostatní e-mailové adresy"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Počet přihlášení"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Vložené zprávy"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Úroveň přístupu"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "ID uživatele"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Datum a čas posledního přihlášení"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Automaticky vymazat po dnech"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Upravit nebo smazat uživatele"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Přidat uživatele"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Upravit nebo smazat uživatele"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Přidat, upravit nebo odstranit podlaží"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Jméno uzlu"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Sdílené heslo"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Host nebo IP adresa"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Číslo portu"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Potvrdit smazání"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Opravdu chcete odstranit "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Ano"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Ne"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr "(Upravit)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Smazat)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(domény, ze kterých tento host přijímá emaily)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(hosti využívající ClamAV clamd službu)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(domény uvedené v Globálním Adresáři)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+"(zasílání odchozích mailů na tyto hosty pouze, pokud přímé doručení selže)"
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "(Domény, jejichž uživatelé mají povolenu maškarádu)"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr "(URLS pro oznámení, když uživatel dostane nový email; )"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+"Zápis syntaxe: Šablona pro oznánení:http[s]://user:password@hostname/path"
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(List běžících Realtime Blackhole)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+"(Pokud je potvrzeno, přepošle všechny odchozí maily na jednoho z těchto "
+"hostů)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(hosti využívající SpamAssassin službu)"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Restartovat nyní"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "Restartovat after paging users"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "Restartovat až budou všichni uživatelé nečinní"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "Prosím čekejte dokud Citadel server je restartován... "
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+"Prosím počkejte dokud nebudou uživatelé nastránkováni, citadel server se "
+"poté restartuje. "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Kontrola přístupu a nastavení politiky stránky"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Karanténí zprávy pro problémové uživatele"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Jméno karanténí místnosti"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Jméno místnosti pro stránky s logy"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr "Ověřovací mód"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr "Povolit anonymní přístup"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Počáteční úroveň přístupu pro nové uživatele"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Potřebné oprávnění pro vytváření nových místností"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Zakázat přístup k Internetovému e-mailu"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Zakázat vlastní vytvoření uživatele"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr "Tip: nevybírejte obě!"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "Požadovat registraci pro nové uživatele"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Automatické nastavení vypršení starých zpráv"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+"Toto nastavení může být změněno na úrovni nastavení podlaží nebo místností."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Hodina ke spuštění automatického čištění databáze."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "Výchozí pravidlo pro zprávy o vypršeníl ve veřejných místnostech"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Nikdy nevymazávat prošlé zprávy"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Zprávy vyprší počtem"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Zprávy propadnou stářím"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Počet zprávy nebo dní: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr "Výchozí pravidlo prošlých zpráv pro soukromé složky"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Stejné pravidla jako veřejné místnosti"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Default user purge time (days)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Výchozí čas pro vyčištění místnosti (dny)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Nastavení LDAP konektoru pro Citadel"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"Změny provedené v této části nebudou provedeny dokud nerestartujete server "
+"Citadelu."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"Poznámka: Tento Citadel server byl postaven bez podpory LDAP. Toto nastavení "
+"nebude mít vliv."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Název hosta LDAP serveru (nechte prázdné pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Číslo portu LDAP serveru (prázdné pole pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "Obecné nastavení služby"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "Změnit logo při přihlašování"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "Změnit logo při odhlašování"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Plně kvalifikované doménové jméno"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Člověku čitelný název nodu"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Telefonní číslo"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Zeměpisná poloha tohoto systému"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Jméno systéového administrátora"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Základní časová zóna pro nepřiřazené kalendáře"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "IMAP naslouchací port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "IMAP přes SSL port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr "Zachovat originální hlavičky na IMAP"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indexování a Žurnálování"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Varování: tyto možnosti jsou systémově náročné."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Aktivovat full-textové indexování"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "POP3 naslouchací port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "POP3 přes SSL port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr "Hostitelský server Funambol (prázdné pole pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "Port serveru Funambol. "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "Funambol sync zdroje"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "Funambol autorizační detaily (uživatel:heslo)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr "Externí pager nástroje (prázdné pole pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Síťové služby"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "IP adresa serveru (0.0.0.0 pro \"jakákoli\")"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "XMPP (Jabber) server <> klient port  (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "XMPP (Jabber) server <> server port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "POP3 naslouchací port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "POP3 naslouchací port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Pokročilé nastavení serveru"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Maximální délka zprávy"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Spojení se serverem v nečinnosti - timeout (sekundy)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Maximální množství spojení (0 = bez omezení)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Minimální počet pracovních vláken"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Maximální počet pracovních vláken"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Automaticky smazat odeslaný databázový záznam"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "SMTP MTA port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "SMTP MSA port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTP přes SSL port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr "Provést RBL kontolu před připojením místo pro připojení k RCPT"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "Označit zprávu jako spam, místo odmítnutí"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr "Povolit neuatentifikované SMTP klienty"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "Opravit upravené \"From:\" řádky při autentifikovaném SMTP přenosu"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr "-1 pro vypnutí"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "ManageSieve Port (-1 pro vypnutí)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Přidat, upravit nebo vymazat uživatelské účty"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Upravit nastavení"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Doménová jména a nastavení Internetových e-mailů"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Ostatní e-mailové adresy"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "Zobrazit odchozí frontu na SMTP servru"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Odhlásit"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Základní příkazy"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Informace o vás"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Pokročilé příkazy místnosti"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Načítání"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Anonymní"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Odeslat zprávu"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr "Uložit do Konceptů"
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Přílohy:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "od"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "v"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "Příjemce:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "Kopie:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "Skrytá kopie:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Předmět (volitelný):"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Předmět:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- přeposlaná zpráva ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Zavřít okno"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Připojit soubor"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr "Odstranit"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Soubory dostupné pro stažení v"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Nahrát soubor:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Název souboru:"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Velikosti"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Obsah"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Popis"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Nahrát obrázek"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Můžete nahrát obrázek přímo z vašeho počítače"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Prosím vyberte soubor k nahrání:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Prezentace"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Přidat/upravit/smazat podlaží"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Číslo podlaží"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Jméno podlaží"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Počet místností"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "CSS úrovně"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(odstranit podlaží)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Musíte být přihlášen pro přístup k této stránce."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "Přihlašte se s uživatelským jménem a heslem"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Heslo:"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Přihlásit se"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Nový uživatel? Zaregistrujte se"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Přihlašte se s pomocí OpenID"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "OpenID URL:"
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr "Přihlásit se použitím Google"
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr "Přihlásit se použitím Yahoo"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr "Přihlásit použitím AOL nebo AIM"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "Čekejte prosím"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Toto je aktualizace události '%s' která už je ve vašem kalendáři."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr "Tato událost bude v konfliktu s '%s' která už je ve vašem kalendáři."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Jazyk:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "E-mail"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Úlohy"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Místnosti"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Připojení uživatelé"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Diskuze"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Pokročilý"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Administrace"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "upravit toto menu"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "přepnout do seznamu místností"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "přepnout na menu"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Moje složky"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Upravte menu ikon"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Zobraz ikony jako:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "obrázky a text"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "pouze obrázky"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "pouze text"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr "Vyberte ikony, které chcete vidět v liště ikon na levé straně okna."
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Logo webu"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Ikona popisující tuto stránku"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Souhrnná stránka"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Pošta (příchozí)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Zkratka do složky přijatých zpráv"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Osobní adresář"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Osobní poznámky"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Zkratka do kalendáře"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Zkratka do seznamu"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Kliknutím na tuto ikonu zobrazíte seznam přístupných místností (adresářů), "
+"které jsou dostupné."
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Kdo je online?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr "Kliknutím na tuto ikonu zobrazíte seznam všech přihlášených uživatelů."
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Kliknutím na tuto ikonu vstoupíte do chatu s ostatními uživateli stejné "
+"místnosti."
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Pokročilé nastavení"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Přístup do kompletního menu funkcí Citadel server."
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Citadel logo"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Zobrazit \"Poháněno přes Citadel\" ikonu"
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"Panel ikon byl aktualizován. Prosím vyberte nějakou volbu pro pokračování."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+"Možná budete potřebovat obnovit stránku (SHIFT - F5) > aby byly změny "
+"provedeny"
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Seznam odebírání"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Seznam přihlášených/odhlášených"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Potvrzovací požadavek odeslán"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr "Jste přihlášen "
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr " k "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr " poštovnímu seznamu."
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+"Distribuční server Vám zaslal e-mail s webovým odkazem, kliknutím na něj "
+"potvrdíte vaše přihlášení."
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+"Tento krok navíc je pro vaši ochranu, aby vás ostatní nemohli přidat do "
+"seznamu bez vašeho souhlasu."
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+"Prosím klikněte na odkaz, který vám byl zaslán pro potvrzení přihlášení."
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Zpět..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr "CHYBA"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr "Nejste přihlášen"
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr "od"
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr "poštovní seznam"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+"Poštovní server vám poslal e-mail, který obsahuje odkaz na potvrzení vašeho "
+"odhlášení."
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+"Tento krok je pro vaši opchranu, aby vás ostatní nemohli odhlásit ze seznamu "
+"bez vašeho souhlasu."
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+"Prosím klikněte na odkaz, který vám byl zaslám e-mailem k potvrzení vašeho "
+"odhlášení."
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr "Zpátky..."
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr "Přihlášení úspěšné!"
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr "Přihlášení selhalo."
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr "To může znamenat dvě věci:"
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+"Čekáte příliš dlouho na potvrzení vašeho požadavku na přihlášení/odhlášení "
+"(potvrzující odkaz je funkční pouze tři dny)"
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+"Již \"jste\" úspěšně potvrdil přihlášovací/odhlášovací požadave a není nutné "
+"provádět znova."
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr "Chyba vrácená serverem byla: "
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr "Název seznamu:"
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr "Vaše e-mailová adresa:"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr "(Pokud jste přihlášen) preferovaný formát: "
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr "Jedna zpráva v čase"
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr "Vybraný formát"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+"Při pokusu o přihlášení/odhlášení z poštovního seznamu přijmete e-mail "
+"obsahující webový odkaz potřebný ke konečnému potvrzení."
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+"Tento krok je pro vaši ochranu, brání ostatním uživatelům aby vás mohli "
+"přihlásit nebo odhlásit z poštovního seznamu."
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr "Přihlášen jako"
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr "Nepřihlášen."
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "běží na"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Přihlašte se znovu"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Upravit nebo odstranit místnost"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Jdi do 'skryté' místnosti"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Vytvořit novou místnost"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Vytvořit novou místnost"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "Schovat tuto místnost"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Seznam všech schovaných místností"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Přečíst nové zprávy"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Zobraz místnosti"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Kam můžu pokračovat?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Jít do vedlejší místnosti"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "...s <em>nepřečtenými</em> zprávami"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Přeskoč do další místnosti"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(vraťte se sem později)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Jít zpět"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "oops! Zpět na "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Přečíst nové zprávy"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "...v této místnosti"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Přečíst všechny zprávy"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "...staré <em>a</em> nové"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Vložte zprávu"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(posláno v této místnosti)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "Knihovna souborů"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(Zobrazit dostupné soubory pro stáhnutí)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Stránka s přehledem"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Přehled mého účtu"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Seznam uživatelů"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(všichni registrovaní uživatelé)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Mějte se!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Změnit heslo"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Zadejte nové heslo:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Pro ověření heslo zopakujte:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Upravte své preference a nastavení"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Aktualizujte své kontaktní informace"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Vložte vaše 'bio'"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Upravit online foto"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Zobrazit/upravit e-mailové filtry na straně serveru"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "Upravit nastavení push email"
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr "Upravit OpenID"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Potvrďte přesun zpráv"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Přesunout zprávu do:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Čtení #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "zprávy"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "nejstařší po nejnovější"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "nejnovější po nejstarší"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Odesílatel"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Načítám zprávy ze serveru, prosím čekejte"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Otevřít v novém okně"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Přesunout"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Kopírovat"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Vytisknout"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Zobrazit kontakty"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Přidat kontakt"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Denní pohled"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Měsíční pohled"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Přidat událost"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Zobrazit úkoly"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Přidat nový úkol"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Zobrazit poznámky"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Přidat novou poznámku"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Aktualizovat list zpráv"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Napsat e-mail"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Wiki"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Upravit tuto stránku"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "Historie"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr "Nový zápisek na blog"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Přeskočit tuto místnost"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "Nová startovní stránka"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "Vaše startovní stránka byla upravena."
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+"(Poznámka: tato akce nezmění domovskou stránku prohlížeče. Pouze startovní "
+"stránku po přihlášení do"
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "Žádné nové zprávy."
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "Vaše OpenID"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "bylo úspěšně ověřeno."
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr "Avšak toto uživatelské jméno"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "je v konfliktu s existujícím uživatelem."
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Prosím specifikujte uživatele, kterého použít."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Preference a nastavení"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Stromový (adresářový) pohled"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Table (rooms) view"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 hodin (am/pm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 hodin"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Neděle"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Pondělí"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Bez podpisu"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "Plná funkcionalita"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Bezpečný mód"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+"Bezpečný mód je méně náročný pro prohlížeč, ale ne všechny funkce budou "
+"fungovat."
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr "Nastavit Push Email"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "Push email a SMS nastavení"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+"Pokud správce povolil tuto funkci, Citadel může oznámit Funambol servru, že "
+"jste obdrželi novou zprávu a automaticky se sesynchronizovat se zařízením na "
+"kterém máte nainstalován Funambol klient."
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+"Pokud to správce nastavil, Citadel vám může poslat sms když přijde nová "
+"zpráva."
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr "Oznámit Funambol serveru"
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr "Poslat sms na číslo..."
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+"(použijte mezinárodní formát bez úvodních nul, mezer nebo pomlček, např "
+"+61415011501)"
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr "Použit vlastní schéma oznámení nastavené Administrátorem"
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr "Neposílat žádná upozornění"
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Jméno místnosti: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Nachází se na podlaží: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Základní pohled pro místnost: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Typ místnosti:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Veřejná (místnost je viditelná pro všechny)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Sokromá - skrytá (přístupná pouze pro ty, kteří znají jméno)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Soukromá - vyžaduje heslo: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Soukromé - pouze na pozvání"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Osobní (pošta pouze pro vás)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Vytvořit novou místnost"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Jméno místnosti: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Základní pohled pro místnost: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Typ místnosti:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Upravit Informace o místnosti"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"Text je formátován pro prohlížeč návštěvníka. Nová řádka je vynucena "
+"následující druhou prázdnou řádkou."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Jít do skryté místnosti"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Pokud znáte jméno skryté nebo zaheslované místnosti, můžete vstoupit zadáním "
+"jejího jméno níže. Jakmile získáte přístup do soukromé místnosti, objeví se "
+"vám mezi běžnými místnostmi, takže se sem nemusíte vracet."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Vložte jméno místnosti:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Vložte heslo místnosti"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Nastavení"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Doba platnosti zprávy"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Kontrola přístupu"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Sdílení"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Služba mailing seznamů"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Vzdálené stažení"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(odstranit)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Níže zobrazení uživatelé mají přístup do této místnosti. Pro odstranění "
+"uživatele z přístupového seznamu, vyberte uživatele a klikněte \"Vykopnout\""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Pokud chcete umožnit přístup ostatním uživatelům do této místnosti, vložte "
+"jejich jméno klikněte \"Pozvat\""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Pozvat:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Uživatelé"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Odstranit tuto místnost"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr "Nastavit nebo upravit ikonu pro návěstí této místnosti"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr "Upravit Informace o místnosti"
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr "jméno místnosti: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Pouze preferovaný uživatel"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Místnost pouze pro čtení"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "Uživatelé, kteří můžou psát zprávy je můžou i mazat."
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Místnost pro soubory"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Jméno adresáře: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Nahrávání povoleno"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Stahování povoleno"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Ponechat zprávy na servru?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Viditelný adresář"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Síťová sdílená místnost"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Trvalý (nedojde ke smazání)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "Předmět vyžadován"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Anonymní zpráva"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Žádné anonymní zprávy"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Všechny zprávy jsou anonymní"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Vyzvat uživatele při psaní zpráv"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Admin místnosti: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Vymazávací politika pro tuto místnost"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Použij základní politiku pro tuto místnost"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Použít výchozí nastavení systému"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr "Stáhnout zprávy ze vzdáleného POP3 servru a ulož je v této místnosti:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "Vzdálený host"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Jméno uživatele"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Ponechat zprávy na servru?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "Rozmezí"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Načti RSS feedy a ulož je v této místnosti:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "Adresa kanálu"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>Obsah této místnosti je odesílán <b>jako samostatné zprávy</b> na "
+"následující seznam příjemců:</i><br><br>"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>Obsah této místnosti je odesílán <b>ve formě digest</b> na následující "
+"seznam příjemců:</i><br><br>"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Přidejte příjemce z Kontaktů nebo ostatních adresních seznamů"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "Povolit neodběratelům odesílat mail na tuto místnost."
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "Publikace příspěvků v místnosti vyžaduje oprávnění Admin."
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "Adresa pro odběratele/neodběratele: "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Nesdíleno s"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Sdíleno s"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Jméno vzdáleného uzlu"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Jméno vzdálené místnosti"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Akce"
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Informace o místnosti"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Schovat současnou místnost"
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr "Pokud vyberete tuto možnost,"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr "zmizí ze seznamu místností. Přejete si to udělat?"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Schované místnosti"
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Klikněte na místnost pro obnovení a vstup do této místnosti."
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "nový z"
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Vyberte stránku: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Hledat: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Vše"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Přidat nebo odstranit text"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Přidat nový skript"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"Pro vytvoření skriptu napište požadované jméno a klikněte na 'vytvořit'."
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Jméno skriptu: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Upravit skripty"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Jít zpět na editaci skriptů"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Smazat skripty"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"Pro smazání existujících skriptů, vyberte jejich jména ze seznamu a klikněte "
+"na 'Smazat'"
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Jestliže"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Příjemce nebo kopie"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Odpovědět na"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Přeposláno z"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Přeposlat kam"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Obálka z"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Obálka k"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-Flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Status"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "Seznam ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Velikost zprávy"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "obsahující"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "neobsahující"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "je"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "není"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "odpovídá"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "neodpovídá"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Všechny zprávy)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "je větší než"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "je menší než"
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr "bajtů"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Nechat"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Tiše zahodit"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Odmítnout"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Přesunout zprávu do"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Přeposlat kam"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Dovolená"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Zpráva:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "potom"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "pokračovat ve zpracovávání"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "Zastavit"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Kdy e-mail přišel: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Provést filtraci na základě pravidel dole"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Zanechat v mé doručené poště bez filtrování"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr "Filtrovat skrz manuálně editované skripty (pokročilý uživatelé)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Přidat pravidlo"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"Tato instalace Citadely nepodporuje filtrování pošty na straně serveru."
+"<br>Pokud tuto funkci potřebujete, kontaktujte administrátora Vašeho systému."
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "Staré zprávy"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "Nové zprávy"
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr "Souhrná strana pro "
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Zprávy"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Dnes&nbsp;ve&nbsp;vašem&nbsp;kalendáři"
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Kdo je nyní &nbsp;online&nbsp;"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "O&nbsp;tomto&nbsp;serveru"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr "Připojen k"
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr "běží"
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr "s"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr "sestavení serveru"
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr "nachází se v"
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr "Váš systémový administrátor je"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"Varování: Máte zakázaný JavaScript ve vašem webovém prohlížeči. Většina "
+"funkcí tohoto systému nebude správně fungovat."
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Vložte vaše 'bio'"
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr "Seznam uživatelů pro "
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Uživatelské jméno"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Číslo"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Úroveň přístupu"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Poslední přihlášení"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Celkem přihlášení"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Celkem příspěvků"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Uživatelský profil"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr "Klikněte zde pro odeslání okamžité zprávy pro"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Upravit kontaktní údaje"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Titul před jménem"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Křestní jméno"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Druhé jméno"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Příjmení"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Titul za jménem"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Zobrazované jméno:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Titul:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organizace:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Poštovní schránka:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Adresa:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Obec:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Stát:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "PSČ:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Země:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Telefon domů:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Telefon do práce:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Mobilní telefon:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Fax:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Tato kniha adres je prázdná."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Objevila se vnitřní chyba."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Přidat komentář"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "Novější příspěvky"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "Starší příspěvky"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d komentářů"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "pevný odkaz"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "nový z"
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "Nemáte povolení vidět tento zdroj."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "Fronta je prázdná."
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Obnovit tuto stránku"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Vzdálený host"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Stát:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "pokračovat ve zpracovávání"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr "Originálně zasláno v "
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "ID zprávy"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Datum a čas poslání"
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr "Další pokus"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Příjemci"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "od "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "komu"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "Upravit"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Odpovědět"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "Odpovědět citací"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "Odpovědět všem"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Přeposlat"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Hlavičky"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "Zobrazit"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Stáhnout"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Zobrazit jako:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "Nyní připojení uživatelé "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr "Klikněte na jméno pro informace o uživateli"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "pro odeslání okamžité zprávy tomuto uživateli"
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(ukončit)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Místnost"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Upravte nastavení sezení"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Tato obrazovka dovoluje změnit způsob, jakým se zobrazuje seznam \"Kdo je "
+"online\". Pro vypnutí \"falešných\" jmen, před tím nastavených, klikněte na "
+"odpovídající \"změnové\" tlačítko bez psaní do příslušného boxu. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Jméno místnosti:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Označení systému:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr "Uživatelé kteří jsou online"
+
+#: ../../static/t/who/section.html:5
+#, fuzzy
+msgid "Edit configuration"
+msgstr "Nastavení webu"
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "Tato kniha adres je prázdná."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "na "
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Vyberte 'Upravte tuto stránku' odkaz v názvu místnosti, pokud chcete "
+"vytvořit tuto stránku."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Strana '%s' není k nalezení zde."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr "Historie editací této stránky"
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr "Seznam stránek Wiki"
+
+#~ msgid "the icon for this floor"
+#~ msgstr "ikona pro toto podlaží"
+
+#~ msgid "Edit %s"
+#~ msgstr "Upravit %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Uložit změny"
+
+#~ msgid " (work)"
+#~ msgstr " (práce)"
+
+#~ msgid " (home)"
+#~ msgstr " (domů)"
+
+#~ msgid " (cell)"
+#~ msgstr " (mobil)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefon:"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Adresář domén"
+
+#, fuzzy
+#~ msgid "Create new room"
+#~ msgstr "Vytvořit novou místnost"
+
+#, fuzzy
+#~ msgid "Zap this room"
+#~ msgstr "Přeskočit tuto místnost"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Síťová sdílená místnost"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Přidat nový uzel"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "minuty"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Předběžné"
+
+#, fuzzy
+#~ msgid "Send"
+#~ msgstr "Odesílatel"
+
+#, fuzzy
+#~ msgid "Delete this message?"
+#~ msgstr "Odstranit tuto místnost"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Informace o místnosti"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "pouze obrázky"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Nahrát soubor:"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Opravdu chcete odstranit "
+
+#~ msgid "Upload"
+#~ msgstr "Nahrát"
+
+#~ msgid "Add"
+#~ msgstr "Přidat"
+
+#, fuzzy
+#~ msgid "Invite"
+#~ msgstr "Pozvat:"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Uživatelé"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Adresář"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Smazat skripty"
+
+#, fuzzy
+#~ msgid "Delete this user?"
+#~ msgstr "Odstranit tuto místnost"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Odstranit"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "Vaše příchozí pošta nebude filtrována žádnými skripty."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "Právě je aktivní skript: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Nastavit replikaci ostatních Citadel servrů"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Zobrazit \"Poháněno přes Citadel\" ikonu"
+
+#, fuzzy
+#~ msgid "Go to your email inbox"
+#~ msgstr "Zkratka do složky přijatých zpráv"
+
+#, fuzzy
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Zkratka do kalendáře"
+
+#, fuzzy
+#~ msgid "Go to your personal address book"
+#~ msgstr "Osobní adresář"
+
+#, fuzzy
+#~ msgid "Go to your personal notes"
+#~ msgstr "Osobní poznámky"
+
+#, fuzzy
+#~ msgid "Go to your personal task list"
+#~ msgstr "Zkratka do seznamu"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Seznam všech schovaných místností"
+
+#, fuzzy
+#~ msgid "Room and system administration functions"
+#~ msgstr "Váš systémový administrátor je"
+
+#, fuzzy
+#~ msgid "Reset form"
+#~ msgstr "Vybraný formát"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Odstranit tuto místnost"
+
+#, fuzzy
+#~ msgid "Create new floor"
+#~ msgstr "Vytvořit novou místnost"
+
+#, fuzzy
+#~ msgid "Delete rule"
+#~ msgstr "Odstranit"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(upravit obrázek)"
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "Změnit jméno místnosti"
+
+#, fuzzy
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Opravdu chcete odstranit "
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Vložte příkaz:"
+
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "Administrátorské jméno"
+
+#~ msgid "Master user password"
+#~ msgstr "Administrátorské heslo"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "Odstranit tuto místnost"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "Seznam ID"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "Vybraný formát"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Předmět"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Chcete opravdu smazat toto OpenID?"
+
+#, fuzzy
+#~ msgid "Share"
+#~ msgstr "Sdílení"
+
+#~ msgid "Change password"
+#~ msgstr "Změnit heslo"
+
+#~ msgid "Change room name"
+#~ msgstr "Změnit jméno místnosti"
+
+#~ msgid "Change host name"
+#~ msgstr "Změnit označení systému"
+
+#~ msgid "Change user name"
+#~ msgstr "Změnit uživatelské jméno"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Uložit změny"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Zaregistroval jste se <TT>%s</TT> do <b>%s</b> distribučního seznamu. "
+#~ "Seznamový server Vám poslal mail s webovým odkazem, kterým potvrdíte své "
+#~ "přihlášení. Tento zvláštní krok je pro Vaši ochranu, aby Vás zapsali na "
+#~ "seznam bez Vašeho vědomí. Prosím klikněte na odkaz, který Vám byl poslán "
+#~ "a Vaše registrace bude potvrzena. <br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr ""
+#~ "VAROVÁNÍ: Nepodařilo se zpracovat nastavení serveru; spustit nový "
+#~ "citserver?"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Místnost '%s' není k nalezení."
+
+#~ msgid "Network"
+#~ msgstr "Síť"
+
+#~ msgid "Tuning"
+#~ msgstr "Ladění"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Okamžitě vymazat smazané zprávy přes IMAP"
diff --git a/webcit/po/webcit/da.po b/webcit/po/webcit/da.po
new file mode 100644 (file)
index 0000000..345aa67
--- /dev/null
@@ -0,0 +1,4769 @@
+# Danish localization for WebCit
+# Copyright (C) 2006 - 2009 The Citadel Project - http://www.citadel.org
+# This file is distributed under GPL v3
+# Flemming Veggerby <fveggerby@dbmail.dk> 2008 - 2009
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2010-10-22 14:46+0000\n"
+"Last-Translator: Flemming Veggerby <Unknown>\n"
+"Language-Team: Danish <da@li.org>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2010-10-23 04:47+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Slettet"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Ny Bruger"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Problem Bruger"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Lokal Bruger"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Netværk Bruger"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Foretrukken Bruger"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Systemansvarlig"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "En fejl er opstået"
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Validér nye brugere"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Ingen brugere kræver validering på dette tidspunkt."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "meget svag"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "svag"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "ok"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "stærk"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Aktuelt brugerniveau: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Vælg brugerniveau for denne bruger:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Afbrudt.  Adgangskode blev ikke ændret."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Adgangskoder matcher ikke.  Adgangskode blev ikke ændret."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Blanke adgangskoder er ikke tilladt."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "tilgængelighed ukendt"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "fri"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "OPTAGET"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Møde invitaion"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Deltagers svar på din invitation"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Publiseret aftale"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Dette er en ukendt type kalender emne."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Summering:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Lokation:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Dato:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Start dato/tid:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Slut dato/tid:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Beskrivelse:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Gentagelse"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Dette er en gentagende aftale"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Deltager:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Dette er en opdatering af '%s' som allerede er i din kalender."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr "Denne aftale vil konflikte med '%s* som allerede er i din kalender."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Opdatering:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "KONFLIKT:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Hvordan vil du svare på denne invitation?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Acceptér"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Foreløbig"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Afvis"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Klik <i>Opdatér<i> for at acceptere dette svar og opdatere din kalender."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Opdatér"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignorér"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Der opstod en fejl ved behandling af dette emne."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+"Du har accepteret denne mødeinvitation.  Det er blevet tilføjet i din "
+"kalender."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Du har foreløbigt accepteret denne mødeinvitation.  Det er blevet tilføjet i "
+"din kalender 'med blyant'"
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Du har afvist denne mødeinvitation.  Det er <b>ikke</b> blevet tilføjet i "
+"din kalender."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Et svar er blevet sendt til mødeorganisatoren."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Din kalender er opdateret til at reflektere denne S.U."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"Du har valgt at ignorere denne S.U. Din kalender er <b>ikke</b> blevet "
+"opdateret."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Kalender dag visning begynder:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Kalender dag visning slutter:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Ugen starter:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Time: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minut: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(status ukendt)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(behøver aktion)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(accepteret)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(afvist)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(foreløbig)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(delegeret)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(færdig)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(igang)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(ingen)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Noter:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Uge"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Timer"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Emne"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Start"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Slut"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Hele dagen aftale"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Igangværende aftale"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "sekunder"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr "dage"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr "aldrig"
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr "tredie"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "fjerde"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "femte"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Aftale"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Deltagere"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Tilføj eller editér en aftale"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Summering"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Lokation"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Noter"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organisator"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(du er organisator)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Vis tid som:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Fri"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Optaget"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(Én per linie)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Kontaktpersoner"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Gentages hver"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "på disse ugedage"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "på den %s%d%s dag i måneden"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "i måneden"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "hver "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "år på denne dato"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "af"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Gentagelsesområde"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Gentag denne aftale indtil "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Gem"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Slet"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Check deltager tilgænglighed"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Afbryd"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Time format"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Upload er blevet afbrudt."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Du uploadede ikke en fil."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "dit billede"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "ikonet for dette rum"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "Velkomstbillede ved login"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "Logaf banner billede"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "realloc() fejl! kunne ikke modtage %d bytes: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Invalid Parameter"
+
+#: ../../inetconf.c:128
+#, fuzzy
+msgid " has been deleted."
+msgstr "%s er blevet slettet."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Højere tilladelse er krævet for at bruge denne funktion."
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+#, fuzzy
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "Skriv det Brugernavn du gerne vil have."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(intet emne)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "FEJL:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Afbrudt.  Meddelelse ikke opsat."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Automatisk afbrudt fordi du har allerede gemt denne meddelelse."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Meddelelse er blevet sendt.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Meddelelse er blevet opsat.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Meddelelsen blev ikke flyttet."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "En fejl opstod under hentning af denne del: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Tilføj signatur til meddelelser?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Brug denne signatur"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Standard karaktérsæt for email headers:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Vist navn på opslagstavle posteringer"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Postkasse visning"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Klik på en note for at ændre den."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Tilret konto/OpenID associationer"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Tilføj et OpenID: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s tillader ikke autentifikation via OpenID"
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Send popup meddelelse"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Sedn popup meddelelse til: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Skriv meddelelsestekst:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Send meddelelse"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Meddelelse blev ikke sendt."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Meddelelse blev sendt til "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Afbrudt. Ingen indstillinger blev ændret."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Gør dette til min startside"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Du har ikke længere en startside."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Afbrudt.  Ændringer blev ikke gemt."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Dine ændringer er blevet gemt."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Bruger %s blev sparket ud af rum %s."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Bruger %s blev inviteret til rum %s."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Afbrudt.  Intet nyt rum blev oprettet."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Etage er blevet slettet."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Ny etage er oprettet."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Rum liste visning"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Vis tomme etager"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "filer"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Opslagstavle"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Post Mappe"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Adressebog"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Kalender"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Opgave Liste"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Note Liste"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Kalender Liste"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Journal"
+
+#: ../../roomviews.c:60
+#, fuzzy
+msgid "Drafts"
+msgstr "Dato"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Denne server har allerede det maximale antal brugere logget ind og kan ikke "
+"acceptere flere lige nu. Prøv igen senere eller kontakt din System "
+"administrator."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Du er forbundet til en Citadel server der kører Citadel %d.%02d. \n"
+"For at køre denne version af WebCit skal du have Citadel %d.%02d eller "
+"nyere.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Din system konfiguration er blevet opdateret"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Ingen)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Ingenting)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Afbrudt.  %s blev ikke gemt."
+
+#: ../../sysmsgs.c:53
+#, fuzzy
+msgid " has been saved."
+msgstr "%s er blevet gemt."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Rum info"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Din bio"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Navn på opgave"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Forfaldsdato"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Kategori"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Vis Alle"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Editér opgave"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Start dato:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr ""
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "eller"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Forfald dato:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr ""
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Kategori:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"En fejl opstod ved forsøg på at oprette eller editére dette adressebogsemne."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Ændringer blev ikke gemt."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "En ny bruger blev oprettet."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"Du forsøger at opretter en ny bruger i Citadel mens den kører i værtsbaseret "
+"autentifikation. I denne konfiguration, skal du oprette nye brugere på værts-"
+"systemet, ikke i Citadel."
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Kunne ikke dekode vcard foto\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Fejl"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(intet navn)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "editér"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Godkendelse Krævet"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"Resourcen som du forespurgte kræver et brugernavn og en adgangskode. Du "
+"kunne ikke blive logged ind: %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Dette program kunne ikke tilslutte eller forblive tilsluttet til Citadel "
+"serveren.  KOntakt din Systemadministrator."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Læs mere..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' er ikke et Wiki rum."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Dato"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Skriv en server kommando"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Denne skærm tillader dig at skrive Citadel server kommandoer som ikke er "
+"muligt med WebCit.  Hvis du ikke ved hvad det betyder, så er dette ikke "
+"stedt for dig."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Skriv kommando:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Kommando input (if requesting SEND_LISTING transfer mode):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+#, fuzzy
+msgid "Detected host header is "
+msgstr "Detekteret vært header er %s://%s"
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Server kommando resultater"
+
+#: ../../static/t/aide/display_generic_result.html:18
+#, fuzzy
+msgid "Enter another command"
+msgstr "Skriv en server kommando"
+
+#: ../../static/t/aide/display_generic_result.html:19
+#, fuzzy
+msgid "Return to menu"
+msgstr "skift til menu"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Netværk konfiguration"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Tilføj en ny node"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Konfigurede noder"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "System Administration Menu"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+#, fuzzy
+msgid "Room Admin Menu"
+msgstr "Rum Systemansvarlig Menu"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Lokal vært aliaser"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Smart værter"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "RBL værter"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "SpamAssassin værter"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr "ClamAV clamd værter"
+
+#: ../../static/t/aide/display_inetconf.html:23
+#, fuzzy
+msgid "Masqueradable domains"
+msgstr "Maskerade domæner"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Global Konfiguration"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Bruger konto administration"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "Luk Citadel"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Rum og Etager"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+#, fuzzy
+msgid "Restart Citadel"
+msgstr "Gør dette til min startside"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+#, fuzzy
+msgid "Message to your Users:"
+msgstr "Meddelelse til dine brugere:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Site konfiguration"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr "Du skal være Sytemansvarlig for at se dette."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "Generelt"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+#, fuzzy
+msgid "Push Email"
+msgstr "Skub Email"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Index/Journal"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Adgang"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+#, fuzzy
+msgid "Directory"
+msgstr "katalog"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Auto-tømmer"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"For at oprette en ny brugerkonto, skriv det ønskede navn i boksen nedenfor "
+"og klik 'Opret'."
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Ny bruger: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"For at editére en eksisterende brugerkonto, vælg et brugernavn fra listen og "
+"klik 'Editér'."
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Editér bruger konto "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Brugernavn"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Adgangskode"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Tilladelse til at sende Internet Mail"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Pimær Internet Email adresse"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Internet Email aliasser"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Antal gange logget på"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Meddelelser sendt"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Bruger type"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "Bruger ID nummer"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Dato og tid for sidste login"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Auto-slet efter så mange dage"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Editér eller slet brugere"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Tilføj brugere"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Editér eller slet brugere"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Tilføj, ret, slet etager"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Node navn"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Delt kodeord"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Vært eller IP adresse"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Port nummer"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Godkend sletning"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Er du sikker på du vil slette? "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Nej"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+#, fuzzy
+msgid "(Edit)"
+msgstr "(editér)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Slet)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(domæner som denne vært modtager post for)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+#, fuzzy
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(værter som kører ClamAV clamd service"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(domæner mappet med Global Adressebog"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "(Domæner som brugere må benytte som maskerade)"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(værter som har en Realtime Blackhole List"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr "(hvis tilgænglig, videresend alt udgående post til en af disse værter)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(værter som kører SpamAssassin service)"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Genstart Nu"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "Genstart efter brugere har fået besked"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "Genstart når alle brugere er inaktive"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "Vent mens Citadel server genstarter"
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+"Vent mens dine brugere får besked, Citadel serveren derefter genstarte..."
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Adgangskontrol og site politik indstillinger"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Tillad ansvarlige at zappe (glemme) rum"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Sæt meddelelser fra problem brugere i karantæne"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Navn på karantæne rum"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Navn på rum for log sider"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr "Autosisations måde"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr "Indeholder"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr "Host navn"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+#, fuzzy
+msgid "Allow anonymous guest access"
+msgstr "Ingen anonyme meddelser"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Adgangsrettighed for nye brugere"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Adgangsrettighed krævet for at oprette rum"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+"Giv automatisk rum-ansvarlig status til den bruger der opretter private rum"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+#, fuzzy
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+"Giv automatisk rum-ansvarlig status til den bruger der opretter BLOG rum"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Blokér adgang til Internet Email"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Slå selvservice brugeroprettelse fra"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "Kræv registrering af nye brugere"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Konfigurér automatisk udløb af meddelser"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr "Disse indstillinger kan blive overskrevet på etage eller rum niveau."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Tid for at køre database auto-tøm"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "Standard meddelelse udløb for offentlige rum"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Aldrig automatisk sætte meddelelse til udløbet"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Sæt udløb efter meddelelsesantal"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Sæt udløb efter meddelelsesalder"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Antal meddelelser eller dage: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr "Standard meddelelse udløb for private postkasser"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Samme politik som for offentlige rum"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Standard bruger tøm tid (dage)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Standard rum tøm tid (dage)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Konfigurér LDAP forbindelse for Citadel"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"Ændringer på denne skærm vil ikke blive effektueret før du har genstartet "
+"Citadel serveren."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"NOTE: Denne Citadel server er blevet installeret uden support af LDAP. Disse "
+"indstillinger vil ikke have nogen betydning."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Navn på LDAP server (blank for at slå fra)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Port nummer op LDAP server (blank for at slå fra)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "Base DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "Forbind DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Adgangskode for forbind DN"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "Generelle site konfigurationsemner"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "Skift Login Logo"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "Skift Logout Logo"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Fuld kvalificeret domæne navn"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Meneskelæseligt node navn"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Telefon nummer"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Paginator prompt (for tekst klienter)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Geografisk lokation af dette system"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Navn på Systemadministror"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Standard tidszone til Kalender aftaler ikke i zone"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "IMAP lytte port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "IMAP over SSL port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr "Behold originale headere i IMAP"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Index og Journal"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Advarsel: disse faciliteter er resourcekrævende."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Slå fuld tekst index til"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "Brug journal på Email meddelelser"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "Brug journal på ikke-Email meddelelser"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "Email destination på journaliserede meddelelser"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "POP3 lytte port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "POP3 over SSL port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+#, fuzzy
+msgid "POP3 fetch frequency in seconds"
+msgstr "POP3 hent frekvens i sekunder"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+#, fuzzy
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "POP3 hurtigste hent frekvens i sekunder"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+#, fuzzy
+msgid "Funambol server host (blank to disable)"
+msgstr "Funambol server vært (blank for at slå fra)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "Funambol server port"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "Funambol synkronisering kilde"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "Funambol autorisation detaljer (bruger:adgangskode)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+#, fuzzy
+msgid "External pager tool (blank to disable)"
+msgstr "Extern pager værktøj (blank for at slå fra)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Netværk service"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "Serverens IP adresse (0.0.0.0 vælger alle)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+#, fuzzy
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "XMPP (Jabber) klient til server port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+#, fuzzy
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "XMPP (Jabber) server til server port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "POP3 lytte port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "POP3 lytte port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Avanceret server finindstilling kontroller"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Maximum meddelelse længde"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Server forbindelse inaktivitetstimeout (i sekunder)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "Netværk kør frekvens (i sekunder)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Maximum antal samtidige sessioner (0 = ingen max)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Minimum antal arbejdstråde"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Maximum antal arbejdstråde"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Automatisk slet commited database logs"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "SMTP MTA port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "SMTP MSA port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTP over SSL port (-1 = afbrudt)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr "Udfør RBL check ved forbindelse i stedet for efter RCPT"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "Markér meddelse som spam, istedet for at afvise den"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+#, fuzzy
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr "Tillad uautoriserede SMTP klienter at benytte denne site's domæne"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "Ret falske Fra: linier under autentification SMTP"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr "Postfix TCP Dictionary Port"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+#, fuzzy
+msgid "-1 to disable"
+msgstr "-1 for at deaktivere."
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+#, fuzzy
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "ManageSieve port (-1 = afbrudt)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Tilføj, ret, slet bruger konti"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Editér site konfiguration"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Domænenavne og Internet post konfiguration"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Internet Email aliasser"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "Vis udgående SMTP kø"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Log af"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Almindelige kommandoer"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Din information"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Avancerede rum kommandoer"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Opslå meddelelse"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Vedhæftede filer"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "Til:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "CC:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "BCC:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Emne (valgfrit):"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Emne:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- videresendt meddelelse ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Luk vinduet"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Vedhæft fil"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+#, fuzzy
+msgid "Remove"
+msgstr "(fjern)"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Filer til download i"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Størrelse"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Upload billede"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Vælg en fil til upload:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Lysbilledshow"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Tilføj/ændre/slette etager"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Etage nummer"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Etage navn"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Antal rum"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "Etage CSS"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(slet etage)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Du skal være logget ind for at se denne side."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Adgangskode"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Sidste login"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Ny bruger? Tilmeld dig nu"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+"indtast det navn og adgangskode du vil benytte. og klik &quot;Ny Bruger."
+"&quot; "
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Log ind med OpenID"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+#, fuzzy
+msgid "Log in using Google"
+msgstr "Log ind med OpenID"
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Log ind med OpenID"
+
+#: ../../static/t/get_logged_in.html:100
+#, fuzzy
+msgid "Log in using AOL or AIM"
+msgstr "Log ind med OpenID"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "Vent"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Dette er en opdatering af '%s' som allerede er i din kalender."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr "Denne aftale vil konflikte med '%s* som allerede er i din kalender."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Sprog"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Post"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Opgaver"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Rum"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Chat"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Avanceret"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Administration"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "personliggør denne menu"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "skift til rum listen"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "skift til menu"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Personliggør denne ikonbjælke"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Vis ikoner som:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "billeder og tekst"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "kun billeder"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "kun tekst"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Vælg de ikoner som vil have vist i 'ikonbjælke' menuen i den venstre side af "
+"skærmen."
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Site logo"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Et ikon der beskriver denne site"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Din summeringsside"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Post (indbakke)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "En genvej til din indbakke"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Din personlige adressebog"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Dine personlige noter"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "En genvej til din personlige kalender"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "En genvej til din personlige opgave liste"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Klik på dette ikon for at vise en liste med alle tilgængelige rum. (eller "
+"foldere)"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Hvem er online?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+"KLik på dette ikon for at vise en liste med alle brugere der er logget ind."
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Klik på dette ikon for at starte chat med andre brugere i det samme rum."
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Avancerede indstillinger"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Adgang til den komplette menu med Citadel funktioner."
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Citadel logo"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Viser 'Powered by Citadel' ikon"
+
+#: ../../static/t/iconbar/save.html:11
+#, fuzzy
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"Din ikonbjælke er blevet opdateret.  Vælg en af mulighederne for at "
+"fortsætte."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Vis Listeabonnementer"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Abonnér/slet abonnement"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Godkendelsesforespørgsel sendt"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+#, fuzzy
+msgid " to the "
+msgstr "Gå dertil"
+
+#: ../../static/t/listsub/display.html:21
+#, fuzzy
+msgid " mailing list."
+msgstr "Mailing liste service"
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Tilbage..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+#, fuzzy
+msgid "ERROR"
+msgstr "FEJL:"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+#, fuzzy
+msgid "from the"
+msgstr "fra "
+
+#: ../../static/t/listsub/display.html:42
+#, fuzzy
+msgid "mailing list."
+msgstr "Mailing liste service"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+#, fuzzy
+msgid "Back..."
+msgstr "Tilbage..."
+
+#: ../../static/t/listsub/display.html:57
+#, fuzzy
+msgid "Confirmation successful!"
+msgstr "Godkendelsesforespørgsel sendt"
+
+#: ../../static/t/listsub/display.html:59
+#, fuzzy
+msgid "Confirmation failed."
+msgstr "Konfiguration"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Navn på opgave"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Din personlige adressebog"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "Skriv meddelelsestekst:"
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "Time format"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+#, fuzzy
+msgid "Logged in as"
+msgstr "Sidste login"
+
+#: ../../static/t/loggedinas.html:6
+#, fuzzy
+msgid "Not logged in."
+msgstr "Ikke logget ind"
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "powered by"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Log på igen"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Editér eller slet dette rum"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Gå til et 'skjult' rum"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Opret et nyt rum"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Opret et nyt rum"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+#, fuzzy
+msgid "Zap (forget) this room"
+msgstr "Zap (glem) dette rum (%s)"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Vis alle glemte rum"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Læs nye meddelelser"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Vist kendte rum"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Hvor kan jeg komme hen?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Gå til næste rum"
+
+#: ../../static/t/menu/basic_commands.html:4
+#, fuzzy
+msgid "...with <em>unread</em> messages"
+msgstr "...med <em>ikke læste</em> meddelelser"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Fortsæt til næste rum"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(kom tilbage hertil senere)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Gå tilbage"
+
+#: ../../static/t/menu/basic_commands.html:6
+#, fuzzy
+msgid "oops! Back to "
+msgstr "(Hovsa! Tilbage til )"
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Læs nye meddelelser"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "...i dette rum"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Læs alle meddelelser"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "...gamle <em>og</em> nye"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Skriv en meddelelse"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(opret i dette rum)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "Fil bibliotek"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(Vis filer som du kan downloade)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Summerings side"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Summering af min konto"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Bruger liste"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(alle registrerede brugere)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Farvel!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Skift din adgangskode"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Skriv ny adgangskode:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Skriv adgangskode igen:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Ændre dine præferencer og indstillinger"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Opdatér din kontakt information"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Indtast din 'bio'"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Editér dit online foto"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Vis/Editér server post filtre"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "Editér dine skub email indstillinger"
+
+#: ../../static/t/menu/your_info.html:9
+#, fuzzy
+msgid "Manage your OpenIDs"
+msgstr "Skift din adgangskode"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Godkend flytning af meddelelse"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Flyt denne meddelelse til:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Læser #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "ældste til nyeste"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "nyeste til ældste"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Afsender"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Henter meddelser fra server, vent venligst"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Åbn i nyt vindue"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Flyt"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Kopiér"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Udskriv"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Vis Kontaktpersoner"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Tilføj ny kontaktperson"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Dag visning"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Måned visning"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Tilføj ny aftale"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Kalender liste"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Vis opgaver"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Tilføj ny opgave"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Vis noter"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Tilføj ny note"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Opret en meddelelse"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Wiki hjem"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Editér denne side"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "nyere stillinger"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Skip dette rum"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Skriv det Brugernavn du gerne vil have."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Præferencer og indstillinger"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Træ (bibliotek) visning"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Tabel (rum) visning"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 timer (am/pm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 timer"
+
+#: ../../static/t/prefs/box.html:150
+#, fuzzy
+msgid "Sunday"
+msgstr "Søndag"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Mandag"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Ingen signatur"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "Fuld funktionalitet"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Sikker kørsel"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+#, fuzzy
+msgid "Configure Push Email"
+msgstr "Skub Email"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "Skub email og SMS indstillinger"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+#, fuzzy
+msgid "Notify Funambol server"
+msgstr "Funambol server port"
+
+#: ../../static/t/prefs/pushemail.html:31
+#, fuzzy
+msgid "Send a text message to..."
+msgstr "Sedn popup meddelelse til:"
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Navn på rum"
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Ligger på etage: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Standard visning for rum: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Type på rum"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Offentlig (automatisk vist til alle)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privat - skjult (adgang for dem der kender navnet)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privat - med adgangskode: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privat - kun med invitation"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Personlig (postkasse kun for dig)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Opret et nyt rum"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Navn på rum"
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Standard visning for rum: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Type på rum"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Editér dette rums Info fil"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"Tekst er formatteret til læserens skærmbredde. For at overvinde "
+"formatteringen, indfør en linie mindst et mellemrum."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Gå til et skjult rum"
+
+#: ../../static/t/room/display_private.html:8
+#, fuzzy
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Hvis du kender navnet på et skjult (gæt-navn) eller adgangsbeskyttet rum, "
+"kan du gå til rummet ved at skrive navnet nedenfor.  Når du får adgang til "
+"et privat rum, vil det optræde på din almindelige rum liste så du ikke "
+"behøver at komme her igen."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Skriv rummets navn:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Skriv rummets adgangskode:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Konfiguration"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Meddelelse udløbspolitik"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Adgangskontrol"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Deling"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Mailing liste service"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Fjernhentning"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(fjern)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+#, fuzzy
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Brugerne nedenfor har adgang til dette rum.  For at fjerne en bruger fra "
+"adgangslisten, Vælg brugeren på listen og klik 'Spark'."
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Far at give en anden bruger adgang til dette rum, skriv brugernavnet i "
+"boksen nedenfor og klik 'Invitér'."
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Invitér:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+#, fuzzy
+msgid "Users"
+msgstr "Brugere"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Slet dette rum"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+#, fuzzy
+msgid "Set or change the icon for this rooms banner"
+msgstr "Sæt eller skift ikonet for dette rums banner"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+#, fuzzy
+msgid "Edit this rooms Info file"
+msgstr "Editér dette rums Info fil"
+
+#: ../../static/t/room/edit/tab_config.html:7
+#, fuzzy
+msgid "name of room: "
+msgstr "Navn på rum"
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Hvis privat, tving aktuelle brugere til at glemme rummet"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Kun foretrukne brugere"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Kun-læs rum"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "Alle brugere der kan skrive må også slette meddelser"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Fil bibliotek rum"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Biblioteksnavn: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "uploading tilladt"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Downloading tilladt"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Gem meddelelser på server?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Synligt bibliotek"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Netværksdelt rum"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanent (bliver ikke autoslettet)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "Emne er krævet (Tving brugere til at skrive et emne)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Anonyme meddelelser"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Ingen anonyme meddelser"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Alle meddelelser er anonyme"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "spørg bruger som skriver meddelelser"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Rum Systemansvarlig"
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Meddelelse udløbspolitik for dette rum"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Brug standard politik for denne etage"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Meddelelse udløbspolitik for denne etage"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Brug system standard"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr "Modtag meddelelser fra disse POP konti og gem dem i dette rum:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+#, fuzzy
+msgid "Remote host"
+msgstr "Smart værter"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Bruger navn"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+#, fuzzy
+msgid "Keep messages on server?"
+msgstr "Gem meddelelser på server?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+#, fuzzy
+msgid "Interval"
+msgstr "Interval"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Hent de følgende RSS feeds og gem dem i dette rum:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "Feed URL"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>Indholdet af dette rum bliver sendt <b>som individuelle meddelelser</b> "
+"til denne liste af modtagere:</i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>Indholdet af dette rum bliver sendt <b>i oversigtsform</b> til den "
+"følgende liste af modtagere:</i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Tilføj modtagere fra Kontakter eller andre adressebøger"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "Tillad ikkeabonenter at skrive til dette rum."
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "Rum opslag publificering kræver tilladelse fra Systemansvarlig."
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+#, fuzzy
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+"Dette rum er konfigureret til at tillade selvbetjent abonement/slet "
+"abonement forspørgsler."
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "URL'en for abonement/slet abonement er:"
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Ikke delt med"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Delt med"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Fjernnode navn"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Fjernrum navn"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Aktioner"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"Når et rum blever delt, skal det deles fra begge ender.  Tilføj en node til "
+"'delt' liste sender meddelelser ud, men for at modtage meddelelser, må de "
+"andre noder være konfigureret til at sende meddelelser ud til dit system "
+"også. <LI>Hvis fjernrum navn er blank, er det underforstået at rum navnet er "
+"identisk på fjern noden.<LI>Hvis fjern rum navnet er forskellig, må fjern "
+"noden også konfigurere navnet på rummet her.</UL></I><br>\n"
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Rum info"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Zap (glem/abonementfjern) det aktuelle rum"
+
+#: ../../static/t/room/zap_this.html:6
+#, fuzzy
+msgid "If you select this option,"
+msgstr "Editér eller slet dette rum"
+
+#: ../../static/t/room/zap_this.html:8
+#, fuzzy
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+"Hvis du vælger denne funktion, <em>%s</em> vil forsvinde fra din rum liste.  "
+"Er det hvad du gerne vil?<br>\n"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Zapped (glemte) rum"
+
+#: ../../static/t/room/zapped_list.html:10
+#, fuzzy
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Klik på et rum for at af-zappe det og gå til rummet.\n"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Alle"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Retunér til script editéring"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Hvis"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Til eller Cc"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Konvolut Fra"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Konvolut Til"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-Flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Status"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "indeholder ikke"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "er"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "matcher ikke"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "er større end"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "er mindre end"
+
+#: ../../static/t/sieve/display_one.html:59
+#, fuzzy
+msgid "bytes"
+msgstr "Noter"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Behold"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Fjern"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "og"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "stop"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Når ny post ankommer: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Filter er som regler valgt nedenfor"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Gem den i min indbakke uden filtrering"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr "Filtrér det gennem manuelt editéret script (avancerede brugere)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"Denne installation af Citadel blev lavet uden support af server post "
+"filtrering.<br>Kontakt din Systemadministrator hvis du skal bruge denne "
+"funktion.<br>"
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+#, fuzzy
+msgid "Summary page for "
+msgstr "Summeringsside for %s"
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Meddelelser"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Idag&nbsp;i&nbsp;din&nbsp;kalender"
+
+#: ../../static/t/summary/page.html:51
+#, fuzzy
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Hvem er&nbsp;online&nbsp;nu"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Om&nbsp;denne&nbsp;server"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+#, fuzzy
+msgid "running"
+msgstr "Tuning"
+
+#: ../../static/t/summary/page.html:65
+#, fuzzy
+msgid "with"
+msgstr "femte"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+#, fuzzy
+msgid "and located in"
+msgstr "og"
+
+#: ../../static/t/summary/page.html:68
+#, fuzzy
+msgid "Your system administrator is"
+msgstr "Navn på Systemadministror"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Indtast din 'bio'"
+
+#: ../../static/t/user/list.html:3
+#, fuzzy
+msgid "User list for "
+msgstr "Bruger liste for %s"
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Bruger navn"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Nummer"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Bruger type"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Sidste login"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Total antal login"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Totale antal meddelelser"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Bruger profil"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+#, fuzzy
+msgid "Click here to send an instant message to"
+msgstr "Klik her for at sende online meddelelse til %s"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Editér kontakt information"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Præfix"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Fornavn"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Mellemnavn"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Efternavn"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Tilføjelse"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Vist navn:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Titel:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organisation:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Postbox:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Adresse:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "By:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Stat:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Postnummer:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Land:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Hjemmetelefon:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Arbejdstelefon:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Denne adressebog er tom."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Skriv en kommentar"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "nyere stillinger"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "ældre indlæg"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "Send kommando"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "Du har ikke lov til at se denne resource."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Smart værter"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Stat:"
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+#, fuzzy
+msgid "Next attempt"
+msgstr "Sidste forsøg"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Modtagere"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "fra "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Svar"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "SvarCitér"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "SvarAlle"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Videresend"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Headers"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "Vis"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Download"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Vis som:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+#, fuzzy
+msgid "Click on a name to read user info.  Click on"
+msgstr "Klik på et navn for at læse bruger info.  Klik på "
+
+#: ../../static/t/who.html:24
+#, fuzzy
+msgid "to send an instant message to that user."
+msgstr "for at sende popup meddelelse til den bruger"
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(dræb)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Rum"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "Fra host"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Editér din session visning"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Her kan do bestemme hvordan din session bliver vist i 'Hvem er online' "
+"listen. For at fjerne et 'falsk' navn du tidligere har sat, bare klik den "
+"tilhørende 'skift' knap uden at skrive noget i boksen. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Rum navn:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Host navn:"
+
+#: ../../static/t/who/list_static_header.html:1
+#, fuzzy
+msgid "Users currently on"
+msgstr "Brugere i øjeblikket på"
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr "Editér konfiguration"
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr "Editér adressebogsemne"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Gå dertil"
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Vælg 'Editér denne side' link i rum banneret hvis du gerne vil oprette denne "
+"side."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Der er ikke nogen side her der hedder '%s'"
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#~ msgid "the icon for this floor"
+#~ msgstr "ikonet for denne etage"
+
+#~ msgid "Edit %s"
+#~ msgstr "Editér %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Gem ændringer"
+
+#~ msgid " (work)"
+#~ msgstr " (arbejde)"
+
+#~ msgid " (home)"
+#~ msgstr " (hjem)"
+
+#~ msgid " (cell)"
+#~ msgstr " (afdeling)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefon:"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Directory domæner"
+
+#, fuzzy
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Smart værter"
+
+#~ msgid "Create new room"
+#~ msgstr "Opret nyt rum"
+
+#~ msgid "Zap this room"
+#~ msgstr "Zap dette rum"
+
+#~ msgid ""
+#~ "You have one or more instant messages waiting, but the Citadel Instant "
+#~ "Messenger window failed to open.  This is probably because you have a "
+#~ "popup blocker installed.  Please configure your popup blocker to allow "
+#~ "popups from this site if you wish to receive instant messages."
+#~ msgstr ""
+#~ "Du har en eller flere popup meddelelser ventende, men Citadel Instant "
+#~ "Messenger vinduet kunne ikke åbnes.  Det er måske fordi du har en popup "
+#~ "blocker installeret.  Konfigurér din popup blocker til at tillade popups "
+#~ "fra denne site hvis du vil have popup meddelelser."
+
+#~ msgid "Change"
+#~ msgstr "Ret"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Netværksdelt rum"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Tilføj node"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "Minutter"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Foreløbig"
+
+#~ msgid "Send"
+#~ msgstr "Send"
+
+#~ msgid "Delete this message?"
+#~ msgstr "Slet denne meddelelse?"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Rum info"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "Billeder i"
+
+#~ msgid "Exit"
+#~ msgstr "Afslut"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "uploading tilladt"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Er du sikker på du vil slette? "
+
+#~ msgid "Upload"
+#~ msgstr "Upload"
+
+#~ msgid "Add"
+#~ msgstr "Tilføj"
+
+#~ msgid "Create"
+#~ msgstr "Opret"
+
+#~ msgid "Kick"
+#~ msgstr "Spark"
+
+#~ msgid "Invite"
+#~ msgstr "Invitér"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Bruger"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Adressebog"
+
+#~ msgid "Delete user"
+#~ msgstr "Slet bruger"
+
+#~ msgid "Delete this user?"
+#~ msgstr "Slet denne bruger?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Slet regel"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "Din indkomne post vil ikke blive filtreret gennem scripts."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "Det aktive script er: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Konfigurér replikéring med andre Citadel servere"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Viser 'Powered by Citadel' ikon"
+
+#~ msgid "Go to your email inbox"
+#~ msgstr "Gå til din indbakke"
+
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Gå til din personlige kalender"
+
+#~ msgid "Go to your personal address book"
+#~ msgstr "Gå til din personlige adressebog"
+
+#~ msgid "Go to your personal notes"
+#~ msgstr "Gå til dine personlige noter"
+
+#~ msgid "Go to your personal task list"
+#~ msgstr "Gå til din personlige opgave liste"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Vis alle dine tilgængelige rum"
+
+#~ msgid "See who is online right now"
+#~ msgstr "Se hvem der er online lige nu"
+
+#~ msgid ""
+#~ "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+#~ msgstr ""
+#~ "Avanceret Menu: Avancerede Rum kommandoer, Konto Information og Chat"
+
+#~ msgid "Room and system administration functions"
+#~ msgstr "Rum og systemadministration funktioner"
+
+#~ msgid "Reset form"
+#~ msgstr "Slet form"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Slet denne note?"
+
+#~ msgid "Create new floor"
+#~ msgstr "Opret ny etage"
+
+#~ msgid "Move rule up"
+#~ msgstr "Flyt regel op"
+
+#~ msgid "Move rule down"
+#~ msgstr "Flyt regel ned"
+
+#, fuzzy
+#~ msgid "Delete rule"
+#~ msgstr "Slet bruger"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(editér grafik)"
+
+#~ msgid "Change name"
+#~ msgstr "Skift navn"
+
+#~ msgid "Change CSS"
+#~ msgstr "Skift CSS"
+
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Er du sikker på du vil slette dette rum?"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Skriv kommando:"
+
+#~ msgid "Unshare"
+#~ msgstr "Fjern deling"
+
+#, fuzzy
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "Master brugernavn (blank for at slå fra)"
+
+#, fuzzy
+#~ msgid "Master user password"
+#~ msgstr "Master bruger adgangskode:"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "Slet denne note?"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "Liste"
+
+#~ msgid "Digest"
+#~ msgstr "Oversigt"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Emne"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Vil du virkelig dræbe denne session?"
+
+#~ msgid "Share"
+#~ msgstr "Deling"
+
+#~ msgid "Change password"
+#~ msgstr "Skift adgangskode"
+
+#~ msgid "Change room name"
+#~ msgstr "Skift rum navn"
+
+#~ msgid "Change host name"
+#~ msgstr "Skift host navn"
+
+#~ msgid "Change user name"
+#~ msgstr "Skift brugernavn"
+
+#~ msgid ""
+#~ "Leave all messages marked as unread, go to next room with unread messages"
+#~ msgstr ""
+#~ "Efterlad alle meddelelser som ulæste, gå til næste rum med ulæste "
+#~ "meddelelser"
+
+#~ msgid "Mark all messages as read, go to next room with unread messages"
+#~ msgstr ""
+#~ "Markér alle meddelelser som læst, gå til næste rum med ulæste meddelelser"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Gem ændringer"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Du abonnérer <TT>%s</TT> på <b>%s</b> post listen.  Listeserveren har "
+#~ "sendt dig en e-mail med et link som du skal klikke på for at godkende dit "
+#~ "abonnement.  Denne ekstra foranstaltning er din beskyttelse, da det "
+#~ "forhindrer andre i at abonnere på en liste i dit navn uden din billigelse."
+#~ "<br><br>Klik på linketsom er blevet sendt til dig for at acceptere dit "
+#~ "abonnement.<br>\n"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Der er ikke noget rum der hedder '%s'."
+
+#~ msgid "Network"
+#~ msgstr "Netværk"
+
+#~ msgid "Tuning"
+#~ msgstr "Tuning"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Fjern slettede meddelelser med det samme i IMAP"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Et script med dette navn eksisterer allerede."
+
+#~ msgid ""
+#~ "A new script has been created.  Return to the script editing screen to "
+#~ "edit and activate it."
+#~ msgstr ""
+#~ "Et nyt script er blevet oprettet.  Returnér til script editéring for at "
+#~ "rette og aktivere det."
+
+#~ msgid ""
+#~ "You are connected to %s, running %s with %s, server build %s and located "
+#~ "in %s.  Your system administrator is %s."
+#~ msgstr ""
+#~ "Du er forbundet til %s, bruger %s med %s, server version %s og "
+#~ "lokaliseret i %s.  Din systemadministrator er %s."
+
+#, fuzzy
+#~ msgid "Yes with users list"
+#~ msgstr "Ja med brugerlisten"
+
+#~ msgid "Room list"
+#~ msgstr "Rum liste"
+
+#, fuzzy
+#~ msgid "text"
+#~ msgstr "kun tekst"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "(intet navn)"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Adgangskode"
+
+#, fuzzy
+#~ msgid "pass"
+#~ msgstr "Opgaver"
+
+#, fuzzy
+#~ msgid "display: none"
+#~ msgstr "Vist navn:"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Din adgangskode blev ikke accepteret."
+
+#~ msgid "If you already have an account on"
+#~ msgstr "Hvis du allerede har en konto på"
+
+#~ msgid "enter your user name and password and click &quot;Log in.&quot;"
+#~ msgstr "indtast dit brugernavn og klik &quot;Log in.&quot;"
+
+#~ msgid "Please log off properly when finished. "
+#~ msgstr "Log af ordentligt når du er færdig. "
+
+#~ msgid "recommended browser list"
+#~ msgstr "anbefalet browser liste"
+
+#~ msgid ""
+#~ "if you have trouble using Webcit.</li> <li>You must have <i>cookies</i> "
+#~ "turned on. "
+#~ msgstr ""
+#~ "hvis du har problemer med Webcit.</li> <li>Du skal have <i>cookies</i> "
+#~ "slået til. "
+
+#~ msgid ""
+#~ "Also keep in mind that if your browser is configured to block pop-up "
+#~ "windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "Husk også at hvis din browser er sat til at blokere pop-ups, vil du ikke "
+#~ "være i stand til at modtage popup medelelser."
+
+#~ msgid "Log off now?"
+#~ msgstr "Log af nu?"
+
+#, fuzzy
+#~ msgid "%d new of %d messages%s"
+#~ msgstr "%d nye af %d meddelser%s"
+
+#~ msgid "(nothing)"
+#~ msgstr "(ingenting)"
+
+#~ msgid "unexpected end of message"
+#~ msgstr "uventet slut på meddelelse"
+
+#~ msgid "An error occurred while setting up the chat socket."
+#~ msgstr "En fejl opstod mens chat forbindelse blev opsat."
+
+#~ msgid "Now exiting chat mode."
+#~ msgstr "Afslutter nu Chat."
+
+#~ msgid "Help"
+#~ msgstr "Hjælp"
+
+#~ msgid "List users"
+#~ msgstr "Vis brugere"
+
+#~ msgid "No messages here."
+#~ msgstr "Ingen meddelelser her."
+
+#, fuzzy
+#~ msgid "no more messages"
+#~ msgstr "Anonyme meddelelser"
+
+#~ msgid ""
+#~ "Your icon bar has been updated.  Please select any of its choices to "
+#~ "continue.<br/><span style=\"font-weight: bold;\">You may need to force "
+#~ "refresh (SHIFT-F5) in order for changes to take effect</span>"
+#~ msgstr ""
+#~ "Din ikonbjælke er blevet opdateret.  Vælg en af mulighederne for at "
+#~ "fortsætte.<br/><span style=\"font-weight: bold;\">Du skal måske bruge "
+#~ "opdatér (SHIFT-F5) for at ændringerne træder i kraft</span>"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "Error retrieving RSS feed: couldn't find messages\n"
+#~ msgstr "Fejl ved hentning af RSS feed: kunne ikke finde meddelelser\n"
+
+#, fuzzy
+#~ msgid "%s from"
+#~ msgstr "%s fra"
+
+#, fuzzy
+#~ msgid "%s in %s"
+#~ msgstr "%s i %s"
+
+#~ msgid " on %s"
+#~ msgstr " på %s"
+
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, fuzzy
+#~ msgid ""
+#~ "<ul><li>Enter your OpenID URL and click &quot;Log in&quot;.<li><a href="
+#~ "\"http://www.citadel.org/doku.php/documentation:openid\">Click here to "
+#~ "learn what OpenID is and how Citadel is using it.</a><li>Please log off "
+#~ "properly when finished. <li>You must use a browser that supports "
+#~ "<i>frames</i> and <i>cookies</i>. <li>Also keep in mind that if your "
+#~ "browser is configured to block pop-up windows, you will not be able to "
+#~ "receive any instant messages.<br></ul>"
+#~ msgstr ""
+#~ "<ul><li><b>Hvis du allerede har en konto på %s</b>, skriv dit brugernavn "
+#~ "og adgangskode og klik &quot;Log på.&quot; <li><b>Hvis du er ny bruger</"
+#~ "b>, skriv det brugernavn og adgangskode du ønsker at bruge, og klik &quot;"
+#~ "Ny Bruger.&quot; <li>Log venligst af, når du er færdig. <li>Du skal bruge "
+#~ "en browser der supporterer <i>frames</i> og <i>cookies</i>. <li>Hvis din "
+#~ "browser er konfigureret til at blokere pop-up vinduer, vil du ikke være i "
+#~ "stand til at modtage online meddelelser.<br></ul>"
+
+#, fuzzy
+#~ msgid ""
+#~ "enter your user name and password and click &quot;Log in.&quot;<li><b>If "
+#~ "you are a new user</b>, enter the name and password you wish to use, and "
+#~ "click &quot;New User.&quot; <li>Please log off properly when finished. "
+#~ "<li>You must use a browser that supports <i>frames</i> and <i>cookies</"
+#~ "i>. <li>Also keep in mind that if your browser is configured to block pop-"
+#~ "up windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "<ul><li><b>Hvis du allerede har en konto på %s</b>, skriv dit brugernavn "
+#~ "og adgangskode og klik &quot;Log på.&quot; <li><b>Hvis du er ny bruger</"
+#~ "b>, skriv det brugernavn og adgangskode du ønsker at bruge, og klik &quot;"
+#~ "Ny Bruger.&quot; <li>Log venligst af, når du er færdig. <li>Du skal bruge "
+#~ "en browser der supporterer <i>frames</i> og <i>cookies</i>. <li>Hvis din "
+#~ "browser er konfigureret til at blokere pop-up vinduer, vil du ikke være i "
+#~ "stand til at modtage online meddelelser.<br></ul>"
+
+#~ msgid "Find out more about Citadel"
+#~ msgstr "Lær mere om Citadel"
+
+#~ msgid "CITADEL"
+#~ msgstr "CITADEL"
+
+#~ msgid "Customize this menu"
+#~ msgstr "Personliggør denne menu"
+
+#~ msgid "Internet configuration"
+#~ msgstr "Internet konfiguration"
+
+#~ msgid "of %d messages."
+#~ msgstr "af %d meddelelser."
+
+#~ msgid " <I>from</I> "
+#~ msgstr " <I>fra</I> "
+
+#~ msgid " <I>in</I> "
+#~ msgstr " <I>i</I> "
+
+#~ msgid "Edit node configuration for "
+#~ msgstr "Editér node konfiguration for "
+
+#~ msgid "ERROR: could not open template "
+#~ msgstr "FEJL: kunne ikke åbne skabelon"
+
+#~ msgid ""
+#~ "<I>This message contains calendaring/scheduling information, but support "
+#~ "for calendars is not available on this particular system.  Please ask "
+#~ "your system administrator to install a new version of the Citadel web "
+#~ "service with calendaring enabled.</I><br>\n"
+#~ msgstr ""
+#~ "<I>Denne meddelse indeholder kalender/skedulerings information, men "
+#~ "support for kalendere er ikke muligt på dette system.  Få din "
+#~ "systemadministrator til at installere en ny version af Citadel web "
+#~ "service med kalenderfunktion aktiveret.</I><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display calendar item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Kan ikke vise kalender emne.  Du ser denne fejl fordi WebCit service "
+#~ "er ikke installeret med kalenderfunktion.  Kontakt din "
+#~ "systemadministrator.</i><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display to-do item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Kan ikke vise opgave emne.  Du ser denne fejl fordi WebCit service er "
+#~ "ikke installeret med kalenderfunktion.  Kontakt din systemadministrator.</"
+#~ "i><br>\n"
+
+#~ msgid "Day: "
+#~ msgstr "Dag:"
+
+#~ msgid "Year: "
+#~ msgstr "År:"
+
+#~ msgid "The calendar view is not available."
+#~ msgstr "Kalender visning er ikke tilgængelig."
+
+#~ msgid "The tasks view is not available."
+#~ msgstr "Opgave visning er ikke tilgængelig."
+
+#~ msgid "Gateway domains"
+#~ msgstr "Gateway domæner"
+
+#~ msgid "(domains whose subdomains match Citadel hosts)"
+#~ msgstr "(domæner hvis underdomæner matcher Citadel værter"
+
+#~ msgid "(This server does not support task lists)"
+#~ msgstr "(Denne server supporterer ikke opgave lister)"
+
+#~ msgid "(This server does not support calendars)"
+#~ msgstr "(Denne server supporterer ikke kalendre)"
+
+#~ msgid ""
+#~ "This room is <i>not</i> configured to allow self-service subscribe/"
+#~ "unsubscribe requests."
+#~ msgstr ""
+#~ "Dette rum er <i>ikke</i> konfigureret til at tillade selvbetjent "
+#~ "abonement/sletabonemnet forspørgsler."
+
+#~ msgid "Click to enable."
+#~ msgstr "Klik for at aktivere."
+
+#~ msgid "Back to menu"
+#~ msgstr "Tilbage til menu"
+
+#~ msgid "Respond to meeting request"
+#~ msgstr "Svar på møde forspørgsel"
+
+#~ msgid "Update your calendar with this RSVP"
+#~ msgstr "Opdatér din kalender med denne S.U."
+
+#~ msgid "Public room"
+#~ msgstr "Offentlig rum"
+
+#~ msgid "Private - guess name"
+#~ msgstr "Privat - gæt navn"
+
+#~ msgid "Private - require password:"
+#~ msgstr "Privat - med adgangskode"
+
+#~ msgid "localhost"
+#~ msgstr "lokalvært"
+
+#~ msgid "gatewaydomain"
+#~ msgstr "gatewaydomæne"
+
+#~ msgid "rbl"
+#~ msgstr "rbl"
+
+#~ msgid "spamassassin"
+#~ msgstr "spamassassin"
+
+#~ msgid "[ close window ]"
+#~ msgstr "[ luk vindue ]"
diff --git a/webcit/po/webcit/de.po b/webcit/po/webcit/de.po
new file mode 100644 (file)
index 0000000..4514b8b
--- /dev/null
@@ -0,0 +1,4656 @@
+# translation of de.po to
+# Copyright (C) 2008 - 2009 The Citadel Project - http://www.citadel.org
+# Wilfried Gösgens <w.goesgens@outgesourced.org>, 2005 - 2009.
+# Stefan Kleinschmidt <stefan@waldstrasse.homeip.net>
+# Heiner Wohner
+# German localization
+# Copyright (C) 2005 - 2009 By Wilfried Gösgens
+# This file is distributed under the revised BSD license
+# "ä ö ü
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2013-08-08 13:16+0000\n"
+"Last-Translator: Heiner Wohner <Unknown>\n"
+"Language-Team: <room_citadel_translators@uncensored.citadel.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-08-09 04:34+0000\n"
+"X-Generator: Launchpad (build 16723)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Gelöscht"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Neuer Benutzer"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Problematischer Benutzer"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Lokaler Benutzer"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Netzwerk Benutzer"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "nur Privilegierte Benutzer"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Verantwortlicher"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Ein Fehler ist aufgetreten."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Neue Benutzer überprüfen"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Zur Zeit müssen keine Benutzer validiert werden."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "sehr schwach"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "schwach"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "in Ordnung"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "stark"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Aktuelle Berechtigungen: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Berechtigungen dieses Benutzers"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Abgebrochen. Passwort wurde nicht geändert."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Die Passwörter stimmen nicht überein. Passwort nicht geändert."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Leere Passwörter sind nicht zulässig."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "Verfügbarkeit unbekannt"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "frei"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "BESCHÄFTIGT"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Zur Seite gehen: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Anfang"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Ende"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Terminvorschlag"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Antwort eines Teilnehmers auf Ihre Einladung"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Veröffentlichtes Ereignis"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Dies ist ein unbekanntes Kalender-Datum"
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Übersicht:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Ort:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Datum:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Startzeit/-Datum:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Endzeit/-Datum:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Beschreibung:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Wiederholung"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Terminserie hinzufügen"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Teilnehmer:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Die Änderung '%s', existiert bereits Ihrem Kalender ist."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+"Dieser Termin würde mit '%s' kollidieren, der bereits in Ihrem Kalender "
+"vorgemerkt ist."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Update:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "KONFLIKT:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Wie möchten Sie auf die Einladung reagieren?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Annehmen"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Vorläufig"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Ablehnen"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Klicken Sie <i>Aktualisieren</i> um diese Änderung in ihren Kalender zu "
+"übernehmen."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Ein Kalenderdatum konnte nicht verarbeitet werden."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+"Sie haben die Einladung angenommen.  Sie wurde in Ihren Kalender übernommen."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Sie haben diese Einladung vorläufig angenommen. Sie wurde in Ihrem Kalender "
+"vorgemerkt."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Sie haben diese Einladung abgelehnt. Sie wurde <b>nicht</b> in Ihren "
+"Kalender übernommen."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Eine Antwort wurde an den Organisator versendet."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "u.A.w.g. wurde eingetragen."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr "u.A.w.g. abgelehnt. Sie wurde <b>nicht</b> übernommen."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Kalender-Tagesübersicht beginnt um:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Kalender-Tagesübersicht endet um:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Wochen starten am:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Stunde: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minute: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(Zustand unbekannt)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(zu bearbeiten)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(Angenommen)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(Abgelehnt)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(Vorläufig)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(delegiert)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(abgeschlossen)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(in Bearbeitung)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(keine)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Unbenanntes Ereignis"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "Von"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Anfangsdatum:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Terminende:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Datum/Zeit:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Notizen:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "vorheriger"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "nächster"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Woche"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Stunden"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Betreff"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Anfang"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Ende"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Ganztägiger Termin"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Mehrtägiger Termin"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Unbenannte Aufgabe"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "Ein Fehler trat beim herunterladen dieser Datei auf: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "Sekunden"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "Minuten"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "Stunden"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "Tage"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "Wochen"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "Monate"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "Jahre"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "nie"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "erster"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "zweiter"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "dritter"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "vierter"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "fünfter"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Ereignis"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Ereignis hinzufügen oder ändern"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Ort"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Notiz"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organisator"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(Sie sind der Organisator)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Zeit anzeigen als:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Frei"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Belegt"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(einen pro Zeile)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Adressen"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Serientermin"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Wiederholt sich alle"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "an diesem Werktag:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "am Tag %s%d%s des Monats"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "an dem "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "des Monats"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "jedes "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "Jahr an diesem Tag"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "im"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Serie endet..."
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Kein Enddatum"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Dieser Termin wiederholt sich"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "mal"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Diese Serie geht bis "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Speichern"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Löschen"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Verfügbarkeit der Teilnehmer überprüfen"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Abbruch"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Uhrzeitformat"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Hochladen des Bilds abgebrochen."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Sie haben keine Datei hochgeladen."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "Ihr Photo"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "Das Symbol für diesen Raum"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "Das Begrüssungsfoto auf der Anmeldeseite"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "das Abmeldeseiten Foto"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "realloc() Fehler! Konnte %d Bytes nicht allozieren: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Iconbar einstellungen"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr "Icon Stiel"
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Ungültiger Parameter"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr " wurde gelöscht."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr " aufgenommen."
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Diese Funktion benötigt höhere Zugriffsechte"
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr "Sie müssen die Mailing-Liste angeben, die Sie abonnieren möchten."
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+"Sie müssen Ihre E-Mail-Adresse angeben, mit der Sie das Abonnement empfangen "
+"möchten."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(kein Betreff)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "FEHLER:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Leere Nachricht"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Abgebrochen. Beitrag wurde nicht gesendet."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+"Automatisch abgebrochen, weil Sie diesen Beitrag schon gespeichert haben."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "In den Entwurfsordner gespeichert "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "Werde keine leere Nachricht senden.\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "Nachricht in Entwürfen gespeichert.\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Nachricht wurde gesendet.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Beitrag wurde gesendet.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Die Meldung wurde nicht verschoben."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "Ein Fehler trat beim laden dieses Anhangs auf: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Ein Fehler trat beim laden dieses Anhangs auf: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "EMail-Signatur anhängen?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Diese Signatur benutzen:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Vorgabezeichensatz für EMail Kopfzeilen:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Bevorzugte EMailadresse"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Bevorzugter Name als Email-Absender"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Bevorzugter Name in Diskussionsforen"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Anzeigen als Postfach"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Kann den folgenden Header nicht darstellen: "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Auf eine Notiz klicken zum bearbeiten"
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Konten/OpenID Assoziierungen verwalten"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Wollen Sie diese OpenID wirklich löschen?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(Löschen)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Eine OpenID hinzufügen: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Verbinden"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s erlaubt kein Anmelden per OpenID"
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Kurznachricht senden"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Kurznachricht senden an: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Nachrichtentext eingeben:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Meldung senden"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Kurznachricht nicht gesendet."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Kurznachricht gesendet an "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Abgebrochen. Änderungen wurden nicht gespeichert."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Als Startseite setzen"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "Dies kann nicht ihre Startseite werden!"
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Startseite gelöscht"
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "Bevorzugte Startseite"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Meine Ordner"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Abgebrochen. Änderungen wurden nicht übernommen."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Ihre Änderungen wurden gespeichert."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Benutzer '%s' des Raumes '%s' verwiesen."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Benutzer '%s' in den Raum '%s' eingeladen."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Abgebrochen. Keinen neuen Raum erzeugt."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Etage gelöscht."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Eine neue Etage wurde erstellt."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Raumlisten Anzeige"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Leere Etagen anzeigen"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "Datei"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "Dateien"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Forum"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Mailordner"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Adressbuch"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Kalender"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Aufgabenliste"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Notizliste"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Kalenderliste"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Journal"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Entwürfe"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Dieser Server bedient bereits die maximale Anzahl von Benutzern. Neue "
+"Anmeldungen können daher nicht akzeptiert werden. Bitte versuchen Sie es "
+"später noch einmal oder kontaktieren Sie ihren Systemverwalter."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "Unerwartete Meldung vom Citadel Server erhalten: Exit."
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Sie sind mit einem Citadel-Server der Version %d.%02d verbunden. \n"
+"Webcit benötigt mindestens Version %d.%02d.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Ihre Systemkonfiguration wurde übernommen"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr "Erster Versuch steht aus"
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Keine)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Nichts)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Abgebrochen.   %s wurde nicht gespeichert."
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr " wurde gespeichert."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Rauminfo"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Ihre Biographie"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Vollständig?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Name der Aufgaben"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Fälligkeitsdatum"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Kategorie"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Alle anzeigen"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Aufgabe bearbeiten"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Anfangsdatum:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Kein Datum"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "oder"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "assoziierte Uhrzeit"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Fälligkeitsdatum:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Vollständig:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Kategorie:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr "Fehler beim Erzeugen / Bearbeiten dieses Adressbuch-Eintrags."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Änderungen verworfen."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Ein neuer Benutzer wurde angelegt."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"Sie versuchen einen Benutzer anzulegen. Dieses System verwendet jedoch die "
+"Konten des Host-Systems, deshalb müssen dort neue Benutzer angelegt werden."
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Konnte VCard-Foto nicht dekodieren\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Fehler"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Kann nicht in den Raum wechseln um die Nachricht zu speichern"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Abgebrochen."
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(kein Name)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "bearbeiten"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Authentifizierung benötigt"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"Die angeforderte Sektion benötigt einen gültigen Benutzernamen und Passwort."
+"Sie konnten nicht Angemeldet werden: %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Dieses Programm konnte keine Verbindung zum Citadel-Server herstellen oder "
+"aufrechterhalten. Bitte wenden Sie sich an Ihren Administrator."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Weiter lesen..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' ist kein Wiki-Raum."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Datum"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Autor"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(anzeigen)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Aktuelle Version"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(zurücknehmen)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Seitentitel"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr "Hinzufügen:"
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Ein Server-Kommando eingeben"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Dieses Fenster erlaubt Ihnen, Citadel-Server Befehle, die nicht in WebCit "
+"verwendet werden, direkt einzugeben. Wenn Ihnen dies nichts sagt, wird "
+"dieses Fenster für Sie nicht ohne Studium der Dokumentation von Nutzen sein."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Kommando eingeben:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Kommando Eingabe (wenn Sie SEND_LISTING Transfer-Modus anfordern):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr "Der gefundene Host Header ist "
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Server-Kommando-Ergebnisse"
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr "Weiteren Befehl eingeben"
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr "Zurück zum Menü"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Netzwerk-Konfiguration"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Neuen Knoten hinzufügen"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Schon konfigurierte Knoten"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "Systemverwaltungsmenü"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr "Raumverantwortlichen Menü"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Aliase für diese Maschine"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Smart Hosts"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr "Benachrichtigungshosts"
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "Blacklist-Maschinen"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "SpamAssassin-Maschinen"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr "ClamAV Clamd Maschine"
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr "Masquarading-Domains"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr "Temporär debug loggen von Komponenten einschalten"
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+"Dieses Formular erlaubt es, einzelne Komponenten des Citserverprozesses zur "
+"Fehlersuche verbos zu schalten. Die Einstellung ist nicht neustart fest.Um "
+"es permanent einzuschalten, fügen sie es zu der CITADEL_LOGDEBUG "
+"Umgebungsvariable im citadel Initscript hinzu."
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Globale Konfiguration"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Benutzer verwalten"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "Citadel Restarten"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Räume und Etagen"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr "Citadel neu starten"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "Kurznachricht an die Benutzer:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Standortskonfiguration"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr "Sie haben keine Berechtigung diese Ressource einzusehen."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "Allgemein"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr "SMTP"
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr "IMAP4"
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "Mobile Push-EMail"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indizierung/Protokollierung"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Zugang"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr "Verzeichnis"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Automatischer Nachrichtenlöscher"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Um einen neuen Benutzer einzurichten, den Anmeldenamen in das Textfeld "
+"eintragen und 'Anlegen' Klicken"
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Neuer Benutzer: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Einen vorhandenen Benutzer zum Bearbeiten aus der Liste auswählen und dann "
+"'Bearbeiten' Klicken"
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Benutzer bearbeiten: "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Benutzername:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Passwort"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Erlaubnis Internet-EMail zu senden"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Haupt-EMailadresse"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Internet EMail-Aliase"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Anzahl der Anmeldungen"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Nachricht abgeschickt"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Zugangsberechtigung"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "Benutzer-ID"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Datum der letzten Anmeldung"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Automatisch löschen nach n Tagen"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Benutzer bearbeiten/löschen"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Neuer Benutzer"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Benutzer bearbeiten/löschen"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Etagen bearbeiten/löschen/hinzufügen"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Name des Knotens"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Gemeinsames Passwort"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Maschinenname oder IP-Adresse"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Portnummer"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Löschen bestätigen"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "wirklich löschen? "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Nein"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr "(Bearbeiten)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Löschen)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(Domäne für die diese Maschine Mail bekommt)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(Maschine, auf der Ihr ClamAV läuft)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(Domäne, auf die das öffentliche Adressbuch zeigt)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+"(sende auslaufende Mails nur für die Hosts, bei denen die direkte Übertragen "
+"fehlschlägt)"
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "(nicht lokale Domänen, von denen Benutzer Mails schicken dürfen)"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr "(URLs für Benachrichtigungen, when ein Nutzer neue Mails erhält;)"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(Maschinen, von denen Echtzeit-Blacklisten zu beziehen sind)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+"(wenn gesetzt, alle zu versendende Mail über diese Maschine verschicken)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(Maschine, auf der Ihr SpamAssassin läuft)"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Jetzt neustarten"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "Nach benachrichtigen der User neustarten"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "Neustarten, wenn alle Benutzer inaktiv sind"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "Bitte warten während der Citadel-Server neu gestartet wird "
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+"Bitte warten während die Benutzer benachrichtigt werden, der Server wird "
+"dann neu gestarted. "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Zugangskontrolle und Vorgabewerte"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Moderatoren erlauben, Räume zu vergessen"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Meldungen Problematischer Nutzer moderieren"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Name des Quarantäne-Raums"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Name des Raums zum Loggen von Kurznachrichten"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr "Authentifizierungsmodus"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr "Abgeschlossen"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr "Host-basiert"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr "LDAP (RFC2307)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr "LDAP (Active Directory)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr "Anonymen Gastzugang erlauben"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Rechtestatus neu angelegter Benutzer"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Zugangsberechtigung um Räume zu erzeugen"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+"Automatisch Benutzern, die private Räume erstellen, Moderator-Status geben."
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr "Automatisch Erstellern von BLOG-Räumen Moderator-Status geben"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Zugang zu Internetmail beschränken"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Erzeugen von Benutzerkonten am Anmeldeprompt verbieten"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr "Hinweis: Nicht beides auswählen!"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "Anmeldung für neue Benutzer erforderlich"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Automatischen Verfall alter Nachrichten konfigurieren"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+"Diese Einstellungen können auf Etagen- oder Raum-Basis aufgehoben werden."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Zeit, zu der die Raumsäuberungen laufen sollen"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+"Standardwerte für die Vorhaltedauer von Nachrichten in öffentlichen Räumen"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Nachrichten nie automatisch löschen"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Nachrichten nach Anzahl löschen"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Lösche Nachrichten älter als"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Anzahl der Nachrichten pro Tag: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+"Standardwerte für die Vorhaltedauer von Nachrichten in privaten Mailboxen"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Die selben Werte wie in öffentlichen Räumen"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Automatisch inaktive Nutzer löschen nach (Tage)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Automatische Raumlöschung nach (Tage)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "LDAP-Verzeichnis-Anbindung des Servers konfigurieren"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"Änderungen in diesem Menü werden erst mit Neustart des Citadel-Servers aktiv."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"Anmerkung: Dieser Citadelserver wurde ohne LDAP-Support gebaut. Diese Option "
+"wird keine Auswirkung haben."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Hostname des LDAP-Verzeichnisserver (leer zum Abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Port des LDAP-Verzeichnisservers (leer zum Abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "Base DN im Verzeichnisserver"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "Bind DN im Verzeichnisserver"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Passwort für die Bind DN am Verzeichnisserver"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "Allgemeine Standortskonfiguration"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "Anmeldelogo wechseln"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "Abmeldelogo wechseln"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Vollqualifizierter Domänenname"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Menschenlesbarer Knotenname"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Telefonnummer"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Eingabeaufforderung (nur für Textclients)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Geografische Position dieses Systems"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Name des Verwalters"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Vorgabe Zeitzone für Kalendereinträge ohne Zeitzone"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr "IMAP"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "IMAP4 Server Port (-1 zum abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "IMAP-SSL Serverport (-1 zum abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr "Original IMAP-Header behalten"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indizierung und Protokollierung"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Warnung: Diese Dienste sind Ressourcen intensiv."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Volltext-Indexdienst anschalten"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "EMail-Nachrichten protokollieren"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "Nicht-EMail Nachrichten protokollieren"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "EMail-Adresse für die Protokollnachrichten"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "POP3 Server Port (-1 zum abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "POP3s Serverport (-1 zum Abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr "POP3-Abhol-Fequenz (in Sekunden)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "Höchste POP3-Abhol-Fequenz (in Sekunden)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr "Hostname des Funambol-Synchronisierungs-Servers (leer zum Abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "Funambol Serverport "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "Funambol-Synchronisierungsquelle"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "Funambol-Autentifizierungs-Details (Nutzer:Passwort)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr "Externe Pager-Server URL (leer zum Abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Netzwerkdienste"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+"Server-IP-Adresse (0.0.0.0 um alle IPV4, * um alle plus IPV6 zu binden)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "XMPP (Jabber) Client nach Server Port (-1 zum abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "XMPP (Jabber) Server zu Server Port (-1 zum abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "POP3 Server Port (-1 zum abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "POP3 Server Port (-1 zum abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Erweiterte Server Einstellungen"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Maximale Nachrichtenlänge (in Bytes)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "ungenutzte Verbindungen trennen nach (in Sekunden):"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "Knoten-Synchronisierunsfrequenz (in Sekunden)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Maximale Anzahl gleichzeitiger Verbindungen (0 = kein Limit)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Minimale Anzahl Server-Threads"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Maximale Anzahl Server-Threads"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Automatisch die Datenbanktransferlogs löschen"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr "SMTP-Server"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "SMTP MTA Server Port (-1 zum abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "SMTP MSA Serverport (-1 zum abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTPS Serverport (-1 zum Abschalten)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr "RBL Prüfung schon beim Verbindungsaufbau durchführen"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "Meldung als Spam Markieren, anstelle verwerfen"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+"Nicht authentifizierten SMTP clients erlauben die Domain dieser Citadel- "
+"Installation zu verwenden"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "'From:' -Kopfzeilen bei authentifizierten SMTP korrigieren"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr "Nein, erlaube alle Addressen in der Von:-Kopfzeile"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr "Die Von:-Kopfzeile nur verändern wenn sie nicht zu dem Benutzer gehört"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+"Ja, immer des Benutzers primäre E-Mail Addresse in der Von:-Kopfzeile "
+"einsetzen."
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr "Nein, Nachrichten mit ungültigen Von:-Kopfzeilen ZURÜCKWEISEN"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr "Postfix TCP Wörterbuch Port"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr "-1 zum Abschalten"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "ManageSieve-Server-Port (-1 zum abschalten)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Benutzer bearbeiten/löschen/anlegen"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Systemvorgaben bearbeiten"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Domänennamens- und Internetmail-Konfiguration"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Internet EMail-Aliase"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "SMTP-Ausgangswarteschlange anzeigen"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Abmelden"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Einfache Kommandos"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Ihre Biographie"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Erweiterte Raum-Kommandos"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Lade"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Anonym"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Beitrag senden"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr "Als Entwurf speichern."
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Anhänge:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "von"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "in"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "An:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "CC:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "BCC:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Betreff (optional):"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Betreff:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- Weitergeleitete Nachricht ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Fenster schließen"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr "Dateien zum Hochladen hier fallen lassen"
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Datei anhängen"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr "Lade Dateien hoch..."
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr "Erneut versuchen"
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr "Entfernen"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Zum Download verfügbare Dateien in"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Eine Datei hochladen:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Dateiname"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Größe"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Inhalt"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Beschreibung"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Bild hochladen"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Sie können ein Bild direkt von ihrem Computer hochladen."
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Bitte geben Sie eine Datei zum Hochladen an:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Diashow"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Etage erstellen/ändern/löschen"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Etagen-Nr."
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Etagen-Name"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Zahl der Räume"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "Etagen CSS"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(Etage löschen)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Sie müssen eingeloggt sein um diese Seite zuzugreifen."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "Mit Benutzer und Passwort anmelden"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Passwort:"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Anmelden"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Neuer Benutzer? Registrieren Sie sich jetzt"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+"einen Loginnamen und Passwort eingeben die verwendet werden sollen; dann "
+"&quot;Neuer Benutzer&quot; Klicken "
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Mit einem OpenID Konto Anmelden"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "OpenID URL:"
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr "Über Google anmelden"
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr "Über Yahoo anmelden"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr "Über AOL oder AIM anmelden"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr "Geben Sie Ihren AOL- oder AIM-Benutzernamen ein:"
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "Bitte warten"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr "Dies ist eine Änderung von"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr "überlappen, der bereits in Ihrem Kalender ist."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr "Dieser Termin würde mit"
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Sprache:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Posteingang"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Aufgaben"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Räume"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Angemeldete Benutzer"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Chat"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Erweitert"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Verwaltung"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "Dieses Menü Bearbeiten"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "Auf Raumliste wechseln"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "Zurück zum Menü"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Meine Ordner"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Diese Icon-Leiste bearbeiten"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Icons anzeigen als:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "Bilder und Text"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "Nur Bilder"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "Nur Text"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Die Menüeinträge auswählen, die Sie auf der Leiste links angezeigt haben "
+"möchten"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Seitenlogo"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Ein Logo, das Ihre Seite beschreibt"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Meine Übersichtsseite"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Posteingang"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Eine Abkürzung zu Ihrem Posteingang"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Ihr eigenes Adressbuch"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Ihre Notizen"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Eine Abkürzung zu Ihrem Kalender"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Eine Abkürzung zu Ihrer Aufgabenliste"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr "Liste aller verfügbaren Räume (oder Verzeichnisse) auflisten."
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Wer ist da?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr "Wer ist gerade angemeldet?"
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr "Interaktiver Chat mit den anderen Benutzern in diesem Raum"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Erweiterte Optionen"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Zugriff zu allen Citadel-Menü-Funktionen"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Citadel Logo"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Das 'Powered by Citadel'-Logo anzeigen"
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"Deine Symbolleiste wurde aktualisiert. Bitte wähle eine von ihren "
+"Möglichkeiten, um fortzufahren."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr "Ggf. aktualisieren (SHIFT-F5)>, damit die Änderungen wirksam werden"
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Listenteilnehmer"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Liste abonnieren/abmelden"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Bestätigungsanfrage gesendet"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr "Sie abonnieren "
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr " die "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr " Mailing-Liste."
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+"Der Mailing-Listen-Server hat Ihnen eine E-Mail mit einem Verweis gesendet, "
+"auf den Sie klicken müssen, um Ihr Abonnement zu bestätigen."
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+"Dieser zusätzliche Schritt dient Ihrem Schutz, weil dadurch verhindert wird, "
+"dass andere ohne Ihre Zustimmung für Sie Mailing-Listen abonnieren können."
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+"Bitte klicken Sie auf den Verweis, der Ihnen per E-Mail gesendet wurde und "
+"Ihr Abonnement wird bestätigt."
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Zurück..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr "FEHLER"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr "Sie kündigen das Abonnement"
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr "der"
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr "Mailing-Liste."
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+"Der Mailing-Listen-Server hat Ihnen eine E-Mail mit einem Verweis gesendet, "
+"auf den Sie klicken müssen, um die Kündigung Ihres Abonnements zu bestätigen."
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+"Dieser zusätzliche Schritt dient Ihrem Schutz, weil dadurch verhindert wird, "
+"dass andere ohne Ihre Zustimmung Ihre Mailing-Listen-Abonnements kündigen "
+"können."
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+"Bitte klicken Sie auf den Verweis, der Ihnen per E-Mail gesendet wurde und "
+"Ihre Abonnement-Kündigung wird bestätigt."
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr "Zurück …"
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr "Bestätigung erfolgreich!"
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr "Bestätigung gescheitert."
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr "Das könnte eines von zwei Dingen bedeuten:"
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+"Sie haben mit der Bestätigung Ihres Abonnements/Ihrer Abonnement-Kündigung "
+"zu lange gewartet (der Verweis zur Bestätigung ist nur drei Tage lang gültig)"
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+"Sie <i>haben bereits</i> erfolgreich Ihr Abonnement/Ihre Abonnement-"
+"Kündigung bestätigt und versuchen es gerade erneut."
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr "Der vom Server gemeldete Fehler war: "
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr "Name der Liste:"
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr "Ihre E-Mail-Adresse:"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr "Bevorzugtes Format (falls Sie abonnieren): "
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr "Eine Nachricht auf einmal"
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr "Digest-Format"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+"Sie werden eine E-Mail mit einem zusätzlichen Verweis erhalten, auf den Sie "
+"zur endgültigen Bestätigung klicken müssen, wenn Sie versuchen, eine Mailing-"
+"Liste zu abonnieren oder zu kündigen."
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+"Dieser zusätzliche Schritt dient Ihrem Schutz, weil dadurch verhindert wird, "
+"dass andere ohne Ihre Zustimmung für Sie Mailing-Listen abonnieren oder Ihre "
+"Mailing-Listen-Abonnements kündigen können."
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr "Angemeldet als"
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr "Nicht angemeldet."
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "betrieben mit"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Erneut anmelden"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Diesen Raum bearbeiten oder löschen"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "In einen 'versteckten' Raum gehen"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Einen neuen Raum erzeugen"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Einen neuen Raum erzeugen"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "Diesen Raum vergessen"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Alle vergessenen Räume auflisten"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr "Doppelte Nachrichten Entfernen"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+"(Meldungen mit gleichem Betreff, Absender und Datum werden in den Papierkorb "
+"verschoben)"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Bekannte Räume aufzählen"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Wo komme ich von hier aus hin?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "nächster Raum"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "... mit <em>ungelesenen</em> Meldungen"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Weiter zum nächsten Raum"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(später zurückkehren)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Zurück"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "Hoppla! Zurück zu "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Aktualisieren"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "... in diesem Raum"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Alle Beiträge"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "... alte <em>und</em> neue"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "neuer Beitrag"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(Beitrag in diesen Raum stellen)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "Datei-Bibliothek"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(Zum Herunterladen verfügbare Dateien anzeigen)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Übersichtsseite"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Mein Benutzerkonto"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Benutzerliste"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(alle Benutzer)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Auf Wiedersehen!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Ändern Sie Ihr Passwort"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Bitte geben Sie ein neues Passwort ein:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Noch einmal zur Verifizierung:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Ihre persönlichen Einstellungen ändern"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Ihre Kontaktinformationen ändern"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Ihr Lebenslauf eingeben"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Ihr Photo ändern"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Bearbeiten/Anzeigen von serverseitigen Mailfiltern"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "Bearbeiten Sie ihre Push-Email einstellungen"
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr "openID's bearbeiten"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Verschieben bestätigen"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Meldung verschieben nach:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Lese #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "Nachrichten"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "alte vor neu"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "neue vor alte"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Absender"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Lade Nachrichten vom Server, Bitte warten"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "in neuem Fenster öffnen"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Verschieben"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Kopieren"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Drucken"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Kontakte anzeigen"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Neuen Kontakt hinzufügen"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Tagesübersicht"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Monatsübersicht"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Neuen Termin hinzufügen"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Kalenderliste"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Aufgaben anzeigen"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Neue Aufgabe"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Nachrichten anzeigen"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Neue Notiz"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Aktualisieren"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Email schreiben"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Wiki-Startseite"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Diese Seite bearbeiten"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "Ältere Versionen"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr "Neuer Blog-Beitrag"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Raum weglassen"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr "Mail Warteschlange erneut versenden"
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "Neue Startseite setzen"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "Ihre neue Startseite wurde geändert"
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+"(Anmerkung: dies setzt nicht die Homepage im Browser. Es ändert die gezeigte "
+"Seite beim anmelden an"
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "Keine neuen Nachrichten."
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "Ihre OpenID"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "wurde erfolgreich revalidiert."
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr "Wie auch immer, der Benutzername"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "wird bereits von jemand anderem verwendet."
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Bitte gebe den Benutzernamen ein den du verwenden willst."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Einstellungen"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Baum- (Ordner) Anzeige"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Tabellen- (Raum) Anzeige"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 Stunden (AM/PM)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 Stunden"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Montag"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Keine Signatur"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "Volle Funktion"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Eingeschränkter modus"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+"Der sichere Modus ist ressourcensparender für deinen Browser, stellt aber "
+"nicht alle Funktionen zur Verfügung."
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr "Push-EMail Konfigurieren"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "Push Email und SMS Einstellungen"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+"Wenn der Administrator freigeschaltet hat, kann Citadel dem Funambol Server "
+"automatisch benachrichtigen, das eine neue EMail eingetroffen ist und sie "
+"auf Endgeräte mit Funambol Client synchronisieren."
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+"Alternativ kann der Administrator das versenden einer SMS mit der "
+"Zusammenfassung der mail senden lassen."
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr "Funambol-Server benachrichtigen"
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr "Eine Textnachricht senden an..."
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+"(bitte das internationale Nummernformat ohne führende Nullen, Leerzeichen "
+"oder Trennstriche angeben, ala +4917234567890)"
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+"Nutze das willkürliche Benachrichtigungsschema, dass von deinem "
+"Administrator festgelegt wurde."
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr "Keine Benachrichtigungen senden."
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Name des Raums: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Befindet sich auf Etage: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Vorgabe-Ansicht für diesen Raum: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Raum-Typ:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Öffentlich (Raum zugänglich für jeden)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privat - versteckt (zugänglich für jeden der den Namen weiß)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privat - erfordert Passwort: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privat - nur mit Einladung"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Persönlich (Briefkasten, nur für Sie)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Einen neuen Raum erzeugen"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Name des Raums: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Vorgabe-Ansicht für diesen Raum: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Raum-Typ:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Bearbeite die Informationsdatei dieses Raumes"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"Der Text wird auf dem Browser des Lesers formatiert.Eine neue Zeile erzwingt "
+"man, indem man die nächste Zeile mit einem Leerschritt beginnt."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Zu einem versteckten Raum gehen"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Wenn Sie den Namen eines versteckten (Namen-raten) oder passwortgeschützten "
+"Raums wissen, Hier eingeben um ihn zu betreten.  Wenn er einmal sichtbar "
+"ist, wird er in Ihrer regulären Raumliste erscheinen."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Raumname eingeben:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Raumpasswort eingeben:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Konfiguration"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Nachrichtenverfalls-Vorgabe"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Zugangskontrolle"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Teilen"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Mailinglistendienst"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Sammeldienste"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(Löschen)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Folgende Benutzer haben Zugang zu diesem Raum. Um einen Benutzer von der "
+"Zugangsliste zu entfernen, Benutzernamen auswählen und 'Kick' anklicken."
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Um einem weiteren Benutzer den Zugang zu diesem Raum zu erlauben den "
+"Benutzernamen in das folgende Textfeld eintragen und 'Einladen' drücken"
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Einladen:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Benutzer"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Raum löschen"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr "Setze oder ändere das Bild für das Banner des Raumes"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr "Bearbeite die Informationsdatei dieses Raumes"
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr "Raumname: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Wenn Privat, sollen aktuelle Benutzer den Raum vergessen?"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "nur privilegierte Benutzer"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Schreibgeschützter Raum"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "Benutzer, die Schreibrechte haben, dürfen auch löschen"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Dateiverzeichnis-Raum"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Verzeichnisname: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Hochladen erlaubt"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Herunterladen erlaubt"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Nachrichten erneut zum entfernten Knoten versenden"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Sichtbares Verzeichnis"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Netzwerk öffentlicher Raum"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanent (kein automatisches Löschen)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "Betreff verlangen (Benutzer zwingen einen Betreff anzugeben)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Anonyme Nachrichten"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Keine anonyme Nachrichten"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Alle Nachrichten sind Anonym"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Benutzer fragen, wenn er die Nachricht eingibt"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Raumverantwortlicher: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Nachrichten-Verfallsvorgabe für diesen Raum"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Die Vorgaberichtlinie dieser Etage verwenden"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Nachrichten-Verfallsvorgabe für diese Etage"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Die Systemvorgabe benutzen"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr "Mails von diesen POP3 Konten abholen und in diesem Raum ablegen:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "POP3 Server"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Benutzername"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Mails auf dem Server belassen?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "Rhythmus"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Die folgenden RSS-Feeds abholen und in diesem Raum ablegen:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "Feed URL"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"</ i> <br>: <i> Der Inhalt dieser Raums werden <b> als einzelne Nachrichten "
+"</ b>, an die folgende Liste von Empfängern verschickt"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>Die Inhalte dieses Raums werden <b>als einzelne Nachrichten </b> zu "
+"folgenden Listenempfängern versendet:</i><br /><br />"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr "Nachrichten in diesem Raum werden an diese Mailinglisten versendet"
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+"Alle Nachrichten, die in diesen Raum geschrieben/gesendet werden andiese E-"
+"Mail Addresse gesendet. Wenn dies mit einer Mailinglisten Abbonement "
+"verbunden wird, sollte sichergestellt sein, das die unten konfigurierte "
+"Absenderaddresse mit der Abbonementsaddresse übereinstimmt. Die Nachrichten "
+"werden zwei mal zu sehen sein: Einmal das Orginal, Einmal die versendete "
+"Nachricht der Mailingliste."
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Empfänger aus den Kontakten oder anderen Addressbüchern hinzufügen"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "Nicht-Abbonenten dürfen in diesen Raum senden"
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "Beitrag einreichen erforderd Moderator Privilegien."
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr "Benutzergesteuertes Abonnieren erlauben."
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "Die URL zum Ab-/Bestellen lautet: "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr "Welche Absederaddresse soll verwendet werden: "
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr "keine (nicht empfohlen)"
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+"Weitere öffentliche Emailaddressen die in diesen Raum ausgeliefert werden:"
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr "Alle Domänen"
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Nicht geteilt mit"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Geteilt mit"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Entfernter Knotenname"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Entfernter Raumname"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Aktionen"
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"Falls ein Raum geteilt werden soll, muss er von beiden Enden her geteilt "
+"werden. Hinzufügen eines Knotens zu der \"Geteilt\" Liste versendet "
+"Nachrichten, aber in der Reihenfolge der empfangenen Nachrichten, müssen die "
+"anderen Knoten so konfiguriert sein, dass sie auch Nachrichten zu deinem "
+"System senden.<li>Wenn der entfernte Raum leer ist, wird angenommen, dass "
+"der Name des Raums identisch ist mit dem auf dem entfernten Knoten.<li>Falls "
+"der Name des entfernten Raumes anders ist, Muss der entfernte Knoten auch "
+"den Namen des hiesigen Raumes einstellen."
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+"Wenn der entfernte Raumname leer ist, wird angenommen das er mit dem lokalen "
+"Namen identisch ist."
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+"Wenn der entfernte Raumname anders ist, muss er auch hier konfiguriert "
+"werden."
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+"Erneutes versenden kann das system belasten, und grosse Spool-Dateien "
+"generieren, die erneut versendet werden beim nächsten Netzwerkerlauf."
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Rauminfo"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "den aktuellen Raum vergessen (vergessen/abbestellen)"
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr "Wenn Sie diese Option wählen,"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr "aus der Raumliste verschwinden. Wollen Sie das wirklich tun?"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Vergessene Räume"
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Einen Raum anclicken zum ent-Zap-en und betreten."
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "neu von"
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Seite wählen: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Suchen: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Alle"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Script bearbeiten/löschen"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Neues Script hinzufügen"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"Um eine neues Script anzulegen, den gewünschten Scriptnamen in das Textfeld "
+"eintragen und 'Anlegen' Klicken"
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Script-Name: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Script bearbeiten"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Zurück zum Bearbeitungsformular"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Script Löschen"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"Um ein vorhandenes Script zu löschen, das Script aus der Liste auswählen und "
+"dann 'Löschen' Klicken"
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Wenn"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "To oder Cc"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Reply-to"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Resent-From"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Resent-To"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Envelope From"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Envelope To"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-Flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Status"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "Listen-ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Nachrichten größe"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "beinhaltet"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "beinhaltet nicht"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "ist"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "ist nicht"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "trifft zu"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "trifft nicht zu"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Alle Beiträge)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "ist größer als"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "ist kleiner als"
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr "bytes"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Behalten"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "still verwerfen"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Abweisen"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Meldung verschieben nach"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Weiterleiten an"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Abwesenheits-Benachrichtigung"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Nachricht:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "und dann"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "weiter Bearbeiten"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "stop"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Wenn eine neue Mail ankommt: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Mit den folgenden Regeln filtern"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Im Posteingang belassen ohne filtern"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr "Mit manuell bearbeitetem Script filtern (nur für erfahrene Benutzer)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Neue Regel"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"Diese Citadel installation wurde ohne Serverseitige Mailfilter gebaut<br> "
+"Bitte fragen Sie Ihren Administrator, wenn Sie diese Funktion brauchen."
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "Alte Nachrichten"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "Neue Nachrichten"
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr "Übersichtsseite für "
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Nachrichten"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Heute&nbsp;in&nbsp;ihrem&nbsp;Kalender"
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Wer &nbsp;ist gerade &nbsp;angemeldet"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Über&nbsp;diesen&nbsp;Server"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr "Sie sind verbunden mit"
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr "wird ausgeführt"
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr "mit"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr "Server-Build"
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr "und aufgestellt in"
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr "Ihr Systemadministrator ist"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"WARNUNG: JavaScript ist im Browser abgeschaltet. Viele Funktionen des "
+"Systems stehen nicht zur verfügung."
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Ihr Lebenslauf eingeben"
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr "Benutzer-Liste für "
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Benutzername"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Zahl"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Zugangsberechtigung"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Letzte Anmeldung"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Anmeldungen gesamt"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Summe aller Beiträge"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Benutzerprofil"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr "Hier klicken zum senden einer Kurznachricht an"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Kontaktdaten bearbeiten"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Anrede"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Vorname"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Mittelinitial"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Nachname"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Zähler"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Namen anzeigen:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Titel:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organisation:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Postfach:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Adresse:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Stadt:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Bundesland:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Postleitzahl:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Land:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Telefon:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Telefon/Büro:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Mobiltelefon:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Faxnummer."
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Dieses Adressbuch ist leer."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Ein interner Fehler ist aufgetreten."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Schreiben Sie einen Kommentar"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "neuere Beiträge"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "ältere Beiträge"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d Kommentare"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "permalink"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "neu von"
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "Sie haben keine Berechtigung diese Ressource einzusehen."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "Diese Warteschlange ist leer."
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Diese Seite neu laden"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr "HINWEIS"
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+"Citadel versucht Mails in Intervallen erneut zuzustellen; Die Intervalle "
+"beginnen mit 60 sekunden und verdoppeln sich jedes mal; Wie auch immer, "
+"dieser Mechanismus kann einmal ausgesetzt werden und alle in der "
+"Warteschlange befindlichen Nachrichten werden sofort versucht erneut zu "
+"versenden."
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr "OK, habs verstanden, auf gehts!"
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr "Alle Nachrichten beim nächsten Lauf erneut versuchen"
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr "Momentan Aktive mail versand Aufträge"
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr "Entfernter Server"
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr "Status:"
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr "Jobs, die auf erneuten Versand warten:"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr "Ursprünglich veröffentlicht in: "
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "Nachrichten-ID"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Versandzeitpunkt"
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr "Nächster Versuch"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Empfänger"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "von "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "an"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Antworten"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "Antworten&amp;Zitieren"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "AntwortenAnAlle"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Weiterleiten"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Kopfzeilen"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "Anzeigen"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Herunterladen"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Anzeigen als:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "Angemeldete Benutzer auf "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr "Auf den Namen klicken um die Benutzerdaten einzusehen. Auf"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "klicken um Ihm eine Kurznachricht zu senden."
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(beenden)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Raum"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "Client DNS Name / IP"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Sitzungsparameter Bearbeiten"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Auf dieser Seite können Sie die in der Benutzerübersicht angezeigten Texte "
+"ändern. Um die Defaultwerte wiederherzustellen bei leerem Feld den "
+"'Raumnamen ändern' Knopf drücken "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Raumname:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Rechnername:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr "Angemeldete Benutzer auf"
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr "Konfiguration Bearbeiten"
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr "Adressbuch Eintrag bearbeiten."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Dahin gehen"
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Klicken Sie auf 'Diese Seite bearbeiten' im Raum-Banner, wenn Sie diesen "
+"Raum erzeugen möchten."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Es gibt hier keine Seite mit Namen '%s'."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr "editierte Einträge für diese Seite"
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr "Wikiseiten"
+
+#~ msgid "the icon for this floor"
+#~ msgstr "Das Symbol für diese Etage"
+
+#~ msgid "Edit %s"
+#~ msgstr "%s bearbeiten"
+
+#~ msgid "Save changes"
+#~ msgstr "Änderungen übernehmen"
+
+#~ msgid "Markdown Wiki"
+#~ msgstr "Markdown Wiki"
+
+#~ msgid " (work)"
+#~ msgstr " (Firma)"
+
+#~ msgid " (home)"
+#~ msgstr " (Privat)"
+
+#~ msgid " (cell)"
+#~ msgstr " (Handy)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefon"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-Mail:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Verzeichnis Namen"
+
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Ausweich Smart-Hosts"
+
+#~ msgid "Create new room"
+#~ msgstr "Einen neuen Raum erzeugen"
+
+#~ msgid "Zap this room"
+#~ msgstr "Raum weglassen"
+
+#~ msgid ""
+#~ "You have one or more instant messages waiting, but the Citadel Instant "
+#~ "Messenger window failed to open.  This is probably because you have a "
+#~ "popup blocker installed.  Please configure your popup blocker to allow "
+#~ "popups from this site if you wish to receive instant messages."
+#~ msgstr ""
+#~ "Es warten eine oder mehrere Kurznachrichten, aber das Citadel "
+#~ "Nachrichtenfensterhat sich nicht geöffnet. Eventuell blockiert ihr "
+#~ "Browser Popups. Bitte erlauben sie das Citadel Nachrichtenfenster im "
+#~ "Popupblocker um Kurznachrichten zu empfangen."
+
+#~ msgid "The citadel server has to be restarted. It will be back in a minute."
+#~ msgstr ""
+#~ "Der Citadelserver muss neu gestartet werden. Er wird sofort wieder da "
+#~ "sein."
+
+#~ msgid "Change"
+#~ msgstr "Ändern"
+
+#~ msgid "Has Files"
+#~ msgstr "Hat Dateien"
+
+#~ msgid "Networked Room"
+#~ msgstr "Netzwerk öffentlicher Raum"
+
+#~ msgid "Add node?"
+#~ msgstr "Knoten hinzufügen?"
+
+#~ msgid "idle since"
+#~ msgstr "inaktiv seit"
+
+#~ msgid "Minutes"
+#~ msgstr "Minuten"
+
+#~ msgid "active"
+#~ msgstr "aktiv"
+
+#~ msgid "Send"
+#~ msgstr "Absenden"
+
+#~ msgid "Delete this message?"
+#~ msgstr "Diesen Raum löschen"
+
+#~ msgid "Room Logo"
+#~ msgstr "Raum Logo"
+
+#~ msgid "Pictures in"
+#~ msgstr "Bilder in"
+
+#~ msgid "Exit"
+#~ msgstr "Beenden"
+
+#~ msgid "{percent}% of {total_size}"
+#~ msgstr "{percent}% von {total_size}"
+
+#~ msgid "Upload failed"
+#~ msgstr "Datei hochladen fehlgeschlagen"
+
+#~ msgid "Processing..."
+#~ msgstr "Bearbeite..."
+
+#~ msgid "Paused"
+#~ msgstr "Pausiert"
+
+#~ msgid "You may only drop one file."
+#~ msgstr "Es kann nur eine Datei auf einmal gedropt werden"
+
+#~ msgid ""
+#~ "Unrecoverable error - the browser does not permit uploading of any kind."
+#~ msgstr "Fataler Fehler - der Browser unterstützt Datei hochladen nicht."
+
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Soll {filename} wirklich gelöscht werden? "
+
+#~ msgid "failed to delete {filename}!"
+#~ msgstr "Löschen von {filename} fehlgeschlagen"
+
+#~ msgid "deleting {filename}"
+#~ msgstr "Lösche {filename}"
+
+#~ msgid "Upload"
+#~ msgstr "Hochladen"
+
+#~ msgid "Add"
+#~ msgstr "Hinzufügen"
+
+#~ msgid "Create"
+#~ msgstr "Anlegen"
+
+#~ msgid "Kick"
+#~ msgstr "Rauswerfen"
+
+#~ msgid "Invite"
+#~ msgstr "Einladen"
+
+#~ msgid "User"
+#~ msgstr "Benutzer"
+
+#~ msgid "Addressbook Popup"
+#~ msgstr "Adressbuch Popup"
+
+#~ msgid "Delete user"
+#~ msgstr "Benutzer löschen"
+
+#~ msgid "Delete this user?"
+#~ msgstr "Diesen Benutzer löschen?"
+
+#~ msgid "Delete File"
+#~ msgstr "Datei löschen"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "Ihre ankommenden Mails werden nicht gefiltert."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "Das zur Zeit aktive Script ist: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Die Replikation mit anderen Citadel-Servern konfigurieren"
+
+#~ msgid "Enable/Disable logging of the server components"
+#~ msgstr "Ein/Ausschalten des loggens von Serverkomponenten"
+
+#~ msgid "Powered by Citadel"
+#~ msgstr "Betrieben mit Citadel"
+
+#~ msgid "Go to your email inbox"
+#~ msgstr "Eine Abkürzung zu Ihrem Posteingang"
+
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Eine Abkürzung zu Ihrem Kalender"
+
+#~ msgid "Go to your personal address book"
+#~ msgstr "Eine Abkürzung zu Ihrem eigenen Adressbuch"
+
+#~ msgid "Go to your personal notes"
+#~ msgstr "Eine Abkürzung zu Ihren Notizen"
+
+#~ msgid "Go to your personal task list"
+#~ msgstr "Eine Abkürzung zu Ihrer Aufgabenliste"
+
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Alle zugänglichen Räume auflisten"
+
+#~ msgid "See who is online right now"
+#~ msgstr "Sehen, wer grade angemeldet ist"
+
+#~ msgid ""
+#~ "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+#~ msgstr ""
+#~ "Erweiterte Optionen Menü: Erweiterte Raum Kommandos, Konto Informationen, "
+#~ "und Chat"
+
+#~ msgid "Room and system administration functions"
+#~ msgstr "Raum und Systemadministrator Funktionen"
+
+#~ msgid "Reset form"
+#~ msgstr "Formular löschen"
+
+#~ msgid "Delete this entry?"
+#~ msgstr "Diesen Eintrag löschen"
+
+#~ msgid "Create new floor"
+#~ msgstr "Einen neuen Flur erzeugen"
+
+#~ msgid "Move rule up"
+#~ msgstr "Regel nach oben bewegen"
+
+#~ msgid "Move rule down"
+#~ msgstr "Regel nach unten bewegen"
+
+#~ msgid "Delete rule"
+#~ msgstr "Regel löschen"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(Bild verändern)"
+
+#~ msgid "Change name"
+#~ msgstr "Namen ändern"
+
+#~ msgid "Change CSS"
+#~ msgstr "CSS Wechseln"
+
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Soll dieser Raum wirklich gelöscht werden? "
+
+#~ msgid "Send command"
+#~ msgstr "Kommando senden"
+
+#~ msgid "Unshare"
+#~ msgstr "Teilen wiederrufen"
+
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr ""
+#~ "Priviligierter Benutzer (z.b. für Asterisk Integration; leer zum "
+#~ "Abschalten)"
+
+#~ msgid "Master user password"
+#~ msgstr "Passwort des priviligierten Benuters"
+
+#~ msgid "Delete this note?"
+#~ msgstr "Diese Notiz löschen"
+
+#~ msgid "List"
+#~ msgstr "Liste"
+
+#~ msgid "Digest"
+#~ msgstr "Digest-Format"
+
+#~ msgid "Set"
+#~ msgstr "Setzen"
+
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Wollen Sie diese Sitzung wirklich beenden?"
+
+#~ msgid "Share"
+#~ msgstr "Teilen"
+
+#~ msgid "Change password"
+#~ msgstr "Passwort ändern"
+
+#~ msgid "Change room name"
+#~ msgstr "Raumnamen ändern"
+
+#~ msgid "Change host name"
+#~ msgstr "Rechnernamen ändern"
+
+#~ msgid "Change user name"
+#~ msgstr "Benutzernamen ändern"
+
+#~ msgid "(INBOX)"
+#~ msgstr "(POSTEINGANG)"
+
+#~ msgid ""
+#~ "Leave all messages marked as unread, go to next room with unread messages"
+#~ msgstr ""
+#~ "Alle Nachrichten wieder ungelesen markieren, in den nächsten Raum mit "
+#~ "neuen Nachrichten gehen"
+
+#~ msgid "Mark all messages as read, go to next room with unread messages"
+#~ msgstr ""
+#~ "Alle Nachrichten als gelesen markieren, und in den nächsten Raum mit "
+#~ "neuen Nachrichten gehen"
+
+#~ msgid "Save changes?"
+#~ msgstr "Änderungen übernehmen?"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Sie abonnieren für <TT>%s</TT> die <b>%s</b>-Mailing-Liste. Der Mailing-"
+#~ "Listen-Server hat Ihnen eine E-Mail mit einem Verweis gesendet, auf den "
+#~ "Sie klicken müssen, um Ihr Abonnement zu bestätigen. Dieser zusätzliche "
+#~ "Schritt dient Ihrem Schutz, weil dadurch verhindert wird, dass andere "
+#~ "ohne Ihre Zustimmung für Sie Mailing-Listen abonnieren können.<br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr ""
+#~ "WARNUNG: Konnte die Serverkonfiguration nicht lesen; ist der Citserver "
+#~ "neuer als WebCit?"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Es gibt keinen Raum mit dem Namen '%s'."
+
+#~ msgid "Network"
+#~ msgstr "Netzwerk"
+
+#~ msgid "Tuning"
+#~ msgstr "Feinabstimmung"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Löschen via IMAP nicht cachen (instant expunge)?"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Es gibt schon ein Script mit diesem Namen!"
+
+#~ msgid ""
+#~ "A new script has been created.  Return to the script editing screen to "
+#~ "edit and activate it."
+#~ msgstr ""
+#~ "Ein neues Script wurde erzeugt. Es kann im Script-Bearbeitungs Formular "
+#~ "aktiviert werden."
+
+#~ msgid "Delete script"
+#~ msgstr "Script löschen"
+
+#~ msgid ""
+#~ "You are connected to %s, running %s with %s, server build %s and located "
+#~ "in %s.  Your system administrator is %s."
+#~ msgstr ""
+#~ "Sie sind angemeldet auf %s, mit %s über %s, Server-Release %s in %s.  Ihr "
+#~ "Systemverwalter ist %s."
+
+#~ msgid "Yes with users list"
+#~ msgstr "Ja, mit Benutzer Liste"
+
+#~ msgid "Room list"
+#~ msgstr "Raumlisten Anzeige"
+
+#~ msgid "View as room list"
+#~ msgstr "Auf Raumlistenansicht wechseln"
+
+#~ msgid "View as folder list"
+#~ msgstr "Auf Ordnerlistenansicht wechseln"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Ihr Passwort wurde nicht akzeptiert"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br /><br />Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br />\n"
+#~ msgstr ""
+#~ "Sie abonnieren für <TT>%s</TT> die <b>%s</b> Liste. Der Listenserver hat "
+#~ "Ihnen eine URL zur Bestätigung der Anmeldung zugeschickt. Dieser "
+#~ "zusätzliche Schritt ist zu Ihrem eigenen Schutz, damit Sie niemand ohne "
+#~ "Ihre Zustimmung auf einer Liste anmelden kann.<br />\n"
+
+#~ msgid "If you already have an account on"
+#~ msgstr "Wenn schon ein Benutzerkonto existiert auf"
+
+#~ msgid "enter your user name and password and click &quot;Login.&quot;"
+#~ msgstr "Benutzername und Passwort angeben und &quot;Anmelden&quot; clicken"
+
+#~ msgid ""
+#~ "<b>If you are a new user</b>, enter the name and password you wish to "
+#~ "use, and click &quot;New User.&quot; "
+#~ msgstr ""
+#~ "<b>Wenn Sie noch keinen Benutzer haben</b> einen Loginnamen und Passwort "
+#~ "eingeben die verwendet werden sollen; dann &quot;Neuer Benutzer&quot; "
+#~ "Klicken "
+
+#~ msgid "Please log off properly when finished. "
+#~ msgstr "Bitte die Sitzung ordentlich beenden. "
+
+#~ msgid "See the"
+#~ msgstr "Die"
+
+#~ msgid "recommended browser list"
+#~ msgstr "Liste empfohlener Browser einsehen"
+
+#~ msgid ""
+#~ "if you have trouble using Webcit.</li> <li>You must have <i>cookies</i> "
+#~ "turned on. "
+#~ msgstr ""
+#~ "wenn es Probleme mit Webcit gibt..</li> <li><i>Cookies</i> müßen "
+#~ "aktiviert sein. "
+
+#~ msgid ""
+#~ "Also keep in mind that if your browser is configured to block pop-up "
+#~ "windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "Bitte auch Popup Fenster zulassen wenn Chat-Fenster benutzt werden sollen."
+
+#~ msgid "Enter your OpenID URL and click &quot;Login&quot;."
+#~ msgstr "Geben Sie ihre OpenID URL ein, und &quot;Anmelden&quot; klicken"
+
+#~ msgid "Click here to learn what OpenID is and how Citadel is using it."
+#~ msgstr "Hier klicken um mehr über OpenID und Citadel zu lernen"
+
+#~ msgid " - powered by <a href='http://www.citadel.org'>Citadel</a>"
+#~ msgstr " - mit <a href=\"http://www.citadel.org\">Citadel</a> Technologie"
+
+#~ msgid "enter your user name and password and click &quot;Log in.&quot;"
+#~ msgstr "Benutzername und Passwort angeben und &quot;Anmelden&quot; clicken"
+
+#~ msgid "Enter your OpenID URL and click &quot;Log in&quot;."
+#~ msgstr "Geben Sie ihre OpenID URL ein, und &quot;Anmelden&quot; klicken"
+
+#~ msgid ""
+#~ "<ul><li>Enter your OpenID URL and click &quot;Log in&quot;.<li><a href="
+#~ "\"http://www.citadel.org/doku.php/documentation:openid\">Click here to "
+#~ "learn what OpenID is and how Citadel is using it.</a><li>Please log off "
+#~ "properly when finished. <li>You must use a browser that supports "
+#~ "<i>frames</i> and <i>cookies</i>. <li>Also keep in mind that if your "
+#~ "browser is configured to block pop-up windows, you will not be able to "
+#~ "receive any instant messages.<br></ul>"
+#~ msgstr ""
+#~ "<ul>\n"
+#~ "<li><b>Wenn Sie schon einen Benutzer bei %s</b> haben, Benutzername und "
+#~ "Passwort eingeben und 'Anmelden' drücken. </li>\n"
+#~ "<li><b>Wenn Sie einen neuen Benutzer anlegen wollen, Benutzername und "
+#~ "Passwort eingeben und 'Neuer Benutzer' drücken.</li>\n"
+#~ "<li>Bitte melden Sie sich ordentlich ab, wenn Sie fertig sind.</li>\n"
+#~ "<li>Ihr Browser muss <i>Frames</i> und <i>Cookies</i> unterstützen</li>\n"
+#~ "<li>Kurznachrichten könnten dem Popup-Blocker Ihres Browsers zum Opfer "
+#~ "fallen</li>\n"
+#~ "<br></ul>"
+
+#~ msgid ""
+#~ "enter your user name and password and click &quot;Log in.&quot;<li><b>If "
+#~ "you are a new user</b>, enter the name and password you wish to use, and "
+#~ "click &quot;New User.&quot; <li>Please log off properly when finished. "
+#~ "<li>You must use a browser that supports <i>frames</i> and <i>cookies</"
+#~ "i>. <li>Also keep in mind that if your browser is configured to block pop-"
+#~ "up windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "<ul>\n"
+#~ "<li><b>Wenn Sie schon einen Benutzer bei %s</b> haben, Benutzername und "
+#~ "Passwort eingeben und 'Anmelden' drücken. </li>\n"
+#~ "<li><b>Wenn Sie einen neuen Benutzer anlegen wollen, Benutzername und "
+#~ "Passwort eingeben und 'Neuer Benutzer' drücken.</li>\n"
+#~ "<li>Bitte melden Sie sich ordentlich ab, wenn Sie fertig sind.</li>\n"
+#~ "<li>Ihr Browser muss <i>Frames</i> und <i>Cookies</i> unterstützen</li>\n"
+#~ "<li>Kurznachrichten könnten dem Popup-Blocker Ihres Browsers zum Opfer "
+#~ "fallen</li>\n"
+#~ "<br></ul>"
+
+#~ msgid ""
+#~ "<I>This message contains calendaring/scheduling information, but support "
+#~ "for calendars is not available on this particular system.  Please ask "
+#~ "your system administrator to install a new version of the Citadel web "
+#~ "service with calendaring enabled.</I><br>\n"
+#~ msgstr ""
+#~ "<I>Diese Nachricht enthält Kalender/Datums Informationen, aber die "
+#~ "Unterstützung für Kalender ist auf diesem System nicht verfügbar. Bitte "
+#~ "fragen Sie ihren System-Administrator nach einer Version des Citadel-Web-"
+#~ "Services mit unterstützung für Kalender.</I><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display calendar item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Kann Kalender-Element nicht darstellen. Sie sehen diesen Fehler, weil "
+#~ "ihr  Citadel System ohne Kalenderunterstützung installiert wurde. Bitte "
+#~ "wenden Sie sich an Ihren Systemadministrator.</i><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display to-do item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Kann To-Do Datum nicht darstellen. Sie sehen diesen Fehler, weil ihr "
+#~ "Citadel System ohne Kalenderunterstützung installiert wurde. Bitte wenden "
+#~ "Sie sich an Ihren Systemadministrator.</i><br>\n"
diff --git a/webcit/po/webcit/el.po b/webcit/po/webcit/el.po
new file mode 100644 (file)
index 0000000..2c3cb8e
--- /dev/null
@@ -0,0 +1,4087 @@
+# Greek translation for citadel
+# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2010-10-27 09:24+0000\n"
+"Last-Translator: Impetus <Unknown>\n"
+"Language-Team: Greek <el@li.org>\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2010-10-28 05:00+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Διαγραφή"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Νέος χρήστης"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Προβληματικός χρήστης"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Τοπικός χρήστης"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Χρήστης δικτύου"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr ""
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Κύριος χρήστης"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr ""
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Επιβεβαιώστε νέους χρήστες"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Δεν υπάρχουν χρήστες για επιβεβαίωση αυτή τη στιγμή"
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "πολύ αδύναμο"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "ασθενές"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "ok!"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "ισχυρό"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Επιλέξτε ομάδα διαχείρησης για τον χρήστη:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Ακυρώθηκε. Ο κωδικός πρόσβασης δεν άλλαξε."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Δεν ταιριάζουν. Ο κωδικός πρόσβασης δεν άλλαξε."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Δεν επιτρέπεται κένο πεδίο στον κωδικό"
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "άγνωστη διαθεσιμότητα"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "ελεύθερο"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "ΑΠΑΣΧΟΛΗΜΕΝΟΣ"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Πήγαινε στη σελίδα: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Αρχή"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Τέλος"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Πρόσκληση για συνάντηση"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Δημοσίευση γεγονότος"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Αυτό είναι άγνωστο στοιχείο για το ημερολόγιο."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Περίληψη:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Τοποθεσία"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Ημερομηνία"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Περιγραφή"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr ""
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+"Αυτό το γεγονός έρχεται σε αντίθεση με το '%s' το οποίο υπάρχει ήδη στο "
+"ημερολόγιό σας."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Ενημέρωση:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "ΑΝΤΙΘΕΣΗ"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Πώς θα θέλατε να απαντήσετε σε αυτή την πρόσκληση;"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Αποδοχή"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Αβέβαιος"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Άρνηση"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Πατήστε <i>Ενημέρωση<i> για να αποδεχτείτε αυτή την απάντηση και να "
+"ενημερώσετε το ημερολόγιό σας."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Ενημέρωση"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+"Υπήρξε ένα σφάλμα κατά την εισαγωγή αυτού του στοιχείου στο ημερολόγιο."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+"Αποδεχτείκατε την πρόσκληση σε συνάντηση και προσθέθηκε στο ημερολόγιό σας."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr "Απορρίψατε την πρόσκληση σε συνάντηση. Δεν εισήχθη στο ημερολόγιό σας."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Μια απάντηση στάλθηκε στον διαχειριστή της συνάντησης."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr ""
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr ""
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr ""
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr ""
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr ""
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr ""
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr ""
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr ""
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr ""
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr ""
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr ""
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr ""
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr ""
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr ""
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr ""
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr ""
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr ""
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr ""
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr ""
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr ""
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr ""
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr ""
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr ""
+
+#: ../../event.c:89
+msgid "Event"
+msgstr ""
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr ""
+
+#: ../../event.c:222
+msgid "Location"
+msgstr ""
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr ""
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr ""
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr ""
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Ακύρωση"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr ""
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr ""
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr ""
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr ""
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr ""
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr ""
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr ""
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr ""
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr ""
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr ""
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr ""
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr ""
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr ""
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr ""
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr ""
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr ""
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr ""
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr ""
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr ""
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr ""
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr ""
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr ""
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr ""
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr ""
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr ""
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr ""
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr ""
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr ""
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr ""
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr ""
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Αυτό το πρόγραμμα ήταν αδύνατο να συνδεθεί και να μείνει συνδεδεμένο με τον "
+"εξυπηρετητή του Citadel. Παρακαλώ ενημερώστε τον διαχειριστή του συστήματος "
+"για το συγκεκριμένο πρόβλημα."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Διαβάστε περισσότερα..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr ""
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+#, fuzzy
+msgid "Access"
+msgstr "Αποδοχή"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+#, fuzzy
+msgid "New user: "
+msgstr "Νέος χρήστης"
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+#, fuzzy
+msgid "Password"
+msgstr "Αλλάξτε κωδικό πρόσβασης"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+#, fuzzy
+msgid "Initial access level for new users"
+msgstr "Επιλέξτε ομάδα διαχείρησης για τον χρήστη:"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+#, fuzzy
+msgid "Network services"
+msgstr "Χρήστης δικτύου"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr "Καθολικά ψευδώνυμα ηλεκτρονικού ταχυδρομείου"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Έξοδος"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Θα πρέπει να συνδεθείτε για να αποκτήσετε πρόσβαση σε αυτήν τη σελίδα."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+#, fuzzy
+msgid "Log in"
+msgstr "Συνδεθείτε ξανά"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Νέος χρήστης; Εγγραφείτε τώρα"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Συνδεθείτε ξανά"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr ""
+"Αυτό το γεγονός έρχεται σε αντίθεση με το '%s' το οποίο υπάρχει ήδη στο "
+"ημερολόγιό σας."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr ""
+"Αυτό το γεγονός έρχεται σε αντίθεση με το '%s' το οποίο υπάρχει ήδη στο "
+"ημερολόγιό σας."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr ""
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+#, fuzzy
+msgid " to the "
+msgstr "Πήγαινε στη σελίδα: "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+#, fuzzy
+msgid "Logged in as"
+msgstr "Συνδεθείτε ξανά"
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Συνδεθείτε ξανά"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+#, fuzzy
+msgid "Summary page"
+msgstr "Περίληψη:"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+#, fuzzy
+msgid "(all registered users)"
+msgstr "Επιβεβαιώστε νέους χρήστες"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Αλλάξτε τον κωδικό πρόσβασης"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Εισάγετε νέο κωδικό πρόσβασης:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Εισάγετε το νέο κωδικό πρόσβασης ξανά για επιβεβαίωση:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+#, fuzzy
+msgid "Manage your OpenIDs"
+msgstr "Αλλάξτε τον κωδικό πρόσβασης"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "νεότερες δημοσιεύσεις"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+msgid "Name of the blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+#, fuzzy
+msgid "Enter room password:"
+msgstr "Εισάγετε νέο κωδικό πρόσβασης:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+#, fuzzy
+msgid "Users"
+msgstr "Νέος χρήστης"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+#, fuzzy
+msgid "Network shared room"
+msgstr "Χρήστης δικτύου"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+#, fuzzy
+msgid "Room aide: "
+msgstr "Πήγαινε στη σελίδα: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+#, fuzzy
+msgid "Actions"
+msgstr "Τοποθεσία"
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr ""
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+#, fuzzy
+msgid "Summary page for "
+msgstr "Περίληψη:"
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr ""
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr ""
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "νεότερες δημοσιεύσεις"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "μεγάλα θέσεις"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+msgid "comments"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr ""
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Πήγαινε στη σελίδα: "
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "There is no page called '"
+msgstr ""
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Χρήστης δικτύου"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Αβέβαιος"
+
+#~ msgid "Add"
+#~ msgstr "Προσθήκη"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Νέος χρήστης"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Διαγραφή"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Διαγραφή"
+
+#, fuzzy
+#~ msgid "Delete rule"
+#~ msgstr "Διαγραφή"
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "Αλλάξτε κωδικό πρόσβασης"
+
+#, fuzzy
+#~ msgid "Master user password"
+#~ msgstr "Εισάγετε νέο κωδικό πρόσβασης:"
+
+#~ msgid "Change password"
+#~ msgstr "Αλλάξτε κωδικό πρόσβασης"
+
+#, fuzzy
+#~ msgid "Network"
+#~ msgstr "Χρήστης δικτύου"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Αλλάξτε κωδικό πρόσβασης"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Ο κωδικός δεν ήταν αποδεκτός"
diff --git a/webcit/po/webcit/en_GB.po b/webcit/po/webcit/en_GB.po
new file mode 100644 (file)
index 0000000..6583cee
--- /dev/null
@@ -0,0 +1,4404 @@
+# translation of webcit.po to en_GB.po
+# Copyright (C) 2008 - 2009 The Citadel Project - http://www.citadel.org
+# This file is distributed under the revised BSD license
+#
+# WebCit messages for UK English
+# Copyright (C) 2005 David Given
+# This file is distributed under GPL v3
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2012-09-19 15:57+0000\n"
+"Last-Translator: Biffaboy <Unknown>\n"
+"Language-Team: <room_citadel_translators@uncensored.citadel.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-09-20 04:31+0000\n"
+"X-Generator: Launchpad (build 15985)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Deleted"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "New User"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Problem User"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Local User"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Network User"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Preferred User"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Admin"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "An error has occurred."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Validate new users"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "No users require validation at this time."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "very weak"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "weak"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "ok"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "strong"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Current access level: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Select access level for this user:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Cancelled.  Password was not changed."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "They don't match.  Password was not changed."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Blank passwords are not allowed."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "availability unknown"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "free"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "BUSY"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Go to page: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "First"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Last"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Meeting invitation"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Attendee's reply to your invitation"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Published event"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "This is an unknown type of calendar item."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Summary:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Location:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Date:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Starting date/time:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Ending date/time:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Description:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Recurrence"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "This is a recurring event"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Attendee:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "This is an update of '%s' which is already in your calendar."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr "This event would conflict with '%s' which is already in your calendar."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Update:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "CONFLICT:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "How would you like to respond to this invitation?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Accept"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Tentative"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Decline"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr "Click <i>Update</i> to accept this reply and update your calendar."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Update"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignore"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "There was an error parsing this calendar item."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "A reply has been sent to the meeting organiser."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Your calendar has been updated to reflect this RSVP."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Calendar day view begins at:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Calendar day view ends at:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Week starts on:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Hour: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minute: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(status unknown)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(needs action)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(accepted)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(declined)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(tenative)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(delegated)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(completed)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(in process)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(none)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Untitled Event"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "From"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Starting date:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Ending date:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Date/time:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Notes:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "previous"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "next"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Week"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Hours"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Subject"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Start"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "End"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "All day event"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Ongoing event"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Untitled Task"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "An error occurred while retrieving this file: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "seconds"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minutos"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "hours"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "days"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "weeks"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "months"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "years"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "never"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "first"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "second"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "third"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "fourth"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "fifth"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Event"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Attendees"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Add or edit an event"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Summary"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Location:"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Notes"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organiser"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(you are the organiser)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Show time as:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Free"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Busy"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(One per line)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Contacts"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Recurrence rule"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Repeats every"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "on these weekdays:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "on day %s%d%s of the month"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "on the "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "of the month"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "every "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "year on this date"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "of"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Recurrence range"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "No ending date"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Repeat this event"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "times"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Repeat this event until "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Save"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Delete"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Check attendee availability"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Cancel"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Time format"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Graphics upload has been cancelled."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "You didn't upload a file."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "your photo"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "the icon for this room"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "graphics to be displayed on the login screen"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "the Logoff banner picture"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "realloc() error! couldn't get %d bytes: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Iconbar Setting"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Invalid Parameter"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr " has been deleted."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr " added."
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Higher access is required to access this function."
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr "You need to specify the mailinglist to subscribe to."
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "You need to specify the email address you'd like to subscribe with."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(no subject)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "ERROR:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Empty message"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Cancelled.  Message was not posted."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Automatically cancelled because you have already saved this message."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "Saved to Drafts failed: "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "Refusing to post empty message.\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "Message has been saved to Drafts.\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Message has been sent.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Message has been posted.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "The message was not moved."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "An error occurred while retrieving this part: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "An error occurred while retrieving this part: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Attach signature to email messages?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Use this signature:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Default character set for email headers:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Preferred email address"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Preferred display name for email messages"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Preferred display name for bulletin board posts"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Mailbox view mode"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "I don't know how to display "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Click on any note to edit it."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Manage Account/OpenID Associations"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Do you really want to delete this OpenID?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(delete)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Add an OpenID: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Attach"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s does not permit authentication via OpenID."
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Send instant message"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Send an instant message to: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Enter message text:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Send message"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Message was not sent."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Message has been sent to "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Cancelled.  No settings were changed."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Make this my start page"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "This isn't allowed to become the start page."
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "You no longer have a start page selected."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "Prefered startpage"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "My Folders"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Cancelled.  Changes were not saved."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Your changes have been saved."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "User '%s' kicked out of room '%s'."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "User '%s' invited to room '%s'."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Cancelled.  No new room was created."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Floor has been deleted."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "New floor has been created."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Room list view"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Show empty floors"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "file"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "files"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Bulletin Board"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Mail Folder"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Address Book"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Calendar"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Task List"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Notes List"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Calendar List"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Journal"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Drafts"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "Received unexpected answer from Citadel server; bailing out."
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Your system configuration has been updated."
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr "First Attempt pending"
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(None)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Nothing)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Cancelled.  %s was not saved."
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr " has been saved."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Room info"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Your bio"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Completed?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Name of task"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Date due"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Category"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Show All"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Edit task"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Start date:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "No date"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "or"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Time associated"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Due date:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Completed:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Category:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"An error occurred while trying to create or edit this address book entry."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Changes were not saved."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "A new user has been created."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Could Not decode vcard photo\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Error"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Unable to enter the room to save your message"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Aborting."
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(no name)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "edit"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Authorisation Required"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Read More..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' is not a Wiki room."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Date"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Author"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(show)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Current version"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(revert)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Page title"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Enter a server command"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Enter command:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Command input (if requesting SEND_LISTING transfer mode):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr "Detected host header is "
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Server command results"
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr "Enter another command"
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr "Return to menu"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Network configuration"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Add a new node"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Currently configured nodes"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "System Administration Menu"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr "Room Admin Menu"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Local host aliases"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Smart hosts"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr "Notification hosts"
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "RBL hosts"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "SpamAssassin hosts"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr "ClamAV clamd hosts"
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr "Masqueradable domains"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Global Configuration"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "User account management"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "Shutdown Citadel"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Rooms and Floors"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr "Restart Citadel"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "Message to your Users:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Site configuration"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr "You need to be aide to view this."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "General"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Iconbar Setting"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "Push Email"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indexing/Journaling"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Access"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr "Directory"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Auto-purger"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "New user: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Edit user account: "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "User name:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Password"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Permission to send Internet mail"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Primary Internet e-mail address"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Internet e-mail aliases"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Number of logins"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Messages submitted"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Access level"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "User ID number"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Date and time of last login"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Auto-purge after this many days"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Edit or delete users"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Add users"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Edit or Delete users"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Add, change, or delete floors"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Node name"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Shared secret"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Host or IP address"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Port number"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Confirm delete"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Are you sure you want to delete "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Yes"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "No"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr "(Edit)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Delete)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(domains for which this host receives mail)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(hosts running the ClamAV clamd service)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(domains mapped with the Global Address Book)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr "(send outbound mail to these hosts only when direct delivery fails)"
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "(Domains as which users are allowed to masquerade)"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr "(URLS for notifications when users receive new mails; )"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(hosts running a Realtime Blackhole List)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr "(if present, forward all outbound mail to one of these hosts)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(hosts running the SpamAssassin service)"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Restart Now"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "Restart after paging users"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "Restart when all users are idle"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "Please wait while the Citadel server is restarted... "
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Access controls and site policy settings"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Allow aides to zap (forget) rooms"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Quarantine messages from problem users"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Name of quarantine room"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Name of room to log pages"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr "Authentication mode"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr "Self contained"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr "Host based"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr "LDAP (RFC2307)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr "LDAP (Active Directory)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr "Allow anonymous guest access"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Initial access level for new users"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Access level required to create rooms"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr "Automatically grant room-aide status to users who create private rooms"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr "Automatically grant room-aide status to users who create BLOG rooms"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Restrict access to Internet mail"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Disable self-service user account creation"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr "Hint: do not select both!"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "Require registration for new users"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Configure automatic expiry of old messages"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr "These settings may be overridden on a per-floor or per-room basis."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Hour to run database auto-purge"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "Default message expire policy for public rooms"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Never automatically expire messages"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Expire by message count"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Expire by message age"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Number of messages or days: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr "Default message expire policy for private mailboxes"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Same policy as public rooms"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Default user purge time (days)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Default room purge time (days)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Configure the LDAP connector for Citadel"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Host name of LDAP server (blank to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Port number of LDAP server (blank to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "Base DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "Bind DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Password for bind DN"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "General site configuration items"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "Change Login Logo"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "Change Logout Logo"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Fully qualified domain name"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Human-readable node name"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Telephone number"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Paginator prompt (for text mode clients)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Geographic location of this system"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Name of system administrator"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Default timezone for unzoned calendar items"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "IMAP listener port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "IMAP over SSL port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr "Keep original from headers in IMAP"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indexing and Journaling"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Warning: these facilities are resource intensive."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Enable full text index"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "Perform journaling of email messages"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "Perform journaling of non-email messages"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "Email destination of journalized messages"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "POP3 listener port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "POP3 over SSL port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr "POP3 fetch frequency in seconds"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "POP3 fastest fetch frequency in seconds"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr "Funambol server host (blank to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "Funambol server port "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "Funambol sync source"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "Funambol auth details (user:pass)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr "External pager tool (blank to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Network services"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "Server IP address (0.0.0.0 for 'any')"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "XMPP (Jabber) client to server port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "XMPP (Jabber) server to server port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "POP3 listener port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "POP3 listener port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Advanced server fine-tuning controls"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Maximum message length"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Server connection idle timeout (in seconds)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "Network run frequency (in seconds)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Maximum concurrent sessions (0 = no limit)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Minimum number of worker threads"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Maximum number of worker threads"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Automatically delete committed database logs"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "SMTP MTA port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "SMTP MSA port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTP over SSL port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr "Perform RBL checks upon connect instead of after RCPT"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "Flag message as spam, instead of rejecting it"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr "Allow unauthenticated SMTP clients to spoof this sites domains"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "Correct forged From: lines during authenticated SMTP"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr "Postfix TCP Dictionary Port"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr "-1 to disable"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "ManageSieve Port (-1 to disable)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Add, change, delete user accounts"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Edit site-wide configuration"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Domain names and Internet mail configuration"
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr "Global email aliases"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "View the outbound SMTP queue"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Log off"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Basic commands"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Your info"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Advanced room commands"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Loading"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Anonymous"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Post message"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr "Save to Drafts"
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Attachments:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "from"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "in"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "To:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "CC:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "BCC:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Subject (optional):"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Subject:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- forwarded message ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Close window"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Attach file"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr "Remove"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Files available for download in"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Upload a file:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "File Name"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Size"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Content"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Description"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Image upload"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "You can upload an image directly from your computer"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Please select a file to upload:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Slideshow"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Add/change/delete floors"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Floor number"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Floor name"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Number of rooms"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "Floor CSS"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(delete floor)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "You must be logged in to access this page."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "Log in using a user name and password"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Password"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Log in"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "New user?  Register now"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Log in using OpenID"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "OpenID URL:"
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr "Log in using Google"
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr "Log in using Yahoo"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr "Log in using AOL or AIM"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr "Enter your AOL or AIM screen name:"
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "Please wait"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "This is an update of '%s' which is already in your calendar."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr "This event would conflict with '%s' which is already in your calendar."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Language:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Mail"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Tasks"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Rooms"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Online users"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Chat"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Advanced"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Administration"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "customise this menu"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "switch to room list"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "switch to menu"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "My folders"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Customise the icon bar"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Display icons as:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "pictures and text"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "pictures only"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "text only"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Site logo"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "An icon describing this site"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Your summary page"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Mail (inbox)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "A shortcut to your email Inbox"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Your personal address book"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Your personal notes"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "A shortcut to your personal calendar"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "A shortcut to your personal task list"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Who is online?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr "Clicking this icon displays a list of all users currently logged in."
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Advanced options"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Access to the complete menu of Citadel functions."
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Citadel logo"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Displays the 'Powered by Citadel' icon"
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "List subscription"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "List subscribe/unsubscribe"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Confirmation request sent"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr "You are subscribing "
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr " to the "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr " mailing list."
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Go back..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr "ERROR"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr "You are unsubscribing"
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr "from the"
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr "mailing list."
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr "Back..."
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr "Confirmation successful!"
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr "Confirmation failed."
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr "This could mean one of two things:"
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr "The error returned by the server was: "
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr "Name of list:"
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr "Your e-mail address:"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr "(If subscribing) preferred format: "
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr "One message at a time"
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr "Digest format"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr "Logged in as"
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr "Not logged in."
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "powered by"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Log in again"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Edit or delete this room"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Go to a 'hidden' room"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Create a new room"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Create a new room"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "Zap (forget) this room"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "List all forgotten rooms"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Read new messages"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "List known rooms"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Where can I go from here?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Goto next room"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "...with <em>unread</em> messages"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Skip to next room"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(come back here later)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Ungoto"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "oops! Back to "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Read new messages"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "...in this room"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Read all messages"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "...old <em>and</em> new"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Enter a message"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(post in this room)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "File library"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(List files available for download)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Summary page"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Summary of my account"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "User list"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(all registered users)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Bye!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Change your password"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Enter new password:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Enter it again to confirm:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Change your preferences and settings"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Update your contact information"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Enter your 'bio'"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Edit your online photo"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "View/edit server-side mail filters"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "Edit your push email settings"
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr "Manage your OpenIDs"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Confirm move of message"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Move this message to:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Reading #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "messages"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "oldest to newest"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "newest to oldest"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Sender"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Loading messages from server, please wait"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Open in new window"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Move"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Copy"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Print"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "View contacts"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Add new contact"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Day view"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Month view"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Add new event"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Calendar list"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "View tasks"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Add new task"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "View notes"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Add new note"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Refresh message list"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Write mail"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Wiki home"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Edit this page"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "History"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr "New blog post"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Skip this room"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "New start page"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "Your start page has been changed."
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "No new messages."
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "Your OpenID"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "was successfully verified."
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr "However, the user name"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "conflicts with an existing user."
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Please specify the user name you would like to use."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Preferences and settings"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Tree (folders) view"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Table (rooms) view"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 hour (am/pm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 hour"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Sunday"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Monday"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "No signature"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "Full-functionality"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Safe mode"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr "Configure Push Email"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "Push email and SMS settings"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr "Notify Funambol server"
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr "Send a text message to..."
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr "Use custom notification scheme configured by your Admin"
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr "Don‘t send any notifications"
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Name of room: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Resides on floor: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Default view for room: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Type of room:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Public (automatically appears to everyone)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Private - hidden (accessible to anyone who knows its name)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Private - require password: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Private - invitation only"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Personal (mailbox for you only)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Create a new room"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Name of room: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Default view for room: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Type of room:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Edit this rooms Info file"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Go to a hidden room"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Enter room name:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Enter room password:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Configuration"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Message expire policy"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Access controls"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Sharing"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Mailing list service"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Remote retrieval"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(remove)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Invite:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Users"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Delete this room"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr "Set or change the icon for this rooms banner"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr "Edit this rooms Info file"
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr "name of room: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "If private, cause current users to forget room"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Preferred users only"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Read-only room"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "All users allowed to post may also delete messages"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "File directory room"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Directory name: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Uploading allowed"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Downloading allowed"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Keep messages on server?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Visible directory"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Network shared room"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanent (does not auto-purge)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "Subject Required (Force users to specify a message subject)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Anonymous messages"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "No anonymous messages"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "All messages are anonymous"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Prompt user when entering messages"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Room aide: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Message expire policy for this room"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Use the default policy for this floor"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Message expire policy for this floor"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Use the system default"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "Remote host"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "User name"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Keep messages on server?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "Interval"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Fetch the following RSS feeds and store them in this room:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "Feed URL"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Add recipients from Contacts or other address books"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "Allow non-subscribers to mail to this room."
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "Room post publication needs Admin permission."
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr "Allow self-service subscribe/unsubscribe requests."
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "The URL for subscribe/unsubscribe is: "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Not shared with"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Shared with"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Remote node name"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Remote room name"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Actions"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well. "
+"<li>If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node. <li>If the remote room name is different, the "
+"remote node must also configure the name of the room here."
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Room info"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Zap (forget/unsubscribe) the current room"
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr "If you select this option,"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr "will disappear from your room list.  Is this what you wish to do?"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Zapped (forgotten) rooms"
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Click on any room to un-zap it and goto that room."
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "new of"
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Select page: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Search: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "All"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Add or delete scripts"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Add a new script"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Script name: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Edit scripts"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Return to the script editing screen"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Delete scripts"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "If"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "To or Cc"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Reply-to"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Resent-From"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Resent-To"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Envelope From"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Envelope To"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-Flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Status"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "List-ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Message size"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "contains"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "does not contain"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "is"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "is not"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "matches"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "does not match"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(All messages)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "is larger than"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "is smaller than"
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr "bytes"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Keep"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Discard silently"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Reject"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Move message to"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Forward to"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Vacation"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Message:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "and then"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "continue processing"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "stop"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "When new mail arrives: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Filter it according to rules selected below"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Leave it in my inbox without filtering"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr "Filter it through a manually edited script (advanced users only)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Add rule"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "Old messages"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "New messages"
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr "Summary page for "
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Messages"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Today&nbsp;on&nbsp;your&nbsp;calendar"
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Who‘s&nbsp;online&nbsp;now"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "About&nbsp;this&nbsp;server"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr "You are connected to"
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr "running"
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr "with"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr "server build"
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr "and located in"
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr "Your system administrator is"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Enter your 'bio'"
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr "User list for "
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "User Name"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Number"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Access Level"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Last Login"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Total Logins"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Total Posts"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "User profile"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr "Click here to send an instant message to"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Edit contact information"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Prefix"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "First Name"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Middle Name"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Last Name"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Suffix"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Display name:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Title:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organisation:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "PO box:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Address:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "City:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "County:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Post code:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Country:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Home telephone:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Work telephone:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Mobile telephone:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Fax number:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "This address book is empty."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "An internal error has occurred."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Post a comment"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "Newer posts"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "Older posts"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d comments"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "permalink"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "new of"
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "You do not have permission to view this resource."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "The queue is empty."
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Refresh this page"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Remote host"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "County:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "continue processing"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr "Originaly posted in: "
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "Message ID"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Date/time submitted"
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr "Next attempt"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Recipients"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "from "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "to"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "Edit"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Reply"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "ReplyQuoted"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "ReplyAll"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Forward"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Headers"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "View"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Download"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "View as:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "Users currently on "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr "Click on a name to read user info.  Click on"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "to send an instant message to that user."
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(kill)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Room"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "From host"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Edit your session display"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Room name:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Host name:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr "Users currently on"
+
+#: ../../static/t/who/section.html:5
+#, fuzzy
+msgid "Edit configuration"
+msgstr "Site configuration"
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "This address book is empty."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "on the "
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "There is no page called '%s' here."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr "History of edits for this page"
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr "List of Wiki pages"
+
+#~ msgid "the icon for this floor"
+#~ msgstr "the icon for this floor"
+
+#~ msgid "Edit %s"
+#~ msgstr "Edit %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Save changes"
+
+#~ msgid " (work)"
+#~ msgstr " (work)"
+
+#~ msgid " (home)"
+#~ msgstr " (home)"
+
+#~ msgid " (cell)"
+#~ msgstr " (mobile)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telephone:"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Directory domains"
+
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Fallback smart hosts"
+
+#, fuzzy
+#~ msgid "Create new room"
+#~ msgstr "Create a new room"
+
+#, fuzzy
+#~ msgid "Zap this room"
+#~ msgstr "Skip this room"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Network shared room"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Add a new node"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "minutos"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Tentative"
+
+#, fuzzy
+#~ msgid "Send"
+#~ msgstr "Sender"
+
+#, fuzzy
+#~ msgid "Delete this message?"
+#~ msgstr "Delete this room"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Room info"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "pictures only"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Upload a file:"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Are you sure you want to delete "
+
+#~ msgid "Upload"
+#~ msgstr "Upload"
+
+#~ msgid "Add"
+#~ msgstr "Add"
+
+#, fuzzy
+#~ msgid "Invite"
+#~ msgstr "Invite:"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Users"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Address Book"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Delete scripts"
+
+#, fuzzy
+#~ msgid "Delete this user?"
+#~ msgstr "Delete this room"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Delete"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "Your incoming mail will not be filtered through any scripts."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "The currently active script is: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Configure replication with other Citadel servers"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Displays the 'Powered by Citadel' icon"
+
+#, fuzzy
+#~ msgid "Go to your email inbox"
+#~ msgstr "A shortcut to your email Inbox"
+
+#, fuzzy
+#~ msgid "Go to your personal calendar"
+#~ msgstr "A shortcut to your personal calendar"
+
+#, fuzzy
+#~ msgid "Go to your personal address book"
+#~ msgstr "Your personal address book"
+
+#, fuzzy
+#~ msgid "Go to your personal notes"
+#~ msgstr "Your personal notes"
+
+#, fuzzy
+#~ msgid "Go to your personal task list"
+#~ msgstr "A shortcut to your personal task list"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "List all forgotten rooms"
+
+#, fuzzy
+#~ msgid "Room and system administration functions"
+#~ msgstr "Your system administrator is"
+
+#, fuzzy
+#~ msgid "Reset form"
+#~ msgstr "Digest format"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Delete this room"
+
+#, fuzzy
+#~ msgid "Create new floor"
+#~ msgstr "Create a new room"
+
+#, fuzzy
+#~ msgid "Delete rule"
+#~ msgstr "Delete"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(edit graphic)"
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "Change room name"
+
+#, fuzzy
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Are you sure you want to delete "
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Enter command:"
+
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "Master user name (blank to disable)"
+
+#~ msgid "Master user password"
+#~ msgstr "Master user password"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "Delete this room"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "List-ID"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "Digest format"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Subject"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Do you really want to delete this OpenID?"
+
+#, fuzzy
+#~ msgid "Share"
+#~ msgstr "Sharing"
+
+#~ msgid "Change password"
+#~ msgstr "Change password"
+
+#~ msgid "Change room name"
+#~ msgstr "Change room name"
+
+#~ msgid "Change host name"
+#~ msgstr "Change host name"
+
+#~ msgid "Change user name"
+#~ msgstr "Change user name"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Save changes"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "There is no room called '%s'."
+
+#~ msgid "Network"
+#~ msgstr "Network"
+
+#~ msgid "Tuning"
+#~ msgstr "Tuning"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Instantly expunge deleted messages in IMAP"
diff --git a/webcit/po/webcit/es.po b/webcit/po/webcit/es.po
new file mode 100644 (file)
index 0000000..5da5596
--- /dev/null
@@ -0,0 +1,4775 @@
+# translation of webcit.po to es_ES.po
+# Copyright (C) 2008 - 2009 The Citadel Project - http://www.citadel.org
+# Gabriel C. Huertas <gabrielhuertas@terra.es>
+# Carlos Zayas Guggiari
+#
+# Spanish translation
+# Copyright (C) 2005 - 2009 By Gabriel C. Huertas
+# This file is distributed under the GNU General Public License;
+# either Version 2 or
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2013-05-03 18:39+0000\n"
+"Last-Translator: Carlos Zayas Guggiari <Unknown>\n"
+"Language-Team: Spanish <room_citadel_translators@uncensored.citadel.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-05-04 05:10+0000\n"
+"X-Generator: Launchpad (build 16598)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Borrado"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Nuevo Usuario"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Usuario Problemático"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Usuario Local"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Usuario de la red"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Usuario Preferente"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Administrador"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Se produjo un error"
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Validación de nuevos usuarios"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Ningún usuario requiere validación por el momento"
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "muy débil"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "débil"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "correcto"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "fuerte"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Nivel actual de acceso: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Seleccione el nivel de acceso para este usuario:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Cancelado. No se cambió la contraseña."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "No cuadran. La contraseña no se cambia."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "No se permiten contraseñas en blanco"
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "disponibilidad desconocida"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "libre"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "OCUPADO"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Ir a la página: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Primera"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Última"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Invitación a reunión"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Respuesta en atención a la invitación"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Evento publicado"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Este es un elemento de calendario desconocido."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Sumario"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Localización"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Fecha"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Fecha/hora de comienzo:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Fecha/hora de finalización:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Descripción:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Este es un evento recurrente"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Attn.:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Esta es una actualizaciñon de '%s' que está ya en su calendario."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+"Este evento entrará en conflicto con '%s' que está ya en su calendario."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Actualizar:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "CONFLICTO"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "¿Como le gustaría responder a esta invitación?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Aceptar"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Tentativa"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Declinar"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Pulse <i>Actualizar</i> para aceptar esta respuesta y actualizar su "
+"calendario."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Actualizar"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignorar"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Se produjo un error al pasar este elemento de calendario."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr "Aceptaste la convocatoria de reunión. Se ha anotado en tu calendario"
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Aceptaste tentativamente la convocatoria de reunión. Se anotó'a lápiz' en tu "
+"calendario"
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Declinaste la convocatoria de reunión. <b>No</b> se anotó en tu calendario"
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Se envió una respuesta al organizador de la reunión."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Su calendario se actualizó para reflegar este RSVP."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr "Eligió ignorar este RSVP. Su calendario <b>no</b> se actualizó"
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "La visualización del calendario comienza por el dia:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Los dias mostrados del calendario finalizan en:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "La semana comienza el día:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Hora "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minuto "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(estado desconocido)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(requiere actuación)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(aceptado)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(declinado)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(tentativo)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(delegado)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(completado)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(en proceso)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(ninguno)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Evento sin título"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "De"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Fecha de inicio:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Fecha de fin:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Fecha/hora:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Notas:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "anterior"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "siguiente"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Semana"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Horas"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Asunto"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Comienzo"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Fin"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Todos los eventos del día"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Evento en curso"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Tarea sin título"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "Un error ocurrió mientras se obtenía este archivo: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "segundos"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minutos"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "horas"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "días"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "semanas"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "meses"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "años"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "nunca"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "primero"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "segundo"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "tercero"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "cuarto"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "quinto"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Evento"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Attn."
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Añadir o editar un evento"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Sumario"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Localización"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Notas"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organizador"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(tu eres el organizador)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Mostrar hora como:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Libre"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Ocupado"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(Uno por línea)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Contactos"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Regla de recuerrencia"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Se repite cada"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "en estos días laborables:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "en días %s%d%s de el mes"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "en el "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "del mes"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "cada "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "año de esta fecha"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "de"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Rango recurrente"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Sin fecha de finalización"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Repetir este evento"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "veces"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Repetir este evento hasta "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Guardar"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Eliminar"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Comprobar posibilidad de atender"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Formato horario"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Carga de gafico cancelada."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "No subiste ningún fichero."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "tu foto"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "el icono par esta sala"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "la imagen de Saludo para el indicador de entrada"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "la imagen de la bandera de cierre de sessión"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "¡realloc() error! no se pudieron conseguir %d bytes: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Configuración de barra de iconos"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Parámetro inválido"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr " ha sido borrado"
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr " agregado"
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+"Para acceder a esta funcionalidad, se necesita tener un mayor nivel de "
+"acceso."
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr "Necesita especificar la lista de correo a suscribirse"
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+"Necesita especificar la dirección de correo con la que desea suscribirse."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(sin asunto)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "ERROR"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Mensaje vacío"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Cancelado. El mensaje no ha sido enviado."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Cancelado automáticamente porque ya habías salvado este mensaje."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "Guardar a Borradores fallo: "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "Se negó enviar mensaje vacío.\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "El mensaje ha sido guardado en Borradores.\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "El mensaje ha sido enviado.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "El mensaje ha sido enviado.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "No se movió el mensaje."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "Un error ocurrió mientras se obtenía esta parte: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Ocurrió un error mientras se recuperaba esta parte: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "¿Añadir firma a el correo electrónico?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Usar esta firma:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Juego de caracteres por defecto para cabeceras de correo:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Dirección de correo preferida"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Nombre preferido a mostrar para mensajes de correo"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Nombre preferido a mostrar en envíos al tablero de mensajes"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Modo de vista buzón"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "No se como mostrarlo "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Pulse en cualquier nota para editarla"
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Administrar Asociación Cuenta/OpenID"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Realmente quiere borrar este OpenID?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(eliminar)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Agregar un OpenID: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Adjuntar"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s no permite autenticación vía OpenID."
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Enviar mensaje instantáneo"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Enviar un mensaje instantáneo a: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Introducir texto de mensaje:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Enviar mensaje"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "El mensaje no se envió."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "El mensaje ha sido enviado a "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Cancelado. No se cambió la configuración."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Hacer de esta mi página de inicio"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "Está no está permitida para ser la página de inicio."
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Ya no tiene página de inicio seleccionada."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "Página de inicio preferida"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Mis carpetas"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Cancelado. Los cambios no se salvaron"
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Los cambios han sido salvados"
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Usuario %s expulado de la sala %s."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Usuario %s invitado a la sala %s."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Cancelado. Ninguna sala nueva se creó."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "El nivel fue borrado."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Un nuevo nivel ha sido creado."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Ver listado de salas"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Mostrrar pisos vacíos"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "archivo"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "archivos"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Tablón de anuncios"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Carpeta de Correo"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Libreta de Direcciones"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Calendario"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Lista de Tareas"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Lista de Notas"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Lista de Calendario"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Diario"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Borradores"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Este servidor ya está sirviendo su número máximo de usuarios y no puede "
+"aceptar inicios de sesión adicionales en este momento. Por favor, inténtelo "
+"de nuevo más tarde o póngase en contacto con el administrador del sistema."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "Respuesta inesperada desde el servidor Citadel; liberando operación."
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Estas conectado a un servidor Citadel, corriendo Citadel %d.%02d. \n"
+"Para poder correr esta versión de WebCit, también debes tener Citade %d.%02d "
+"o posterior.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Su confiración de sistema ha sido actualizada"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr "Primer Intento pendiente"
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Ninguno)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Nada)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Cancelado %s no se salvó"
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr " a sido guardado."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Información de sala"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Tu biografía"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "¿Terminado?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Nombre de la tarea"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Fecha coclusión"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Categoría"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Mostrar Todo"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Editar tarea"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Fecha de inicio"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Sin fecha"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "o"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Tiempo asociado"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Fecha finalización"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Completado:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Categoría:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"Un error ocurrio mientras intentaba crear o editar esta entrada en la "
+"libreta de direcciones."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Los cambios no se salvaron"
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Se creó un nuevo usuario"
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"Está intentando crear un nuevo usuario denrtro de Citadel el cual está en "
+"modo de autenticación basado en anfitrión. En este modo, debe crear nuevos "
+"usuarios en el sistema anfitrión, no dentro de Citadel."
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "No se pudo descodificar vcard foto\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Error"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Imposible entrar en la sala para guardar el mensaje"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Abortando."
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(sin nombre)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "editar"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Autorización requerida"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"El recurso solicitado rquiere un nombre y contraseña de usuarios válidos. No "
+"podrás conectarte a: %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Este programa fue incapaz de conectarse o de permanecer conectado al "
+"servidor Citadel.Por favor, informe de este problema al administrador del "
+"sistema."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Leer más..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' no es una sala Wiki."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Fecha"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Autor"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(mostrar)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Versión actual"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(revertir)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Título de página"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Introducir comando de servidor"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Esta pantalla te permite introducir comandos del servidor Citadel que no "
+"están soportados por WebCit. Si no sabes que quiere decir eso, esta pantalla "
+"no te será de mucha utilidad."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Introducir comando"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Introducción de comando (si se pidiera SEND_LISTING transfer mode):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+#, fuzzy
+msgid "Detected host header is "
+msgstr "La cabecera detectada del host es %s://%s"
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Resultado de los comandos de servidor"
+
+#: ../../static/t/aide/display_generic_result.html:18
+#, fuzzy
+msgid "Enter another command"
+msgstr "Introducir comando de servidor"
+
+#: ../../static/t/aide/display_generic_result.html:19
+#, fuzzy
+msgid "Return to menu"
+msgstr "cambiar a menú"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Configuración de Red"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Añadir un nuevo nodo"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Nodos actualmente configurados"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "Menú de Administración de Sistema"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+#, fuzzy
+msgid "Room Admin Menu"
+msgstr "Administrador de la sala"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Alias del host local"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Smart hosts"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "RBL hosts"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "SpamAssasin hosts"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+#, fuzzy
+msgid "Masqueradable domains"
+msgstr "Dominios de puerta de enlace"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Configuración Global"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Gestión de cuentas de usuario"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Salas y Niveles"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+#, fuzzy
+msgid "Restart Citadel"
+msgstr "Hacer de esta mi página de inicio"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+#, fuzzy
+msgid "Message to your Users:"
+msgstr "El mensaje no se envió."
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Configuración del sitio"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "General"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Configuración de barra de iconos"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+#, fuzzy
+msgid "Push Email"
+msgstr "Email"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indexar/Journaling"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Acceso"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+#, fuzzy
+msgid "Directory"
+msgstr "directorio"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Autopurgar"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Para crear una nueva cuenta de usuario, introduzca el usuario deseado en la "
+"caja de abajo y pulse 'Crear'."
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Nuevo usuario: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Para editar una cuenta de usuario existente, seleccione el nombre de usuario "
+"de la lista y pulse 'Editar'."
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Editar cuenta de usuario: "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Nombre de usuario:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Contraseña"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Autorización para enviar correo Internet"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Dirección de email primaria"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Alias de email"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Número de conexiones"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Mensajes enviados"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Nivel de acceso"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "ID de usuario"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Fecha y hora de la última conexión"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Autopurgar despues de estos muchos dias"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Editar o borrar usuarios"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Añadir usuarios"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Editar o Borrar usuarios"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Añadir, cambiar o borrar niveles"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Nombre de nodo"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Secreto compartido"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Host o dirección IP"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Puerto número"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Confirmar borrar"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "¿Estás seguro de querer borrar?"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Si"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "No"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+#, fuzzy
+msgid "(Edit)"
+msgstr "(editar)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Borrar)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(dominios desde los cuales este host recibirá correo)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+#, fuzzy
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(host corriendo el servicio SpamAssassin)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(dominios mapeados con la Libreta de Direcciones Global)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(host corriendo una lista Agujero Negro en tiempo real)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+"(si está activo, reenviar todo el correo de salida a uno de estos hosts)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(host corriendo el servicio SpamAssassin)"
+
+#: ../../static/t/aide/restart.html:2
+#, fuzzy
+msgid "Restart Now"
+msgstr "Hacer de esta mi página de inicio"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Control de acceso y política general del sitio"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Permitir a administradores olvidar (zap) salas"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Poner en cuarentena mensajes de usuarios problemáticos"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Nombre de la sala de cuarentena"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Nombre de la sala para páginas de log"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+#, fuzzy
+msgid "Self contained"
+msgstr "Acciones"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+#, fuzzy
+msgid "Host based"
+msgstr "Nombre de Host"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+#, fuzzy
+msgid "Allow anonymous guest access"
+msgstr "Sin mensajes anónimos"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Nivel de acceso inicial para nuevos usuarios"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Nivel de acceso requerido para crear salas"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+"Garantizar automáticamente estatus de administrador de sala al usuario que "
+"crea una sala privada"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+#, fuzzy
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+"Garantizar automáticamente estatus de administrador de sala al usuario que "
+"crea una sala BLOG"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Restringir acceso a Correo Internet"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Desactivar autoservicio en cuanto a creación de cuentas de usuario"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "Se requiere registro para nuevos usuarios"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Configurar expiración automática de mensajes antiguos"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+"Esta configuración puede ser obviada en configuraciones por-sala o por-nivel "
+"aparte."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Hora para correr la autopurga de bases de datos"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "Política de expiración por defecto para salas públicas"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Nunca producir expiración automática de mensajes"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Expirar según cuenta de mensajes"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Expirar según la edad del mensaje"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Número de mensajes o días "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr "Política de expiración de mensajes por defecto para buzones privados"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Misma política que para salas públicas"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Purga de usuario por defecto (dias)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Purga por defecto de salas  (días)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Configurar la conexión LDAP para Citadel"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"Los cambios practicados en esta pantalla no surtirán efectos hasta que "
+"reinicies el Servidor Citadel"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Nombre del Host del sevidor LDAP (en blanco para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Número del puerto del servidor LDAP (en blanco para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "Base DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "Bind DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Contraseña para bind DN"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "Elementos de configuración general del sitio"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Nombre de dominio totalmente cualificado"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Nombre del nodo humanamente legible"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Número de teléfono"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Paginador de texto (para clintes en modo texto)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Localización geográfica de este sistema"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Nombre del administrador de sistema"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "Puerto de escucha IMAP (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "Puerto IMAP sobre SSL (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indexado y jornalización"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Advertencia: estas utilidades consumen muchos recursos."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Activar índice de texto completo"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "Realizar jornalización de mensajes de correo electrónico"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "Realizar jornalización de mensajes de tipo no email"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "Correo electrónico de destino de los mensajes jornalizados"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "Puerto de escucha POP3 (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "Puerto POP3 sobre SSL (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+#, fuzzy
+msgid "POP3 fetch frequency in seconds"
+msgstr "Frecuencia de marcha de red (en segundos)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+#, fuzzy
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "Frecuencia de marcha de red (en segundos)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+#, fuzzy
+msgid "Funambol server host (blank to disable)"
+msgstr "Nombre del Host del sevidor LDAP (en blanco para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+#, fuzzy
+msgid "Funambol server port "
+msgstr "Nombre del Host del sevidor LDAP (en blanco para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+#, fuzzy
+msgid "Funambol sync source"
+msgstr "Nombre del Host del sevidor LDAP (en blanco para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+#, fuzzy
+msgid "External pager tool (blank to disable)"
+msgstr "Nombre del Host del sevidor LDAP (en blanco para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Servicios de red"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "Dirección de servidor IP (0.0.0.0 para 'cualquiera')"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+#, fuzzy
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "Puerto de escucha POP3 (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+#, fuzzy
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "Puerto de escucha POP3 (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "Puerto de escucha POP3 (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "Puerto de escucha POP3 (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Control de afinación fina avanzada del servidor"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Longitud máxima de mensajes"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Tiempo máximo de espera de conexión (en segundos)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "Frecuencia de marcha de red (en segundos)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Número máximo de sesiones concurrentes (0 = sin límite)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Número mínimo de temáticas funcionando"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Número máximo de temáticas funcionando"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Borrar automáticamente logs de la base de datos pasados"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "Puerto SMTP MTA (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "Puerto SMTP MSA (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "Puerto SMTP sobre SSL (-1 para desactivar)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+#, fuzzy
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+"Permitir a cliente SMTP no autenticados hacer spoof a los dominios de este "
+"sitio"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "Correfir forged From: lineas durante SMTP autenticada"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+#, fuzzy
+msgid "-1 to disable"
+msgstr "Pulse para desactivar"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+#, fuzzy
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "Puerto de escucha IMAP (-1 para desactivar)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Añadir, cambiar, borrar cuentas de usuarios"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Editar configuración general del sitio"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Dominios y configuración de correo de internet"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Alias de email"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Log off (desconectar)"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Comandos básicos"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Su información"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Comandos avanzados de sala"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Postear mensaje"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Adjuntos"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "A"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "CC:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "BCC"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Asunto"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Asunto:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- mensaje reenviado ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Cerrar ventana"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Adjuntar fichero"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+#, fuzzy
+msgid "Remove"
+msgstr "(remover)"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Cargar imagen"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Puede sugir una imagen directamente desde su equipo"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Por favor, seleccione el fichero a cargar:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Añadir/cambiar/borrar/niveles"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Número de nivel"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Nombre de nivel"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Número de salas"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "Sala CSS"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(borrar sala)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "iDebe estar registrado para acceder a esta página."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Contraseña"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Última conexión"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "¿Nuevo usuario? Regístrese ahora"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Iniciar acceso de nuevo"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Esta es una actualizaciñon de '%s' que está ya en su calendario."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr ""
+"Este evento entrará en conflicto con '%s' que está ya en su calendario."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Lenguaje"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Correo"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Tareas"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Salas"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Chat"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Avanzado"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Administración"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "personalizar este menú"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "cambiar a lista de salas"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "cambiar a menú"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Personalizar la barra de iconos"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Mostrar iconos como:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "imágenes y texto"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "sólo imágenes"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "sólo texto"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Seleccione los iconos que le gustaría mostrar en la 'icon bar' menú a "
+"laizquierda de la pantalla"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Logotipo del sitio"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Un icono descriptor de este sitio"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Tu página sumario"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Correo (entrante)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Atajo a su buzón de correo"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Su libreta de direcciones personal"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Sus notas personales"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Atajo a su calendario personal"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Atajo a su lista personal de tareas"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Pulsando en este icono se mostrará una lista de todas las salas disponibles "
+"(o carpetas)"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "¿Quién está en línea?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+"Pulsando en este icono se mostrará una lista de todos los usuarios "
+"actualmente conectados."
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Pulsando en este icono se entra en el mmodo de chat a tiempor real con otros "
+"usuarios en la misma sala"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Opciones avanzadas"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Acceso al menú completo de funciones de Citadel."
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Logotipo de Citadel"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Muestra el icono 'Powered by Citadel'"
+
+#: ../../static/t/iconbar/save.html:11
+#, fuzzy
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"Sy barra de iconos ha sido actualizada. Por favor selecciones alguno de sus "
+"opciones para continuar."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Lista subscripción"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Listar suscribir/cancelar subscripción"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Enviada solicitud de confirmación"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr "Se está suscribiendo "
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr " a la "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr " lista de mensajes."
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+"El servidor de listas le ha enviado un e-mail con un enlace Web adicional "
+"para que usted pueda hacer clic para confirmar su suscripción."
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+"Este paso adicional es para su protección, ya que impide que otros sean "
+"capaces de suscribirse a las listas sin su consentimiento."
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+"Por favor, haga clic en el enlace que está siendo enviado por correo "
+"electrónico a usted y se confirmará su suscripción."
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Ir atrás"
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr "ERROR"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr "Usted está cancelando su suscripción"
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr "desde el"
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr "lista de correo."
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+"El servidor de listas le ha enviado un e-mail con un enlace Web adicional "
+"para que haga clic en él para confirmar la anulación de la suscripción."
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+"Este paso adicional es para su protección, ya que impide que otros sean "
+"capaces de darse de baja de listas sin su consentimiento."
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+"Por favor, haga clic en el enlace que está siendo enviado por correo "
+"electrónico a usted y se confirmará la cancelación de su suscripción."
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr "Atrás..."
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr "Confirmación falló"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr "Esto podría significar una de dos cosas:"
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Nombre de la tarea"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Dirección de correo preferida"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "Introducir texto de mensaje:"
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "Formato horario"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+#, fuzzy
+msgid "Logged in as"
+msgstr "Última conexión"
+
+#: ../../static/t/loggedinas.html:6
+#, fuzzy
+msgid "Not logged in."
+msgstr "No conectado ahora"
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "ofrecido por"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Iniciar acceso de nuevo"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Editar o borrar esta sala"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Ir a una sala 'hidden' (oculta)"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Crear nueva sala"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Crear nueva sala"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+#, fuzzy
+msgid "Zap (forget) this room"
+msgstr "Zap (olvidar) esta sala (%s)"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Listar todas las salas olvidadas"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Leer mensajes nuevos"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Listar salas conocidas"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "¿A dónde se puede ir desde aquí?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Ir a la siguiente sala"
+
+#: ../../static/t/menu/basic_commands.html:4
+#, fuzzy
+msgid "...with <em>unread</em> messages"
+msgstr "...con <em>mensajes</em> no leídos"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Saltar a la siguiente sala"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(volver aquí después)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Atrás"
+
+#: ../../static/t/menu/basic_commands.html:6
+#, fuzzy
+msgid "oops! Back to "
+msgstr "(¡oh! Vuelta a %s)"
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Leer mensajes nuevos"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "... en esta sala"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Leer todos los mensajes"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "...viejos <em>y</em> nuevos"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Redactar mensaje"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(postear a esta sala)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Página sumario"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Sumario de mi cuenta"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Lista de usuarios"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(todos los usuarios registrados)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "¡Adiós!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Cambie su contraseña"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Introducir nueva contraseña"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Introdúzcala de nuevo como confirmación:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Cambiar sus preferencias y configuración"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Actualizar su información de contacto"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Introducir 'bio' (biografía)"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Editar su foto en línea"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Ver/editar filtros de correo del lado del servidor"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+#, fuzzy
+msgid "Manage your OpenIDs"
+msgstr "Cambie su contraseña"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Confirme mover mensaje"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Mover este mensaje a:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Leyendo #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Remitente"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Mover"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Imprimir"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Ver contactos"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Añadir nuevo contacto"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Visualización de día"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "VIsualización mensual"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Añadir nuevo evento"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Lista de calendario"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Ver tareas"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Añadir nueva tarea"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Ver notas"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Añadir nueva nota"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Redactar mensaje"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Wiki home"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Editar esta página"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "los nuevos puestos de trabajo"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Saltarse esta sala"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Preferencias y configuración"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Ver (carpetas) en árbol"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Ver (salas) en tabla"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 horas (am/pm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 horas"
+
+#: ../../static/t/prefs/box.html:150
+#, fuzzy
+msgid "Sunday"
+msgstr "Sumario"
+
+#: ../../static/t/prefs/box.html:151
+#, fuzzy
+msgid "Monday"
+msgstr "Sumario"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Sin firma"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+#, fuzzy
+msgid "Configure Push Email"
+msgstr "Email"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+#, fuzzy
+msgid "Notify Funambol server"
+msgstr "Nombre del Host del sevidor LDAP (en blanco para desactivar)"
+
+#: ../../static/t/prefs/pushemail.html:31
+#, fuzzy
+msgid "Send a text message to..."
+msgstr "Enviar un mensaje instantáneo a: "
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Nombre de la sala: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Nivel al que pertenece: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Vista por defecto para esta sala "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Tipo de sala:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Pública (automáticamente aparece visible a todos)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privada - oculta (accesible solo a quienes conocen su nombre)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privada - se requiere contraseña: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privada - sólo mediante invitación"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Personal (buzón de correo para tí solo)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Crear nueva sala"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Nombre de la sala: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Vista por defecto para esta sala "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Tipo de sala:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Editar el fichero informativo de esta sala"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"El texto se reformateará según ancho de pantalla del lector. To defeat the "
+"formatting, indent a line at least one space."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Ir a una sala oculta"
+
+#: ../../static/t/room/display_private.html:8
+#, fuzzy
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Si conoces el nombre de una sala oculta (nombre de invitación) o protegida "
+"con contraseña, puedesentrar en la sala escribiendo el nombre abajo. Una vez "
+"que hayas ganado acceso a una salaprivada, aparecerá regularmente en tu "
+"lista de salas disponibles, por lo que no tendrás que repetir este proceso. "
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Intoduzca el nombre de sala:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Introduzaca la contraseña de sala:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Configuración"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Política de expiración de mensajes"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Controles de acceso"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Compartir"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Servicio de lista de correo"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(remover)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+#, fuzzy
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Los usuarios listados abajo tiene acceso a esta sala.  Para borrar un "
+"usuario seleccione el usuario de la lista de acceso y pulse 'Kick'."
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Para garantizar el acceso de un usuario a la sala, introduzca su nombre ne "
+"la caja de abajo y pulse 'Invitar'."
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Invitar"
+
+#: ../../static/t/room/edit/tab_access.html:37
+#, fuzzy
+msgid "Users"
+msgstr "Lista de usuarios"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Borrar esta sala"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+#, fuzzy
+msgid "Set or change the icon for this rooms banner"
+msgstr "Determinar o cambiar el icono para el baner de esta sala"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+#, fuzzy
+msgid "Edit this rooms Info file"
+msgstr "Editar el fichero informativo de esta sala"
+
+#: ../../static/t/room/edit/tab_config.html:7
+#, fuzzy
+msgid "name of room: "
+msgstr "Nombre de la sala: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Si privada, hacer que los usuarios actuales olviden la sala"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Usuarios preferentes solamente"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Sala de sólo lectura"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Sala directorio de ficheros"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Nombre de directorio "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Subidas permitidas"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Bajadas permitidas"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "No hay mensajes aquí"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Directorio visible"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Sala de intercambio en red"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanente (sin purga automática)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Mensajes anónimos"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Sin mensajes anónimos"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Todos los mensajes anónimos"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Preguntar al usuario cuando esté introduciendo mensajes"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Administrador de la sala "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Política de expiración de mensajes para esta sala"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Use la política por defecto para esta sala"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Política de expiración de mensajes para este nivel"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Usar las configuraciones por defecto"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+#, fuzzy
+msgid "Remote host"
+msgstr "Smart hosts"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Nombre de usuario"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+#, fuzzy
+msgid "Keep messages on server?"
+msgstr "No hay mensajes aquí"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+#, fuzzy
+msgid "Interval"
+msgstr "General"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>El contenido de esta sala está siendo enviado por correo <b>como mensajes "
+"individuales</b> a los siguientes receptores:</i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>El contenido de esta sala se envia por correo <b>compilado en boletines "
+"diarios</b> a los siguientes receptores:</i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+#, fuzzy
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+"Esta sala está configurada para permitir autoservicio en los porcesos de "
+"suscripción/cancelación."
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "La URL para suscribirse/cancelar suscripción es: "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "No compartido con"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Compartido con"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Nombre del nodo remoto"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Nombre de la sala remota"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Acciones"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"Las sals compartidas deben compartirse desde los dos lados.  Añadiendo un "
+"nodo a la lista 'shared' (compartida) se envían mensajes afuera, pero para "
+"recibir, los otros nodos tienen que estar configurados para enviar mensajes "
+"a su tu sistema también. <LI>Si el nombre de la sala remota está vacío, se "
+"asume que su nombre es idéntico en el nodo remoto.<LI>Si el nombre de la "
+"sala remota es diferente, el nodo remoto debe configurar el nombre de la "
+"sala también aquí.</UL></I><br>\n"
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Información de sala"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Zap (olvidar/cancela suscripción) a la sala actual"
+
+#: ../../static/t/room/zap_this.html:6
+#, fuzzy
+msgid "If you select this option,"
+msgstr "Editar o borrar esta sala"
+
+#: ../../static/t/room/zap_this.html:8
+#, fuzzy
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+"Si selecciona esta opción, <em>%s</em> desaparecerá de su lista de salas.  "
+"¿Es eso lo que desea?<br>\n"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Salas Zapped (olvidadas)"
+
+#: ../../static/t/room/zapped_list.html:10
+#, fuzzy
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Pulse en cualqueir sala para recordarla y entrar en ella.\n"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Buscar: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Todo"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Añadir o borrar scripts"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Añadir un nuevo script"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"Para crear un nuevo script, entrar le nombre deseado para el script en la "
+"ventana abajo y pulsar \"Crear\"."
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Nombre del script: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Editar scripts"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Volver a la pantalla de edición de script"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Borrar scripts"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"Para borrar un script existente, seleccionar su nombre en la lista y pulsar "
+"\"Borrar\"."
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Si"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Para o CC"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Responder-a"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Reenviado desde"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Enviar a"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Ensobretado Desde"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Ensobretado Para"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-Flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Status"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "List-ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Tamaño del mensaje"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "contiene"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "no contiene"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "corresponde con"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "no es"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "coincide"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "no coincide"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Todos los mensajes)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "es más grande que"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "es más pequeño que"
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr "bytes"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Conservar"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Descartar de manera silenciosa"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Rechazar"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Mover mensaje a"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Reenviar a"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Vacaciones"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Mensaje:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "y entonces"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "seguir procesando"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "detener"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Al llegar nuevos e-mails: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "La filtración se hará según las reglas siguientes"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Dejarlos en mi bandeja de entrada sin filtrarlos"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+"Filtrarlo mediante un script editado manualmente (sólo para los usuarios "
+"avanzados)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Agregar regla"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"Esta instalación de Citadel viene construida sin soporte para la filtración "
+"de correo server-side.<br>Contacte al administrador de su sistema si "
+"requiere esta funcionalidad.<br>"
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+#, fuzzy
+msgid "Summary page for "
+msgstr "Página sumario para %s"
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Mensajes"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Hoy&nbsp;en&nbsp;su&nbsp;calendario"
+
+#: ../../static/t/summary/page.html:51
+#, fuzzy
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Quién está&nbsp;en línea&nbsp;ahora"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Acerca&nbsp;de este&nbsp;servidor"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+#, fuzzy
+msgid "running"
+msgstr "Afinar"
+
+#: ../../static/t/summary/page.html:65
+#, fuzzy
+msgid "with"
+msgstr "quinto"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+#, fuzzy
+msgid "Your system administrator is"
+msgstr "Nombre del administrador de sistema"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"ADVERTENCIA: Tiene desactivado JavaScript en su navegador. Muchas funciones "
+"de este sistema no funcionaran apropiadamente."
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Introducir 'bio' (biografía)"
+
+#: ../../static/t/user/list.html:3
+#, fuzzy
+msgid "User list for "
+msgstr "Lista de usuarios %s"
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Nombre de Usuario"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Número"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Nivel de Acceso"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Última conexión"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Total de conexiones"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Correos Totales"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Profile de usuario"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+#, fuzzy
+msgid "Click here to send an instant message to"
+msgstr "Pulse aquí para enviar un mensaje instantáneo a %s"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Editar información de contacto"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Prefijo"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Primero"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Medio"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Apellido"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Sufijo"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Mostrar nombre:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Título:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organización:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Aptdo. Correos"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Dirección:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Ciudad"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Estado:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Código postal"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "País"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Teléfono de casa"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Teléfono del trabajo"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Teléfono móvil:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Número de fax:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Esta libreta de direcciones está vacía."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Un error interno ocurrió."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Publicar un comentario"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "los nuevos puestos de trabajo"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "las entradas más antiguas"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d comentarios"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "Enlace permanente"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Smart hosts"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Estado:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "seguir procesando"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "de "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Responder"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "Respuesta entrecomillada"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "Responder Todos"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Reenviar"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Cabeceras"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "Ver"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Descargar"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Ver como:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+#, fuzzy
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+"Pulse en un nombre para leer la información del usuario. Pulse en %s para "
+"enviar un mensaje instantáneo a ese usuario. "
+
+#: ../../static/t/who.html:24
+#, fuzzy
+msgid "to send an instant message to that user."
+msgstr "Enviar un mensaje instantáneo a: "
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(matar)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Sala"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "Desde el host"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Editar la vista de sus sesión"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Esta pantalla te permite cambiar la forma en que tu sesión aparece en 'Quién "
+"está en línea' Para desactivar cualquier nombre 'fake' (falso alias) creado "
+"previamente, simplemente pulse el botón apropiado 'cambiar' sin escribir "
+"nada en la caja correspondiente. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Nombre  de sala"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Nombre de Host"
+
+#: ../../static/t/who/list_static_header.html:1
+#, fuzzy
+msgid "Users currently on"
+msgstr "Usuarios actualmente en %s"
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr "Editar configuración"
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr "Editar entrada de la libreta de direcciones"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "en el "
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Seleccione el enlace 'Editar esta página' en el banner de la sala si "
+"deseacrear esta página."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Aquí no existe ninguna página denominada '%s'."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#~ msgid "the icon for this floor"
+#~ msgstr "el icono para este nivel"
+
+#~ msgid "Edit %s"
+#~ msgstr "Editar %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Salvar cambios"
+
+#~ msgid " (work)"
+#~ msgstr " (trabajo)"
+
+#~ msgid " (home)"
+#~ msgstr " (casa)"
+
+#~ msgid " (cell)"
+#~ msgstr " (celular)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Teléfono:"
+
+#~ msgid "E-mail:"
+#~ msgstr "Correo-e:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Dominios de directorios"
+
+#, fuzzy
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Smart hosts"
+
+#~ msgid "Create new room"
+#~ msgstr "Crear nueva sala"
+
+#~ msgid "Zap this room"
+#~ msgstr "Zap a esta sala"
+
+#~ msgid ""
+#~ "You have one or more instant messages waiting, but the Citadel Instant "
+#~ "Messenger window failed to open.  This is probably because you have a "
+#~ "popup blocker installed.  Please configure your popup blocker to allow "
+#~ "popups from this site if you wish to receive instant messages."
+#~ msgstr ""
+#~ "Tienes uno o más mensajes instantáneos esperando, pero la ventanade "
+#~ "mensajería instantánea no se pudo abrir. Esto ha sido causado "
+#~ "probablemente porque tienes instalado un bloqueo de popups, configure su "
+#~ "herramienta parapermitir poups de este sitio si quiere recibir mensajería "
+#~ "instantánea."
+
+#~ msgid "Change"
+#~ msgstr "Cambiar"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Sala de intercambio en red"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Añadir nodo"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "Minuto"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Tentativa"
+
+#~ msgid "Send"
+#~ msgstr "Enviar"
+
+#~ msgid "Delete this message?"
+#~ msgstr "¿Borrar este mensaje?"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Información de sala"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "sólo imágenes"
+
+#~ msgid "Exit"
+#~ msgstr "Salir"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Subidas permitidas"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "¿Estás seguro de querer borrar?"
+
+#~ msgid "Upload"
+#~ msgstr "Cargar"
+
+#~ msgid "Add"
+#~ msgstr "Añadir"
+
+#~ msgid "Create"
+#~ msgstr "Crear"
+
+#~ msgid "Kick"
+#~ msgstr "Kick"
+
+#~ msgid "Invite"
+#~ msgstr "Invitar"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Nuevo Usuario"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Libreta de Direcciones"
+
+#~ msgid "Delete user"
+#~ msgstr "Borrar usuario"
+
+#~ msgid "Delete this user?"
+#~ msgstr "¿Borrar este usuario?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Borrar usuario"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "Al llegar el correo, no se filtrará mediante ningún script."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "El script activo actualmente es: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Configurar replicación con otros servidores Citadel"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Muestra el icono 'Powered by Citadel' "
+
+#~ msgid "Go to your email inbox"
+#~ msgstr "Ir a tu buzón de correo entrante"
+
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Ir a tu calendario personal"
+
+#~ msgid "Go to your personal address book"
+#~ msgstr "Ir a tu libreta personal de direcciones"
+
+#~ msgid "Go to your personal notes"
+#~ msgstr "Ir a tus notas personales"
+
+#~ msgid "Go to your personal task list"
+#~ msgstr "Ir a tu lista de tareas personal"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Listar todas las salas accesibles"
+
+#~ msgid "See who is online right now"
+#~ msgstr "Ver quien está online ahora mismo"
+
+#~ msgid ""
+#~ "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+#~ msgstr ""
+#~ "Menú de opciones avanzadas: Comandos Avanzados para Salas, información de "
+#~ "cuentas,y Chat"
+
+#~ msgid "Room and system administration functions"
+#~ msgstr "Funciones de administración de sala y sistema"
+
+#~ msgid "Reset form"
+#~ msgstr "Resetear formulario"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "¿Borrar esta entrada?"
+
+#~ msgid "Create new floor"
+#~ msgstr "Crear nuevo nivel"
+
+#~ msgid "Move rule up"
+#~ msgstr "Mover la regla hacia arriba"
+
+#~ msgid "Move rule down"
+#~ msgstr "Mover la regla hacia abajo"
+
+#~ msgid "Delete rule"
+#~ msgstr "Eliminar regla"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(editar gráfico)"
+
+#~ msgid "Change name"
+#~ msgstr "Cambiar nombre"
+
+#~ msgid "Change CSS"
+#~ msgstr "Cambiar CSS"
+
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "¿Esta seguro de querer borrar esta sala?"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Introducir comando"
+
+#~ msgid "Unshare"
+#~ msgstr "Dejar de compartir"
+
+#, fuzzy
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "Nombre del Host del sevidor LDAP (en blanco para desactivar)"
+
+#, fuzzy
+#~ msgid "Master user password"
+#~ msgstr "Introducir nueva contraseña"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "¿Borrar esta entrada?"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "Primero"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "Formato horario"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Asunto"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "¿Realmente quiere matar esta sesión?"
+
+#~ msgid "Share"
+#~ msgstr "Compartir"
+
+#~ msgid "Change password"
+#~ msgstr "Cambia contraseña"
+
+#~ msgid "Change room name"
+#~ msgstr "Cambiar nombre de sala"
+
+#~ msgid "Change host name"
+#~ msgstr "Cambiar nombre de host"
+
+#~ msgid "Change user name"
+#~ msgstr "Cambiar nombre de usuario"
+
+#~ msgid ""
+#~ "Leave all messages marked as unread, go to next room with unread messages"
+#~ msgstr ""
+#~ "Dejar todos los mensajes marcados como no leídos, yr a la siguiente sala "
+#~ "con mensajes no leídos"
+
+#~ msgid "Mark all messages as read, go to next room with unread messages"
+#~ msgstr ""
+#~ "Marcar todso los mensajes como leídos, ir a la siguiente sala con "
+#~ "mensajes por leer"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Salvar cambios"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Te estás suscribiendo a <TT>%s</TT> en la <b>%s</b> lista de correo.  El "
+#~ "servidor de la lista te ha enviado un email con un link web  y debe "
+#~ "pulsarlo par confirmar su suscripción.  Esta medida se toma por su "
+#~ "seguridad, de forma que se impida a otros suscribirle  sin su "
+#~ "consentimiento.<br><br />Por favor, pulse en el link que se le ha "
+#~ "enviadoy su suscripción será activada.<br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr ""
+#~ "ADVERTENCIA: No se pudo analizar la configuración del servidor, se "
+#~ "ejecuta un nuevo citserver?"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "No existe la sala denominada '%s'."
+
+#~ msgid "Network"
+#~ msgstr "Red"
+
+#~ msgid "Tuning"
+#~ msgstr "Afinar"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Desechar automáticamente mensajes borrados en IMAP"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Un script ya tiene este nombre."
+
+#~ msgid ""
+#~ "A new script has been created.  Return to the script editing screen to "
+#~ "edit and activate it."
+#~ msgstr ""
+#~ "Un nuevo script ha sido creado. Vuelva a la pantalla de edición de los "
+#~ "scripts para editarlo y activarlo."
+
+#~ msgid "Delete script"
+#~ msgstr "Borrar un script"
+
+#~ msgid "Delete this script?"
+#~ msgstr "¿Borrar este script?"
+
+#~ msgid ""
+#~ "You are connected to %s, running %s with %s, server build %s and located "
+#~ "in %s.  Your system administrator is %s."
+#~ msgstr ""
+#~ "Estás conectado a %s, corriendo %s con %s, server build %s,  y localizado "
+#~ "en %s.  Tu administrador de sistema es %s."
+
+#, fuzzy
+#~ msgid "Yes with users list"
+#~ msgstr "cambiar a lista de salas"
+
+#~ msgid "Room list"
+#~ msgstr "Lista de Salas"
+
+#, fuzzy
+#~ msgid "text"
+#~ msgstr "siguiente"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "(sin nombre)"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Contraseña"
+
+#, fuzzy
+#~ msgid "pass"
+#~ msgstr "Tareas"
+
+#, fuzzy
+#~ msgid "display: none"
+#~ msgstr "Mostrar nombre:"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Su contraseña no ha sido aceptada"
+
+#~ msgid "Log off now?"
+#~ msgstr "¿Desconectar ahora?"
+
+#, fuzzy
+#~ msgid "%d new of %d messages%s"
+#~ msgstr "%d nuevo de %d mensajes"
+
+#~ msgid "(nothing)"
+#~ msgstr "(nada)"
+
+#~ msgid "unexpected end of message"
+#~ msgstr "finalización inesperada de mensaje"
+
+#~ msgid "An error occurred while setting up the chat socket."
+#~ msgstr "Se produjo un error al intentar activar la conexión de chat. "
+
+#~ msgid "Now exiting chat mode."
+#~ msgstr "Saliendo de modo chat."
+
+#~ msgid "Help"
+#~ msgstr "Ayuda"
+
+#~ msgid "List users"
+#~ msgstr "Listar usuarios"
+
+#~ msgid "No messages here."
+#~ msgstr "No hay mensajes aquí"
+
+#, fuzzy
+#~ msgid "no more messages"
+#~ msgstr "Mensajes anónimos"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "Error retrieving RSS feed: couldn't find messages\n"
+#~ msgstr "Error de respuesta RSS: no se pudieron encontrar mensajes\n"
+
+#, fuzzy
+#~ msgid "%s from"
+#~ msgstr "de"
+
+#, fuzzy
+#~ msgid "%s in %s"
+#~ msgstr "sólo imágenes"
+
+#, fuzzy
+#~ msgid ""
+#~ "<ul><li>Enter your OpenID URL and click &quot;Log in&quot;.<li><a href="
+#~ "\"http://www.citadel.org/doku.php/documentation:openid\">Click here to "
+#~ "learn what OpenID is and how Citadel is using it.</a><li>Please log off "
+#~ "properly when finished. <li>You must use a browser that supports "
+#~ "<i>frames</i> and <i>cookies</i>. <li>Also keep in mind that if your "
+#~ "browser is configured to block pop-up windows, you will not be able to "
+#~ "receive any instant messages.<br></ul>"
+#~ msgstr ""
+#~ "<ul><li><b>Si ya dispone de una cuenta en %s</b>, introduzca su nombre de "
+#~ "usuario y contraseña y seleccione &quot;Log in.&quot; <li><b>Si es un "
+#~ "usuario nuevo</b>, introduzca su nombre y la contraseña que le gustaría "
+#~ "utilizar, y pulse &quot;Nuevo Usuario.&quot; <li>Por favor, cierre su "
+#~ "conexión adecuadamente al terminar. <li>Debe utilizar un explorador que "
+#~ "soporte <i>frames</i> y <i>cookies</i>. <li>Tenga también en cuenta que "
+#~ "si su explorador esta configurado para bloquear pop windows, no podrá "
+#~ "recibir mensajería instantánea.<br></ul>"
+
+#, fuzzy
+#~ msgid ""
+#~ "enter your user name and password and click &quot;Log in.&quot;<li><b>If "
+#~ "you are a new user</b>, enter the name and password you wish to use, and "
+#~ "click &quot;New User.&quot; <li>Please log off properly when finished. "
+#~ "<li>You must use a browser that supports <i>frames</i> and <i>cookies</"
+#~ "i>. <li>Also keep in mind that if your browser is configured to block pop-"
+#~ "up windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "<ul><li><b>Si ya dispone de una cuenta en %s</b>, introduzca su nombre de "
+#~ "usuario y contraseña y seleccione &quot;Log in.&quot; <li><b>Si es un "
+#~ "usuario nuevo</b>, introduzca su nombre y la contraseña que le gustaría "
+#~ "utilizar, y pulse &quot;Nuevo Usuario.&quot; <li>Por favor, cierre su "
+#~ "conexión adecuadamente al terminar. <li>Debe utilizar un explorador que "
+#~ "soporte <i>frames</i> y <i>cookies</i>. <li>Tenga también en cuenta que "
+#~ "si su explorador esta configurado para bloquear pop windows, no podrá "
+#~ "recibir mensajería instantánea.<br></ul>"
+
+#~ msgid "Find out more about Citadel"
+#~ msgstr "Saber más sobre Citadel"
+
+#~ msgid "CITADEL"
+#~ msgstr "CITADEL"
+
+#~ msgid "Customize this menu"
+#~ msgstr "Personalizar este menú"
+
+#~ msgid "Internet configuration"
+#~ msgstr "Configuración de internet"
+
+#~ msgid "of %d messages."
+#~ msgstr "de %d mensajes."
+
+#~ msgid " <I>from</I> "
+#~ msgstr " <I>de</I> "
+
+#~ msgid " <I>in</I> "
+#~ msgstr " <I>en</I> "
+
+#~ msgid "Edit node configuration for "
+#~ msgstr "Editar configuración de nodo para"
+
+#~ msgid "ERROR: could not open template "
+#~ msgstr "ERROR: no se pudo abrir la plantilla (template) "
+
+#~ msgid ""
+#~ "<I>This message contains calendaring/scheduling information, but support "
+#~ "for calendars is not available on this particular system.  Please ask "
+#~ "your system administrator to install a new version of the Citadel web "
+#~ "service with calendaring enabled.</I><br>\n"
+#~ msgstr ""
+#~ "<I>Este mensaje contiene información sobre porgrmación anticipada de "
+#~ "tareas y calendarios,perolos calendarios no son soportados por este "
+#~ "sistema particular.  Por favor, pida a su administrador de sistemas que "
+#~ "instale una nueva versión del servicio web Citadel con activación de "
+#~ "calendarios.</I><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display calendar item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>No puedo mostrar elemento del calendario.Este error significa que  "
+#~ "WebCit no está instalado con soporte para calendarios.  Contacte con su "
+#~ "administrador de sistemas.</i><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display to-do item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>No se puede mostrar el elemento «por hacer». Está viendo este mensaje "
+#~ "porque su servicio WebCit se instaló sin soporte para calendarios.  Por "
+#~ "favor, contacte con su  adminstrador de sistemas.</i><br>\n"
+
+#~ msgid "Day: "
+#~ msgstr "Día"
+
+#~ msgid "Year: "
+#~ msgstr "Año"
+
+#~ msgid "The calendar view is not available."
+#~ msgstr "La visualización del calendario no está disponible."
+
+#~ msgid "The tasks view is not available."
+#~ msgstr "La visualización de tareas no está disponible."
+
+#~ msgid "Gateway domains"
+#~ msgstr "Dominios de puerta de enlace"
+
+#~ msgid "(domains whose subdomains match Citadel hosts)"
+#~ msgstr ""
+#~ "(dominios cuyos subdominios se corresponden con con el host Citadel)"
+
+#~ msgid "(This server does not support task lists)"
+#~ msgstr "(Este servidro no soporta listas de tarea)"
+
+#~ msgid "(This server does not support calendars)"
+#~ msgstr "(Este servidro no soporta calendarios)"
+
+#~ msgid ""
+#~ "This room is <i>not</i> configured to allow self-service subscribe/"
+#~ "unsubscribe requests."
+#~ msgstr ""
+#~ "Esta sala no<i>está</i> configurada para permitir autoservicio en cuanto "
+#~ "peticiones desuscripción/cancelación."
+
+#~ msgid "Click to enable."
+#~ msgstr "Pulse para activar."
+
+#~ msgid "Back to menu"
+#~ msgstr "Volver al menú"
+
+#~ msgid "Respond to meeting request"
+#~ msgstr "Responder a convocatoria de reunión"
+
+#~ msgid "Update your calendar with this RSVP"
+#~ msgstr "Actualizar el calendario con este RVSP"
+
+#~ msgid "Public room"
+#~ msgstr "Sala pública"
+
+#~ msgid "Private - guess name"
+#~ msgstr "Privada - invitación nominativa"
+
+#~ msgid "Private - require password:"
+#~ msgstr "Privada - requiere contraseña:"
+
+#~ msgid "localhost"
+#~ msgstr "localhost"
+
+#~ msgid "gatewaydomain"
+#~ msgstr "gatewaydomain"
+
+#~ msgid "rbl"
+#~ msgstr "rbl"
+
+#~ msgid "spamassassin"
+#~ msgstr "spamassassin"
+
+#~ msgid "[ close window ]"
+#~ msgstr "[ cerrar ventana ]"
diff --git a/webcit/po/webcit/et.po b/webcit/po/webcit/et.po
new file mode 100644 (file)
index 0000000..9ce68e5
--- /dev/null
@@ -0,0 +1,4524 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR The Citadel Project - http://www.citadel.org
+# Gabriel C. Huertas <gabrielhuertas@terra.es>
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2010-10-22 14:52+0000\n"
+"Last-Translator: Rait Lotamõis <rait@kuma.ee>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ee\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-08-01 04:33+0000\n"
+"X-Generator: Launchpad (build 15719)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Kustutatud"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Uus Kasutaja"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Probleemne Kasutaja"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Kohalik Kasutaja"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Võrgukasutaja"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Privilegeeritud Kasutaja"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Korrapidaja"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Tekkis viga."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Kinnita uusi kasutajaid"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Ükski kasutaja ei vaja hetkel kinnitamist."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "väga nõrk"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "nõrk"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "käib kah"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "tugev"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Hetke juurdepääsutase: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Määra kasutaja juurdepääsutase:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Katkestatud. Salasõna ei muudetud."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Need ei ühti. Salasõna ei muudetud."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Tühjad paroolid ei ole lubatud."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "saadavus teadmata"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "vaba"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "HÕIVATUD"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Koosoleku kutse"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Osaleja vastus sinu kutsele"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Avaldatud sündmus"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "See on tundmatut tüüpi kalendrisündmus."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Kokkuvõte:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Asukoht:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Kuupäev:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Alguse kuu/kell:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Lõpu kuu/kell:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Kirjeldus:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Korduvus:"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "See on korduv sündmus"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Osaleja:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "See on uuendus sinu kalendris olevale sündmusele '%s'."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr "See sündmus läheks vastuollu juba kalendris oleva sündmusega '%s'."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Uuendus:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "VASTUOLU:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Kuidas sa soovid sellele kutsele vastata?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Nõustun"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Üritan"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Keeldun"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr "Klõpsa <i>Uuenda</i>, et kanda see vastus oma kalendrisündmusele."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Uuenda"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignoreeri"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Selle kalendrikande töötlemisel tekkis viga."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr "Sa oled selle kutse vastu võtnud. Sündmus märgiti sinu kalendrisse"
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Sa üritad jõuda sellele kohtumisele. Sündmus kanti kalendrisse 'pliiatsiga'."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr "Sa keeldusid sellest kutsest. Sündmust <b>ei</b> kantud kalendrisse."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Vastus on saadetud koosoleku korraldajale."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Kalendripäeva vaade algab kell:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Kalendripäeva vaade lõppeb kell:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Nädal algab:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Tund: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minut: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(olukord teadmata)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(nõuab tegevust)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(vastu võetud)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(keeldutud)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(kahtlane)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(delegeeritud)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(lõpetatud)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(töös)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(none)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Nimetu Sündmus"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "Alates:"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Alguse kuupäev:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Lõpu kuupäev:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Kuupäev/kellaaeg:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Märkmed:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Nädal"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Tunnid"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Pealkiri"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Algus"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Lõpp"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Kogu päeva sündmus"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Käimasolev sündmus"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Nimetu Ülesanne"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "Tekkis viga, kui laadisin seda faili: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "sekundit"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minutit"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "tundi"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "päeva"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "nädalat"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "kuud"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "aastat"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "mitte kunagi"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "esimene"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "teine"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "kolmas"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "neljas"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "viies"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Sündmus"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Osalejad"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Lisa või muuda sündmust"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Kokkuvõte"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Asukoht"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Märkmed"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Korraldaja"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(sina oled korraldaja)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Näita aega kui:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Vaba"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Hõivatud"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(iga nimi uuel real)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Kontaktid"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Korduvuse reegel"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Kordumise intervall"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "nendel nädalapäevadel:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "kuu %s%d%s päeval"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Korduvuse vahemik"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Lõpukuupäev puudub"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Korda seda sündmust"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "korda"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Korda seda sündmust kuni "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Salvesta"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Kustuta"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Kontrolli osalejate saadavust"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Katkesta"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Aja formaat"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Kujunduse üleslaadimine katkestatud"
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Sa ei laadinud faili üles."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "sinu foto"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "selle toa pisipilt"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "Tervituspilt sisselogimise aknasse"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "Väljalogimise bannerpilt"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Ikooniriba seaded"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Vigane Parameeter"
+
+#: ../../inetconf.c:128
+#, fuzzy
+msgid " has been deleted."
+msgstr "%s on kustutatud."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Kõrgem juurdepääsuluba on vajalik selle funktsiooni kasutamiseks."
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+#, fuzzy
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "Palun sisesta kasutajanimi mida soovid kasutada."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(pealkiri puudub)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Katkestatud. Sõnumit ei postitatud."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Automaatselt katkestatud, sest sa oled selle sõnumi juba salvestanud."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Sõnum on saadetud.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Sõnum on postitatud.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Sõnumit ei liigutatud."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Lisa allkiri e-kirjadele?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Kasuta seda allkirja:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Eelistatud e-maili aadress"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Eelistatud nimi e-kirjadele"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Eelistatud nimi teadetetahvlile postitades"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Postkasti vaade"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Ma ei tea kuidas kuvada "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Klõpsa märkmel, et seda muuta."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Saada kiirsõnum"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Saada kiirsõnum kasutajale: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Sisesta sõnumi tekst:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Saada sõnum"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Sõnumit ei saadetud."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Sõnum saadetud kasutajale "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Katkestatud. Seadeid ei muudetud."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Tee see leht minu Citadeli avaleheks."
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Sul ei ole enam valitud Citadeli avalehte."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Katkestatud. Muudatusi ei salvestatud."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Sinu muudatused on salvestatud."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Kasutaja %s löödi toast %s välja."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Kasutaja %s kutsutud tuppa %s."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Katkestatud. Uut tuba ei loodud."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Korrus on kustutatud."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Uus korrus on loodud."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Tubade nimekirja vaade"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Näita tühje korruseid"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "fail"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "faili"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Teadetetahvel"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Meilikast"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Aadressiraamat"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Kalender"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Ülesannete nimekiri"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Märkmete nimekiri"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Kalendri nimekiri"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+#, fuzzy
+msgid "Drafts"
+msgstr "Kuupäev"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Sinu süsteemiseaded on uuendatud"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Ei midagi)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Katkestatud. %s ei salvestatud."
+
+#: ../../sysmsgs.c:53
+#, fuzzy
+msgid " has been saved."
+msgstr "%s salvestati."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Toa info"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Sinu info"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Lõpetatud?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Ülesande nimi"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Lõpetamise kuupäev"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Kategooria"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Näita kõiki"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Muuda ülesannet"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Alguse kuupäev:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Kuupäev puudub"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "või"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Seostatud aeg"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Tähtaeg:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Lõpetatud:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Kategooria:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Muudatusi ei salvestatud"
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Uus kasutaja on loodud"
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Ei suutnud dekodeerida visiitkaardi fotot\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Viga"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(nimetu)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "muuda"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Nõutav Autoriseering"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"See programm ei suutnud luua või säilitada ühendust Citadeliga. Palun "
+"teavita oma süsteemiadministraatorit sellest probleemist."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Loe edasi..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' ei ole Wiki tuba."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Kuupäev"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+#, fuzzy
+msgid "Enter command:"
+msgstr "Sisesta toa nimi:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+#, fuzzy
+msgid "Return to menu"
+msgstr "menüü"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+#, fuzzy
+msgid "Network configuration"
+msgstr "Konfiguratsioon"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+#, fuzzy
+msgid "Add a new node"
+msgstr "Lisa uus märge"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+#, fuzzy
+msgid "System Administration Menu"
+msgstr "Administratsioon"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+#, fuzzy
+msgid "Room Admin Menu"
+msgstr "Toa Korrapidaja: "
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+#, fuzzy
+msgid "Smart hosts"
+msgstr "Serveri aadress"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+#, fuzzy
+msgid "RBL hosts"
+msgstr "Serveri aadress"
+
+#: ../../static/t/aide/display_inetconf.html:21
+#, fuzzy
+msgid "SpamAssassin hosts"
+msgstr "Serveri aadress"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+#, fuzzy
+msgid "Global Configuration"
+msgstr "Konfiguratsioon"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Toad ja Korrused"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+#, fuzzy
+msgid "Restart Citadel"
+msgstr "Uus avaleht"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+#, fuzzy
+msgid "Message to your Users:"
+msgstr "Sõnumit ei saadetud."
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+#, fuzzy
+msgid "Site configuration"
+msgstr "Konfiguratsioon"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+#, fuzzy
+msgid "General"
+msgstr "Intervall"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Ikooniriba seaded"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+#, fuzzy
+msgid "Push Email"
+msgstr "Seadista Push Email"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+#, fuzzy
+msgid "Access"
+msgstr "Juurdepääsutase"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+#, fuzzy
+msgid "Directory"
+msgstr "Kataloogi nimi:"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+#, fuzzy
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Et anda kasutajale juurdepääsu sellele toale, sisesta kasutajanimi kasti "
+"ning klõpsa 'Kutsu'"
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Uus kasutaja: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+#, fuzzy
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Et anda kasutajale juurdepääsu sellele toale, sisesta kasutajanimi kasti "
+"ning klõpsa 'Kutsu'"
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Kasutajanimi:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Salasõna"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Peamine Interneti e-maili aadress"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Interneti e-maili aliased"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+#, fuzzy
+msgid "Number of logins"
+msgstr "Tubade arv"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+#, fuzzy
+msgid "Messages submitted"
+msgstr "Sõnumi suurus"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+#, fuzzy
+msgid "Access level"
+msgstr "Juurdepääsutase"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+#, fuzzy
+msgid "User ID number"
+msgstr "Kasutajanimi"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+#, fuzzy
+msgid "Edit or delete users"
+msgstr "Muuda või kustuta see tuba"
+
+#: ../../static/t/aide/edituser/select.html:17
+#, fuzzy
+msgid "Add users"
+msgstr "Lisa reegel"
+
+#: ../../static/t/aide/edituser/select.html:20
+#, fuzzy
+msgid "Edit or Delete users"
+msgstr "Muuda või kustuta see tuba"
+
+#: ../../static/t/aide/floorconfig.html:2
+#, fuzzy
+msgid "Add, change, or delete floors"
+msgstr "Lisa/muuda/kustuta korruseid"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+#, fuzzy
+msgid "Node name"
+msgstr "Kasutajanimi"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+#, fuzzy
+msgid "Shared secret"
+msgstr "Jagatud "
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+#, fuzzy
+msgid "Port number"
+msgstr "Korruse number"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Kinnita kustutamine"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Oled sa kindel, et soovid kustutada "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Jah"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Ei"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+#, fuzzy
+msgid "(Edit)"
+msgstr "(Muuda)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Kustuta)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+#, fuzzy
+msgid "Restart Now"
+msgstr "Nädal algab:"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "Palun oota kuni Citadeli serverile restarti tehakse..."
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+#, fuzzy
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr "Palun oota kuni Citadeli serverile restarti tehakse..."
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+#, fuzzy
+msgid "Name of quarantine room"
+msgstr "Toa nimi: "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+#, fuzzy
+msgid "Name of room to log pages"
+msgstr "Toa nimi: "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+#, fuzzy
+msgid "Self contained"
+msgstr "sisaldab"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+#, fuzzy
+msgid "Allow anonymous guest access"
+msgstr "Anonüümsed sõnumid keelatud"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+#, fuzzy
+msgid "Initial access level for new users"
+msgstr "Määra kasutaja juurdepääsutase:"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+#, fuzzy
+msgid "Configure automatic expiry of old messages"
+msgstr "Sõnumid ei aegu"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+#, fuzzy
+msgid "Default message expire policy for public rooms"
+msgstr "Sõnumite aegumise reeglid siin toas"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Sõnumid ei aegu"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Aeguvad sõnumite üldarvu alusel"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Aeguvad sõnumi vanuse alusel"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Sõnumite või päevade arv: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+#, fuzzy
+msgid "Default message expire policy for private mailboxes"
+msgstr "Sõnumite aegumise reeglid siin korrusel"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+#, fuzzy
+msgid "Same policy as public rooms"
+msgstr "Sõnumite aegumise reeglid siin toas"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+#, fuzzy
+msgid "General site configuration items"
+msgstr "Konfiguratsioon"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+#, fuzzy
+msgid "Telephone number"
+msgstr "Telefon:"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+#, fuzzy
+msgid "Name of system administrator"
+msgstr "Administratsioon"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+#, fuzzy
+msgid "Perform journaling of email messages"
+msgstr "Eelistatud nimi e-kirjadele"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+#, fuzzy
+msgid "Perform journaling of non-email messages"
+msgstr "Eelistatud nimi e-kirjadele"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+#, fuzzy
+msgid "Network services"
+msgstr "Võrgukasutaja"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+#, fuzzy
+msgid "Add, change, delete user accounts"
+msgstr "Lisa/muuda/kustuta korruseid"
+
+#: ../../static/t/aide/global_config.html:2
+#, fuzzy
+msgid "Edit site-wide configuration"
+msgstr "Konfiguratsioon"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Interneti e-maili aliased"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Välju"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Põhikäsud"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Sinu info"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Põhjalikumad tubade käsud"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Laadimine"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Anonüümne"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+#, fuzzy
+msgid "Post message"
+msgstr "sõnumist"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Manused:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "saatja"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "Saaja:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "Koopia:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "Pimekoopia:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Pealkiri (valikuline)"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Pealkiri:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- edastatud sõnum ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Sulge aken"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Lisa manus"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+#, fuzzy
+msgid "Remove"
+msgstr "(eemalda)"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Failid kaustas"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Lae fail üles:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Failinimi"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Suurus"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Sisu"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Kirjeldus"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Pildi üleslaadimine"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Sa võid laadida pildi otse oma arvutist"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Palun vali fail mida soovid üleslaadida:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Pildiesitlus"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Lisa/muuda/kustuta korruseid"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Korruse number"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Korruse nimi"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Tubade arv"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "Korruse CSS"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(kustuta korrus)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Sa pead olema sisselogitud, et siseneda sellele lehele."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Salasõna:"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Viimati sees"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Uus kasutaja? Registreeri nüüd"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr "võta ühendust süsteemiadministraatoriga "
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Logi sisse kasutades OpenID'd"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+#, fuzzy
+msgid "Log in using Google"
+msgstr "Logi sisse kasutades OpenID'd"
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Logi sisse kasutades OpenID'd"
+
+#: ../../static/t/get_logged_in.html:100
+#, fuzzy
+msgid "Log in using AOL or AIM"
+msgstr "Logi sisse kasutades OpenID'd"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "Palun oota"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "See on uuendus sinu kalendris olevale sündmusele '%s'."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr "See sündmus läheks vastuollu juba kalendris oleva sündmusega '%s'."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Keel:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Kirjakast"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Ülesanded"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Toad"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Online kasutajad"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Vestle"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Põhjalikum"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Administratsioon"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "muuda menüüd"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "tubade vaade"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "menüü"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Minu kaustad"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Personaliseeri Ikooniriba"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Näita ikoone kui:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "pildid ja tekst"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "ainult pildid"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "ainult tekst"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr "Vali ikoonid mida sa soovid vasakul asuval 'Ikooniribal' näha"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Lehekülje logo"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Pisipilt kirjeldamaks seda keskkonda"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Sinu kokkuvõttelehekülg"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Kirjakast"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Otsetee sinu e-maili kirjakasti"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Sinu isiklik aadressiraamat"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Sinu isiklikud märkmed"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Otsetee sinu kalendri juurde"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Otsetee sinu isikliku ülesannete nimekirja juurde"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Sellel ikoonil klõpsamine kuvab nimekirja kõigist juurdepääsetavatest "
+"tubadest (või kataloogidest)."
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Kes on sisse logitud?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+"Sellel ikoonil klõpsamine kuvab nimekirja kasutajatest kes on hetkel sisse "
+"logitud."
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Sellel ikoonil klõpsamine avab reaalajas vestluse teiste samas ruumis "
+"asuvate kasutajatega"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Veel valikuid"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Juurdepääs täieliku Citadeli funktsioonide menüüle"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Citadeli logo"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Kuvab 'Powered by Citadel' ikooni"
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+#, fuzzy
+msgid " to the "
+msgstr "Mine sinna"
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Mine tagasi..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+#, fuzzy
+msgid "from the"
+msgstr "postitaja "
+
+#: ../../static/t/listsub/display.html:42
+#, fuzzy
+msgid "mailing list."
+msgstr "Kalendri nimekiri"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+#, fuzzy
+msgid "Back..."
+msgstr "Mine tagasi..."
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+#, fuzzy
+msgid "Confirmation failed."
+msgstr "Konfiguratsioon"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Ülesande nimi"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Eelistatud e-maili aadress"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "Sisesta sõnumi tekst:"
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "Aja formaat"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+#, fuzzy
+msgid "Logged in as"
+msgstr "Viimati sees"
+
+#: ../../static/t/loggedinas.html:6
+#, fuzzy
+msgid "Not logged in."
+msgstr "Ei ole võrgus"
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "jooksutab"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Sisene uuesti"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Muuda või kustuta see tuba"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Mine 'peidetud' tuppa"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Loo uus tuba"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Loo uus tuba"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "Unusta see tuba"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Näita kõiki unustatud tube"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Loe uusi sõnumeid"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Näita kõiki teadaolevaid tube"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Kuhu ma saan siit edasi minna?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Mine järgmisesse tuppa"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "...kus on <em>lugemata</em> sõnumeid"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Hüppa edasi järgmisesse tuppa"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(tule siia hiljem tagasi)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Mine tagasi"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "uups! Tagasi "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Loe uusi sõnumeid"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "...selles toas"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Loe kõiki sõnumeid"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "...nii vanu kui uusi"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Sisesta sõnum"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(postita siia tuppa)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "Failikaust"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(Näita faile mida saab allalaadida)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Kokkuvõttelehekülg"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Minu konto koondülevaade"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Kasutajate nimekiri"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(kõik registreeritud kasutajad)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Nägemist!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Muuda oma salasõna"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Sisesta uus salasõna:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Sisesta salasõna uuesti:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Muuda oma eelistusi ja seadeid"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Uuenda oma kontaktinfot"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Sisesta oma 'resümee'"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Muuda oma online fotot"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Vaata/muuda serveris asuvaid postifiltreid"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "Muuda oma push email (mobiili special) seadeid"
+
+#: ../../static/t/menu/your_info.html:9
+#, fuzzy
+msgid "Manage your OpenIDs"
+msgstr "Muuda oma salasõna"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Kinnita sõnumi liigutamine"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Liiguta see sõnum kausta:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Loed #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "sõnumist"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "vanimast uuemani"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "uuemast vanimani"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Saatja"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Laen serverist kirju, palun oota"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Ava uues aknas"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Liiguta"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Kopeeri"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Prindi"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Vaata kontakte"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Lisa uus kontakt"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Päeva vaade"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Kuu vaade"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Lisa uus sündmus"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Kalendri nimekiri"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Vaata ülesandeid"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Lisa uus ülesanne"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Vaata märkmeid"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Lisa uus märge"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Värskenda sõnumite nimekirja"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Saada kiri"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Wiki koduleht"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Muuda seda lehekülge"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "uuemad postitused"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Jäta tuba vahele"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "Uus avaleht"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "Sinu avaleht on muudetud"
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+"NB: see ei muuda sinu brauseri avalehte. See määrab lehekülje, mida sa "
+"näedesimesena, kui siia sisse logid"
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Palun sisesta kasutajanimi mida soovid kasutada."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Eelistused ja seaded"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Puu (kataloogidena) vaade"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Tabel (tubadena) vaade"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 tundi (am/pm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 tundi"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Pühapäevaga"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Esmaspäevaga"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Ei kasuta allkirja"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "Täisfunktsionaalsus"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Turvarežiim"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+"Turvarežiim ei kurna sinu veebilehitsejat niipalju, kuid ei ole ka kõigi "
+"võimalustega."
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr "Seadista Push Email"
+
+#: ../../static/t/prefs/pushemail.html:9
+#, fuzzy
+msgid "Push email and SMS settings"
+msgstr "Muuda oma push email (mobiili special) seadeid"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+#, fuzzy
+msgid "Send a text message to..."
+msgstr "Saada kiirsõnum kasutajale: "
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Toa nimi: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Asub korrusel: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Vaikimisi vaade sellele toale: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Toa liik:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Avalik (ilmub automaatselt kõigile)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+"Privaatne - peidetud (juurdepääsetav ainult nendele, kes teavad toa nime)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privaatne - nõua salasõna: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privaatne - ainult kutse alusel"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Personaalne (kirjakast ainult sinule)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Loo uus tuba"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Toa nimi: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Vaikimisi vaade sellele toale: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Toa liik:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Muuda selle toa Info faili"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Mine peidetud tuppa"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Sisesta toa nimi:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Sisesta toa salasõna:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Konfiguratsioon"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Sõnumite aegumise reeglid"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Juurdepääsuõigused"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Jagamine"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Mujalt posti kogumine"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(eemalda)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+#, fuzzy
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Allolevas nimekirjas olevatel kasutajatel on juurdepääs sellele toale. Et "
+"kasutajatnimekirjast eemaldada, vali kasutajanimi ning klõpsa 'Löö minema'"
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Et anda kasutajale juurdepääsu sellele toale, sisesta kasutajanimi kasti "
+"ning klõpsa 'Kutsu'"
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Kutsu:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Kasutajad"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Kustuta see tuba"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+#, fuzzy
+msgid "Set or change the icon for this rooms banner"
+msgstr "Määra või muuda selle toa banneri ikooni"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+#, fuzzy
+msgid "Edit this rooms Info file"
+msgstr "Muuda selle toa Info faili"
+
+#: ../../static/t/room/edit/tab_config.html:7
+#, fuzzy
+msgid "name of room: "
+msgstr "Toa nimi: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Kui privaatne, sunni kasutajaid tuba unustama"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Ainult Privilegeeritud kasutajad"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Loe-ainult tuba"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "Kasutajad, kes tohivad postitada, tohivad ka sõnumeid kustutada"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Failivahetuse tuba"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Kataloogi nimi:"
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Üleslaadimine lubatud"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Allalaadimine lubatud"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Säilita koopia serveris?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Nähtav kataloog"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Tuba jagatud võrku"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanentne (ei toimu auto-tühjendamist)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "Pealkiri Nõutud (Sunni kasutajaid sõnumitele pealkirju lisama)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Anonüümsed sõnumid"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Anonüümsed sõnumid keelatud"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Kõik sõnumid on anonüümsed"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Teavita kasutajat sõnumi sisestamisel"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Toa Korrapidaja: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Sõnumite aegumise reeglid siin toas"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Kasuta vaikimisi reegleid sõnumite aegumiseks"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Sõnumite aegumise reeglid siin korrusel"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Kasuta süsteemi vaikimisi seadeid"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr "Kogu kirju nendelt POP3 kontodelt ja salvesta siia tuppa"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "Serveri aadress"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Kasutajanimi"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Säilita koopia serveris?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "Intervall"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Kogu järgmiseid RSS feed'e ja salvesta nad siia tuppa:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "Feed'i URL"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Lisa saajad Kontaktidest või teistest aadressiraamatutest"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Ei ole jagatud"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Jagatud"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+#, fuzzy
+msgid "Remote node name"
+msgstr "Kasutajanimi"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+#, fuzzy
+msgid "Remote room name"
+msgstr "Sisesta toa nimi:"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Tegevused"
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Toa info"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Unusta praegune tuba"
+
+#: ../../static/t/room/zap_this.html:6
+#, fuzzy
+msgid "If you select this option,"
+msgstr "Muuda või kustuta see tuba"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Unustatud toad"
+
+#: ../../static/t/room/zapped_list.html:10
+#, fuzzy
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Klõpsa toal, et seda taas 'meelde tuletada' ning sinna siseneda.\n"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Vali lehekülg: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Otsi: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Kõik"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Lisa või kustuta skripte"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Lisa uus skript"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Skripti nimi: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Muuda skripte"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Tagasi skript editori aknasse"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Kustuta skripte"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Kui"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Saaja või Koopia"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Vastus"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Sõnumi suurus"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "sisaldab"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "ei sisalda"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "on"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "ei ole"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "kattub"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "ei kattu"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Kõik sõnumid)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "on suurem kui"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "on väiksem kui"
+
+#: ../../static/t/sieve/display_one.html:59
+#, fuzzy
+msgid "bytes"
+msgstr "aastat"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Säilita"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Kustuta vaikides"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Hülga"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Liiguta kausta"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Saada edasi"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Puhkusel"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Vastus:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "ja siis"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "jätka töötlemist"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "peatu"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Kui uus kiri saabub: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Filtreeri vastavalt alltoodud reeglitele"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Jäta see minu Kirjakasti ilma filtreerimata"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+"Filtreeri vastavalt käsitsi sisestatud skriptile (pead teadma mida sa teed)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Lisa reegel"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+#, fuzzy
+msgid "Summary page for "
+msgstr "Kasutaja %s kokkuvõtteleht"
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Sõnumid"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Täna&nbsp;sinu&nbsp;Kalendris"
+
+#: ../../static/t/summary/page.html:51
+#, fuzzy
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Kes&nbsp;on&nbsp;hetkel&nbsp;võrgus"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Sellest&nbsp;serverist"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+#, fuzzy
+msgid "with"
+msgstr "viies"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+#, fuzzy
+msgid "and located in"
+msgstr "ja siis"
+
+#: ../../static/t/summary/page.html:68
+#, fuzzy
+msgid "Your system administrator is"
+msgstr "Administratsioon"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Sisesta oma 'resümee'"
+
+#: ../../static/t/user/list.html:3
+#, fuzzy
+msgid "User list for "
+msgstr "%s kasutajate nimekiri"
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Kasutajanimi"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Number"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Juurdepääsutase"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Viimati sees"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Logimisi kokku"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Postitusi kokku"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Kasutajaprofiil"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+#, fuzzy
+msgid "Click here to send an instant message to"
+msgstr "Klõpsa siin, et saata kasutajale %s kiirsõnum"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Muuda kontaktinfot"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Tiitel"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Eesnimi"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Lisanimi"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Perekonnanimi"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Kuvatav nimi:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Ametinimi:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organisatsioon:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Postkast"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Aadress:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Linn:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Maakond:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Postiindeks"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Riik"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Kodune telefon:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Töötelefon:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Mobiiltelefon:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Faks:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "See aadressiraamat on tühi"
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Tekkis sisemine viga"
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Postita kommentaar"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "uuemad postitused"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "vanemad postitused"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "Postita kommentaar"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Serveri aadress"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Maakond:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "jätka töötlemist"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "postitaja "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Vasta"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "Tsiteeri"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "VastaKõigile"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Edasta"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+#, fuzzy
+msgid "View"
+msgstr "Kuva kui:"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Lae"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Kuva kui:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "Kasutajad hetkel võrgus  - "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr "Klõpsa nimel et saada kasutaja kohta infot. Klõpsa"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "et saata sellele kasutajale kiirsõnum."
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+#, fuzzy
+msgid "(kill)"
+msgstr " (mobiil)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Tuba"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "Aadressilt"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Muuda oma sessiooni väljanägemist"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Toa nimi:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+#, fuzzy
+msgid "Users currently on"
+msgstr "Kasutajad hetkel võrgus  - "
+
+#: ../../static/t/who/section.html:5
+#, fuzzy
+msgid "Edit configuration"
+msgstr "Konfiguratsioon"
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "See aadressiraamat on tühi"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Mine sinna"
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Ei leia '%s' nimelist tuba."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#~ msgid "the icon for this floor"
+#~ msgstr "selle korruse pisipilt"
+
+#~ msgid "Edit %s"
+#~ msgstr "Muuda %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Salvesta muudatused"
+
+#~ msgid " (work)"
+#~ msgstr " (töö)"
+
+#~ msgid " (home)"
+#~ msgstr " (kodune)"
+
+#~ msgid " (cell)"
+#~ msgstr " (mobiil)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefon:"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#, fuzzy
+#~ msgid "Directory domains"
+#~ msgstr "Kataloogi nimi:"
+
+#, fuzzy
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Serveri aadress"
+
+#~ msgid "Create new room"
+#~ msgstr "Loo uus tuba"
+
+#~ msgid "Zap this room"
+#~ msgstr "Unusta tuba"
+
+#~ msgid ""
+#~ "You have one or more instant messages waiting, but the Citadel Instant "
+#~ "Messenger window failed to open.  This is probably because you have a "
+#~ "popup blocker installed.  Please configure your popup blocker to allow "
+#~ "popups from this site if you wish to receive instant messages."
+#~ msgstr ""
+#~ "Sul on üks või enam kiirsõnumit ootamas, kuid Citadeli Sõnumitooja aken "
+#~ "ei suutnud avaneda. See on tingitud arvatavasti installeeritud pop-up "
+#~ "blokeerijast,või on netilehitsejal hüpikaknad keelatud. Palun luba "
+#~ "hüpikaknad siit lehelt."
+
+#, fuzzy
+#~ msgid "Change"
+#~ msgstr "Muuda CSS"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Tuba jagatud võrku"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Lisa uus märge"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "minutit"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Üritan"
+
+#~ msgid "Send"
+#~ msgstr "Saada"
+
+#, fuzzy
+#~ msgid "Delete this message?"
+#~ msgstr "Kustuta see märge?"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Toa info"
+
+#~ msgid "Pictures in"
+#~ msgstr "Pildid kaustas"
+
+#~ msgid "Exit"
+#~ msgstr "Välju"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Lae fail üles:"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Oled sa kindel, et soovid kustutada "
+
+#~ msgid "Upload"
+#~ msgstr "Lae üles"
+
+#~ msgid "Add"
+#~ msgstr "Lisa"
+
+#~ msgid "Create"
+#~ msgstr "Loo"
+
+#~ msgid "Kick"
+#~ msgstr "Löö minema"
+
+#~ msgid "Invite"
+#~ msgstr "Kutsu"
+
+#~ msgid "User"
+#~ msgstr "Kasutaja"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Aadressiraamat"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Kustuta reegel"
+
+#, fuzzy
+#~ msgid "Delete this user?"
+#~ msgstr "Kas kustutan selle skripti?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Kustuta reegel"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "Sinu sissetulevaid kirju ei filtreerita."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "Hetkel aktiivne skript on: "
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Kuvab 'Powered by Citadel' ikooni"
+
+#, fuzzy
+#~ msgid "Go to your email inbox"
+#~ msgstr "Otsetee sinu e-maili kirjakasti"
+
+#, fuzzy
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Otsetee sinu kalendri juurde"
+
+#, fuzzy
+#~ msgid "Go to your personal address book"
+#~ msgstr "Sinu isiklik aadressiraamat"
+
+#, fuzzy
+#~ msgid "Go to your personal notes"
+#~ msgstr "Sinu isiklikud märkmed"
+
+#, fuzzy
+#~ msgid "Go to your personal task list"
+#~ msgstr "Otsetee sinu isikliku ülesannete nimekirja juurde"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Näita kõiki unustatud tube"
+
+#, fuzzy
+#~ msgid "Room and system administration functions"
+#~ msgstr "Administratsioon"
+
+#~ msgid "Reset form"
+#~ msgstr "Tühjenda vorm"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Kustuta see märge?"
+
+#~ msgid "Create new floor"
+#~ msgstr "Loo uus korrus"
+
+#~ msgid "Move rule up"
+#~ msgstr "Liiguta reeglit üles"
+
+#~ msgid "Move rule down"
+#~ msgstr "Liiguta reeglit alla"
+
+#~ msgid "Delete rule"
+#~ msgstr "Kustuta reegel"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(muuda kujundust)"
+
+#~ msgid "Change name"
+#~ msgstr "Muuda nime"
+
+#~ msgid "Change CSS"
+#~ msgstr "Muuda CSS"
+
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Oled sa kindel, et soovid seda tuba kustutada?"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Sisesta toa nimi:"
+
+#~ msgid "Unshare"
+#~ msgstr "Lõpeta jagamine"
+
+#, fuzzy
+#~ msgid "Master user password"
+#~ msgstr "Sisesta uus salasõna:"
+
+#~ msgid "Delete this note?"
+#~ msgstr "Kustuta see märge?"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "Ülesannete nimekiri"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "Aja formaat"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Pealkiri"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Oled sa kindel, et soovid seda tuba kustutada?"
+
+#~ msgid "Share"
+#~ msgstr "Jaga"
+
+#~ msgid "Change password"
+#~ msgstr "Muuda salasõna"
+
+#~ msgid "Change room name"
+#~ msgstr "Muuda toa nime"
+
+#~ msgid "Change user name"
+#~ msgstr "Muuda kasutajanime"
+
+#~ msgid ""
+#~ "Leave all messages marked as unread, go to next room with unread messages"
+#~ msgstr ""
+#~ "Jäta kõik sõnumid märgituks kui lugemata ning mine järgmisesse tuppa kus "
+#~ "on lugemata sõnumeid"
+
+#~ msgid "Mark all messages as read, go to next room with unread messages"
+#~ msgstr ""
+#~ "Märgi siin sõnumid loetuks ja liigu järgmisesse tuppa kus on lugemata "
+#~ "sõnumeid"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Salvesta muudatused"
+
+#, fuzzy
+#~ msgid "Network"
+#~ msgstr "Võrgukasutaja"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Sellenimeline skript on juba olemas."
+
+#~ msgid "Delete script"
+#~ msgstr "Kustuta skript"
+
+#~ msgid "Delete this script?"
+#~ msgstr "Kas kustutan selle skripti?"
+
+#~ msgid ""
+#~ "You are connected to %s, running %s with %s, server build %s and located "
+#~ "in %s.  Your system administrator is %s."
+#~ msgstr ""
+#~ "Sa oled ühendunud võrku %s, mis jookseb tarkvaral %s veebiliidesega %s, "
+#~ "serveri versioon %s ning asukohaga %s. Sinu süsteemiadministraator on %s."
+
+#~ msgid "Yes with users list"
+#~ msgstr "Jah, koos kasutajanimedega"
+
+#~ msgid "Room list"
+#~ msgstr "Tubade nimekiri"
+
+#, fuzzy
+#~ msgid "uname"
+#~ msgstr "Failinimi"
+
+#, fuzzy
+#~ msgid "text"
+#~ msgstr "ainult tekst"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "Failinimi"
+
+#, fuzzy
+#~ msgid "pname"
+#~ msgstr "Failinimi"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Salasõna"
+
+#, fuzzy
+#~ msgid "pass"
+#~ msgstr "Ülesanded"
+
+#, fuzzy
+#~ msgid "display: none"
+#~ msgstr "Kuvatav nimi:"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Sinu parooli ei aktsepteeritud."
+
+#~ msgid "If you already have an account on"
+#~ msgstr "Kui sul on juba konto"
+
+#~ msgid "enter your user name and password and click &quot;Log in.&quot;"
+#~ msgstr ""
+#~ "siis sisesta oma kasutajanimi ja salasõna ning klõpsa &quot;Logi sisse."
+#~ "&quot;"
+
+#~ msgid "Please log off properly when finished. "
+#~ msgstr "Kui lõpetad, siis palun logi korrektselt välja. "
+
+#~ msgid "See the"
+#~ msgstr "Vaata"
+
+#~ msgid "recommended browser list"
+#~ msgstr "soovitatud brauserite nimekirja"
+
+#~ msgid ""
+#~ "if you have trouble using Webcit.</li> <li>You must have <i>cookies</i> "
+#~ "turned on. "
+#~ msgstr ""
+#~ "kui sul on Webcit'iga probleeme.</li> <li>Sul peavad <i>küpsised</"
+#~ "i>lubatud olema. "
+
+#~ msgid ""
+#~ "Also keep in mind that if your browser is configured to block pop-up "
+#~ "windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "Samuti pea meeles, et kui sinu brauser blokeerib hüpikaknaid (pop-up)siis "
+#~ "ei ole sa suuteline kiirsõnumeid vastu võtma."
+
+#, fuzzy
+#~ msgid "Log off now?"
+#~ msgstr "Välju"
+
+#~ msgid "%d new of %d messages%s"
+#~ msgstr "%d uut, %d sõnumist%s"
+
+#~ msgid "(nothing)"
+#~ msgstr "(ei midagi)"
+
+#~ msgid "Now exiting chat mode."
+#~ msgstr "Väljun sõnumivahetuse režiimist."
+
+#~ msgid "Help"
+#~ msgstr "Abi"
+
+#~ msgid "List users"
+#~ msgstr "Kuva kasutajad"
+
+#~ msgid "No messages here."
+#~ msgstr "Siin ei ole sõnumeid."
+
+#, fuzzy
+#~ msgid "no more messages"
+#~ msgstr "Anonüümsed sõnumid"
+
+#~ msgid ""
+#~ "Your icon bar has been updated.  Please select any of its choices to "
+#~ "continue.<br/><span style=\"font-weight: bold;\">You may need to force "
+#~ "refresh (SHIFT-F5) in order for changes to take effect</span>"
+#~ msgstr ""
+#~ "Sinu ikooniriba on uuendatud. Palun klõpsa sealt mõnel ikoonil et edasi "
+#~ "minna.<br/><span style=\"font-weight: bold;\">Võib juhtuda et sa pead "
+#~ "lehte refreshima (SHIFT-F5) et muudatused teoks saaksid</span>"
+
+#~ msgid "Email"
+#~ msgstr "E-mail"
+
+#~ msgid "Error retrieving RSS feed: couldn't find messages\n"
+#~ msgstr "RSS feed'i vastuvõtmisel tekkis viga: ei leidnud sõnumeid\n"
diff --git a/webcit/po/webcit/fi.po b/webcit/po/webcit/fi.po
new file mode 100644 (file)
index 0000000..100745b
--- /dev/null
@@ -0,0 +1,4082 @@
+# Finnish translation for citadel
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2011-01-15 08:57+0000\n"
+"Last-Translator: Esa Hulkko <Unknown>\n"
+"Language-Team: Finnish <fi@li.org>\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-08-01 04:33+0000\n"
+"X-Generator: Launchpad (build 15719)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Tuhottu"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Uusi käyttäjä"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr ""
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Paikallinen käyttäjä"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Verkkokäyttäjä"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Ylläpitäjä"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr ""
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Tapahtui virhe."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Hyväksy uudet käyttäjät"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "Erittäin heikko"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "heikko"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "ok"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "vahva"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Peruutettu. Salasanaa ei vaihdettu."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Salasanat eivät täsmää. Salasanaa ei vaihdettu."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Tyhjä salasana ei ole sallittu"
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr ""
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "vapaa"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "VARATTU"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr ""
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Yhteenveto:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Sijainti:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Päivämäärä:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Alkamis päivä/aika:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Loppumis päivä/aika:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Kuvaus:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Toistuvuus"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr ""
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr ""
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr ""
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr ""
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr ""
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr ""
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr ""
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr ""
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr ""
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr ""
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "alustava"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr ""
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "valmis"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "käsittelee"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(ei mitään)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "Lähettäjä:"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "c"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Päiväys/aika:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Muistiinpanot:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "edellinen"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "seuraava"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Viikko"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Tuntia"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "aihe"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Käynnistä"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Kestää koko päivän"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Menneillään oleva tapahtuma"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "sekuntia"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minuuttia"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "tuntia"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "vuorokautta"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "viikkoa"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "kuukautta"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "vuotta"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "ei koskaan"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "ensimmäinen"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "sekunti"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "3."
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "4."
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "5."
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Tapahtuma"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Osallistujat"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Lisää tai muokkaa tapahtumaa"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Yhteenveto"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Sijainti"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Muistiinpanot"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Tallenna"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Poista"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Keskeytä"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr ""
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+#, fuzzy
+msgid " has been deleted."
+msgstr "%s on tallennettu."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Tee tästä aloitussivuni"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "Tästä ei voi tehdä aloitussivua"
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Aloitussivua ei ole enää valittu"
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Peruutettu. Muutoksia ei tallennettu."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Muutoksesi on tallennettu."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr ""
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr ""
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr ""
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr ""
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr ""
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr ""
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr ""
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr ""
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr ""
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr ""
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Järjestelmän asetukset on päivitetty."
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Ei mitään)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Ei mitään)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+#, fuzzy
+msgid " has been saved."
+msgstr "%s on tallennettu."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Valmis?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Tehtävän nimi"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Tavoitepäivämäärä"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Kategoria"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Näytä kaikki"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Muokkaa tehtävää"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Aloituspäivämäärä:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Ei päivämäärää"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "tai"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Tavoitepäivämäärä:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Valmis:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Kategoria:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr ""
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Virhe"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(nimetön)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Lue lisää..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr ""
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Käyttäjänimi:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Ensisijainen sähköpostiosoite:"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr "Yleiset sähköpostitunnukset"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Kirjaudu ulos"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Kirjaudu uudestaan"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr ""
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Tehtävät"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Tehtävän nimi"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Ensisijainen sähköpostiosoite:"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Kirjaudu uudestaan"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Vaihda salasanasi"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Kirjoita uusi salasana:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Kirjoita salasana uudestaan:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Lähettäjä"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "uudempia virkaa"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Tehtävän nimi"
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr ""
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Kaikki"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Viestin koko"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "sisältää"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "ei sisällä"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "on"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "ei ole"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Kaikki viestit)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "on suurempi kuin"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "on pienempi kuin"
+
+#: ../../static/t/sieve/display_one.html:59
+#, fuzzy
+msgid "bytes"
+msgstr "vuotta"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Säilytä"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Välitä"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Loma"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Viesti:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "pysäytä"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Kun uusi sähköposti saapuu: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Lisää sääntö"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Viestit"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Etunimi"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Toinen nimi"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Sukunimi"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Jälkiliite"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Näyttönimi:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Nimike:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organisaatio:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Postilokero:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Osoite:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Kaupunki:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Osavaltio:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Postinumero:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Maa:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Kotipuhelin:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Työpuhelin:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Matkapuhelin:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "FAX:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Tämä osoitekirja on tyhjä."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Lähetä kommentti"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "uudempia virkaa"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "vanhemmat viestit"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "Lähetä kommentti"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Osavaltio:"
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr ""
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "Tämä osoitekirja on tyhjä."
+
+#: ../../static/t/wiki/empty.html:5
+msgid "'here"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "There is no page called '"
+msgstr ""
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#~ msgid "Edit %s"
+#~ msgstr "Muokkaa %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Tallenna muutokset"
+
+#~ msgid "E-mail:"
+#~ msgstr "Sähköpostiosoite:"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Verkkokäyttäjä"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "minuuttia"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "alustava"
+
+#, fuzzy
+#~ msgid "Send"
+#~ msgstr "Lähettäjä"
+
+#~ msgid "Add"
+#~ msgstr "Lisää"
+
+#~ msgid "Create"
+#~ msgstr "Luo"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Uusi käyttäjä"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Poista"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Poista"
+
+#, fuzzy
+#~ msgid "Delete rule"
+#~ msgstr "Poista"
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "Vaihda käyttäjänimeä"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "aihe"
+
+#~ msgid "Change password"
+#~ msgstr "Vaihda salasana"
+
+#~ msgid "Change user name"
+#~ msgstr "Vaihda käyttäjänimeä"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Tallenna muutokset"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Salasana ei kelpaa"
diff --git a/webcit/po/webcit/fr.po b/webcit/po/webcit/fr.po
new file mode 100644 (file)
index 0000000..449c0d9
--- /dev/null
@@ -0,0 +1,4801 @@
+# translation of webcit.po to fr.po
+# Copyright (C) 2008 - 2009 The Citadel Project - http://www.citadel.org
+#
+# Gilles Desplanques - <gilles.desplanques@nessie.homeip.net>
+# Jacques Lavignotte - <jacques@lavignotte.org>
+# Thierry Pasquier - <thierry.pasquier@pictascience.org>, 2006
+# Robert di Rosa <robert@di-rosa.ch>
+# Peter Bocsak <peterbocsak@gmail.com>
+#
+# This file is distributed under BSD License
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2013-10-28 08:45+0000\n"
+"Last-Translator: Peter Bocsak <peterbocsak@gmail.com>\n"
+"Language-Team: <room_citadel_translators@uncensored.citadel.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-10-29 04:35+0000\n"
+"X-Generator: Launchpad (build 16818)\n"
+"X-Poedit-Country: FRANCE\n"
+"X-Poedit-Language: French\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Supprimé"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Nouvel usager"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Usager à problème"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Usager local"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Usager en réseau"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Usager privilégié"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Administrateur"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Une erreur est apparue."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Valider les nouveaux usagers"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Aucun usager ne requière de validation actuellement."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "très faible"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "faible"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "ok"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "strong"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Niveau d'accès actuel : %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Sélection du niveau d'accès de cet usager :"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Abandon. Le mot de passe n'a pas été changé."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr ""
+"Les deux saisies sont différentes. Le mot de passe n'a pas été modifié."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Les mots de passe vides ne sont pas autorisés."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "disponibilité inconnue"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "libre"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "OCCUPÉ(E)"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Aller à la page : "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Premier"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Dernier"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Invitation à une réunion"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Réponse(s) à votre invitation"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Événement publié"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Type d'événement inconnu."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Résumé :"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Lieu :"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Date :"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Date et horaire de début :"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Date et horaire de fin :"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Description :"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Récurrence"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "C'est un événement récurrent"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Participant-e-s :"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Ceci est une mise à jour de '%s' déjà présent dans votre agenda."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+"Cet événement entre en conflit avec '%s' qui est déjà dans votre agenda."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Mise à jour :"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "CONFLIT :"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Comment souhaitez-vous répondre à cette invitation ?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Accepter"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Peut-être"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Décliner"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Cliquez sur <i>Mise à jour</i> pour accepter cette réponse et actualiser "
+"votre agenda."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Mise à jour"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignorer"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Il y a une erreur dans l'analyse des données de cet événement."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr "Vous avez accepté cette invitation. Votre agenda a été actualisé."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Vous avez indiqué que vous accepteriez 'Peut-être' cette invitation, elle "
+"est notée <b>provisoirement</b> dans votre agenda."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Vous avez décliné cette invitation. Votre agenda <b>n'a pas été</b> modifié."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Une réponse a été envoyée à l'organisateur de la réunion."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Votre agenda a été mis à jour pour tenir compte de cette réponse."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"Vous avez choisi d'ignorer cette réponse. Votre agenda <b>n'a pas</b> été "
+"modifié."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Heure de début de journée :"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Heure de fin de journée :"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "La semaine démarre le:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Heure : "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minute : "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(pas encore de réponse)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(action requise)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(accepté)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(décliné)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(tentative)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(délégué)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(achevé)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(en cours)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(aucun)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Événement sans titre"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "De"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "date de début:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "date de fin:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Date/heure"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Notes :"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "précédent"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "suivant"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Semaine"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Heures"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Objet"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Début"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Fin"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "journée entière"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Évènement en cours"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Tâche sans titre"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "Une erreur est apparue en récupérant ce fichier : %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "secondes"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minutes"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "heures"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "jours"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "semaines"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "mois"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "années"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "jamais"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "Prénom"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "Envoyer"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "troisième"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "quatrième"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "cinquième"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Événement"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "invités"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Ajouter ou modifier un événement"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Résumé"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Lieu"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Notes"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organisateur"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(vous êtes l'organisateur)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Disponibilité"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Libre"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "occupé-e"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(un par ligne)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Contacts"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Règle de récurrence"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Répéter chaque"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "ces jours de la semaine:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "le jour %s%d%s du mois"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "sur le "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "du mois"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "chaque "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "année de cette date"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "de"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "plage de récurrence"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Pas de date de fin"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Répéter cet événement"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "heures"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Répéter cette évènement jusqu'à "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Enregistrer"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Supprimer"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Vérifiez la disponibilité des invités"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Abandonner"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Format horaire"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Le téléchargement de l'image a été abandonné."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Vous n'avez pas téléchargé de fichier."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "Votre photographie"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "l'icône de ce salon"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "l'image d'accueil pour la connexion"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "la bannière de déconnexion"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "realloc() error! couldn't get %d bytes: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Options de la barre d'icônes"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Paramètre invalide"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr " à été supprimé"
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr " ajouté"
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Un niveau d'accès supérieur est requis pour utiliser cette fonction"
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+"Vous devez spécifier la liste de distribution à laquelle vous, vous inscrivez"
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "Vous devez spécifier l'adresse mail avec laquelle vous vous inscrivez"
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(pas d'objet)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "ERREUR :"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Message vide"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Abandon. Message non envoyé."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Abandon automatique car vous avez déjà enregistré ce message."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "Sauvegarde dans le dossier brouillon à échoué "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "L'envoit de message vide à été réfusé\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "Le message à été sauvé dans le dossier brouillon\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Message envoyé.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Message posté.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Ce message n'a pas été déplacé."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "Une erreur est apparue en récupérant cette partie : %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Une erreur est apparue en récupérant cette partie : %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Attacher une signature aux courriels ?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Utiliser cette signature :"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Jeu de caractères par défaut pour les en-têtes des courriels :"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Adresse de courriel préférée"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Intitulé d'affichage des courriels"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Nom à utiliser dans le panneau d'affichage"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Mode d'affichage"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Je ne sais pas comment afficher "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Cliquer sur une note pour la modifier."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Gérer les associations comptes / OpenID"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Voulez vous vraiment supprimer ce compte OpenID?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(Supprimer)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Ajouter un compte OpenID "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Attacher"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s n'autorise pas l'authentification via OpenID."
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Envoyer un message instantané"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Envoyer un message instantané à : "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Entrez le texte du message :"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Envoyer le message"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Le message n'a pas été envoyé."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Le message a été envoyé à "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Annulé. Aucun réglage n'a été modifié."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "En faire ma page d'accueil"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "Ceci ne peut pas devenir votre page d'accueil"
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Vous n'avez pas encore choisi de page d'accueil."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "page d'accueil par défaut"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Mes répetoires"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Abandon. Les modifications ne seront pas prises en compte."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Vos modifications ont été enregistrées."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "L'utilisateur %s a été renvoyé du salon %s."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "L'utilisateur %s a été invité à rejoindre le salon %s."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Abandon. Aucun nouveau salon n'a été créé."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Le palier a été détruit."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Un nouveau palier a été créé."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Liste des salons"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Afficher les paliers vides"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "fichier"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "fichiers"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Panneau d'affichage"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Dossier de messages"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Carnet d'adresses"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Calendrier"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Liste des tâches"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Liste des notes"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Agenda"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Journal"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Brouillons"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Le nombre maximum d'usagers simultanés sur ce serveur est atteint, celui-ci "
+"ne peut plus accepter de connexions supplémentaires.  SVP essayez plus tard "
+"ou contactez l'administrateur du système."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+"Nous avons reçu une réponse inatendue du serveur Citadel; interruption du "
+"programme."
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Vous êtes connecté à un serveur qui fonctionne avec Citadel %d.%02d. \n"
+"Pour permettre à cette version de WebCit de fonctionner, vous devez utiliser "
+"Citadel %d.%02d ou une version plus récente.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "La configuration de votre système a été mise à jour"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr "Première tentative en attente"
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Rien)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Vide)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Abandon. %s n'a pas été enregistré."
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr " à été sauvegardé"
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Informations sur le salon"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Votre biographie"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Achevé ?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Intitulé de la tâche"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Échéance"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Catégorie"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Les montrer tous"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Éditer la tâche"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Date de début :"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Sans date"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "ou"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Temps associé"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Échéance :"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Achevé :"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Catégorie:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"Une erreur est apparue pendant la création ou la modification de ce contact."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Les changements n'ont pas été enregistrés."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Un nouvel usager a été créé."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"Vous essayez de créer un nouvel usager en utilisant le système interne à "
+"Citadel alors que celui-ci est en mode d'authentification sur le système. "
+"Dans ce mode, vous devez créer les nouveaux usagers directement sur le "
+"système hôte et non avec Citadel."
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Impossible de décoder la photo de la vcard\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Erreur"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Impossible d'entrer dans le salon pour sauver votre message"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Abandon."
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(pas de nom)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "modifier"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Autorisation requise"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"La ressource que vous avez demandée requiert un nom d'usager et un mot de "
+"passe valides. Vous n'avez pas été connecté à %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Ce programme n'a pas pu se connecter ou rester connecté au serveur Citadel. "
+"SVP informez l'administrateur du système de ce problème."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "En lire plus..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' n'est pas un salon du type wiki."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Date"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Auteur"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(montrer)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Version actuelle"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(annuler)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Titre de la page"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Entrer une commande serveur"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Cet écran vous permet d'entrer directement des commandes textuelles qui ne "
+"sont pas supportées par l'interface web de Citadel. Si vous ne savez pas "
+"trop à quoi cela correspond, cette facilité n'est pas faite pour vous."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Entrer une commande :"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Command input (if requesting SEND_LISTING transfer mode):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr "L'en-tête de l'hôte detecté est "
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Résultat de la commande serveur"
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr "Entrer une autre commande"
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr "Retour au menu"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Configuration réseau"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Ajouter un nouveau nœud"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Nœuds actuellement configurés"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "Menu d'administration du système"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr "Menu d'amdinistration des salons"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Pseudonymes de l'hôte local"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Serveurs de relais"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr "Hôtes de notification"
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "Serveurs de listes noires"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "Serveurs SpamAssassin"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr "Hôte du démon ClamAV"
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr "Domaines non distribués localement"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Configuration générale"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Gestion des comptes d'usagers"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "Arrêter Citadel"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Salons et paliers"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr "Redémarrer Citadel"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "Message aux usagers:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Configuration du site"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr "Vous n'avez pas accès à cette ressource."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "Globale"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Options de la barre d'icônes"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "Transfert du courrier"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indexation / journalisation"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Accès"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr "Dossier"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Purge automatique"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Pour créer un nouveau compte d'usager, entrez son identifiant dans le champ "
+"de saisie ci-après et cliquez sur 'Créer'."
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Nouvel usager : "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Pour modifier un compte, sélectionnez l'identifiant de ce compte dans la "
+"liste puis cliquez 'Éditer'."
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Modifier ce compte : "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Identifiant :"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Mot de passe"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Permission d'envoyer des courriels vers Internet"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Adresse de courriel principale"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Alias d'adresses de courriel"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Nombres de connexions"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Messages soumis"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Niveau d'accès"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "Identifiant numérique de l'usager"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Date et heure de la dernière connexion"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Purge automatique après ce nombre de jours"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Modifier ou supprimer des usagers."
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Ajouter des usagers"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Modifier ou supprimer des usagers."
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Ajouter, modifier ou supprimer des paliers"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Nom du nœud"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Code secret partagé"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Hôte ou adresse IP"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Numéro de port"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Confirmer la suppression"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Êtes vous sur de vouloir supprimer "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Oui"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Non"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr "(Edition)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Supprimer)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(domaines pour lesquels cet hôte reçoit du courrier)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(hôtes sur lesquels fonctionne le service ClamAV)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(domaines référencés dans l'annuaire principal)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+"(Envoyer les mails sortant à ces hôtes uniquement lorsque l'envoi échoue)"
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "(Domaines que les utilisateurs peuvent utiliser)"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+"(URLS pour la notification lorsque les utilisateurs reçoivent de nouveaux "
+"emails; )"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+"Syntaxe: nomdumodeldenotification:http[s]://utilisateur:motdepasse@hostname/"
+"chemin"
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(hôtes sur lesquels fonctionne une liste noire en temps réel)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr "(si présent, relayer le courrier sortant via l'un de ces serveurs)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(hôtes sur lesquels fonctionne le service SpamAssassin)"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Redémarrer maintenant"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "Rédémarrer après avoir bippé les utilisateurs"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "Redémarrage lorsque tous les usagers sont inactifs"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+"S'il vous plaît, patientez pendant que le serveur Citadel redémarre... "
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+"S'il vous plait patientez pendant que Citadel informe les usagers, le "
+"serveur redémarrera ensuite... "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Contrôles des accès et mise en place des règles de fonctionnement"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Permettre aux administrateurs de sauter (mettre de côté) des salons"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Messages d'usagers à problème mis en quarantaine"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Nom du salon de quarantaine"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Nom du salon pour enregistrer les alertes"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr "Mode d'authentification"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr "contient"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr "Host based"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr "LDAP (RFC2307)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr "LDAP (Active Directory)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr "Authoriser les accès client anonymes"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Niveau d'accès initial des nouveaux usagers"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Niveau d'accès requis pour créer des salons"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+"Les usagers qui créent des salons privés se voient accordé le statut "
+"d'administrateurs de ces salons."
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+"Donner automatiquement le statut \"aide au salon\" aux créateurx de salons "
+"BLOG"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Limiter l'accès au courrier électronique"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Désactiver le libre-service de création de compte d'usager"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr "Conseil: ne pas séléctionner les deux"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "L'enregistrement est requis pour les nouveaux usagers"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Configurer l'expiration automatique des anciens messages"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+"Ces options peuvent être modifiées individuellement par palier ou par salon."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Heure de démarrage des purges automatiques"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "Règles d'expiration par défaut des messages dans un salon public"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Les messages n'expirent jamais automatiquement"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Expiration des messages en fonction du compte"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Expiration des messages en fonction de l'âge"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Nombre de messages ou de jours : "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+"Règles d'expiration par défaut des messages dans une boîte aux lettres privée"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Mêmes règles que dans les salons publics"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Délai de purge par défaut pour cet usager (jours)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Délai de purge de ce salon (en jours)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Configuration du connecteur LDAP"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"Les changements effectués à partir de cet écran ne seront effectifs qu'après "
+"un redémarrage du serveur Citadel."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"NOTE: Ce serveur Citadel a été mis en fonction sans prise en charge de LDAP. "
+"Ces options n'auront aucun effet."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Nom d'hôte du serveur d'annuaire LDAP (laisser vide pour désactiver)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Numéro du port LDAP (laisser vide pour désactiver)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "DN de base"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "DN d'association"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Mot de passe du DN d'association"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "Éléments de configuration générale du site"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "Changer le logo de connexion"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "Changer le logo de déconnexion"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Nom de domaine pleinement qualifié"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Nom du nœud lisible pour un usager"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Numéro de téléphone"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Invite du paginateur (pour les clients en mode texte)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Localisation géographique de ce serveur"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Nom de l'administrateur du système"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+"Fuseau horaire par défaut des événements de l'agenda sans mention du fuseau"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "Port d'écoute IMAP (-1 pour désactiver ce service)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "Port IMAP sécurisé via SSL (-1 pour désactiver)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr "Conserver les entêtes originaux avec IMAP"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indexation et journalisation"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Attention: ces fonctionnalités sont très exigeantes en ressources."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Activer l'indexation de tout le texte"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "Procéder à la journalisation des messages de courrier électronique"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "Procéder à la journalisation des autres messages (sauf courriel)"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "Adresse courriel de destination des messages journalisés"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "Port d'écoute de POP3 (-1 pour désactiver ce service)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "Port POP3 sécurisé via SSL (-1 pour désactiver)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr "Fréquence de récupération POP3 en secondes"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "Fréquence de récupération POP3 la plus rapide en secondes"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr "Nom d'hôte du serveur Funambol (laisser vide pour désactiver)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "Numéro de port de Funambol "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "Source de synchronisation Funambol"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "Détails d'authentification Funambol (user:pass)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr "External pager tool (blank to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Services réseau"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "Adresse IP du serveur (0.0.0.0 pour 'quelconque')"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "Port d'écoute du client XMPP POP3 (-1 pour désactiver ce service)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "Port d'écoute XMPP (Jabber) (-1 pour désactiver ce service)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "Port d'écoute de POP3 (-1 pour désactiver ce service)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "Port d'écoute de POP3 (-1 pour désactiver ce service)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Réglages avancés du serveur"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Longueur maximum des messages"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Limite de temps d'inactivité d'une connexion au serveur (en secondes)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "Fréquenece de lancement du réseau (en secondes)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Nombre de sessions simultanées (pas de limite = 0)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Nombre minimum de processus"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Nombre maximum de processus"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Supprimer automatiquement les journaux validés des bases de données"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "Port SMTP  (-1 pour désactiver ce service)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "Port SMTP MSA (-1 pour désactiver)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "Port SMTP sécurisé via SSL (-1 pour désactiver)"
+
+# RBL correspond ici à liste noire
+# RCPT = réception?
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr "Effectuer un test RBL à la connexion plutôt qu'après réception."
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "Marquer les messages comme spam au lieu de les rejeter"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+"Autoriser les client SMTP non authentifiés à usurper l'identité des domaine "
+"de ce site"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+"Corriger les identifications d'expéditeur (FROM:) contrefaites lors de "
+"session SMTP authentifiées."
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr "Port du dictionnaire TCP de Postfix"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr "-1 pour désactiver."
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "Port d'écoute Sieve (-1 pour désactiver ce service)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Ajouter, modifier ou supprimer des comptes"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Modifier la configuration générale du site"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Configuration des noms de domaine et du courrier électronique"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Alias d'adresses de courriel"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "Voir la queue SMTP sortante"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Déconnexion"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Commandes de base"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Vos informations"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Commandes avancées des salons"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Chargement"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Messages anonymes"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Poster le message"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr "Sauvegarde comme brouillon"
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Documents joints :"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "de"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "dans"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "À :"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "Copie conforme :"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "Copie cachée à :"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Objet (facultatif) :"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Objet :"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- message transféré ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Fermer la fenêtre"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Joindre un fichier"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr "Supprimer"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Les fichiers sont téléchargeables à partir de"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Téléverser un fichier"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Nom du fichier"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Taille"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Contenu"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Description :"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Image téléchargée"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Vous pouvez télécharger une image directement depuis votre ordinateur"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Sélectionner un fichier à transférer :"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Diaporama"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Ajouter / modifier / supprimer un palier"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Numéro de palier"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Nom du palier"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Nombre de salons"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "CSS du palier"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(supprimer le palier)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Vous devez être connecté pour accéder à cette page."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "Se connecter en utilisant identifiant et mot de passe"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Mot de passe :"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Connexion"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Nouvel utilisateur? Inscrivez-vous maintenant"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+"entrez l'identifiant et le mot de passe que vous souhaitez utiliser et "
+"cliquez sur &quot;Nouvel usager.&quot; "
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Se connecter en utilisant OpenID"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "adresse OpenID :"
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr "Connection en utilisant Google"
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr "Connection en utilisant Yahoo"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr "Connection en utilisant AOL ou AIM"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr "Saisissez votre nom d'utilisateur AOL ou AIM:"
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "S'il vous plaît, patientez pendant"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Ceci est une mise à jour de '%s' déjà présent dans votre agenda."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr ""
+"Cet événement entre en conflit avec '%s' qui est déjà dans votre agenda."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Langue :"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Courriel"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Tâches"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Salons"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Usagers en ligne"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Clavardage"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Admin et préférences"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Administration"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "personnaliser ce menu"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "passer aux salons"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "passer au menu"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Mes répertoires"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Personnalisation du menu"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Afficher les entrées du menu comme:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "icônes et textes"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "icônes seulement"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "textes seulement"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Sélectionnez les icônes que vous souhaitez afficher dans le menu situé à "
+"gauche de l'écran."
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Logo du site"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Une icône représentative de ce site"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Votre tableau de bord"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Courrier (boîte de réception)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Raccourci vers votre boîte de réception"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Votre carnet d'adresses personnel"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Vos notes personnelles"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Raccourci vers votre agenda personnel"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Raccourci vers votre liste de tâches personnelles"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr "La liste des paliers et de tous les salons accessibles"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Qui est connecté ?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr "La liste de tous les usagers connectés"
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr "Clavarder avec les autres personnes présentes dans ce salon."
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Options avancées"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Accès à l'ensemble des fonctions de Citadel."
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Logo de Citadel"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Affiche l'icône 'Powered by Citadel'"
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"Votre barre d'icônes à été mise à jour. Veuillez séléctionner une option "
+"pour continuer."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+"Vous devriez forcer un rafraîchissement (MAJ-F5) pour que les changements "
+"prennent effets"
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Abonnement à la liste"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Abonnement/désabonnement à la liste"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Requête de confirmation envoyée."
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr "Vous vous inscrivez "
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr " à "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr " liste de distribution"
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+"Le listserver vous a envoyé un email avec un lien Internet supplémentaire "
+"que vous pourrez cliquer pour confirmer votre inscription."
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+"Cette étape supplémentaire est là pour votre protection, dans la mesure où "
+"elle ne permet pas à d'autres de vous inscrire à des listes sans votre "
+"consentement."
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+"Veuillez clicker sur le lien qui vous à été envoyé par email, afin de "
+"valider votre inscription."
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Retour..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr "ERREUR"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr "Vous vous inscrivez"
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr "De"
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr "liste de distribution"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+"Le listserver vous a envoyé un email avec un lien Internet supplémentaire "
+"que vous pourrez cliquer pour confirmer votre inscription."
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+"Cette étape supplémentaire vise à vous protéger, elle évite que d'autres "
+"usagers puissent se désinscrire à vos listes sans votre consotement."
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+"Veuillez clicker sur le lien qui vous à été envoyé par email, afin de "
+"valider votre désinscription."
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr "Retour..."
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr "Confirmation réussie"
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr "Confirmation échoué"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr "Cela peut signifier une des deux options:"
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+"Vous avez attendu trop longtemps pour valider votre demande d'inscription/"
+"désinscription (le mail de confirmation n'est valable que pendant trois "
+"jours)"
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+"Vous avez <i>déjà</i> confirmé votre demande d'inscription/désinscription et "
+"êtes en train d'essayer à nouveau de le faire."
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr "L'erreur retourné par le serveur est: "
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr "Nom de la liste :"
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr "Votre adresse mail"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr "(en cas d'inscription) format préféré: "
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr "Un message à la fois"
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr "Digest format"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+"Lors que vous essayez de vous inscrire ou de vous désinscrire à une liste "
+"d'envoie, vous allez recevoir un email contenant un lien Internet "
+"supplémentaire que vous devrez cliquer pour la confirmation finale."
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+"Cette étape supplémentaire est là pour votre protection, dans la mesure où "
+"elle permet d'éviter que d'autres puissent vous inscrire ou vous désinscrire "
+"de listes."
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr "Connecté en tant que"
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr "Non connecté."
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "propulsé par"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Se connecter à nouveau"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Éditer ou supprimer ce salon"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Rejoindre un salon 'caché'"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Créer un nouveau salon"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Créer un nouveau salon"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "Sauter (mettre de côté) ce salon"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Liste de tous les salons mis de côté"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Lire les nouveaux messages"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Liste des salons connus"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Où puis-je aller à partir d'ici ?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Aller au prochain salon"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "... avec des messages <em>non lus</em>"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Passer au salon suivant"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "Revenir ici plus tard"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Revenir"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "oops! Retour à "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Lire les nouveaux messages"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "... dans ce salon"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Lire tous les messages"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "... anciens <em>et</em> nouveaux"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Écrire un message"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "Poster dans ce salon"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "Dépôt des fichiers"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(Liste des fichiers à télécharger)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Tableau de bord"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Informations sur mon compte"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Liste des usagers"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "Tous les usagers enregistrés"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Au revoir !"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Changez votre mot de passe"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Entrez un nouveau mot de passe :"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Retapez le pour confirmer :"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Changer vos préférences et options"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Mettre à jours vos données personnelles"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Entrer votre 'biographie'"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Poser votre portrait"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Éditer les filtres de courriels"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "Éditer les paramètres pour faire suivre les courriels."
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr "Gérer vos OpenIDs"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Confirmer le déplacement de ce message"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Déplacer ce message vers :"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Lecture #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "messages"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "du plus ancien au plus récent"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "du plus récent au plus ancien"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Expéditeur"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Chargement en cours des messages depuis les serveurs. SVP patientez."
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Ouvrir dans une nouvelle fenêtre"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Déplacer"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Copier"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Imprimer"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Voir les contacts"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Ajouter un nouveau contact"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Vue journalière"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Vue mensuelle"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Ajouter un événement"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Agenda"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Voir les tâches"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Ajouter une tâche"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Voir les notes"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Ajouter une note"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Rafraichir la liste des messages"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Écrire un message"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Accueil Wiki"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Modifier cette page"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "Hstorique"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr "Nouvelle publication de blog"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Passer ce salon"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "En faire ma nouvelle page d'accueil"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "Votre page d'accueil à été changée."
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+"(Note: ceci ne changera pas la page d'accueil de votre navigateur, mais "
+"seulement celle que vous obtiendrez dès votre connexion."
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "Pas de nouveaux messages"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "Votre OpenID"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "A été vérifié avec succès"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr "Malgrès, le nom d'utilisateur"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "Conflits avec un utilisateur existant"
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "SVP précisez le nom d'usager que vous souhaitez utiliser."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Préférences et options"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Vue en arborescence"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Vue en tableaux"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 heures (am/pm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 heures"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Dimanche"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Lundi"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Pas de signature"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "Pleines fonctionnalités"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Mode sûr"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+"Le mode sûr est moins contraignant pour votre navigateur, mais pas aussi "
+"complet."
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr "Configurer le transfert du courrier"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "Faire suivre les courriels et paramétrages SMS"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+"Si votre administrateur a installé cette fonctionnalité, Citadel peut "
+"notifie à un serveur Funambol que vous avez reçu des nouveaux courrier et "
+"permettre la synchronisation automatique avec n'importe quel périphérique où "
+"un client Funambol est installé."
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+"Alternativement, si l'administrateur l'a configuré, Citadel peut envoyer un "
+"message textuel lorsqu'un nouveau mail est arrivé."
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr "Notifier le serveur Funambol"
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr "Envoyer un message texte à ..."
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+"(Utiliser le format international, sans zéros au début ni espaces ou "
+"ponctuation, comme +61415011501)"
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+"Utilisez les schéma de nothifications personnalisé par votre administrateur"
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr "Ne pas envoyer de nothifications"
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Nom du salon : "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Réside sur le palier : "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Vue par défaut de ce salon : "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Type de salon :"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Public (est visible de tous les usagers)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privé - caché (accessible à quiconque connaît son nom)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privé - le mot de passe est requis : "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privé - seulement sur invitation"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Personnel (une boîte aux lettres pour vous seulement)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Créer un nouveau salon"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Nom du salon : "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Vue par défaut de ce salon : "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Type de salon :"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Editer les informations de ce salon"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"Le texte est composé à la largeur de l'écran du lecteur. Pour modifier ce "
+"formatage, indentez une ligne d'au moins un espace."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Allez à un salon caché"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Si vous connaissez le nom caché (devinez le nom) ou le mot de passe d'un "
+"salon caché, vous pouvez entrer dans ce salon en saisissant son nom ci-"
+"dessous. Une fois que vous aurrez rejoint le salon privé, elle apparaîtra "
+"dans la liste de vos salons habituels, de sorte à ce que vous n'ayez plus "
+"besoin de revenir ici."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Écrivez le nom du salon :"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Écrivez le mot de passe pour accéder au salon :"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Configuration"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Politique d'expiration des messages"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Contrôles d'accès"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Partage"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Service des listes de diffusion"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Récupération à distance"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(enlever)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Les utilisateurs suivant ont accès au salon. Pour supprimer un utilisateur "
+"de la liste d'accès, sélectionnez l'utilisateur et clickez 'éjecter'."
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Pour accorder l'accès à ce salon à un usager, entrer son identifiant dans le "
+"champ de saisie ci-dessous et cliquer sur 'Inviter'."
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Inviter :"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Usagers"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Supprimer ce salon"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr "Définir ou changer l'icône de ce salon"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr "Editer les informations de ce salon"
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr "nom de la salle: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Si ce salon est privé, cela force les usagers à le sauter"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Réservé aux usagers privilégiés"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Salon en lecture seulement"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+"Tous les usagers autorisés à poster peuvent aussi supprimer les messages"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Dépot de fichiers"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Nom du répertoire : "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Téléversement autorisé"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Téléchargement autorisé"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Garder les messages sur le serveur?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Répertoire visible"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Salon partagé via le réseau"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanent (pas de purge automatique des contenus)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "L'objet est requis (les usagers sont obligés de remplir ce champ)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Messages anonymes"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Pas de messages anonymes"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Tous les messages sont anonymes"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Invite l'utilisateur à la saisie de message"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Administrateur "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Politique d'expiration des messages de ce salon"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Utiliser la politique par défaut pour ce palier"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Règles d'expiration des messages de ce palier"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Utiliser la configuration par défaut"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+"Récupérer les messages de comptes POP3 distants et les stocker dans ce "
+"salon :"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "Serveurs de relais"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Nom d'usager"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Garder les messages sur le serveur?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "Intervalle"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Récupérer les flux RSS suivants et les stocker dans ce salon :"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "URL du flux"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>Les contenus de ce salon seront envoyés par email sous forme de "
+"<b>messages individuels</b> à la liste de destinataires:</i><br><br>"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>Les contenus de ce salon seront envoyés par email <b>sous forme de  "
+"resumé</b> à la liste de destinataires:</i><br><br>"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Ajoutez des destinataires de Contacts ou d'autres carnets d'adresses"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "Permettre aux non abonnés de poster dans ce salon."
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "Publier dans ce salon nécessite la permission de l'administrateur."
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr "Permettre l'inscription et la désinscription en libre service."
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "L'URL pour s'abonner ou se désabonner est : "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Pas de partage avec"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Partagé avec"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Nom du nœud distant"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Nom du salon distant"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Actions"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"Lors du partage d'un salon, le salon doit être partagé avec le même nom des "
+"deux cotés, et les deux cotés doivent partager le nœud. <li>Si le nom du "
+"salon est vide ici, elle est supposée l'être de l'autre coté aussi.<li>Si le "
+"nom du salon est différent, se nom de salon doit aussi être renseigné ici."
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Informations sur le salon"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Sauter (mettre de côté) le salon courant"
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr "Si vous séléctionnez cette option,"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr "va disparaitre de se salon. Est-ce ce que vous désirez ?"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Salons mis de côté (sautés)"
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Cliquer sur n'importe quel salon pour le réactiver et aller à ce salon"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "Nouveau depuis"
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Sélectionner la page : "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Recherche "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Tous"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Éditer ou supprimer des usagers."
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Ajouter un nouveau nœud"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"Pour créer un nouveau script, entrez un nom dans le champ de saisie ci-après "
+"et cliquez sur 'Créer'."
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Nom du script : "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Éditer les scripts"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Revenir au formulaire d'édition du script"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Supprimer des scripts"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"Pour détruire un script existant, sélectionnez son nom dans la liste puis "
+"cliquez 'Supprimer ce script'."
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Si"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "À ou Copie"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Répondre à"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Resent-From"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Resent-To"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Enveloppe De"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Enveloppe À"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-Flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Status"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "List-ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Taille du message"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "contient"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "ne contient pas"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "est"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "n'est pas"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "correspond à"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "ne correspond pas à"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Tous les messages)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "est plus grand que"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "est plus petit que"
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr "octets"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Garder"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Supprimer sans avis"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Rejeter"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Déplacer ce message vers"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Faire suivre"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Absence"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Message:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "et ensuite"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "(en cours)"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "stop"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Quand un nouveau mail arrive : "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Le filtrer en lui appliquant les règles ci-dessous"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Le laisser dans ma boîte aux lettres sans le filtrer"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+"Le filtrer au travers d'un script créé manuellement (pour les usagers "
+"avancés seulement)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Ajouter une règle"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"Cette installation de Citadel a été construite sans support du filtrage des "
+"mail côté serveur.<br>SVP contactez votre administrateur si vous avez besoin "
+"de cette fonction.<br>"
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "Ancients messages"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "Nouveaux messages"
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr "Page récapitulatif de "
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Messages"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Votre&nbsp;agenda&nbsp;d'aujourd'hui"
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Qui&nbsp;est&nbsp;en&nbsp;ligne&nbsp;maintenant"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "À propos de ce serveur"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr "Vous êtes connecté à"
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr "en cours d'exécution"
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr "avec"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr "build serveur"
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr "et situé dans"
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr "Votre administrateur système est"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"ATTENTION: JavaScript est désactivé dans votre navigateur. Plusieurs "
+"fonctionnalités du système ne seront pas disponibles."
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Entrer votre 'biographie'"
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr "Liste des utilisateur pour "
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Identifiant"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Numéro"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Niveau d'accès"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Dernière connexion"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Nombre total de connexions"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Nombre de messages"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Profil usager"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr "Clickez ici pour envoyer un message instantané à"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Modifier l'information du contact"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Civilité"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Prénom"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Deuxième prénom"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Nom"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Suffixe"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Nom affiché :"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Titre :"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organisation :"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Boîte postale :"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Adresse :"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Ville :"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "État :"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Code postal :"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Pays :"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Téléphone personnel :"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Téléphone professionnel :"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Téléphone personnel :"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Numéro de fax:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Le carnet d'adresses est vide."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Une erreur interne est apparue."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Poster un commentaire"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "les nouveaux messages"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "des messages plus anciens"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d commentaires"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "Lien permanent"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "Nouveau depuis"
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "Vous n'avez pas accès à cette ressource."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "La file d'attente est vide."
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Actualiser cette page"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Serveurs de relais"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "État :"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "(en cours)"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr "Initalement posté dans: "
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "Référence du messages"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Date et heure de soumission"
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr "Prochain essait"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Destinataires"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "de "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "à"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "Éditer (?)"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Répondre"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "Répondre en citant"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "Répondre à tous"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Faire suivre"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Entêtes"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "Voir"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Télécharger"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Voir comme"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "Usagers actuellement dans "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+"Cliquez sur l'identifiant pour lire les informations publiques de l'usager. "
+"Cliquer sur"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "Envoyer un message instantané à cet usager."
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(supprimer)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Salon"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "Machine d'origine"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Modifier les propriétés d'affichage de votre session"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Cet écran vous permet de changer la façon dont votre session apparaît dans "
+"la liste des usagers connectés. Pour éviter qu'un 'pseudonyme' que vous "
+"auriez préalablement indiqué ne soit encore visible, cliquez simplement sur "
+"le bouton 'changer' sans rien indiquer dans la boîte de saisie "
+"correspondante. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Nom du salon :"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Nom de la machine hôte :"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr "Usagers actuellement dans"
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr "Modifier la configuration"
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr "Modifier un contact du carnet d'adresse"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Aller là"
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Pour créer cette page, sélectionnez le lien 'Éditer cette page ' dans la "
+"bannière du salon."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Il n'y a pas ici de page nommée '%s'."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr "Historique des éditions de cette page"
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr "Liste des pages Wiki"
+
+#~ msgid "the icon for this floor"
+#~ msgstr "l'icône de ce palier"
+
+#~ msgid "Edit %s"
+#~ msgstr "Éditer %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Enregistrer les modifications"
+
+#~ msgid " (work)"
+#~ msgstr " (travail)"
+
+#~ msgid " (home)"
+#~ msgstr " (accueil)"
+
+#~ msgid " (cell)"
+#~ msgstr " (portable)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Téléphone :"
+
+#~ msgid "E-mail:"
+#~ msgstr "Courriel :"
+
+#~ msgid "Directory domains"
+#~ msgstr "Domaines des annuaires"
+
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Serveurs de relais"
+
+#~ msgid "Create new room"
+#~ msgstr "Créez un nouveau salon"
+
+#~ msgid "Zap this room"
+#~ msgstr "Mettre de côté ce salon"
+
+#~ msgid ""
+#~ "You have one or more instant messages waiting, but the Citadel Instant "
+#~ "Messenger window failed to open.  This is probably because you have a "
+#~ "popup blocker installed.  Please configure your popup blocker to allow "
+#~ "popups from this site if you wish to receive instant messages."
+#~ msgstr ""
+#~ "Vous avez un ou plusieurs messages instantanés en attente, mais il est "
+#~ "impossible d'ouvrir une fenêtre de lecture. Le blocage des pop-ups "
+#~ "intempestives est probablement activé, SVP configurez votre navigateur "
+#~ "pour les autoriser (au moins pour Citadel) si vous souhaitez lire les "
+#~ "messages instantanés."
+
+#~ msgid "The citadel server has to be restarted. It will be back in a minute."
+#~ msgstr ""
+#~ "Le serveur Citadel doit redémarrer. Il sera de nouveau en service dans "
+#~ "une minute"
+
+#~ msgid "Change"
+#~ msgstr "Changer"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Salon partagé via le réseau"
+
+#~ msgid "Add node?"
+#~ msgstr "Ajouter un noeud ?"
+
+#~ msgid "idle since"
+#~ msgstr "idle since"
+
+#~ msgid "Minutes"
+#~ msgstr "minutes"
+
+#~ msgid "active"
+#~ msgstr "actif"
+
+#~ msgid "Send"
+#~ msgstr "Envoyer"
+
+#~ msgid "Delete this message?"
+#~ msgstr "Détruire ce message ?"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Informations sur le salon"
+
+#~ msgid "Pictures in"
+#~ msgstr "Images dans"
+
+#~ msgid "Exit"
+#~ msgstr "Quitter"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Téléverser un fichier"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Êtes vous sur de vouloir supprimer "
+
+#~ msgid "Upload"
+#~ msgstr "Télécharger"
+
+#~ msgid "Add"
+#~ msgstr "Ajouter"
+
+#~ msgid "Create"
+#~ msgstr "Créer"
+
+#~ msgid "Kick"
+#~ msgstr "Éjecter"
+
+#~ msgid "Invite"
+#~ msgstr "Inviter"
+
+#~ msgid "User"
+#~ msgstr "Usager"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Carnet d'adresses"
+
+#~ msgid "Delete user"
+#~ msgstr "Supprimer un usager"
+
+#~ msgid "Delete this user?"
+#~ msgstr "Supprimer cet usager ?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Supprimer une règle"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "Vos courriels ne seront filtrés par aucun scripts."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "le script actif est : "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Configurer la réplication avec d'autres serveurs Citadel"
+
+#~ msgid "Powered by Citadel"
+#~ msgstr "Motorisé par Citadel"
+
+#~ msgid "Go to your email inbox"
+#~ msgstr "Vers votre boîte de réception de courriels"
+
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Vers votre agenda personnel"
+
+#~ msgid "Go to your personal address book"
+#~ msgstr "Vers votre carnet d'adresses personnel"
+
+#~ msgid "Go to your personal notes"
+#~ msgstr "Vers vos notes personnelles"
+
+#~ msgid "Go to your personal task list"
+#~ msgstr "Vers votre liste des tâches personnelles"
+
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Liste de tous les salons qui vous sont accessibles"
+
+#~ msgid "See who is online right now"
+#~ msgstr "Voir qui est connecté en ce moment"
+
+#~ msgid ""
+#~ "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+#~ msgstr ""
+#~ "Options avancées de gestion des salons, des comptes et du clavardage"
+
+#~ msgid "Room and system administration functions"
+#~ msgstr "Commandes d'administration des salons et du système"
+
+#~ msgid "Reset form"
+#~ msgstr "Réinitialiser le formulaire"
+
+#~ msgid "Delete this entry?"
+#~ msgstr "Supprimer cette entrée ?"
+
+#~ msgid "Create new floor"
+#~ msgstr "Créer un nouveau palier"
+
+#~ msgid "Move rule up"
+#~ msgstr "Monter la règle"
+
+#~ msgid "Move rule down"
+#~ msgstr "Descendre la règle"
+
+#~ msgid "Delete rule"
+#~ msgstr "Supprimer une règle"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(éditer le graphisme)"
+
+#~ msgid "Change name"
+#~ msgstr "Renommer"
+
+#~ msgid "Change CSS"
+#~ msgstr "Changer la feuille CSS"
+
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Êtes vous sûr de vouloir supprimer ce salon ?"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Entrer une commande :"
+
+#~ msgid "Unshare"
+#~ msgstr "Arrêter le partage"
+
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "Nom de l'administrateur (laisser vide pour désactiver)"
+
+#~ msgid "Master user password"
+#~ msgstr "Mot de passe de l'administrateur"
+
+#~ msgid "Delete this note?"
+#~ msgstr "Supprimer cette note ?"
+
+#~ msgid "List"
+#~ msgstr "Liste"
+
+#~ msgid "Digest"
+#~ msgstr "Résumé"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Objet"
+
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Voulez vous vraiment détruire cette session ?"
+
+#~ msgid "Share"
+#~ msgstr "Partager"
+
+#~ msgid "Change password"
+#~ msgstr "Changer le mot de passe"
+
+#~ msgid "Change room name"
+#~ msgstr "Changer le nom du salon :"
+
+#~ msgid "Change host name"
+#~ msgstr "Changer le nom de la machine hôte"
+
+#~ msgid "Change user name"
+#~ msgstr "Changer le nom de l'usager"
+
+#~ msgid ""
+#~ "Leave all messages marked as unread, go to next room with unread messages"
+#~ msgstr ""
+#~ "Laisser les messages sélectionnés comme non lus, aller au prochain salon  "
+#~ "avec des messages non lus."
+
+#~ msgid "Mark all messages as read, go to next room with unread messages"
+#~ msgstr ""
+#~ "Marquer tous les messages comme lus, aller au prochain salon qui contient "
+#~ "des messages non lus."
+
+#~ msgid "Save changes?"
+#~ msgstr "Conserver les modifications ?"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Vous vous êtes abonné  <TT>%s</TT> à la liste de diffusion <b>%s</b>. Le "
+#~ "serveur vous a envoyé un courriel comportant un lien que vous devrez "
+#~ "suivre pour confirmer votre inscription. Cette étape est nécessaire pour "
+#~ "vérifier que quelqu'un d'autre ne vous a pas abonné à votre insu."
+#~ "<br><br>SVP effectuez cette action, vous recevrez alors un courriel de "
+#~ "confirmation de votre abonnement.<br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr ""
+#~ "ATTENTION: Echec lors de la lecture du la Configuration du Serveur; "
+#~ "s'agît-il d'un nouveau citserver?"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Le salon '%s' n'existe pas."
+
+#~ msgid "Network"
+#~ msgstr "Réseau"
+
+#~ msgid "Tuning"
+#~ msgstr "Réglages"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Effacer immédiatement les messages supprimés via IMAP"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Il existe déjà un script avec ce nom."
+
+#~ msgid ""
+#~ "A new script has been created.  Return to the script editing screen to "
+#~ "edit and activate it."
+#~ msgstr ""
+#~ "Un nouveau script a été créé. Retourner à l'écran de modification des "
+#~ "scripts pour le modifier et l'activer."
+
+#~ msgid "Delete script"
+#~ msgstr "Supprimer ce script"
+
+#~ msgid "Delete this script?"
+#~ msgstr "Supprimer ce script ?"
+
+#~ msgid ""
+#~ "You are connected to %s, running %s with %s, server build %s and located "
+#~ "in %s.  Your system administrator is %s."
+#~ msgstr ""
+#~ "Vous êtes connecté(e) à %s qui est servi par %s avec %s (révision %s) et "
+#~ "situé à %s. Votre administrateur système est %s."
+
+#~ msgid "Yes with users list"
+#~ msgstr "Oui, avec la liste des usagers"
+
+#~ msgid "Room list"
+#~ msgstr "Liste des salons"
+
+#, fuzzy
+#~ msgid "uname"
+#~ msgstr "Nom du fichier"
+
+#, fuzzy
+#~ msgid "text"
+#~ msgstr "textes seulement"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "Nom du fichier"
+
+#, fuzzy
+#~ msgid "pname"
+#~ msgstr "Nom du fichier"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Mot de passe"
+
+#, fuzzy
+#~ msgid "pass"
+#~ msgstr "Tâches"
+
+#, fuzzy
+#~ msgid "display: none"
+#~ msgstr "Nom affiché :"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Votre mot de passe a été refusé."
+
+#~ msgid "If you already have an account on"
+#~ msgstr "Si vous avez déjà un compte sur"
+
+#, fuzzy
+#~ msgid "enter your user name and password and click &quot;Log in.&quot;"
+#~ msgstr ""
+#~ "entrez votre identifiant et votre mot de passe puis cliquez sur &quot;"
+#~ "Login.&quot;"
+
+#~ msgid "Please log off properly when finished. "
+#~ msgstr "Fermez votre session  proprement en quittant. "
+
+#~ msgid "See the"
+#~ msgstr "Voir la"
+
+#~ msgid "recommended browser list"
+#~ msgstr "liste des navigateurs recommandés"
+
+#~ msgid ""
+#~ "if you have trouble using Webcit.</li> <li>You must have <i>cookies</i> "
+#~ "turned on. "
+#~ msgstr ""
+#~ "Si Webcit présente des dysfonctionnement.</li><li>Vous devez activer les "
+#~ "<i>cookies</i> "
+
+#~ msgid ""
+#~ "Also keep in mind that if your browser is configured to block pop-up "
+#~ "windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "Gardez aussi à l'esprit que si votre navigateur est configuré pour "
+#~ "bloquer les pop-ups intempestives vous ne recevrez aucun message "
+#~ "instantané."
+
+#, fuzzy
+#~ msgid "Enter your OpenID URL and click &quot;Log in&quot;."
+#~ msgstr "Entrez votre adresse OpenID et cliquez sur &quot;Connecter&quot;."
+
+#~ msgid "Click here to learn what OpenID is and how Citadel is using it."
+#~ msgstr ""
+#~ "Cliquez ici pour savoir ce qu'est OpenID et comment Citadel l'utilise."
+
+#~ msgid "Log off now?"
+#~ msgstr "Déconnexion immédiate ?"
+
+#~ msgid "%d new of %d messages%s"
+#~ msgstr "%d nouveau(x) sur %d messages%s"
+
+#~ msgid "(nothing)"
+#~ msgstr "(rien)"
+
+#~ msgid "unexpected end of message"
+#~ msgstr "fin de message inattendue"
+
+#~ msgid "An error occurred while setting up the chat socket."
+#~ msgstr ""
+#~ "Une erreur est survenue lors de l'établissement du canal du clavardage."
+
+#~ msgid "Now exiting chat mode."
+#~ msgstr "Sortie du mode clavardage."
+
+#~ msgid "Help"
+#~ msgstr "Admin"
+
+#~ msgid "List users"
+#~ msgstr "Liste des usagers"
+
+#~ msgid "No messages here."
+#~ msgstr "Pas de message ici."
+
+#, fuzzy
+#~ msgid "no more messages"
+#~ msgstr "Messages anonymes"
+
+#~ msgid ""
+#~ "Your icon bar has been updated.  Please select any of its choices to "
+#~ "continue.<br/><span style=\"font-weight: bold;\">You may need to force "
+#~ "refresh (SHIFT-F5) in order for changes to take effect</span>"
+#~ msgstr ""
+#~ "Votre barre d'icônes a été mise à jour. SVP sélectionnez l'une de ses "
+#~ "options pour continuer.<br/><span style=\"font-weight: bold;\">Vous "
+#~ "pouvez avoir besoin de rafraichir (SHIFT-F5) afin que les changement "
+#~ "prennent effets à l'affichage.</span>"
+
+#~ msgid "Email"
+#~ msgstr "Courriel"
+
+#~ msgid "Error retrieving RSS feed: couldn't find messages\n"
+#~ msgstr ""
+#~ "Erreur de récupération du flux RSS : impossible de trouver les messages\n"
+
+# c-format
+#~ msgid "%s from"
+#~ msgstr "%s de"
+
+#~ msgid "%s in %s"
+#~ msgstr "%s dans %s"
+
+#~ msgid " on %s"
+#~ msgstr "sur %s"
+
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#~ msgid ""
+#~ "<ul><li>Enter your OpenID URL and click &quot;Login&quot;.<li><a href="
+#~ "\"http://www.citadel.org/doku.php/documentation:openid\">Click here to "
+#~ "learn what OpenID is and how Citadel is using it.</a><li>Please log off "
+#~ "properly when finished. <li>You must use a browser that supports "
+#~ "<i>frames</i> and <i>cookies</i>. <li>Also keep in mind that if your "
+#~ "browser is configured to block pop-up windows, you will not be able to "
+#~ "receive any instant messages.<br></ul>"
+#~ msgstr ""
+#~ "<ul><li>Enter your OpenID URL and click &quot;Login&quot;.<li><a href="
+#~ "\"http://www.citadel.org/doku.php/documentation:openid\">Click here to "
+#~ "learn what OpenID is and how Citadel is using it.</a><li>Please log off "
+#~ "properly when finished. <li>You must use a browser that supports "
+#~ "<i>frames</i> and <i>cookies</i>. <li>Also keep in mind that if your "
+#~ "browser is configured to block pop-up windows, you will not be able to "
+#~ "receive any instant messages.<br></ul>"
+
+#, fuzzy
+#~ msgid ""
+#~ "enter your user name and password and click &quot;Login.&quot;<li><b>If "
+#~ "you are a new user</b>, enter the name and password you wish to use, and "
+#~ "click &quot;New User.&quot; <li>Please log off properly when finished. "
+#~ "<li>You must use a browser that supports <i>frames</i> and <i>cookies</"
+#~ "i>. <li>Also keep in mind that if your browser is configured to block pop-"
+#~ "up windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "<ul><li><b>Si vous avez déjà un compte sur %s</b>, entrez votre "
+#~ "identifiant et votre mot de passe puis cliquez sur &quot;Login.&quot;</"
+#~ "li> <li><b>Si vous êtes un nouvel usager</b>, entrez l'identifiant et le "
+#~ "mot de passe que vous souhaitez utiliser et cliquez sur &quot;Nouvel "
+#~ "usager.&quot; </li><li>Fermez votre session  proprement en quittant.</li> "
+#~ "<li>Vous devez employer un navigateur qui supporte les <i>cadres</i> et "
+#~ "les <i>cookies</i> </li><li>Gardez aussi à l'esprit que si votre "
+#~ "navigateur est configuré pour bloquer les pop-ups intempestives vous ne "
+#~ "recevrez aucun message instantané.</li></ul>"
+
+#~ msgid "Find out more about Citadel"
+#~ msgstr "En savoir plus à propos de Citadel"
+
+#~ msgid "CITADEL"
+#~ msgstr "CITADEL"
+
+#~ msgid "Customize this menu"
+#~ msgstr "Personnaliser ce menu"
+
+#~ msgid "Internet configuration"
+#~ msgstr "Configuration internet"
+
+#~ msgid "of %d messages."
+#~ msgstr "des %d messages."
+
+#~ msgid " <I>from</I> "
+#~ msgstr " <I>de</I> "
+
+#~ msgid " <I>in</I> "
+#~ msgstr " <I>dans</I> "
+
+#~ msgid "Edit node configuration for "
+#~ msgstr "Éditer la configuration du noeud "
+
+#~ msgid ""
+#~ "<a href=\"http://www.postfix.org/tcp_table.5.html\">Postfix TCP "
+#~ "Dictionary Port </a> (-1 to disable)"
+#~ msgstr ""
+#~ "<a href=\"http://www.postfix.org/tcp_table.5.html\">Postfix TCP "
+#~ "Dictionary Port </a> (-1 to disable)"
+
+#~ msgid "ERROR: could not open template "
+#~ msgstr "ERREUR : impossible d'ouvrir le modèle"
+
+#~ msgid ""
+#~ "<I>This message contains calendaring/scheduling information, but support "
+#~ "for calendars is not available on this particular system.  Please ask "
+#~ "your system administrator to install a new version of the Citadel web "
+#~ "service with calendaring enabled.</I><br>\n"
+#~ msgstr ""
+#~ "<i>Ce message contient des informations de gestion d'agenda et/ou de "
+#~ "planification, mais la prise en charge de ces informations n'est pas "
+#~ "disponible sur ce système. SVP demandez à votre administrateur de mettre "
+#~ "à jour le serveur Citadel et d'activer le service de gestion d'agenda et "
+#~ "de planification. </i><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display calendar item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Impossible d'afficher un événement. Vous voyez ce message car le "
+#~ "service d'agenda est désactivé sur ce serveur Citadel. SVP contactez "
+#~ "l'administrateur du système.</i><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display to-do item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Impossible d'afficher une tâche. Le service en question est désactivé "
+#~ "sur ce serveur Citadel. SVP contactez l'administrateur du système.</"
+#~ "i><br>\n"
+
+#~ msgid "Day: "
+#~ msgstr "Jour :"
+
+#~ msgid "Year: "
+#~ msgstr "Année :"
+
+#~ msgid "The calendar view is not available."
+#~ msgstr "Le calendrier n'est pas disponible."
+
+#~ msgid "The tasks view is not available."
+#~ msgstr "Le visualiseur des tâches n'est pas disponible."
+
+#~ msgid "Gateway domains"
+#~ msgstr "Domaines de niveau supérieur"
+
+#~ msgid "(domains whose subdomains match Citadel hosts)"
+#~ msgstr "(domaines dont les sous-domaines correspondent aux hôtes Citadel)"
+
+#~ msgid "(This server does not support task lists)"
+#~ msgstr "(Ce serveur ne supporte pas les listes de tâches)"
+
+#~ msgid "(This server does not support calendars)"
+#~ msgstr "(ce server ne supporte pas les agendas)"
+
+#~ msgid ""
+#~ "This room is <i>not</i> configured to allow self-service subscribe/"
+#~ "unsubscribe requests."
+#~ msgstr ""
+#~ "Ce salon <i>n'est pas</i> configuré pour autoriser les requêtes "
+#~ "d'inscriptions et de désinscriptions en libre-service."
+
+#~ msgid "Click to enable."
+#~ msgstr "Cliquer pour activer."
+
+#~ msgid "Back to menu"
+#~ msgstr "Retour au menu"
+
+#~ msgid "Respond to meeting request"
+#~ msgstr "Répondre à cette invitation."
+
+#~ msgid "Update your calendar with this RSVP"
+#~ msgstr "Mettre à jour votre agenda avec cette réponse."
+
+#~ msgid "Public room"
+#~ msgstr "Salon public"
+
+#~ msgid "Private - guess name"
+#~ msgstr "Privé - les invités sont nommés"
+
+#~ msgid "Private - require password:"
+#~ msgstr "Privé - accès par mot de passe"
+
+#~ msgid "localhost"
+#~ msgstr "localhost"
+
+#~ msgid "gatewaydomain"
+#~ msgstr "passerelle"
+
+#~ msgid "rbl"
+#~ msgstr "rbl"
+
+#~ msgid "spamassassin"
+#~ msgstr "spamassassin"
diff --git a/webcit/po/webcit/he.po b/webcit/po/webcit/he.po
new file mode 100644 (file)
index 0000000..1dcf16a
--- /dev/null
@@ -0,0 +1,4041 @@
+# Hebrew translation for citadel
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2011-08-12 13:38+0000\n"
+"Last-Translator: igal <Unknown>\n"
+"Language-Team: Hebrew <he@li.org>\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-08-01 04:34+0000\n"
+"X-Generator: Launchpad (build 15719)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr ""
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr ""
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr ""
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr ""
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr ""
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr ""
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr ""
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr ""
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr ""
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr ""
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr ""
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr ""
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr ""
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr ""
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr ""
+
+#: ../../availability.c:169
+msgid "free"
+msgstr ""
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr ""
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr ""
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr ""
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr ""
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr ""
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr ""
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr ""
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr ""
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr ""
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr ""
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr ""
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "שעה: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "דקה: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(סטטוס לא ידוע)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(נדרשת פעולה)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(התקבל)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(נדחה)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(זמני)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(הוסמך)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(הושלם)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(בתהליך)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(אין)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr ""
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr ""
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr ""
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr ""
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr ""
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr ""
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr ""
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr ""
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr ""
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr ""
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr ""
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr ""
+
+#: ../../event.c:89
+msgid "Event"
+msgstr ""
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr ""
+
+#: ../../event.c:222
+msgid "Location"
+msgstr ""
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr ""
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr ""
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr ""
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "ביטול"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr ""
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "עריכת סרגל סמלים"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr ""
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "לעריכה הקליקו על ההודעה ."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "האם ברצונך למחוק את הזהות הפתוחה ?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(מחיקה)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "הוספת זהות פתוחה: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "צרף"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s אינו מרשה אימות דרך זהות פתוחה."
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "בוטל. שום הגדרות לא שונו."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "הגדר זאת כדף הפתיחה שלי"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "זה אינו רשאי להפוך לדף פתיחה."
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "אין לך דף פתיחה נבחר."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "דף פתיחה מועדף"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr ""
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr ""
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr ""
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr ""
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr ""
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr ""
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr ""
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr ""
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr ""
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr ""
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr ""
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr ""
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr ""
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr ""
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr ""
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr ""
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr ""
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr ""
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr ""
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr ""
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr ""
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr ""
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr ""
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr ""
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr "ארעה שגיאה בעת ניסיון ליצור/לערוך את איש הקשר."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "שינויים לא נשמרו."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "נוצר משתמש חדש."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr ""
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr ""
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr ""
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' אינו חדר Wiki."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "תאריך"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "מחבר"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(הראה)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "גירסה נוכחית"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(חזור)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "כותרת הדף"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "עריכת סרגל סמלים"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "שם המשתמש"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr ""
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr ""
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr ""
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+msgid "Name of the blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr ""
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr ""
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr ""
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr ""
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr ""
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+msgid "comments"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "שם החדר:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "שם המארח:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "'here"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr "בחרו בקישור ' ערוך דף זה' בכרזת החדר אם ברצונכם ליצור דף זה."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "לא קיים כאן חדר בשם '%s'."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "דקה: "
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "(זמני)"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "האם ברצונך למחוק את הזהות הפתוחה ?"
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "שנה את שם החדר"
+
+#, fuzzy
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "האם ברצונך למחוק את הזהות הפתוחה ?"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "האם ברצונך למחוק את הזהות הפתוחה ?"
+
+#~ msgid "Change room name"
+#~ msgstr "שנה את שם החדר"
+
+#~ msgid "Change host name"
+#~ msgstr "שנה את שם המארח"
+
+#~ msgid "Change user name"
+#~ msgstr "שנה את שם המשתמש"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "לא קיים חדר בשם '%s'."
diff --git a/webcit/po/webcit/hu.po b/webcit/po/webcit/hu.po
new file mode 100644 (file)
index 0000000..04b0368
--- /dev/null
@@ -0,0 +1,4565 @@
+# WebCit
+# Hungarian localization
+# Copyright (C) 2009 Czakó Krisztián <slapic@prolin.hu>
+# This file is distributed under the revised BSD license
+# Czakó Krisztián <slapic@prolin.hu>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2010-11-12 23:46+0000\n"
+"Last-Translator: Czakó Krisztián <slapic@prolin.hu>\n"
+"Language-Team:  <room_citadel_translators@uncensored.citadel.org>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-08-01 04:34+0000\n"
+"X-Generator: Launchpad (build 15719)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Törölt"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Új felhasználó"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Problémás felhasználó"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Helyi felhasználó"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Hálózati felhasználó"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Kedvelt felhasználó"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr ""
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Egy hiba lépett fel."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Új felhasználók érvényesítése"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Nincs érvényesítésre váró felhasználó."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "nagyon gyenge"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "gyenge"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "OK"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "erős"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Jelenlegi elérési szint: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Válassza ki ezen felhasználó hozzáférési szintjét:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Megszakítva. A jelszó nem változott."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Nem egyeznek. A jelszó nem változott."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Az üres jelszavak nem engedélyezettek."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "elérhetőség ismeretlen"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "Szabad"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "ELFOGLALT"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Meghívó megbeszélésre"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Partner válasza az ön meghívására"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Közzétett esemény"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Ez egy ismeretlen típusú naptár bejegyzés."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Összegzés:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Hely:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Dátum:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Kezdés dátuma/ideje:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Befejezés dátuma/ideje:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Leírás:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Ismétlődés"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Ez egy ismétlődő esemény"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Résztvevő:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Az a(z) '%s' frissítése,  mely már létezik az ön naptárában."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+"Ez az esemény ütközik a(z) '%s' eseménnyel, mely már létezik az ön "
+"naptárában."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Frissítés:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "ÜTKÖZÉS:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Hogyan szeretne reagálni erre a meghívásra?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Elfogad"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Próbaképpen"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Visszautasít"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"A válasz elfogadásához és a naptár frissítéséhez kattintson a <i>Frissítés</"
+"i>re"
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Frissítés"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Mellőzés"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Hiba történ a naptár bejegyzés értelmezése közben."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr "Ön elfogadta ezt a megbeszélés meghívót. Bekerült az ön naptárába."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Ön próbaképpen elfogadta ezt a megbeszélés meghívót. 'Ceruzával' került be "
+"az ön naptárába."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Visszautasította ezt a megbeszélés meghívót. Ezért <b>nem</b> került be az "
+"ön naptárába."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Válasz ment a megbeszélés szervezőjének."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Az ön naptára frissült, hogy reagáljon az RSVP-re."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"Figyelmen kívül hagyta ezt az RSVP-t. Az ön naptára <b>nem</b> frissült."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Naptár napi nézet kezdődik:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Naptár napi nézet végződik:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Hét első napja:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Óra: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Perc: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(ismeretlen állapot)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(cselekvés szükséges)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(elfogadott)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(elutasított)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(feltételes)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(delegált)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(teljesített)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(folyamatban)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(nincs)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Névtelen esemény"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "Kezdet:"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Kezdés dátuma:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Befejezés dátuma:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Dátum/idő:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Jegyzetek:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Hét"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Óra"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Tárgy"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Kezdet"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Befejezés"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Egész napos esemény"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Futó esemény"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Névtelen feladat"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "Hiba történt a(z) %s fájl beszerzése közben.\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "másodperc"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "perc"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "óra"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "nap"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "hét"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "hónap"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "év"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "soha"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "első"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "második"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "harmadik"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "negyedik"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "ötödik"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Esemény"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Résztvevők:"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Esemény hozzáadása vagy szerkesztése"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Összegzés"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Hely"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Jegyzetek"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Szervező"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(ön a szervező)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Idő mutatása a következőképpen:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Szabad"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Elfoglalt"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(Soronként egy)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Kapcsolatok"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Ismétlődési szabály"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Ismétlődik minden"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "a következő munkanapokon:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "a hónap %s%d%s napján"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "a "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "a hónapnak"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "minden "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "az év ezen napján"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "az összesen"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Ismétlődési időszak"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Nincs végső dátum"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Ismételje ezt az eseményt"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "ennyiszer"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Ismételje ezt az esemény eddig: "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Mentés"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Törlés"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Résztvevők elérhetőségének ellenőrzése"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Mégsem"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Időformátum"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Grafika feltöltés megszakítva."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Nem töltött fel fájlt."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "az ön fényképe"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "a szoba ikonja"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "a belépési oldal üdvözlőképe"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "a kilépési reklám kép"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "realloc() hiba! nem kaptam meg %d byte-t: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Érvénytelen paraméter"
+
+#: ../../inetconf.c:128
+#, fuzzy
+msgid " has been deleted."
+msgstr "%s törölve."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Több hozzáférésre van szükség ehhez a funkcióhoz."
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+#, fuzzy
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "Kérem adja meg a felhasználó nevet, amit használni szeretne."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(nincs tárgy)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "HIBA:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Megszakítva. Az üzenet nem lett beküldve."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Automatikusan megszakítva, mert ön már elmentette ezt az üzenetet."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Üzenet elküldve.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Üzenet postázva.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Az üzenetet nem mozgattuk."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "Hiba történt, miközben beszereztem ezt a részt: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Hiba történt, miközben beszereztem ezt a részt: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Csatol aláírást az email üzenetekhez?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Használja ezt az aláírást:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Alapértelmezett betűkészlet a levél fejléceihez:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Kedvelt email cím"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Kedvelt megjelenített név az email üzenetekhez"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Kedvelt megjelenített név a hirdetőtábla üzenetkehez"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Postafiók megjelenítési mód"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Nem tudom hogyan jelenítsem meg. "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Kattintson bármely jegyzetre a szerkesztéshez."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Azonosító/OpenID hozzárendelések kezelése"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Tényleg törölni kívánja ezt az OpenID-t?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(törlés)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "OpenID hozzáadása: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Hozzárendel"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s nem engedélyezi a hitelesítést OpenID-val."
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Azonnali üzenet küldése"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Azonnali üzenet küldése ide: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Írja be az üzenet szövegét:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Üzenet küldése"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Üzenet nem lett elküldve."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Az üzenet elküldésre került ide: "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Megszakítva.  A beállítások nem változtak."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Legyen ez a kezdőlap."
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Önnek mostantól nincs kezdőlapja."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Megszakítva.  Változások nem kerültek mentésre."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "A változtatásait mentettük."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "%s felhasználó kirúgva a(z) %s szobából."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "%s felhasználó meghívva a(z) %s szobába."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Megszakítva.  Nem lett új szoba létrehozva."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Szint törölve."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Új szint létrehozva."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Szoba lista nézet"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Mutasd az üres szinteket"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "fájl"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "fájlok"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Hirdetőtábla"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Levelek mappa"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Címjegyzék"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Naptár"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Feladatlista"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Jegyzetlista"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Naptárlista"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Napló"
+
+#: ../../roomviews.c:60
+#, fuzzy
+msgid "Drafts"
+msgstr "Dátum"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Az ön rendszerének beállítása frissítve"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Nincs)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Semmi)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Megszakítva.  %s nincs mentve."
+
+#: ../../sysmsgs.c:53
+#, fuzzy
+msgid " has been saved."
+msgstr "%s elmentve."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Szoba infó"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Befejezve?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Feladat neve"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Esedékesség dátuma"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Kategória"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Összes megjelenítése"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Feladat szerkesztése"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Kezdési dátum:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Nincs dátum"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "vagy"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Időponthoz kötött"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Esedékesség dátuma:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Befejezve:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Kategória:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "A változások nem lettek mentve."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Az új felhasználó létrehozva."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Nem tudom értelmezni a névjegy fényképet\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Hiba"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(nincs név)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "szerkeszt"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Azonosítás szükséges"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"A program képtelen volt kapcsolódni vagy a kapcsolatot fenntartani a Citadel "
+"kiszolgálóval. Kérjük jelezze a problémát a rendszergazdának."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "További információk"
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' nem Wiki szoba."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Dátum"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Írja be a kiszolgáló parancsot"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Ez a képernyő lehetővé teszi oylan Citadel kiszolgáló parancsok bevitelét, "
+"melyet a WebCit nem támogat.  Ha nem tudja ez mit jelent, ennek a "
+"képernyőnek nem sok hasznát veszi."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Írja be a parancsot:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Parancs bemenet (ha SEND_LISTING átviteli módot kér):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+#, fuzzy
+msgid "Detected host header is "
+msgstr "A felismert kiszolgáló fejléc %s://%s"
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Kiszolgáló parancs eredménye"
+
+#: ../../static/t/aide/display_generic_result.html:18
+#, fuzzy
+msgid "Enter another command"
+msgstr "Írja be a kiszolgáló parancsot"
+
+#: ../../static/t/aide/display_generic_result.html:19
+#, fuzzy
+msgid "Return to menu"
+msgstr "váltás a menüre"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Hálózat beállítása"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Új csomópont hozzáadása"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Jelenleg beállított csomópontok"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "Rendszer Adminisztrációs Menü"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+#, fuzzy
+msgid "Room Admin Menu"
+msgstr "Szoba infó"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Helyi rendszer további címei"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Levéltovábbító címek"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+#, fuzzy
+msgid "RBL hosts"
+msgstr "Levéltovábbító címek"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "SpamAssassin kiszolgálók"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr "ClamAV clamd kiszolgálók"
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Globális beállítások"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Felhasználói hozzáférés kezelés"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "Citadel leállítása"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Szobák és szintek"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr "Citadel újraindítása"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "Üzenet az ön felhasználóinak:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Hely beállítása"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "Általános"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "Push Email"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indexelés/naplózás"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Hozzáférés"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+#, fuzzy
+msgid "Directory"
+msgstr "Könyvtár neve:"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Automatikus-takarító"
+
+#: ../../static/t/aide/edituser/add.html:1
+#, fuzzy
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Ha szeretne további felhasználónak hozzáférést adni ehhez a szobához, írja "
+"be a felhasználó nevét az alábbi szövegdobozba és kattintson a 'Meghív' "
+"pontra."
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Új felhasználó: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+#, fuzzy
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Ha szeretne további felhasználónak hozzáférést adni ehhez a szobához, írja "
+"be a felhasználó nevét az alábbi szövegdobozba és kattintson a 'Meghív' "
+"pontra."
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Felhasználói azonosító szerkesztése: "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Felhasználónév:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Jelszó"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Elsődleges Internet e-mail cím"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "További Internet e-mail címek"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Belépések száma"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+#, fuzzy
+msgid "Messages submitted"
+msgstr "Levél mérete"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Hozzáférési szint"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+#, fuzzy
+msgid "User ID number"
+msgstr "Felhasználónév"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Utolsó belépés dátuma és ideje"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Felhasználók szerkesztése vagy törlése"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Felhasználók hozzáadása"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Felhasználók szerkesztése vagy törlése"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Szintek hozzáadása, megváltoztatása vagy törlése"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Csomópont neve"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Megosztott titok"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Gazda vagy IP címek"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Port szám"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Törlés jóváhagyása"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Biztosan törölni akarja"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Igen"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Nem"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+#, fuzzy
+msgid "(Edit)"
+msgstr "(Szerkeszt)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Töröl)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(domain nevek, melyekre ez a rendszer levelet fogad)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(rendszerek, melyek a ClamAV clamd szolgáltatást futtatják)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(domain nevek Globális Címlistával)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+#, fuzzy
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(rendszerek, melyek a ClamAV clamd szolgáltatást futtatják)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+#, fuzzy
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(rendszerek, melyek a ClamAV clamd szolgáltatást futtatják)"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Újraindítás most"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "Újraindítás a felhasználók figyelmeztetése után"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "Újraindítás, ha minden felhasználó tétlen"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "Kérem várjon, amíg a Citadel kiszolgáló újraindul..."
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+#, fuzzy
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr "Kérem várjon, amíg a Citadel kiszolgáló újraindul..."
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Karantén szoba neve"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+#, fuzzy
+msgid "Name of room to log pages"
+msgstr "Szoba neve:"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr "Azonosítási mód"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+#, fuzzy
+msgid "Self contained"
+msgstr "tartalmazza"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr "Kiszolgáló alapú"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr "LDAP (RFC2307)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr "LDAP (Active Directory)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+#, fuzzy
+msgid "Allow anonymous guest access"
+msgstr "Nincsenek anonym üzenetek"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Induló hozzáférési szint az új felhasználókhoz"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Önkiszolgáló felhasználó létrehozás kikapcsolása"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+#, fuzzy
+msgid "Configure automatic expiry of old messages"
+msgstr "Soha nem évüljenek el az üzenetek"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+#, fuzzy
+msgid "Default message expire policy for public rooms"
+msgstr "Üzenet elévülési szabályok ehhez a szobához"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Soha nem évüljenek el az üzenetek"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Elévülés az üzenetek száma alapján"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Elévülés az üzenetek kora alapján"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Üzenetek vagy napok száma: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+#, fuzzy
+msgid "Default message expire policy for private mailboxes"
+msgstr "Üzenetek elévülési szabálya ezen a szinten"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+#, fuzzy
+msgid "Same policy as public rooms"
+msgstr "Üzenet elévülési szabályok ehhez a szobához"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Az LDAP csatoló beállítása a Citadel számára"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "LDAP kiszolgáló neve (üres kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "LDAP kiszolgáló port száma (üres kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "Alap DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "Kapcsolódó DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Jelszó a kapcsolódó DN számára"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+#, fuzzy
+msgid "General site configuration items"
+msgstr "Hely beállítása"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "Belépési logó megváltoztatása"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "Kilépési logó megváltoztatása"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Csomópont ember által olvasható neve"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Telefonszám"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Ezen rendszer földrajzi elhelyezkedése"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Rendszergazda neve"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Alapértelmezett időzóna az időzóna nélküli naptár bejegyzésekhez"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+#, fuzzy
+msgid "IMAP listener port (-1 to disable)"
+msgstr "SMTP MTA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+#, fuzzy
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "SMTP MSA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indexelés és naplózás"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Teljes szöveges indexelés bekapcsolása"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+#, fuzzy
+msgid "Perform journaling of email messages"
+msgstr "Kedvelt megjelenített név az email üzenetekhez"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+#, fuzzy
+msgid "Perform journaling of non-email messages"
+msgstr "Kedvelt megjelenített név az email üzenetekhez"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+#, fuzzy
+msgid "POP3 listener port (-1 to disable)"
+msgstr "SMTP MTA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+#, fuzzy
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "SMTP MSA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+#, fuzzy
+msgid "Funambol server host (blank to disable)"
+msgstr "LDAP kiszolgáló neve (üres kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+#, fuzzy
+msgid "Funambol server port "
+msgstr "LDAP kiszolgáló neve (üres kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+#, fuzzy
+msgid "External pager tool (blank to disable)"
+msgstr "LDAP kiszolgáló neve (üres kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Hálózati szolgáltatások"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+#, fuzzy
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "SMTP MTA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+#, fuzzy
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "SMTP MTA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "SMTP MTA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "SMTP MTA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Üzenet legnagyobb hossza"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "SMTP MTA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "SMTP MSA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+#, fuzzy
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTP MSA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "Levelek megjelölése SPAM-ként az elutasítás helyett"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr "-1 kikapcsolja"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+#, fuzzy
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "SMTP MSA port (-1 kikapcsolja)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Felhasználói azonosítók hozzáadása, megváltoztatása, törlése"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Rendszer szintű beállítások szerkesztése"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Domain nevek és internetes levelezés beállítása"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "További Internet e-mail címek"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "Kimenő SMTP sor megtekintése"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Kilépés"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Alap parancsok"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Az ön adatai"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Haladó szoba parancsok"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Betöltés"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Ismeretlen"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+#, fuzzy
+msgid "Post message"
+msgstr "üzenetből"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Mellékletek:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "Feladó:"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "Hely:"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "Címzett:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "Másolat:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "Vakmásolat:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Tárgy (opcionális):"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Tárgy:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- továbbított üzenet ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Ablak bezárása"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Fájl csatolása"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+#, fuzzy
+msgid "Remove"
+msgstr "(eltávolít)"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Fájl feltöltése:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Fájlnév"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Méret"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Tartalom"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Leírás"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Kép feltöltése"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Feltölthet egy képet közvetlenül a számítógépéről"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Kérem válassza ki a feltöltendő fájlt:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Diavetítés"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Szint hozzáadása/módosítása/törlése"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Szint száma"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Szint neve"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Szobák száma"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "Szint CSS"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(szint törlése)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Be kell jelentkezned, hogy ezt az oldalt."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "belépés felhasználó név és jelszó segítségével"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Jelszó:"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Utolsó bejelentkezés"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Új felhasználó? Regisztráljon most"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Belépés OpenID használatával"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "OpenID URL:"
+
+#: ../../static/t/get_logged_in.html:90
+#, fuzzy
+msgid "Log in using Google"
+msgstr "Belépés OpenID használatával"
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Belépés OpenID használatával"
+
+#: ../../static/t/get_logged_in.html:100
+#, fuzzy
+msgid "Log in using AOL or AIM"
+msgstr "Belépés OpenID használatával"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "Kérem vár"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Az a(z) '%s' frissítése,  mely már létezik az ön naptárában."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr ""
+"Ez az esemény ütközik a(z) '%s' eseménnyel, mely már létezik az ön "
+"naptárában."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Nyelv:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Levelezés"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Feladatok"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Szobák"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Jelenlévő felhasználók"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Csevegés"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Haladó"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Adminisztráció"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "menü testreszabása"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "váltás a szoba listára"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "váltás a menüre"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Saját mappáim"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "eszköztár testre szabása"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Ikonok megjelenítése mint:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "képek és szöveg"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "csak képek"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "csak szöveg"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Válassza ki az ikonokat, melyeket a képernyőn balra, az eszköztárban "
+"szeretne látni."
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Hely logó"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "A helyre jellemző ikon"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Az ön összefoglaló oldala"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Levél (bejövő)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Egy gyorsbillentyű az ön bejövő leveleihez"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Az ön személyes címjegyzéke"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Az ön személyes jegyzetei"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Egy gyorsbillentyű az ön személyes naptárához"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Egy gyorsbillentyű az ön személyes feladatlistájához"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Erre az ikonra kattintva megtekintheti az összes elérhető szobát (vagy "
+"mappát)."
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Ki van itt?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+"Erre az ikonra kattintva megtekintheti az összes bejelentkezett felhasználó "
+"listáját."
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Erre az ikonra kattintva belép egy valós idejű csevegés módba azokkal a "
+"felhasználókkal, akik ugyan ebben a szobában vannak."
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Haladó beállítások"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Hozzáférés a Citadel teljes funkcióinak menüjéhez"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Citadel logó"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Megmutatja a 'Működteti a Citadel' ikont"
+
+#: ../../static/t/iconbar/save.html:11
+#, fuzzy
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr "Az ön naptára frissült, hogy reagáljon az RSVP-re."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Lista előfizetés"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Lista előfizetés/lemondás"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Jóváhagyási kérelem elküldve"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+#, fuzzy
+msgid " to the "
+msgstr "a "
+
+#: ../../static/t/listsub/display.html:21
+#, fuzzy
+msgid " mailing list."
+msgstr "Levelezőlista szolgáltatás"
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Vissza..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+#, fuzzy
+msgid "ERROR"
+msgstr "HIBA:"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+#, fuzzy
+msgid "from the"
+msgstr "ettől: "
+
+#: ../../static/t/listsub/display.html:42
+#, fuzzy
+msgid "mailing list."
+msgstr "Levelezőlista szolgáltatás"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+#, fuzzy
+msgid "Back..."
+msgstr "Vissza..."
+
+#: ../../static/t/listsub/display.html:57
+#, fuzzy
+msgid "Confirmation successful!"
+msgstr "Jóváhagyási kérelem elküldve"
+
+#: ../../static/t/listsub/display.html:59
+#, fuzzy
+msgid "Confirmation failed."
+msgstr "Beállítások"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Feladat neve"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Kedvelt email cím"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "Írja be az üzenet szövegét:"
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "Időformátum"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+#, fuzzy
+msgid "Logged in as"
+msgstr "Utolsó bejelentkezés"
+
+#: ../../static/t/loggedinas.html:6
+#, fuzzy
+msgid "Not logged in."
+msgstr "Nincs belépve"
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "működteti a"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Lépjen be újra"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Szoba szerkesztése vagy törlése"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Ugrás egy 'rejtett' szobába"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Új szoba létrehozása"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Új szoba létrehozása"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+#, fuzzy
+msgid "Zap (forget) this room"
+msgstr "Szoba kilövése"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Listázza az összes elfelejtett szobát"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Új üzenetek olvasása"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Listázza az ismert szobákat"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Hova mehetek innen?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Ugrás a következő szobába"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Ugrás a következő szobába"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(visszatérés később)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Visszalépés"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "hoppá! Vissza ide: "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Új üzenetek olvasása"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "... ebben a szobában"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Összes üzenet olvasása"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Üzenet beküldése"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(hozzászólás ebben a szobában)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "Fájl-tár"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(Letölthető fájlok listája)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Összefoglaló oldal"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Saját azonosítóm összefoglalója"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Felhasználók listája"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(összes regisztrált felhasználó)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Viszlát!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Változtassa meg a jelszavát"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Írja be az új jelszót:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Ellenőrzésként írja be ismét:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Az ön jellemzőinek és beállításainak megváltoztatása"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Frissítse a kapcsolati információit"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Az ön fényképének szerkesztése"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+#, fuzzy
+msgid "Manage your OpenIDs"
+msgstr "Változtassa meg a jelszavát"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Üzenet mozgatás jóváhagyása"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Üzenet mozgatása ide:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Olvasás alatt #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "üzenetből"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "legrégebbitől a legújabbig"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "legújabbtól a legrégebbiig"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Küldő"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Levél betöltése a kiszolgálóról, türelem"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Megnyitás új ablakban"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Mozgat"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Másolás"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Nyomtatás"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Kapcsolatok megnézése"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Új partner felévtele"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Napi nézet"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Havi nézet"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Új esemény felvétele"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Naptár lista"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Feladatok megnézése"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Új feladat felévtele"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Jegyzetek megnézése"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Új jegyzet felévtele"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Üzenetlista frissítése"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Email írása"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Wiki kezdőlap"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Oldal szerkesztése"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "újabb hozzászólás"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Szoba kihagyása"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "Új induló oldal"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "Az ön induló oldala megváltozott."
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Kérem adja meg a felhasználó nevet, amit használni szeretne."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Jellemzők és beállítások"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Fa (mappa) nézet"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Táblázat (szoba) nézet"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 órás (de/du)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 órás"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Vasárnap"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Hétfő"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Nincs aláírás"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "Teljes funkcionalitás"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Biztonságos mód"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+#, fuzzy
+msgid "Configure Push Email"
+msgstr "Push Email"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+#, fuzzy
+msgid "Send a text message to..."
+msgstr "Azonnali üzenet küldése ide:"
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+#, fuzzy
+msgid "Don‘t send any notifications"
+msgstr "Ne küldjön értesítéseket"
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Szoba neve: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Ezen a szinten van: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Szoba alapértelmezett nézete: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Szoba típusa:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Nyilvános (automatikusan megjelenik mindenkinek)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privát - rejtett (elérhető mindenkinek, aki tudja a nevét)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privát - jelszót igényel: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privát - csak meghívással"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Személyes (postafiók csak önnek)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Új szoba létrehozása"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Szoba neve: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Szoba alapértelmezett nézete: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Szoba típusa:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "A szoba Info fájl szerkesztése"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Rejtett szobába ugrás"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Adja meg a szoba nevét:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Adja meg a szoba jelszavát:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Beállítások"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Üzenet elévülési szabály"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Hozzáférés szabályozás"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Megosztás"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Levelezőlista szolgáltatás"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Távoli beszerzés"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(eltávolít)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+#, fuzzy
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Az alábbi listában található felhasználóknak van hozzáférése ehhez a "
+"szobához.  Ha el akarja valamelyiküket távolítani a listáról, válassza ki a "
+"felhasználó nevét és kattintson a 'Kirúg' pontra."
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Ha szeretne további felhasználónak hozzáférést adni ehhez a szobához, írja "
+"be a felhasználó nevét az alábbi szövegdobozba és kattintson a 'Meghív' "
+"pontra."
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Meghív:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Felhasználók"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Szoba törlése"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+#, fuzzy
+msgid "Set or change the icon for this rooms banner"
+msgstr "A szoba hirdetés ikonjának beállítása vagy megváltoztatása"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+#, fuzzy
+msgid "Edit this rooms Info file"
+msgstr "A szoba Info fájl szerkesztése"
+
+#: ../../static/t/room/edit/tab_config.html:7
+#, fuzzy
+msgid "name of room: "
+msgstr "Szoba neve:"
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Ha privát, az összes jelenlegi felhasználó elfelejti a szobát"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Csak a kedvenc felhasználók"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Csak olvasható szoba"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "Minden felhasználó, aki beküldhet az törölhet is üzeneteket"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Fájl mappa szoba"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Könyvtár neve: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Feltöltés engedélyezett"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Letöltés engedélyezett"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Megtartja az üzeneteket a szerveren?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Látható könyvtár"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Hálózaton megosztott szoba"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Állandó (nem törlődik automatikusan)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+"Tárgy kötelező (Kényszeríti a felhasználókat, hogy az üzeneteknek adják meg "
+"a tárgyát)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Anonym üzenetek"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Nincsenek anonym üzenetek"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Minden üzenet anonym"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+#, fuzzy
+msgid "Room aide: "
+msgstr "Szoba száma:"
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Üzenet elévülési szabályok ehhez a szobához"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Használja az alapértelmezett szabályokat ehhez a szinthez"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Üzenetek elévülési szabálya ezen a szinten"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Rendszer alapértelmezés használata"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+"Üzenetek letöltése távoli POP3 azonosítóról és tárolása ebben a szobában:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "Távoli kiszolgáló"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Felhasználónév"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Megtartja az üzeneteket a szerveren?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "Időköz"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "A következő RSS folyam letöltése és tárolása ebben a szobában:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "Folyam URL"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>A szoba tartalma <b>egyedi üzenetekben</b> elküldésre kerül az alábbi "
+"címzetteknek:</i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>A szoba tartalma <b>egyetlen üzenetben</b> elküldésre kerül az alábbi "
+"címzetteknek:</i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Címzettek hozzáadása a Kapcsolatokból vagy más címlistákból"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "Engedélyezi, hogy nem előfizetők postázhassanak ebbe a szobába."
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr "Önkiszolgáló előfizetés/lemondás engedélyezése."
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "Az előfizetés/lemondás URL: "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Nincs megosztva ezzel:"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Megosztva ezzel:"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Távoli csomópont neve"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Távoli szoba neve"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Műveletek"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"Amikor megoszt egy szobát, annak meg kell lennie osztva mindkét oldalon.  "
+"Egy csomópont hozzáadása a 'megosztások' listájához kiküldi az üzeneteket, "
+"de ahhoz, hogy kapjon is üzenetet, a másik csomópontoknak is be kell "
+"állítaniuk, hogy kiküldje az üzeneteket az ön rendszerének. <li>Ha a távoli "
+"szoba neve üres, feltételezzük, hogy a szoba neve azonos a másik oldalon."
+"<li>Ha a távoli szoba neve más, a másik csomóponton szintén be kell állítani "
+"az itteni szoba nevét.</ul></l><br>\n"
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Szoba infó"
+
+#: ../../static/t/room/zap_this.html:3
+#, fuzzy
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Szoba kilövése"
+
+#: ../../static/t/room/zap_this.html:6
+#, fuzzy
+msgid "If you select this option,"
+msgstr "Szoba szerkesztése vagy törlése"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Kilőtt (elfelejtett) szobák"
+
+#: ../../static/t/room/zapped_list.html:10
+#, fuzzy
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Kattintson bármelyik szobára, hogy azt felélessze és belépjen.\n"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Oldal kiválasztása: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Keres: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Minden"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Szkript hozzáadása vagy törlése"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Új szkript hozzáadása"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Szkript neve: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Szkriptek szerkesztése"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Szkriptek törlése"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Ha"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Címzett vagy másolat"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Válaszcím"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Újraküldő"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Újraküldés címzettje"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Boríték feladó"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Boríték címzett"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "Levelezőprogram"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "SPAM jelzés"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "SPAM állapot"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "Listaazonosító"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Levél mérete"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "tartalmazza"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "nem tartalmazza"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "pontosan az, hogy"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "nem az, hogy"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "egyezik"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "nem egyezik"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Összes üzenet)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "nagyobb, mint"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "kisebb, mint"
+
+#: ../../static/t/sieve/display_one.html:59
+#, fuzzy
+msgid "bytes"
+msgstr "év"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Megtart"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Csendben eldob"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Visszautasít"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Levél mozgatása ide:"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Továbbítás ide:"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Vakáció"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Üzenet:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "és utána"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "feldolgozás folytatása"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "állj"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Ha új email érkezik: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Szűrd az alábbi feltételek szerint"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Hagyd a bejövő levelek között szűrés nélkül"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr "Szűrd a kézzel szerkesztett szkriptekkel (csak haladó felhasználóknak)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Szabály hozzáadása"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+#, fuzzy
+msgid "Summary page for "
+msgstr "%s összefoglaló lapja"
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Üzenetek"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Az&nbsp;ön&nbsp;naptára&nbsp;ma"
+
+#: ../../static/t/summary/page.html:51
+#, fuzzy
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Ki van&nbsp;itt&nbsp;most"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Erről&nbsp;a&nbsp;kiszolgálóról"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+#, fuzzy
+msgid "running"
+msgstr "Hangolás"
+
+#: ../../static/t/summary/page.html:65
+#, fuzzy
+msgid "with"
+msgstr "ötödik"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+#, fuzzy
+msgid "and located in"
+msgstr "és utána"
+
+#: ../../static/t/summary/page.html:68
+#, fuzzy
+msgid "Your system administrator is"
+msgstr "Rendszergazda neve"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+#, fuzzy
+msgid "User list for "
+msgstr "Felhasználók listája"
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Felhasználónév"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Szám"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Hozzáférési szint"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Utolsó bejelentkezés"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Összes bejelentkezés"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Összes hozzászólás"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Felhasználói profil"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+#, fuzzy
+msgid "Click here to send an instant message to"
+msgstr "Azonnali üzenet küldése ide: "
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Kapcsolat információ szerkesztése"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Megszólítás"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Keresztnév"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Középső név"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Vezetéknév"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Utótag"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Megjelenített név:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Megszólítás:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Szervezet:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Postafiók:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Cím:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Város:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Megye:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Irányítószám:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Ország:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Otthoni telefon:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Munkahelyi telefon:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Mobiltelefon:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Fax szám:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Ez a címlista üres."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Belső hiba történt."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "A hozzászólásod"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "újabb hozzászólás"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "régebbi hozzászólás"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "Parancs elküldése"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "A sor üres."
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Oldal frissítése"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Távoli kiszolgáló"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Megye:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "feldolgozás folytatása"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "Üzenet azonosító"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Feladás dátuma/ideje"
+
+#: ../../static/t/view_mailq/table.html:8
+#, fuzzy
+msgid "Next attempt"
+msgstr "Utolsó kísérlet"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Címzettek"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "ettől: "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "Címzett:"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Válasz"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "IdézveVálaszol"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "VálaszMindenkinek"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Továbbít"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Fejlécek"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "Megnéz"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Letölt"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Mutasd mint:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+#, fuzzy
+msgid "Click on a name to read user info.  Click on"
+msgstr "Kattintson bármely jegyzetre a szerkesztéshez."
+
+#: ../../static/t/who.html:24
+#, fuzzy
+msgid "to send an instant message to that user."
+msgstr "Azonnali üzenet küldése ide:"
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(kilő)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Szoba"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "Innen jött"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Szoba száma:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Gépnév:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+#, fuzzy
+msgid "Edit configuration"
+msgstr "Hely beállítása"
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "Ez a címlista üres."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Ugrás"
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Nincs '%s' nevű oldal itt."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#~ msgid "the icon for this floor"
+#~ msgstr "az szint ikonja"
+
+#~ msgid "Edit %s"
+#~ msgstr "%s szerkesztése"
+
+#~ msgid "Save changes"
+#~ msgstr "Változások mentése"
+
+#~ msgid " (work)"
+#~ msgstr " (munka)"
+
+#~ msgid " (home)"
+#~ msgstr " (otthon)"
+
+#~ msgid " (cell)"
+#~ msgstr " (mobil)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefon:"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Címtár domainek"
+
+#, fuzzy
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Levéltovábbító címek"
+
+#~ msgid "Create new room"
+#~ msgstr "Új szoba létrehozása"
+
+#~ msgid "Zap this room"
+#~ msgstr "Szoba kilövése"
+
+#~ msgid ""
+#~ "You have one or more instant messages waiting, but the Citadel Instant "
+#~ "Messenger window failed to open.  This is probably because you have a "
+#~ "popup blocker installed.  Please configure your popup blocker to allow "
+#~ "popups from this site if you wish to receive instant messages."
+#~ msgstr ""
+#~ "Önnek egy vagy több várakozó azonnali üzenete van, de a Citadel Azonnali "
+#~ "Üzenetküldő ablaka nem tudott megnyílni.  Ennek valószínűleg az az oka, "
+#~ "hogy az ön böngészője blokkolja a felugró ablakokat.  Kérem állítsa be a "
+#~ "böngészőt úgy, hogy erről a helyről engedélyezze a felugró ablakokat, ha "
+#~ "azonnali üzeneteket szeretne kapni."
+
+#, fuzzy
+#~ msgid "Change"
+#~ msgstr "CSS megváltoztatása"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Hálózaton megosztott szoba"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Új csomópont hozzáadása"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "perc"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Próbaképpen"
+
+#~ msgid "Send"
+#~ msgstr "Küldés"
+
+#, fuzzy
+#~ msgid "Delete this message?"
+#~ msgstr "Szoba törlése"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Szoba infó"
+
+#~ msgid "Pictures in"
+#~ msgstr "Képek itt"
+
+#~ msgid "Exit"
+#~ msgstr "Kilépés"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Fájl feltöltése:"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Biztosan törölni akarja"
+
+#~ msgid "Upload"
+#~ msgstr "Feltöltés"
+
+#~ msgid "Add"
+#~ msgstr "Hozzáadás"
+
+#~ msgid "Create"
+#~ msgstr "Létrehoz"
+
+#~ msgid "Kick"
+#~ msgstr "Kirúg"
+
+#~ msgid "Invite"
+#~ msgstr "Meghív"
+
+#~ msgid "User"
+#~ msgstr "Felhasználó"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Címjegyzék"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Szabály törlése"
+
+#, fuzzy
+#~ msgid "Delete this user?"
+#~ msgstr "Törli ezt a szkriptet?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Szabály törlése"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "A beérkező levelei nem lesznek szűrve egyetlen szkripttel sem."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "A jelenleg aktív szkript: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Replikáció beállítása más Citadel kiszolgálókkal"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Megmutatja a 'Működteti a Citadel' ikont"
+
+#, fuzzy
+#~ msgid "Go to your email inbox"
+#~ msgstr "Egy gyorsbillentyű az ön bejövő leveleihez"
+
+#, fuzzy
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Egy gyorsbillentyű az ön személyes naptárához"
+
+#, fuzzy
+#~ msgid "Go to your personal address book"
+#~ msgstr "Az ön személyes címjegyzéke"
+
+#, fuzzy
+#~ msgid "Go to your personal notes"
+#~ msgstr "Az ön személyes jegyzetei"
+
+#, fuzzy
+#~ msgid "Go to your personal task list"
+#~ msgstr "Egy gyorsbillentyű az ön személyes feladatlistájához"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Listázza az összes elfelejtett szobát"
+
+#, fuzzy
+#~ msgid "Room and system administration functions"
+#~ msgstr "Rendszergazda neve"
+
+#~ msgid "Reset form"
+#~ msgstr "Űrlap ürítése"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Szoba törlése"
+
+#~ msgid "Create new floor"
+#~ msgstr "Új szint létrehozása"
+
+#~ msgid "Move rule up"
+#~ msgstr "Szabály mozgatása felfelé"
+
+#~ msgid "Move rule down"
+#~ msgstr "Szabály mozgatása lefelé"
+
+#~ msgid "Delete rule"
+#~ msgstr "Szabály törlése"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(grafika szerkesztése)"
+
+#~ msgid "Change name"
+#~ msgstr "Név megváltoztatása"
+
+#~ msgid "Change CSS"
+#~ msgstr "CSS megváltoztatása"
+
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Biztosan törölni kívánja ezt a szobát?"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Írja be a parancsot:"
+
+#~ msgid "Unshare"
+#~ msgstr "Megosztás visszavonása"
+
+#, fuzzy
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "LDAP kiszolgáló neve (üres kikapcsolja)"
+
+#, fuzzy
+#~ msgid "Master user password"
+#~ msgstr "Írja be az új jelszót:"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "Szoba törlése"
+
+#~ msgid "List"
+#~ msgstr "Lista"
+
+#~ msgid "Digest"
+#~ msgstr "Kivonat"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Tárgy"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Tényleg törölni kívánja ezt az OpenID-t?"
+
+#~ msgid "Share"
+#~ msgstr "Megoszt"
+
+#~ msgid "Change password"
+#~ msgstr "Jelszó megváltoztatása"
+
+#~ msgid "Change room name"
+#~ msgstr "Szoba nevének megváltoztatása"
+
+#~ msgid "Change host name"
+#~ msgstr "Gép nevének megváltoztatása"
+
+#~ msgid "Change user name"
+#~ msgstr "Felhasználó nevének megváltoztatása"
+
+#~ msgid ""
+#~ "Leave all messages marked as unread, go to next room with unread messages"
+#~ msgstr ""
+#~ "Összes üzenet olvasatlanul hagyása és ugrás a következő olvasatlan "
+#~ "üzenetet tartalmazó szobába"
+
+#~ msgid "Mark all messages as read, go to next room with unread messages"
+#~ msgstr ""
+#~ "Összes üzenet megjelölése olvasottként és ugrás a következő olvasatlan "
+#~ "levelet tartalmazó szobába"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Változások mentése"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Ön előfizeti <TT>%s</TT>-t a <b>%s</b> levelező listára.  A lista "
+#~ "kiszolgáló egy további Web linket küldött önnek e-mailben, amire rá kell "
+#~ "kattintania az előfizetés jóváhagyásához. Ez a kiegészítő lépés azért "
+#~ "szükséges, hogy megakadályozzon másokat abban, hogy előfizessék önt az ön "
+#~ "beleegyezése nélkül.<br><br>Kérem kattintson rá a linkre, melyet e-"
+#~ "mailben küldtünk önnek, hogy az előfizetését jóváhagyja.<br>\n"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Nincs '%s' nevű szoba."
+
+#~ msgid "Network"
+#~ msgstr "Hálózat"
+
+#~ msgid "Tuning"
+#~ msgstr "Hangolás"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Törölt levelek azonnali megsemmisítése az IMAP-on"
+
+#~ msgid "Delete script"
+#~ msgstr "Szkript törlése"
+
+#~ msgid "Delete this script?"
+#~ msgstr "Törli ezt a szkriptet?"
+
+#~ msgid "Yes with users list"
+#~ msgstr "Igen, a felhasználók listájával"
+
+#~ msgid "Room list"
+#~ msgstr "Szoba lista"
+
+#, fuzzy
+#~ msgid "uname"
+#~ msgstr "Fájlnév"
+
+#, fuzzy
+#~ msgid "text"
+#~ msgstr "csak szöveg"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "Fájlnév"
+
+#, fuzzy
+#~ msgid "pname"
+#~ msgstr "Fájlnév"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Jelszó"
+
+#, fuzzy
+#~ msgid "pass"
+#~ msgstr "Feladatok"
+
+#, fuzzy
+#~ msgid "display: none"
+#~ msgstr "Megjelenített név:"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "A jelszavát nem fogadtuk el."
+
+#~ msgid "See the"
+#~ msgstr "Lásd itt"
+
+#~ msgid "recommended browser list"
+#~ msgstr "ajánlott böngészők listája"
+
+#~ msgid "Click here to learn what OpenID is and how Citadel is using it."
+#~ msgstr ""
+#~ "Kattintson ide, ha többet szeretne tudni az OpenID-ról és arról, hogyan "
+#~ "használja azt a Citadel."
+
+#, fuzzy
+#~ msgid "Log off now?"
+#~ msgstr "Kilépés"
+
+#~ msgid "%d new of %d messages%s"
+#~ msgstr "%d új az összesen %d üzenetből%s"
+
+#~ msgid "(nothing)"
+#~ msgstr "(semmi)"
+
+#~ msgid "unexpected end of message"
+#~ msgstr "az üzenet váratlanul végetért"
+
+#~ msgid "An error occurred while setting up the chat socket."
+#~ msgstr "Hiba történt a csevegés kapcsolat felépítésekor."
+
+#~ msgid "Now exiting chat mode."
+#~ msgstr "Kilépek a csevegés módból."
+
+#~ msgid "Help"
+#~ msgstr "Súgó"
+
+#~ msgid "List users"
+#~ msgstr "Felhasználók listája"
+
+#~ msgid "No messages here."
+#~ msgstr "Itt nincsenek üzenetek."
+
+#, fuzzy
+#~ msgid "no more messages"
+#~ msgstr "Anonym üzenetek"
+
+#~ msgid ""
+#~ "Your icon bar has been updated.  Please select any of its choices to "
+#~ "continue.<br/><span style=\"font-weight: bold;\">You may need to force "
+#~ "refresh (SHIFT-F5) in order for changes to take effect</span>"
+#~ msgstr ""
+#~ "Az eszköztár frissítve. Kérem válassza az alábbi lehetőségek bármelyikét "
+#~ "a folytatáshoz.<br/><span style=\"font-weight: bold;\">Valószínűleg "
+#~ "kényszerített frissítésre (SHIFT-F5) van szükség ahhoz, hogy a változások "
+#~ "érvénybe lépjenek</span>"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "%s from"
+#~ msgstr "Ettől: %s FIX415"
+
+#~ msgid "%s in %s"
+#~ msgstr " %s itt FIX416: %s: "
+
+#~ msgid " on %s"
+#~ msgstr " a(z) %s (FIX417)"
+
+#~ msgid "%s"
+#~ msgstr "%s FIXME418"
diff --git a/webcit/po/webcit/it.po b/webcit/po/webcit/it.po
new file mode 100644 (file)
index 0000000..5ee3c63
--- /dev/null
@@ -0,0 +1,4787 @@
+# translation of webcit.po to it.po
+# Copyright (C) 2005 - 2009 The Citadel Project - http://www.citadel.org
+# This file is distributed under the revised BSD license
+#
+# Gabriele Tassoni <tasso@fastwebnet.it>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2010-11-13 00:06+0000\n"
+"Last-Translator: Gabriele Tassoni <gabriele.tassoni@email.it>\n"
+"Language-Team: <room_citadel_translators@uncensored.citadel.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2010-11-14 05:02+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Cancellato"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Nuovo Utente"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Utente con Problemi"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Utente Locale"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Utente di Rete"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Utente Preferito"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Amministratore"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "E' avvenuto un errore."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Valida il nuovo utente"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Non si richiede l'autenticazione utente in questo momento"
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "molto debole"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "debole"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "ok"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "forte"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Attuale livello di accesso: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Seleziona il livello di accesso per l'utente corrente:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Aziona cancellata. La password non &egrave; stata cambiata."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Le password non coincidono. Cambiamento non effettuato."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Le password vuote non sono ammesse."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "Disponibilit&agrave; sconosciuta"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "libero"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "OCCUPATO"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Vai alla pagina: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Primo"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Ultimo"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Invito a un incontro"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Risposta del membro al tuo invito"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Evento pubblicato"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Questo &egrave un tipo di calendario sconosciuto."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Sommario:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Luogo:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Data:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Data e ora di inizio:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Data e ora di fine:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Descrizione:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Ricorrenza"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Questo è un evento ricorrente"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Membro:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+"Questo &egrave; un aggiornamento di '%s' gi&egrave; nel tuo calendario."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+"Questo evento &egrave; in conflitto con l'evento '%s' gi&agrave; presente "
+"nel tuo calendario."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Aggiorna:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "CONFLITTO:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Come vuoi rispondere a questo invito?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Accetta"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Tentativo"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Declina"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Seleziona <i>Aggiorna</i> Per accettare questa risposta e aggiornare il tuo "
+"calendario."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Aggiorna"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignora"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "C'&egrave; un errore in questo oggetto del calendario."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+"Hai accettato questo invito all'incontro. &egrave; stato aggiunto al tuo "
+"calendario."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Hai accettato questo messaggio in forse. &egrave; stato \"segnato a matita\" "
+"nel tuo calendario"
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Hai declinato l'invito. Non &egrave; stato inserito nel tuo calendario."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Una risposta &egrave; stata mandata all'organizzatore dell'incontro."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+"Il tuo calendario &egrave; stato aggiornato per riflettere questo RSVP."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"Hai scelto di ignorare questo RSVP. il tuo calendario <b>non</b> "
+"verr&agrave; aggiornato."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "La vista giornaliera del calendario inizia il:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "La vista giornaliera del calendario finisce il:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "La settimana parte da:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Ora: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minuto: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(stato sconosciuto)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(serve una azione)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(accettato)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(declinato)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(tentativo)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(delegato)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(completato)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(in lavorazione)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(nessuno)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Evento senza Titolo"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "Mittente"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Data di partenza:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Data di arrivo:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Data/tempo:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "note:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "precedente"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "successivo"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Settimana"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Ore"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Oggetto"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Inizio"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Fine"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Evento per tutto il giorno"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Evento corrente"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "E' avvenuto un errore durante il recupero di questa parte: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "secondi"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minuti"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "ore"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "giorni"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "settimane"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "mesi"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "anni"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "mai"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "primo"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "secondo"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "terzo"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "quarto"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "quinto"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Evento"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Membri"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Aggiungi o modifica un evento"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Sommario"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Luogo"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Note"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organizer"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(tu sei l'organizzatore)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Mostra l'ora come:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Libero"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Occupato"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(Uno per linea)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Contatti"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Regola ricorrente"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Ripeti ogni"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "nei giorni di questa settimana:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "nei giorni %s%d%s del mese"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "sul "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "del mese"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "ogni "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "anno in questa data"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "di"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Nessuna data finale"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Ripeti questo evento"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "tempi"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Ripeti questo evento fino "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Salva"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Cancella"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Controlla la disponibilit&agrave; del membro."
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Cancella"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Formato dell'ora"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Il caricamento della grafica &egrave; stato cancellato."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Non carichi un file."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "La tua foto"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "l'icona di questa stanza"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "errore di realloc()! non riesco a ottenere %d bytes: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Parametro Invalido"
+
+#: ../../inetconf.c:128
+#, fuzzy
+msgid " has been deleted."
+msgstr "%s &egrave; stato cancellato."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+#, fuzzy
+msgid " added."
+msgstr "aggiunto."
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(nessun oggetto)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "ERRORE:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Messaggio vuoto"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Cancellato. Il messaggio non &egrave; stato inviato."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Cancellato automaticamente, hai gi&agrave; salvato questo messaggio."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Il messaggio &egrave; stato inviato.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Il messaggio &egrave; stato postato.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Il messaggio non è stato spostato"
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "E' avvenuto un errore durante il recupero di questa parte: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "E' avvenuto un errore durante il recupero di questa parte: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Allega la firma ai messaggi email?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Usa questa firma:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Set di caratteri di default per le intestazioni delle email:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Indirizzo email preferito"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Non so come mostrare "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Clicca su una nota per modificarla."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(elimina)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Aggiungi un OpenID: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Allega"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Invia un Messaggio Istantaneo"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Invia un Messaggio istantaneo a: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Inserisci il testo del messaggio:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Invia il messaggio"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Il Messaggio non è stato spedito."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Il Messaggio è stato spedito a "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Attività cancellata. Nessuna impostazione è stata cambiata."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Imposta questa pagina come principale"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Non hai più una pagina principale selezionata."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Le mie Catrelle"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Attività Cancellata.Le modifiche non sono state salvate."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Le tue modifiche sono state salvate."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "L'utente %s è stato espulso dalla stanza %s."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "L'utente %s è stato invitato nella stanza %s."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Attività Cancellata.Nessuna nuova stanza è stata creata."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Il piano &egrave; stato cancellato."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Il nuovo piano &egrave; stato creato."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Vista della lista delle stanze"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "documento"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "documenti"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Forum"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Cartella di Posta"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Contatti"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Calendario"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Lista delle Attività"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Lista delle Note"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Lista Calendario"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "giornale"
+
+#: ../../roomviews.c:60
+#, fuzzy
+msgid "Drafts"
+msgstr "Data"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Sei collegato a un server Citadel con installato Citadel %d.%02d. \n"
+"Per poter usare questa versione di WebCit, devi avere Citadel %d.%02d o più "
+"recente.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "La configurazione del tuo sistema è stata aggiornata"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Nessuno)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Nulla)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Attività cancellata. %s non è stato salvato."
+
+#: ../../sysmsgs.c:53
+#, fuzzy
+msgid " has been saved."
+msgstr "%s è stato salvato."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Informazioni di stanza"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Le tue informazioni personali"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Completato?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Nome dell'operazione"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Data dovuta"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Categoria"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Mostra Tutto"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Aggiorna questa operazione."
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Data di inizio:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Nessuna Data"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "o"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Tempo associato"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Scadenza:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Completato:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Categoria:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"E' avvenuto un errore durante la creazione o la cancellazione di questa voce "
+"della rubrica dei contatti"
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "I cambiamento non sono stati salvati."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "E' stato creato un nuovo utente."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Errore"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Abortendo."
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(nessun nome)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "Modifica"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Autorizzazione richiesta"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"Questa risorsa richiede un nome utente e una password. Non puoi essere "
+"autenticato e accedere a: %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Questo programma non riesce a collegarsi o a rimanere collegato al server "
+"Citadel. Per favore, segnala questo errore all'amministratore di sistema."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Leggi Altro..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' non è una stanza di tipo Wiki."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Data"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Autore"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(mostra)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Versione corrente"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Titolo pagina"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "inserisci un comando per il server"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Questa schermata ti permette di inviare comandi al server non supportati da "
+"WebCit. Se non sai cosa significhi, allora questa schermata non ti "
+"sar&agrave; di molto aiuto."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Inserisci il comando:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+"Input del comando (se si richiede un modo di traferimento SEND_LISTING):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+#, fuzzy
+msgid "Detected host header is "
+msgstr "L'intestazione dell'host rilevata &egrave; %s://%s"
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Risultato del comando impartito al Server"
+
+#: ../../static/t/aide/display_generic_result.html:18
+#, fuzzy
+msgid "Enter another command"
+msgstr "inserisci un comando per il server"
+
+#: ../../static/t/aide/display_generic_result.html:19
+#, fuzzy
+msgid "Return to menu"
+msgstr "Visualizza il menu"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Configurazione di rete"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Aggiungi un nuovo nodo"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Nodi configurati"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "Menu di amministrazione di sistema"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+#, fuzzy
+msgid "Room Admin Menu"
+msgstr "Amministratore della stanza: "
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Alias degli host locali"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Smart Host"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "Host RBL"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "Host Spamassassin"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+#, fuzzy
+msgid "Masqueradable domains"
+msgstr "Domini del gateway"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Configurazione globale"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Gestione account utenti"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Stanze e piani"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+#, fuzzy
+msgid "Restart Citadel"
+msgstr "Imposta questa pagina come principale"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+#, fuzzy
+msgid "Message to your Users:"
+msgstr "Il Messaggio non è stato spedito."
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Configurazione del sito"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+#, fuzzy
+msgid "You need to be aide to view this."
+msgstr "Non hai il permesso di visualizzare questa risorsa."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "Generale"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+#, fuzzy
+msgid "Push Email"
+msgstr "Email"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indicizza"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Accesso"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+#, fuzzy
+msgid "Directory"
+msgstr "directory"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Eliminatore automatico"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Per creare un nuovo account utente, inserisci il nome utente desiderato "
+"nella casella riportata sotto e clicca 'Crea'."
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Nuovo utente:"
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Per modificare un utente esistente, seleziona il suo nome dalla lista e "
+"clicca 'Modifica'."
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Modifica l'account dell'utente:"
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Nome utente:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Password"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Permesso di inviare email a internet"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Indirizzo email principale"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Alias degli indirizzi email esterni"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Numero di login"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Numero di Messaggi"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Livello di accesso"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "Numero indentificativo"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Data e giorno dell'ultimo accesso"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Auto elimina dopo questo numero di giorni"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Modifica o cancella gli utenti"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Aggiungi utenti"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Modifica o cancella gli utenti"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Aggiungi, modifica o cancella i piani"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Nome del nodo"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Segreto condiviso"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Nome dell'host o indirizzo IP"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Numero di porta"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Conferma la cancellazione"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Sei sicuro di voler cancellare? "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Si"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "No"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+#, fuzzy
+msgid "(Edit)"
+msgstr "(modifica)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Cancella)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(Domini per cui questo host riceve email)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+#, fuzzy
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(host che forniscono il servizio spamassassin)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(Domini mappati nei Contatti Globali)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(host che usano una lista Blackhole in tempo reale)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr "(Se presenti, invia tutta la posta non locale a uno di questi host)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(host che forniscono il servizio spamassassin)"
+
+#: ../../static/t/aide/restart.html:2
+#, fuzzy
+msgid "Restart Now"
+msgstr "Imposta questa pagina come principale"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Controlli di accesso e impostazioni delle politiche del sito"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Permetti agli amministratori di dimenticare le stanze"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Poni in quarantena i messaggi da utenti con problemi"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Nome della stanza di quarantena"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Nome delle stanze per il log delle pagine"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+#, fuzzy
+msgid "Self contained"
+msgstr "Contiene"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+#, fuzzy
+msgid "Host based"
+msgstr "Nome dell'host:"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+#, fuzzy
+msgid "Allow anonymous guest access"
+msgstr "Nessun messaggio anonimo"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Livello di accesso iniziale per i nuovi utenti"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Livello di accesso richiesto per creare le stanze"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+"Imposta automaticamente lo stato di aide per la stanza agli utenti che "
+"creano stanze private"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+#, fuzzy
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+"Imposta automaticamente lo stato di aide per la stanza agli utenti che "
+"creano stanze BLOG"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Restringi l'accesso alla posta internet"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Disabilita l'autocreazione degli account utente"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "Richiedi la registrazione per i nuovo utenti"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Configura la cancellazione automatica dei vecchi messaggi"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+"Queste impostazioni possono essere escluse da impostazioni specifiche alla "
+"stanza o al piano."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Ora in cui lanciare la pulizia del database"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "Politica di default per la cancellazione delle stanze publiche"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Non permettere ai messaggi di auto cancellarsi"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Cancella per numero di messaggi"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Elimina per età del messaggio"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Numero di messaggi o giorni:"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+"Politica di default per la cancellazione delle cassette postali private"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Stessa politica delle stanze private"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Tempo di eliminazione di default degli utenti (in giorni)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Tempo di eliminazioni di default delle stanze (in giorni)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Configura il connettore LDAP per Citadel"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"I cambiamenti in questa schemata non avranno effetto finchè non si riavvia "
+"il server Citadel."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"NOTA: Questo server citadel è stato compilato senza il supporto LDAP. Queste "
+"opzioni non avranno effetto."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Nome del server LDAP (vuoto per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Nuero di porta del server LDAP (vuoto per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "DN di base"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "DN bind"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Password per il DN bind"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "Oggetti di configurazione generali del sito"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Nome di dominio completo"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Nome del nodo leggibile da umani"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Numero di telefono"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Richiamo di impaginazione (per i client solo testo)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Località geografica di questo server"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Nome dell'amministratore di sistema"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Timezone di default per i calendari non localizzati"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "Porta IMAP (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "Porta IMAP SSL (-1 per disabiliare)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indicizzazione"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Attenzione: queste caratteristiche richiedono molte risorse."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Abilita l'indicizzazione completa dei testi"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "Esegui l'indicizzazione delle email"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "Esegui l'indicizzazione dei messaggi non-email"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "Email di destinazione  dei messaggi indicizzati"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "Porta POP3 (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "Porta POP3 SSL (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+#, fuzzy
+msgid "POP3 fetch frequency in seconds"
+msgstr "Velocità della rete (in secondi)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+#, fuzzy
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "Velocità della rete (in secondi)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+#, fuzzy
+msgid "Funambol server host (blank to disable)"
+msgstr "Nome del server Funambol (vuoto per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+#, fuzzy
+msgid "Funambol server port "
+msgstr "Nome del server Funambol (vuoto per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+#, fuzzy
+msgid "Funambol sync source"
+msgstr "Nome del server Funambol (vuoto per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+#, fuzzy
+msgid "External pager tool (blank to disable)"
+msgstr "Nome del server Funambol (vuoto per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Servizi di rete"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "Indirizzo ip del server (0.0.0.0 per 'qualsiasi')"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+#, fuzzy
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "Porta POP3 (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+#, fuzzy
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "Porta POP3 (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "Porta POP3 (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "Porta POP3 (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Controlli avanzati per la configurazione delle rifiniture"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Massima lunghezza dei messaggi"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Timeout della connessione per il server in attesa (in secondi)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "Velocità della rete (in secondi)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Numero massimo di sessioni concorrenti (0 = nessun limite)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Numero minimo di discussioni attive"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Massimo numero di discussioni attive"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Cancella automaticamente i log del database approvati"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "Porta SMTP MTA (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "Porta SMTP MSA (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "Porta SMTP SSL (-1 per disabilitare)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+#, fuzzy
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+"Permetti ai client SMTP non autenticati lo spoofing dei domini del server"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "Correggi le linee From: forgiate durante una sessione SMTP autenticata"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+#, fuzzy
+msgid "-1 to disable"
+msgstr "Clicca per disabilitare."
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+#, fuzzy
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "Porta IMAP (-1 per disabilitare)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Aggiungi, modifica, cancella degli account di utenti"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Modifica la configurazione per tutto il sito"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Configurazione dei nomi di dominio e della posta internet"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Alias degli indirizzi email esterni"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "Visualizza la coda SMTP di posta in uscita"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Esci"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Comandi base"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Le tue Informazioni"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Comandi di stanza avanzati"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Caricamento"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Anonimo"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Posta il messaggio"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Allegati:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "da"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "in"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "A:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "CC:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "BCC:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Oggetto (opzionale):"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Oggetto:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- messaggio inoltrato ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Chiudi la finestra"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Allega file"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+#, fuzzy
+msgid "Remove"
+msgstr "(rimuovi)"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Carica un documento:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Nome del documento"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Dimensione"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Contenuto"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Descrizione"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Carica l'immagine"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Puoi caricare una qualsiasi immagine direttamente dal tuo computer."
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Per favore, seleziona un file da caricare:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Agiungi, cambia o cancella i piani"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Numero del piano"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Nome del piano"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Numero di stanze"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "Stile del Piano"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(Cancella il piano)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Devi essere registrato per accedere a questa pagina."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Password:"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Ultimo Login"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Nuovo utente? Registrati ora"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "OpenID URL:"
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Esegui nuovamente il Log in"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr ""
+"Questo &egrave; un aggiornamento di '%s' gi&egrave; nel tuo calendario."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr ""
+"Questo evento &egrave; in conflitto con l'evento '%s' gi&agrave; presente "
+"nel tuo calendario."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Lingua:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Posta"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Attività"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Stanze"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Utenti in rete"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Chat"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Avanzato"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Amministrazione"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "modifica questo menu"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "Visualizza le cartelle"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "Visualizza il menu"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Le mie cartelle"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Personalizza la barra delle icone"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Mostra le icone come:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "immagini e testo"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "solo immagini"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "solo testo"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Seleziona le icone che vorresti vedere nel menu alla sinistra dello schermo."
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Logo del sito"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Una icona che descriva questo sito"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Visualizza il sommario"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Mail (Posta in arrivo)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Un collegamento alla tua Posta in Arrivo"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "I tuoi Contatti personali"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Le tue note personali"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Un collegamento al tuo calendario personale"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Un collegamento alla tua lista di operazioni da effettuare"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Cliccando questa icona, mostra una lista di tutte le stanze o cartelle "
+"disponibili."
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Chi &egrave; on line?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+"Cliccando su questa icona, mostra tutti gli utenti collegati in questo "
+"momento."
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Cliccando su questa icona vi porter&agrave; a una chat in tempo reale con "
+"gli altri utenti nella stessa stanza."
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Opzioni avanzate"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Accesso al menu completo delle funzioni di Citadel."
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Logo Citadel"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Mostra l'icona Potenziato da Citadel"
+
+#: ../../static/t/iconbar/save.html:11
+#, fuzzy
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"La tua bara delle icone &egrave; stata aggiornata. Per favore, seleziona una "
+"delle sue possibilit&agrave; per continuare."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Mostra le sottoscrizioni"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Mostra le sottoscrizioni/cancella la sottoscrizione"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Richiesta di conferma inviata"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+#, fuzzy
+msgid " to the "
+msgstr "sul "
+
+#: ../../static/t/listsub/display.html:21
+#, fuzzy
+msgid " mailing list."
+msgstr "Servizio Mailing List"
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Indietro..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+#, fuzzy
+msgid "ERROR"
+msgstr "ERRORE:"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+#, fuzzy
+msgid "from the"
+msgstr "da "
+
+#: ../../static/t/listsub/display.html:42
+#, fuzzy
+msgid "mailing list."
+msgstr "Servizio Mailing List"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+#, fuzzy
+msgid "Back..."
+msgstr "Indietro..."
+
+#: ../../static/t/listsub/display.html:57
+#, fuzzy
+msgid "Confirmation successful!"
+msgstr "Richiesta di conferma inviata"
+
+#: ../../static/t/listsub/display.html:59
+#, fuzzy
+msgid "Confirmation failed."
+msgstr "Configurazione"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Nome dell'operazione"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Indirizzo email preferito"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "Inserisci il testo del messaggio:"
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "Formato dell'ora"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+#, fuzzy
+msgid "Logged in as"
+msgstr "Ultimo Login"
+
+#: ../../static/t/loggedinas.html:6
+#, fuzzy
+msgid "Not logged in."
+msgstr "Non autenticato"
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "potenziato da"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Esegui nuovamente il Log in"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Cancella o modifica questa stanza"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Entra in una stanza \"nascosta\""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Crea una nuova stanza"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Crea una nuova stanza"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+#, fuzzy
+msgid "Zap (forget) this room"
+msgstr "Dimentica questa stanza (%s)"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Mostra tutte le stanze dimenticate"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Leggi i nuovi messaggi"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Mostra le stanze conosciute"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Dove posso andare da qui?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Vai alla Prossima Stanza"
+
+#: ../../static/t/menu/basic_commands.html:4
+#, fuzzy
+msgid "...with <em>unread</em> messages"
+msgstr "... contenente messaggi <em>non letti</em>"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Salta alla prossima stanza"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(torna più tardi)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Stanza Precedente"
+
+#: ../../static/t/menu/basic_commands.html:6
+#, fuzzy
+msgid "oops! Back to "
+msgstr "(oops! Torna a %s)"
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Leggi i nuovi messaggi"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "... in questa stanza"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "leggi tutti i messaggi"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "...vecchi <em>e</em> nuovo"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Componi un messaggio"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(scrivi in questa stanza)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Sommario"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Sommario del mio account"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Utenti"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(tutti gli utenti registrati)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Ciao!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Cambia la tua password"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Inserisci la nuova password:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Inseriscila nuovamente per conferma:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Modifica le tue preferenze e impostazioni"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Aggiorna i tuoi dati personali"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Inserisci la tua biografia"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Modifica la tua foto on line"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Visualizza/Modifica i filtri email lato server"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+#, fuzzy
+msgid "Manage your OpenIDs"
+msgstr "Il tuo OpenID"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Conferma lo spostamento del messaggio"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Sposta questo messaggio in:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Numero di letture"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "messaggi"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "dai più vecchi ai più recenti"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "dai più recenti ai più vecchi"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Mittente"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Apri in una nuova finestra"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Sposta"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Copia"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Stampa"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Vista contatti"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Aggiungi un nuovo contatto"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Vista giornaliera"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Vista mensile"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Aggiungi un nuovo evento"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Lista dei Calendari"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Mostra le Attività"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Aggiungi una nuova Attività"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Mostra le note"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Aggiungi una nuova nota"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Componi un messaggio"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Home Page del Wiki"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Modifica questa pagina"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "Storia"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "i nuovi post"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Salta questa stanza"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "Nuova pagina iniziale"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "La tua pagina iniziale è stata cambiata"
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "Nessun nuovo messaggio."
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "Il tuo OpenID"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "é stato verificato con successo."
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "conflitto con un utente esistente"
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Preferenze e impostazioni"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Vista ad albero (cartelle)"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Vista a tabella (stanze)"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 ore (am/pm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 ore"
+
+#: ../../static/t/prefs/box.html:150
+#, fuzzy
+msgid "Sunday"
+msgstr "Sommario"
+
+#: ../../static/t/prefs/box.html:151
+#, fuzzy
+msgid "Monday"
+msgstr "Sommario"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Nessuna firma"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+#, fuzzy
+msgid "Configure Push Email"
+msgstr "Email"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+#, fuzzy
+msgid "Notify Funambol server"
+msgstr "Nome del server Funambol (vuoto per disabilitare)"
+
+#: ../../static/t/prefs/pushemail.html:31
+#, fuzzy
+msgid "Send a text message to..."
+msgstr "Invia un Messaggio istantaneo a:"
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Nome delle stanza: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Appartiene al piano: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Vista di default della stanza: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "TIpo di stanza:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Pubblica (Appare automaticamente a tutti gli utenti)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privata - nascosta (Accessibile solo a chi ne conosce il nome)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privata - richiede password "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privato - solo su invito"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Personale (cassetta della posta solo per te)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Crea una nuova stanza"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Nome delle stanza: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Vista di default della stanza: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "TIpo di stanza:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Modifica il file di Informazioni di questa stanza"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"Il testo viene formattato dalla larghezza dello schermo del lettore. Per non "
+"seguire la formattazione, indentare la linea di almeno uno spazio."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Vai a una stanza segreta"
+
+#: ../../static/t/room/display_private.html:8
+#, fuzzy
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Se conosci il nome di una stanza nascosta (indovina il nome) o protetta da "
+"password, puoi digitarlo qui sotto per accedervi. Una volta che hai "
+"l'accesso a una stanza privata, comparirà nella tua lista di stanze, così "
+"non dovrai ripetere questo passaggio."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Inserisci il nome della stanza:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Inserisci la password della stanza:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Configurazione"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Politica di cancellazione dei messaggi"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Controllo Accessi"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Condivisione"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Servizio Mailing List"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(rimuovi)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+#, fuzzy
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Gli utenti mostrati sotto hanno accesso a questa stanza. Per rimuovere un "
+"utente dalla lista degli accessi, selezionalo e clicca 'Espelli'."
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Per permettere a un altro utente l'accesso a questa stanza, inserisci il suo "
+"nome utente e clicca 'Invita'."
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Invita:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+#, fuzzy
+msgid "Users"
+msgstr "Utenti"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Cancella questa stanza"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+#, fuzzy
+msgid "Set or change the icon for this rooms banner"
+msgstr "Imposta o modifica l'icona per il banner di questa stanza"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+#, fuzzy
+msgid "Edit this rooms Info file"
+msgstr "Modifica il file di Informazioni di questa stanza"
+
+#: ../../static/t/room/edit/tab_config.html:7
+#, fuzzy
+msgid "name of room: "
+msgstr "Nome delle stanza:"
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Se impostato come privato, l'utente corrente dimenticherà la stanza"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Solo utenti preferiti"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Stanza in sola lettura"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Stanza direttorio di file"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Nome del direttorio:"
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Upload permesso"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Download permesso"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Nessun messaggio."
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Direttorio visibile"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Stanza condivisa in rete"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanente (non si auto cancella)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Messaggio anonimo"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Nessun messaggio anonimo"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Tutti i messaggi sono anonimi"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Notifica l'utente quando si sta digitando il messaggio"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Amministratore della stanza: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Politica di cancellazione dei messaggi per questa stanza"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Usa la politica di default per questo piano"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Politica di cancellazione messaggi per questo piano"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Usa il default di sistema"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+#, fuzzy
+msgid "Remote host"
+msgstr "Smart Host"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Nome utente"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+#, fuzzy
+msgid "Keep messages on server?"
+msgstr "Nessun messaggio."
+
+#: ../../static/t/room/edit/tab_feed.html:17
+#, fuzzy
+msgid "Interval"
+msgstr "Generale"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>I contenuti di questa stanza verranno inviati <b>come messaggi "
+"individuali</b> alla seguente lista di destinatari:</i><br/><br/>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>I contenuti di questa stanza saranno inviati come <b>selezione di "
+"messaggi</b> alla seguente lista di destinatari</i><br/><br/>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+#, fuzzy
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+"Questa stanza è configurate per permettere la sottoscrizione/cancellazione "
+"automatica degli utenti."
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "L'indirizzo per sottoscriversi/cancellarsi dalla stanza è:"
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Non condivisa con"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Condivisa con"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "nome del nodo remoto"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Nome della stanza remota"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Azioni"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"La condivisione di una stanza deve essere effettuata in tutti i server in "
+"cui è presente. Aggiungendo un nodo alla lista di condivisioni fa in modo "
+"che il messaggio venga inviato, ma per ricevere, anche il nuovo nodo deve "
+"essere configurato per inviare i messaggi al primo.<li>Se il nome remoto "
+"della stanza è vuoto, è implicito che il nome della stanza remota sarà lo "
+"stesso.<li>Se il nome remoto è diverso, si deve configurare anche il nodo "
+"della stanza iniziale.</ul></i><br/>\n"
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Informazioni di stanza"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Zap (dimentica/cancella la tua sottoscrizione) questa stanza"
+
+#: ../../static/t/room/zap_this.html:6
+#, fuzzy
+msgid "If you select this option,"
+msgstr "Cancella o modifica questa stanza"
+
+#: ../../static/t/room/zap_this.html:8
+#, fuzzy
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+"Se selezioni questa opzione, <em>%s</em> scomparirà dalla tua lista delle "
+"stanze, vuoi farlo davvero?<br/><br/>\n"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Stanze zappate (dimenticate)"
+
+#: ../../static/t/room/zapped_list.html:10
+#, fuzzy
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Clicca su una stanza per dezapparla ed entrarci.\n"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "nuovo di"
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Seleziona pagina: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Cerca: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Tutti"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Aggiungi o cancella degli script"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Aggiungi un nuovo script"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"Per creare un nuovo script, inserisci il nome desiderato nella casella "
+"riportata sotto e clicca 'Crea'."
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Nome dello script: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Modifica gli script"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Torna alla schermata di modifica dello script"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Cancella gli script"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"Per cancellare uno script esistente, seleziona il suo nome dalla lista e "
+"clicca 'Cancella'."
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Se"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Destinatario o Cc"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Rispondi a"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Inoltra da"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Inoltra a"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Mittente del contenitore"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Destinatario del contenitore"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Status"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "Lista-ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Dimensione del messaggio"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "Contiene"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "Non contiene"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "è"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "Non è"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "è uguale a"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "Non è uguale"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(tutti i messaggi)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "E' più grande"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "E' più piccolo"
+
+#: ../../static/t/sieve/display_one.html:59
+#, fuzzy
+msgid "bytes"
+msgstr "anni"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Tieni"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Scarta silenziosamente"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Rimanda al mittente"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Sposta il messaggio in"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Inoltra a"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Vacanza"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Messaggio:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "e poi"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "Continua a processare"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "ferma"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Quando arrivano nuove email: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Crea filtro dalle regole selezionate qui sotto"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Lasciala nellla mia posta in entrata senza filtrarla"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr "Crea filtro modificando manualmente lo script (solo utenti esperti)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Aggiungi regola"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "Messaggi vecchi"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+#, fuzzy
+msgid "Summary page for "
+msgstr "Pagina riassuntiva per %s"
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Messaggi"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Oggi nel tuo calendario"
+
+#: ../../static/t/summary/page.html:51
+#, fuzzy
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Chi è online adesso?"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "A proposito di questo server"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+#, fuzzy
+msgid "running"
+msgstr "Rifiniture"
+
+#: ../../static/t/summary/page.html:65
+#, fuzzy
+msgid "with"
+msgstr "quinto"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+#, fuzzy
+msgid "and located in"
+msgstr "e poi"
+
+#: ../../static/t/summary/page.html:68
+#, fuzzy
+msgid "Your system administrator is"
+msgstr "Nome dell'amministratore di sistema"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Inserisci la tua biografia"
+
+#: ../../static/t/user/list.html:3
+#, fuzzy
+msgid "User list for "
+msgstr "Lista utenti per %s"
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Nome Utente"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Numero"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Livello di Accesso"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Ultimo Login"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Login Totali"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Messaggi Totali"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Profilo utente"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+#, fuzzy
+msgid "Click here to send an instant message to"
+msgstr "Clicca qui per inviare un messaggio istantaneo a %s"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Modifica le informazioni del contatto"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Prefisso"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Nome"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Secondo nome"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Cognome"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Suffisso"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Nome da mostrare:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Titolo:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organizzazione:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Presso:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Indirizzo:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Città:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Provincia:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "C.A.P.:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Nazione:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Telefono di casa:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Telefono di lavoro:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Telefono mobile:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Numero di fax:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Questa lista contatti &egrave; vuota"
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Invia un commento"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "i nuovi post"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "i post più vecchi"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "Invia il comando"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "nuovo di"
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "Non hai il permesso di visualizzare questa risorsa."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "La coda è vuota."
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Ricarica questa pagina"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Smart Host"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Provincia:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "Continua a processare"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "ID del messaggio"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Ora/Data fornita"
+
+#: ../../static/t/view_mailq/table.html:8
+#, fuzzy
+msgid "Next attempt"
+msgstr "Ultimo tentativo"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Destinatari"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "da "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "a"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "Modifica"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Rispondi"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "Rispondi con cronistoria"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "Rispondi A Tutti"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Inoltra"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Intestazione"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "Vedi"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Scarica"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Vedi come:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "Utenti correntemente attivi "
+
+#: ../../static/t/who.html:22
+#, fuzzy
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+"Clicca su un nome per leggere le informazioni utente.Clicca su %s per "
+"inviare un messaggio istantaneo a questo utente."
+
+#: ../../static/t/who.html:24
+#, fuzzy
+msgid "to send an instant message to that user."
+msgstr "Invia un Messaggio istantaneo a:"
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(termina)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Stanza"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "Dall'host"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Modifica la tua vista della sessione"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Questa schermata ti permette di cambiare il modo in cui appare la tua "
+"sessione nella lista \"chi è on line\". Per eliminare qualsiasi nome "
+"fittizio abbia usato in precedenza, clicca semplicemente sul bottone di "
+"\"modifica\" appropriaton senza digitare nulla nella casella corrispondente. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Nome della stanza:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Nome dell'host:"
+
+#: ../../static/t/who/list_static_header.html:1
+#, fuzzy
+msgid "Users currently on"
+msgstr "Utenti attualmente su %s"
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr "Modifica la configurazione"
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr "Modifica il contatto"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Entra nella stanza"
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr "Seleziona il collegamento 'Modifica questa pagina' se la vuoi creare."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Nessuna pagina chamata '%s'."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#~ msgid "the icon for this floor"
+#~ msgstr "L'icona per questo piano"
+
+#~ msgid "Edit %s"
+#~ msgstr "Modifica %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Cambia i cambiamenti"
+
+#~ msgid " (work)"
+#~ msgstr " (lavoro)"
+
+#~ msgid " (home)"
+#~ msgstr " (casa)"
+
+#~ msgid " (cell)"
+#~ msgstr " (cellulare)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefono:"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Domini delle directory"
+
+#, fuzzy
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Smart Host"
+
+#~ msgid "Create new room"
+#~ msgstr "Crea una nuova stanza"
+
+#~ msgid "Zap this room"
+#~ msgstr "Zap questa stanza"
+
+#~ msgid ""
+#~ "You have one or more instant messages waiting, but the Citadel Instant "
+#~ "Messenger window failed to open.  This is probably because you have a "
+#~ "popup blocker installed.  Please configure your popup blocker to allow "
+#~ "popups from this site if you wish to receive instant messages."
+#~ msgstr ""
+#~ "Hai uno o più messaggi in coda che aspettano di essere letti, ma la "
+#~ "finestra per i Messaggi Istantanei di Citadel non può essere aperta. La "
+#~ "causa può essere un popup blocker installato nel tuo browser. Per favore, "
+#~ "se vuoi ricevere Messaggi Istantanei, configura il tuo popup blocker in "
+#~ "modo da permettere i popup da questo sito."
+
+#~ msgid "Change"
+#~ msgstr "Cambia"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Stanza condivisa in rete"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Aggiungi un nodo"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "Minuto:"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Tentativo"
+
+#~ msgid "Send"
+#~ msgstr "Invia"
+
+#~ msgid "Delete this message?"
+#~ msgstr "Cancellare questo messaggio?"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Informazioni di stanza"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "solo immagini"
+
+#~ msgid "Exit"
+#~ msgstr "Uscita"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Carica un documento:"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Sei sicuro di voler cancellare? "
+
+#~ msgid "Upload"
+#~ msgstr "Carica"
+
+#~ msgid "Add"
+#~ msgstr "Aggiungi"
+
+#~ msgid "Create"
+#~ msgstr "Crea"
+
+#~ msgid "Kick"
+#~ msgstr "Espelli"
+
+#~ msgid "Invite"
+#~ msgstr "Invita"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Nuovo Utente"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Contatti"
+
+#~ msgid "Delete user"
+#~ msgstr "Cancella l'utente"
+
+#~ msgid "Delete this user?"
+#~ msgstr "Cancellare questo utente?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Cancella la regola"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr ""
+#~ "La tua posta in ingresso non verrà filtrata attraverso nessuno script."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "Lo script attivo è: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Configura la replicazione con altri server Citadel"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Mostra l'icona Potenziato da Citadel"
+
+#~ msgid "Go to your email inbox"
+#~ msgstr "Leggi la tua Posta in Arrivo"
+
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Visualizza il tuo calendario personale"
+
+#~ msgid "Go to your personal address book"
+#~ msgstr "Vai ai tuoi contatti personali"
+
+#~ msgid "Go to your personal notes"
+#~ msgstr "Visualizza le tue Note personali"
+
+#~ msgid "Go to your personal task list"
+#~ msgstr "Visualizza le Attività da portare a termine"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Mostra tutte le tue stanze accessibili"
+
+#~ msgid "See who is online right now"
+#~ msgstr "Mostra gli altri utenti collegati in questo momento"
+
+#~ msgid ""
+#~ "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+#~ msgstr ""
+#~ "Menu di opzioni avnzate: Comandi avanzati di stanza, Informazioni "
+#~ "dell'utente e Chat"
+
+#~ msgid "Room and system administration functions"
+#~ msgstr "Funzioni di amministrazione delle stanze e di sistema"
+
+#~ msgid "Reset form"
+#~ msgstr "Cancella"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Cancello questa voce?"
+
+#~ msgid "Create new floor"
+#~ msgstr "Crea un nuovo piano"
+
+#~ msgid "Move rule up"
+#~ msgstr "Sposta la regola su"
+
+#~ msgid "Move rule down"
+#~ msgstr "Sposta la regola giù."
+
+#~ msgid "Delete rule"
+#~ msgstr "Cancella la regola"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(Modifica la grafica)"
+
+#~ msgid "Change name"
+#~ msgstr "Cambia nome"
+
+#~ msgid "Change CSS"
+#~ msgstr "Modifica lo Stile"
+
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Sicuro di voler cancellare questa stanza?"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Inserisci il comando:"
+
+#~ msgid "Unshare"
+#~ msgstr "Elimina condivisione"
+
+#, fuzzy
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "Nome del server Funambol (vuoto per disabilitare)"
+
+#, fuzzy
+#~ msgid "Master user password"
+#~ msgstr "Inserisci la nuova password:"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "Cancello questa voce?"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "Cognome"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "Formato dell'ora"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Oggetto"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Vuoi davvero terminare questa sessione?"
+
+#~ msgid "Share"
+#~ msgstr "Condividi"
+
+#~ msgid "Change password"
+#~ msgstr "Cambia la password"
+
+#~ msgid "Change room name"
+#~ msgstr "Cambia il nome della stanza"
+
+#~ msgid "Change host name"
+#~ msgstr "Cambia il nome dell'host"
+
+#~ msgid "Change user name"
+#~ msgstr "Cambia nome utente"
+
+#~ msgid ""
+#~ "Leave all messages marked as unread, go to next room with unread messages"
+#~ msgstr ""
+#~ "Lascia tutti i messaggi marcati come non letti, passa alla stanza "
+#~ "successiva con messaggi non letti."
+
+#~ msgid "Mark all messages as read, go to next room with unread messages"
+#~ msgstr ""
+#~ "Marca tutti i messaggi come letti, vai alla prossima stanza con messaggi "
+#~ "non letti"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Cambia i cambiamenti"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Stai sottoscrivendo <TT>%s</TT> alla mailing list <b>%s</b>.  Il server "
+#~ "di posta ti ha inviato una email contenente un collegamento da cliccare "
+#~ "per confermare la tua sottoscrizione. questo passo &egrave; necessario "
+#~ "per la tua protezione, in modo da evitare che altre persone possano "
+#~ "sottoscriverti senza il tuo consenso.<br><br>Per favore, clicca sul "
+#~ "collegamento presente nella email per confermare la tua sottoscrizione."
+#~ "<br>\n"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Nessuna stanza col nome '%s'."
+
+#~ msgid "Network"
+#~ msgstr "Rete"
+
+#~ msgid "Tuning"
+#~ msgstr "Rifiniture"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Elimina automaticamente i messaggi cancellati nelle cartelle IMAP"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Esiste già uno script con quel nome."
+
+#~ msgid ""
+#~ "A new script has been created.  Return to the script editing screen to "
+#~ "edit and activate it."
+#~ msgstr ""
+#~ "E' stato creato un nuovo script. Torna alla schermata di editing per "
+#~ "modificarlo e attivarlo."
+
+#~ msgid "Delete script"
+#~ msgstr "Cancella lo script"
+
+#~ msgid "Delete this script?"
+#~ msgstr "Cancellare questo script?"
+
+#~ msgid ""
+#~ "You are connected to %s, running %s with %s, server build %s and located "
+#~ "in %s.  Your system administrator is %s."
+#~ msgstr ""
+#~ "Sei connesso a %s, %s è in esecuzione con %s server build %s e "
+#~ "localizzato in %s. Il tuo amministratore di sistema è %s."
+
+#, fuzzy
+#~ msgid "Yes with users list"
+#~ msgstr "Visualizza le cartelle"
+
+#~ msgid "Room list"
+#~ msgstr "Lista delle stanze"
+
+#, fuzzy
+#~ msgid "uname"
+#~ msgstr "Nome del documento"
+
+#, fuzzy
+#~ msgid "text"
+#~ msgstr "successivo"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "Nome del documento"
+
+#, fuzzy
+#~ msgid "pname"
+#~ msgstr "Nome del documento"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Password"
+
+#, fuzzy
+#~ msgid "pass"
+#~ msgstr "Attività"
+
+#, fuzzy
+#~ msgid "authbox"
+#~ msgstr "Autore"
+
+#, fuzzy
+#~ msgid "display: none"
+#~ msgstr "Nome da mostrare:"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "La tua password non &egrave; stata accettata."
+
+#~ msgid "See the"
+#~ msgstr "Guarda il"
+
+#~ msgid "Log off now?"
+#~ msgstr "Uscire adesso?"
+
+#, fuzzy
+#~ msgid "%d new of %d messages%s"
+#~ msgstr "%d nuovi messaggi su %d totali"
+
+#~ msgid "(nothing)"
+#~ msgstr "(nulla)"
+
+#~ msgid "unexpected end of message"
+#~ msgstr "Fine del messaggio inaspettata"
+
+#~ msgid "An error occurred while setting up the chat socket."
+#~ msgstr ""
+#~ "Si è verificato un errore durante la creazione della connessione per la "
+#~ "chat."
+
+#~ msgid "Now exiting chat mode."
+#~ msgstr "Uscita dalla modalità chat."
+
+#~ msgid "Help"
+#~ msgstr "Aiuto"
+
+#~ msgid "List users"
+#~ msgstr "Mostra gli utenti"
+
+#~ msgid "No messages here."
+#~ msgstr "Nessun messaggio."
+
+#, fuzzy
+#~ msgid "no more messages"
+#~ msgstr "Messaggio anonimo"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "Error retrieving RSS feed: couldn't find messages\n"
+#~ msgstr ""
+#~ "Errore nella ricezione del RSS: non riesco a trovare dei messaggi</br>\n"
+
+#, fuzzy
+#~ msgid "%s from"
+#~ msgstr "da"
+
+#, fuzzy
+#~ msgid "%s in %s"
+#~ msgstr "solo immagini"
+
+#, fuzzy
+#~ msgid ""
+#~ "<ul><li>Enter your OpenID URL and click &quot;Log in&quot;.<li><a href="
+#~ "\"http://www.citadel.org/doku.php/documentation:openid\">Click here to "
+#~ "learn what OpenID is and how Citadel is using it.</a><li>Please log off "
+#~ "properly when finished. <li>You must use a browser that supports "
+#~ "<i>frames</i> and <i>cookies</i>. <li>Also keep in mind that if your "
+#~ "browser is configured to block pop-up windows, you will not be able to "
+#~ "receive any instant messages.<br></ul>"
+#~ msgstr ""
+#~ "<ul><li><b>Se hai gi&agrave; un account su %s</b>, fornisci il tuo nome "
+#~ "utente e la tua password e clicca su &quot;Log in.&quot; <li><b>Se sei un "
+#~ "nuovo utente</b>, fornisci il nome utente e la password che vorresti e "
+#~ "clicca su &quot;Nuovo Utente.&quot; <li>Per favore, eseguire il logout in "
+#~ "maniera corretta prima di uscire. <li>Devi usare un Browser che supporti "
+#~ "i  <i>frames</i> e i <i>cookies</i>. <li>Tieni anche a mente che se il "
+#~ "tuo browser &egrave; configurato per bloccare le finestre di pop up, non "
+#~ "riuscirai a ricevere nessun messaggio istantaneo.<br></ul>"
+
+#, fuzzy
+#~ msgid ""
+#~ "enter your user name and password and click &quot;Log in.&quot;<li><b>If "
+#~ "you are a new user</b>, enter the name and password you wish to use, and "
+#~ "click &quot;New User.&quot; <li>Please log off properly when finished. "
+#~ "<li>You must use a browser that supports <i>frames</i> and <i>cookies</"
+#~ "i>. <li>Also keep in mind that if your browser is configured to block pop-"
+#~ "up windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "<ul><li><b>Se hai gi&agrave; un account su %s</b>, fornisci il tuo nome "
+#~ "utente e la tua password e clicca su &quot;Log in.&quot; <li><b>Se sei un "
+#~ "nuovo utente</b>, fornisci il nome utente e la password che vorresti e "
+#~ "clicca su &quot;Nuovo Utente.&quot; <li>Per favore, eseguire il logout in "
+#~ "maniera corretta prima di uscire. <li>Devi usare un Browser che supporti "
+#~ "i  <i>frames</i> e i <i>cookies</i>. <li>Tieni anche a mente che se il "
+#~ "tuo browser &egrave; configurato per bloccare le finestre di pop up, non "
+#~ "riuscirai a ricevere nessun messaggio istantaneo.<br></ul>"
+
+#~ msgid "Find out more about Citadel"
+#~ msgstr "Scopri di più  su Citadel"
+
+#~ msgid "CITADEL"
+#~ msgstr "CITADEL"
+
+#~ msgid "Customize this menu"
+#~ msgstr "Personalizza questo menu"
+
+#~ msgid "Internet configuration"
+#~ msgstr "Configurazione internet"
+
+#~ msgid "of %d messages."
+#~ msgstr "di %d messaggi."
+
+#~ msgid " <I>from</I> "
+#~ msgstr "<i>da</i>"
+
+#~ msgid " <I>in</I> "
+#~ msgstr "<i>in</i>"
+
+#~ msgid "Edit node configuration for "
+#~ msgstr "Modifica la configurazione del nodo per"
+
+#~ msgid ""
+#~ "<a href=\"http://www.postfix.org/tcp_table.5.html\">Postfix TCP "
+#~ "Dictionary Port </a> (-1 to disable)"
+#~ msgstr ""
+#~ "<a href=\"http://www.postfix.org/tcp_table.5.html\">Porta del dizionario "
+#~ "TCP di Postfix </a> (-1 per disabilitare)"
+
+#~ msgid "ERROR: could not open template "
+#~ msgstr "ERRORE non riesco ad aprire il template"
+
+#~ msgid ""
+#~ "<I>This message contains calendaring/scheduling information, but support "
+#~ "for calendars is not available on this particular system.  Please ask "
+#~ "your system administrator to install a new version of the Citadel web "
+#~ "service with calendaring enabled.</I><br>\n"
+#~ msgstr ""
+#~ "<I>Questo messaggio contiene informazioni di organizzazione/"
+#~ "programmazione, ma in questo particolare sistema, il supporto per i "
+#~ "calendari non &egrave; disponibile. Per favore, chiedi al tuo "
+#~ "amministratore di sistema di installare una nuova versione del servizion "
+#~ "web di Citadel con il calendario abilitato.</I><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display calendar item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Non posso mostrare l'oggetto calendario. Stai vedendo questo messaggio "
+#~ "perch&egrave; il servizio WebCit non &egrave; stato installato col "
+#~ "supporto al calendario. Per favore, contatta il tuo amministratore di "
+#~ "sistema.</i><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display to-do item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Non posso mostrare l'oggetto cose da fare. Stai vedendo questo "
+#~ "messaggio perch&egrave; il servizio WebCit non &egrave; stato installato "
+#~ "col supporto al calendario. Per favore, contatta il tuo amministratore di "
+#~ "sistema.</i><br>\n"
+
+#~ msgid "Day: "
+#~ msgstr "Giorno:"
+
+#~ msgid "Year: "
+#~ msgstr "Anno:"
+
+#~ msgid "The calendar view is not available."
+#~ msgstr "La vista calendario non &egrave; disponibile."
+
+#~ msgid "The tasks view is not available."
+#~ msgstr "La vista operazione non &egrave; disponibile."
+
+#~ msgid "Gateway domains"
+#~ msgstr "Domini del gateway"
+
+#~ msgid "(domains whose subdomains match Citadel hosts)"
+#~ msgstr "(domini i cui sottodomini coincidono con host Citadel)"
+
+#~ msgid "(This server does not support task lists)"
+#~ msgstr "(Questo server non supporta la lista delle operazioni)"
+
+#~ msgid "(This server does not support calendars)"
+#~ msgstr "(Questo server non supporta i calendari)"
+
+#~ msgid ""
+#~ "This room is <i>not</i> configured to allow self-service subscribe/"
+#~ "unsubscribe requests."
+#~ msgstr ""
+#~ "Questa stanza <i>non</i> è stata configurata per permettere la "
+#~ "sottoscrizione/cancellazione automatica degli utenti."
+
+#~ msgid "Click to enable."
+#~ msgstr "Clicca per abilitare."
+
+#~ msgid "Back to menu"
+#~ msgstr "Torna al menu"
+
+#~ msgid "Respond to meeting request"
+#~ msgstr "Rispondi alla richiesta di incontro"
+
+#~ msgid "Update your calendar with this RSVP"
+#~ msgstr "Aggiorna il tuo calendario con questo RSVP"
+
+#~ msgid "Public room"
+#~ msgstr "Stanza pubblica"
+
+#~ msgid "Private - guess name"
+#~ msgstr "Privato - indovina il nome"
+
+#~ msgid "Private - require password:"
+#~ msgstr "Privato - richiede la password"
+
+#~ msgid "localhost"
+#~ msgstr "localhost"
+
+#~ msgid "gatewaydomain"
+#~ msgstr "dominio del gateway"
+
+#~ msgid "rbl"
+#~ msgstr "rbl"
+
+#~ msgid "spamassassin"
+#~ msgstr "spamassassin"
+
+#~ msgid "[ close window ]"
+#~ msgstr "[ chiudi la finestra ]"
diff --git a/webcit/po/webcit/kk.po b/webcit/po/webcit/kk.po
new file mode 100644 (file)
index 0000000..4a97a5d
--- /dev/null
@@ -0,0 +1,4003 @@
+# Kazakh translation for citadel
+# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2010-12-26 10:06+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Kazakh <kk@li.org>\n"
+"Language: kk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-08-01 04:34+0000\n"
+"X-Generator: Launchpad (build 15719)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr ""
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr ""
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr ""
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr ""
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr ""
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr ""
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr ""
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr ""
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr ""
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr ""
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr ""
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr ""
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr ""
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr ""
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr ""
+
+#: ../../availability.c:169
+msgid "free"
+msgstr ""
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr ""
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr ""
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr ""
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr ""
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr ""
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr ""
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr ""
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr ""
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr ""
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr ""
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr ""
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr ""
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr ""
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr ""
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr ""
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr ""
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr ""
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr ""
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr ""
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr ""
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr ""
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr ""
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr ""
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr ""
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr ""
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr ""
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr ""
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr ""
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr ""
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr ""
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr ""
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr ""
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr ""
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr ""
+
+#: ../../event.c:89
+msgid "Event"
+msgstr ""
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr ""
+
+#: ../../event.c:222
+msgid "Location"
+msgstr ""
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr ""
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr ""
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr ""
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr ""
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr ""
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr ""
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr ""
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr ""
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr ""
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr ""
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr ""
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr ""
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr ""
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr ""
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr ""
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr ""
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr ""
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr ""
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr ""
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr ""
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr ""
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr ""
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr ""
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr ""
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr ""
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr ""
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr ""
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr ""
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr ""
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr ""
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr ""
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr ""
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr ""
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr ""
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr ""
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr ""
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr ""
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr ""
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr ""
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+msgid "Name of the blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr ""
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr ""
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr ""
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr ""
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr ""
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+msgid "comments"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr ""
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "'here"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "There is no page called '"
+msgstr ""
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
diff --git a/webcit/po/webcit/ko.po b/webcit/po/webcit/ko.po
new file mode 100644 (file)
index 0000000..27a6c68
--- /dev/null
@@ -0,0 +1,4003 @@
+# Korean translation for citadel
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2013-11-20 21:55+0000\n"
+"Last-Translator: Litty <Unknown>\n"
+"Language-Team: Korean <ko@li.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-11-21 05:11+0000\n"
+"X-Generator: Launchpad (build 16831)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr ""
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr ""
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr ""
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr ""
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr ""
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr ""
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr ""
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr ""
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr ""
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr ""
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr ""
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr ""
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr ""
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr ""
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr ""
+
+#: ../../availability.c:169
+msgid "free"
+msgstr ""
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr ""
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr ""
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr ""
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr ""
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr ""
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr ""
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr ""
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr ""
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr ""
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr ""
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr ""
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr ""
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr ""
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr ""
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr ""
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr ""
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr ""
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr ""
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr ""
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr ""
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr ""
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr ""
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr ""
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr ""
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr ""
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr ""
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr ""
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr ""
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr ""
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr ""
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr ""
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr ""
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr ""
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr ""
+
+#: ../../event.c:89
+msgid "Event"
+msgstr ""
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr ""
+
+#: ../../event.c:222
+msgid "Location"
+msgstr ""
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr ""
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr ""
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr ""
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr ""
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr ""
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr ""
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr ""
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "취소되었습니다. 변경 사항이 저장되지 않았습니다."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "변경 사항이 저장되었습니다."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr ""
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr ""
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr ""
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "방 목록 보기"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr ""
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr ""
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr ""
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr ""
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr ""
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr ""
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr ""
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr ""
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr ""
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr ""
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr ""
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr ""
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr ""
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr ""
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr ""
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr ""
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr ""
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr ""
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr ""
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr ""
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr ""
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr ""
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr ""
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr ""
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr ""
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr ""
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+msgid "Name of the blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr ""
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr ""
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr ""
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr ""
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr ""
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+msgid "comments"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr ""
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "'here"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "There is no page called '"
+msgstr ""
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
diff --git a/webcit/po/webcit/nl.po b/webcit/po/webcit/nl.po
new file mode 100644 (file)
index 0000000..a9b743c
--- /dev/null
@@ -0,0 +1,4770 @@
+# translation of nl.po to Nederlands
+# Copyright (C) 2006-2008 The Citadel Project - http://www.citadel.org
+# This file is distributed under the GNU General Public License
+#
+# Wim Kuilman <wim.kuilman@esdalcollege.nl>, 2006, 2007.
+# Wim Kuilman <w.kuilman@icoss.net>, 2008, 2009.
+# Sander Bosman <sbosman@hotmail.com>
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2013-05-22 11:47+0000\n"
+"Last-Translator: Sander Bosman <sbosman@hotmail.com>\n"
+"Language-Team: Dutch <kde-i18n-doc@lists.kde.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-05-23 05:12+0000\n"
+"X-Generator: Launchpad (build 16640)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Verwijderd"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Nieuwe gebruiker"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Probleemgebruiker"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Lokale gebruiker"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Netwerkgebruiker"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Voorkeursgebruiker"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Beheerder"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Er is een fout opgetreden."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Nieuwe gebruikers goedkeuren"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Er zijn geen gebruikers die goedgekeurd moeten worden."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "erg zwak"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "zwak"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "ok"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "sterk"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Huidig toegangsniveau %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Selecteer toegangsniveau voor deze gebruiker:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Geannuleerd: Wachtwoord niet gewijzigd."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Ze komen niet overeen. Wachtwoord is niet gewijzigd."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Wachtwoorden mogen niet leeg zijn."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "beschikbaarheid niet bekend"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "vrij"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "BEZET"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Ga naar pagina: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Eerste"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Laatste"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Uitnodiging bijeenkomst"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Antwoord van de deelnemer op uw uitnodiging"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Gepubliceerde afspraak"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Dit is een onbekend agenda item."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Omschrijving:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Locatie:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Datum:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Startdatum/-tijd:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Einddatum/-tijd:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Beschrijving:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Herhalend"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Dit is een zich herhalende gebeurtenis"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Deelnemer:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Dit is een update van '%s' die al in uw agenda staat."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr "Deze afspraak zou botsen met '%s' , die al in uw agenda staat."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Update:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "CONFLICT:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Hoe wilt u reageren op deze uitnodiging?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Accepteren"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Voorwaardelijk"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Afwijzen"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Klik <i>Bijwerken</i> om deze reactie te accepteren en uw agenda bij te "
+"werken."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Bijwerken"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Negeren"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Fout opgetreden bij het plaatsen van dit agenda-item."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+"U heeft de uitnodiging voor deze bijeenkomst geaccepteerd. Uw agenda is "
+"bijgewerkt."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"U heeft de uitnodiging voor deze bijeenkomst voorwaardelijk geaccepteerd. "
+"Het staat 'met potlood' in uw agenda."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"U heeft de uitnodiging voor deze bijeenkomst afgewezen. Het is niet in uw "
+"agenda opgenomen."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Een antwoord is gestuurd naar de organisator van deze bijeenkomst."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Uw agenda is bijgewerkt om dit 'verzoek om antwoord' weer te geven."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"U heeft gekozen dit verzoek om antwoord te negeren.  Uw agenda is <b>niet</"
+"b> bijgewerkt."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Dag in agenda begint om:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Dag in agenda eindigt om:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Week begint op:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Uur: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minuut: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(status onbekend)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(actie gevraagd)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(geaccepteerd)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(afgewezen)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(voorwaardelijk)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(gedelegeerd)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(afgehandeld)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(in bewerking)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(geen)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Naamloze gebeurtenis"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "van"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Begindatum"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Einddatum"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Datum/tijd"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Notities:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "vorige"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "volgende"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Week"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Uren"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Onderwerp"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Start"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Eind"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Gebeurtenis hele dag"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Doorlopende afspraak"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Naamloze taak"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "Fout opgetreden bij ophalen dit bestand: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "seconden"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minuten"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "uren"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "dagen"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "weken"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "maanden"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "jaren"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "nooit"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "eerste"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "tweede"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "derde"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "vierde"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "vijfde"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Gebeurtenis"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Deelnemers"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Gebeurtenis toevoegen of bewerken"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Samenvatting"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Locatie"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Notities"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organisator"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(u bent de organisator)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Toon tijd als:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Vrij"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Bezet"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(Een per regel)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Contacten"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Zich herhalende regel"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Herhaalt zich elke"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "op deze weekdagen:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "op dag %s%d%s van de maand"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "op de "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "van de maand"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "iedere "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "jaar op deze datum"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "van"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Zich herhalende periode"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Geen einddatum"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Deze gebeurtenis herhalen"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "maal"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Herhaal deze gebeurtenis tot "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Bewaren"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Controleer beschikbaarheid deelnemers"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "uurformaat"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Uploaden van afbeelding is afgebroken."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "U heeft geen bestand geüpload."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "uw foto"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "het icoontje voor deze ruimte"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "het welkomsplaatje voor de login prompt"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "het plaatje voor de Uitlog banner"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "realloc() fout! kon niet %d bytes krijgen: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Instellingen iconbalk"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Ongeldige parameter"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr " is verwijderd."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+#, fuzzy
+msgid " added."
+msgstr "toegevoegd"
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Hogere toegangrechten nodig voor deze functie."
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr "Je moet de mailinglist specificeren waarop je jezelf wilt abonneren."
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "Je moet het e-mail adres waarmee je je wilt abonneren specificeren."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(geen onderwerp)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "FOUT:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Leeg bericht"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Afgebroken.  Bericht is niet geplaatst."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Automatisch afgebroken omdat u dit bericht al heeft bewaard."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "Opslaan als concept mislukt: "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "Weigering leeg bericht te versturen.\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "Bericht opgelagen als concept.\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Bericht is verstuurd.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Bericht is geplaatst.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Het bericht is niet verplaatst."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "Fout opgetreden bij ophalen dit deel: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Fout opgetreden bij ophalen dit deel: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Ondertekening aan emailberichten toevoegen?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Gebruik deze ondertekening:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Standaard tekenset voor emailheaders:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Voorkeur e-mailadres"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Weergegeven naam voor emailberichten"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Voorkeursnaam voor bulletinboard berichten"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Mailboxweergave"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Ik weet niet hoe ik moet tonen "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Klik op willekeurige notitie om te bewerken."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Beheer account/OpenID verbindingen"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Wilt u dit OpenID echt verwijderen?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(verwijderen)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Voeg een OpenID toe: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Bijlage"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s staat authentificatie via OpenID niet toe."
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Stuur direct bericht"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Stuur direct bericht naar: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Tekst bericht toevoegen:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Bericht versturen"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Bericht is niet verstuurd!"
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Bericht is verstuurd naar "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Afgebroken. Geen instellingen gewijzigd."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Maak hiervan mijn startpagina"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "Niet toegestaan hier de startpagina van te maken."
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "U heeft geen startpagina meer geselecteerd."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "Voorkeur startpagina"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Mijn mappen"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Afgebroken. Wijzigingen niet bewaard."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Uw wijzigingen zijn bewaard."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Gebruiker %s uit deze ruimte verwijderd. %s."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Gebruiker %s uitgenodigd in deze ruimte %s."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Afgebroken. Geen nieuwe ruimte aangemaakt"
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Verdieping is verwijderd"
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Nieuwe verdieping aangemaakt"
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Bekijk als ruimte"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Toon lege verdiepingen"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "bestand"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "bestanden"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Bulletin Board"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Mailmap"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Adresboek"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Agenda"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Takenlijst"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Lijst notities"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Agendalijst"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Verslag"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Concepten"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"De server draait al met het maximaal aantal gebruikers en kan op dit moment "
+"geen nieuwe login aannemen. Probeer het later nog eens of neem contact op "
+"met uw systeembeheerder."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "Ontving onverwacht bericht van de Citadel server; afgesloten."
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"U bent verbonden met een Citadel server draaiend op Citadel %d.%02d. \n"
+"Om deze versie van Webcit de kunnen gebruiken moet u ook Citadel versie  %d."
+"%02d of nieuwer hebben.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Uw systeeminstellingen zijn bijgewerkt."
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr "Eerste poging loopt"
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Niemand)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Niets)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Afgebroken. %s is niet bewaard."
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr " is opgeslagen."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Informatie over deze ruimte"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Uw CV"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Afgehandeld?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Naam van taak"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Streefdatum"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Categorie"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Toon alles"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Taak bewerken"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Startdatum:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Geen datum"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "of"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Tijd gekoppeld"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Streefdatum:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Afgehandeld:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Categorie:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"Er is een fout opgetreden tijdens het aanmaken of bewerken van dit adresboek "
+"item."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Wijzigingen niet bewaard."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Nieuwe gebruiker aangemaakt."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"U probeert een nieuwe gebruiker aan te maken binnen Citadel terwijl "
+"uhostbased authenticatie gebruikt. Dan moet u een nieuwe gebruiker aanmaken "
+"op het hostsysteem en niet in Citadel."
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Kon de vcard foto niet decoderen\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Fout"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Ruimte niet toegankelijk om bericht te bewaren"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Afgebroken"
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(geen naam)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "bewerken"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Autorisatie vereist"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"De opgevraagde bron vereist een geldige gebruikersnaam en wachtwoord. U kon "
+"niet worden ingelogd in: %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Dit programma was niet in staat om contact te maken - of te houden met de "
+"Citadel server. Meld dit probleem alstublieft bij uw systeembeheerder."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Lees verder..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s'is geen Wiki ruimte."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Datum"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Auteur"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(toon)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Huidige versie"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(terugplaatsen)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Paginatitel"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Voer een servercommando in"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Dit scherm geeft de mogelijkheid Citadel servercommando's in te voeren, die "
+"niet worden ondersteund door Webcit. Als u niet weet wat dat betekent, dan "
+"is dit scherm van weinig nut voor u."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Voer commando in:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Commando invoer (indien aanvraag SEND_LISTING overdrachtsmode):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+#, fuzzy
+msgid "Detected host header is "
+msgstr "Gevonden host header is %s://%s"
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Resultaten servercommando"
+
+#: ../../static/t/aide/display_generic_result.html:18
+#, fuzzy
+msgid "Enter another command"
+msgstr "Voer een servercommando in"
+
+#: ../../static/t/aide/display_generic_result.html:19
+#, fuzzy
+msgid "Return to menu"
+msgstr "Switch naar menu"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Netwerk instellingen"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Een nieuw knooppunt toevoegen"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Nu ingestelde knooppunten"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "Menu Systeembeheer"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr "Menu ruimte beheerder"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Local host aliases"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Smart hosts"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "RBL hosts"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "SpamAssasin hosts"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr "ClamAV clamd hosts"
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr "Masqueradable domeinen"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Instellingen Totaal"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Beheer gebruikeraccounts"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "Citadel afsluiten"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Ruimtes en Verdiepingen"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+#, fuzzy
+msgid "Restart Citadel"
+msgstr "Maak hiervan mijn startpagina"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "Bericht aan uw gebruikers:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Site instellingen"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr "U moet beheerder zijn om dit te bekijken."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "Algemeen"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Instellingen iconbalk"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "Push Email"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indexing/Journaling"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Toegang"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+#, fuzzy
+msgid "Directory"
+msgstr "Naam van map: "
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Auto-wisser"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Om een nieuw gebruikersaccount aan te maken vul de gewenste gebruikersnaam "
+"hieronder in en klik op 'Aanmaken'."
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Nieuwe gebruiker: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Om een bestaande gebruiker te bewerken, selecteer de gebruikersnaam en klik "
+"op 'Bewerken'"
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Gebruikersaccount bewerken: "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Gebruikersnaam:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Toestemming om Internetmail te verzenden"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Primair e-mailadres:"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Internet e-mail aliases"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Aantal logins"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Bericht geplaatst"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Toegangsniveau"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "Gebruiker ID nummer"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Datum en tijd laatste login"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Opruimen na dit aantal dagen"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Gebruikers bewerken of verwijderen"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Gebruikers toevoegen"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Gebruikers bewerken of verwijderen"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Verdiepingen toevoegen, wijzigen of verwijderen"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Naam knooppunt"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Gedeeld geheim"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Host of IP adres"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Poortnummer"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Verwijdering bevestigen"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Weet u zeker dat u wilt verwijderen "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Nee"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+#, fuzzy
+msgid "(Edit)"
+msgstr "(bewerk)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Verwijderen)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(domeinen waarvoor deze host mail ontvangt)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(hosts waarop de ClamAV clamd service draait)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(domeinen in het Algemene adresboek)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "(Domeinen die gebruikers mogen gebruiken als 'masquerade')"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(hosts met de Realtime Blackhole Lijst)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr "(indien aanwezig, stuur alle mail naar buiten naar een van deze hosts)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(hosts waarop SpamAssassin draait)"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Nu opnieuw opstarten"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "Herstarten na bericht aan gebruikers."
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "Herstarten als geen gebruikers actief"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "Even geduld a.u.b. tot Citadel server is opgestart... "
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+"Even geduld terwijl gebruikers een berichtje hebben, de citadel server zal "
+"daarna opstarten... "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Toegangscontrole en instellingen site policy"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Sta beheerders toe ruimtes te zappen (vergeten)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Quarantaine berichten van probleemgebruikers"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Naam van de quarantaineruimte"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Naam van de ruimte voor log pagina's"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+#, fuzzy
+msgid "Authentication mode"
+msgstr "Authenticatie toe"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+#, fuzzy
+msgid "Self contained"
+msgstr "bevat"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+#, fuzzy
+msgid "Host based"
+msgstr "Hostnaam:"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+#, fuzzy
+msgid "Allow anonymous guest access"
+msgstr "Geen anonieme berichten"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Begin toegangsniveau voor nieuwe gebruikers"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Benodigd toegangsniveau om ruimte aan te maken"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+"Sta automatisch beheerdersstatus in voor gebruikers die privé ruimtes "
+"aanmaken"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+#, fuzzy
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+"Sta automatisch beheerdersstatus in voor gebruikers die BLOG ruimtes aanmaken"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Toegang tot Internetmail beperken"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Schakel de self-service uit bij het aanmaken van een account"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "Registratie nodig voor nieuwe gebruikers"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Stel het automatisch verlopen van oude berichten in."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+"Deze instellingen kunnen worden overschreven op verdieping- of ruimteniveau."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Tijd waarop database opgeruimd wordt"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "Standaardinstelling voor het laten verlopen van openbare ruimtes"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Nooit berichten automatisch laten verlopen"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Verlopen door aantal berichten"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Verlopen door ouderdom bericht"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Aantal berichten of dagen: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr "Standaardinstelling voor het laten verlopen van privé mailboxen"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Zelfde instelling als openbare ruimtes"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Standaard opruimen gebruiker (dagen)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Standaard opruimen ruimte (dagen)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Stel de LDAP connector voor Citadel in."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"Wijzigingen gemaakt in dit scherm zullen pas actief worden nadat u de "
+"Citadel server opnieuw heeft gestart."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"LET OP: Deze Citadel server is gebouwd zonder LDAP ondersteuning. Deze "
+"opties zullen geen effect hebben."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Hostnaam van de LDAP server (blanco is uit)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Poortnummer van de LDAP server (blanco is uit)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "Base DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "Bind DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Wachtwoord voor bind DN"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "Algemene items site instellingen"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "Wijzig logo Inloggen"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "Wijzig logo Uitloggen"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Fully qualified domain name"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Leesbare knooppuntnaam"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Telefoonnummer"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Prompt volgende pagina (voor textmode clients)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Geografische locatie van dit systeem"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Naam van de systeembeheerder"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Standaard tijdzone voor agenda-items zonder zone"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "IMAP listener port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "IMAP over SSL port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr "Bewaar origineel van headers in IMAP"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indexering en Journaling"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Waarschuwing: dit vraagt veel van het systeem."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Geef full-text index vrij"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "Voer journaliseren van emailberichten uit"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "Voer journaliseren van niet-emailberichten uit"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "Bestemming voor gejournaliseerde berichten"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "POP3 listener port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "POP3 over SSL port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr "POP3 ophaalfrequentie in seconden"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "POP3 snelste ophaalfrequentie in seconden"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr "Funambol server (blanco is uit)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "Funambol serverpoort "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "Funambol sync bron"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "Funambol auth details (user:pass)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr "Externe pager tool (blanco is uit)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Netwerk services"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "Server IP adres (0.0.0.0 voor 'elk')"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "XMPP (Jabber) client to server port (-1 voor uitschakelen)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "POP3 listener port (-1 voor uitschakelen)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "POP3 listener port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "POP3 listener port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Uitgebreide server fine-tuning"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Maximale lengte bericht"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Serververbinding timeout (in seconden)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "Network run frequency (in seconden)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Maximale gelijktijdige sessies (0 = geen limiet)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Minimum aantal worker threads"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Maximum aantal worker threads"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Wis automatisch bewaarde database logs"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "SMTP MTA port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "SMTP MSA port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTP over SSL port (-1 to disable)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr "Voer RBL controles uit bij verbinding i.p.v. na RCPT"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "Markeer bericht als spam i.p.v. het af te wijzen"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+"Sta unauthenticated SMTP clients toe het domein van deze site te spoofen"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "Corrigeer gedwongen Van: regels tijdens authenticated SMTP"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr "Postfix TCP Dictionary Port"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr "-1 voor uitschakelen"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "ManageSieve Port (-1 to disable)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Gebruikeraccounts toevoegen, wijzigen of verwijderen"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Bewerk 'site-brede' instellingen"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Domeinnamen en Internet mail instellingen"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Internet e-mail aliases"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "Toon de SMTP-wachtrij naar buiten"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Uitloggen"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Basiscommando's"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Uw informatie"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Uitgebreide opdrachten ruimtes"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Laden"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Anoniem"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Bericht plaatsen"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+#, fuzzy
+msgid "Save to Drafts"
+msgstr "Opslaan als concept mislukt: "
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Bijlagen:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "van"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "in"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "Aan:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "CC:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "BCC:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Onderwerp (optioneel):"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Onderwerp:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- doorgestuurd bericht ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Venster sluiten"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Bijlage toevoegen"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+#, fuzzy
+msgid "Remove"
+msgstr "(verwijderen)"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Bestanden beschikbaar voor downloaden in"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Upload een bestand:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Bestandsnaam"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Grootte"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Inhoud"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Beschrijving"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Afbeelding uploaden"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "U kunt direct vanaf uw computer een plaatje uploaden."
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Selecteer een bestand om te uploaden:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Diashow"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Toevoegen, wijzigen of verwijderen verdiepingen"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Nummer verdieping"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Naam verdieping"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Aantal ruimtes"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "CSS ruimte"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(verwijder verdieping)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Je moet ingelogd zijn om deze pagina te openen."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "Log in met gebruikersnaam en wachtwoord"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Laatste login"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Nieuwe gebruiker? Schrijf u nu in"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+"vul uw gebruikersnaam in en het wachtwoord dat u wilt gebruiken en klik op "
+"&quot;Nieuwe gebruiker. "
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Login met OpenID"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "OpenID URL:"
+
+#: ../../static/t/get_logged_in.html:90
+#, fuzzy
+msgid "Log in using Google"
+msgstr "Login met OpenID"
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Login met OpenID"
+
+#: ../../static/t/get_logged_in.html:100
+#, fuzzy
+msgid "Log in using AOL or AIM"
+msgstr "Login met OpenID"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "Even geduld"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Dit is een update van '%s' die al in uw agenda staat."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr "Deze afspraak zou botsen met '%s' , die al in uw agenda staat."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Taal:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Mail"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Taken"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Ruimtes"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Online gebruikers"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Chat"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Uitgebreid"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Beheer"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "Dit menu aanpassen"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "Switch naar lijst ruimtes"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "Switch naar menu"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Mijn mappen"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Lijst menuitems aanpassen."
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Laat menuitems zien als:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "plaatjes en tekst"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "alleen plaatjes"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "alleen tekst"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Selecteer de menuitems die u graag weergegeven wilt zien in menubalk aan de "
+"linkerzijde van het scherm"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Logo van de site"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Logo van het bedrijf of de instelling"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Uw samenvattingspagina"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Mail (inbox)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Een snelkoppeling naar uw email Inbox"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Uw persoonlijk adresboek"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Uw persoonlijke notities"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Uw persoonlijke agenda"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Uw persoonlijke takenlijst"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Hiermee wordt u een lijst van alle toegankelijke ruimtes (of mappen) getoond"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Wie is online?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+"Hiermee wordt een lijst getoond van alle gebruikers die op dat moment zijn "
+"ingelogd."
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Hiermee kunt u in 'real-time' chatten met andere gebruikers in dezelfde "
+"ruimte."
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Uitgebreide opties"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Toegang tot het complete menu van Citadelfuncties."
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Citadel logo"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Toont het 'Powered by Citadel' icoontje."
+
+#: ../../static/t/iconbar/save.html:11
+#, fuzzy
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"Uw menubalk is bijgewerkt. U kunt nu hieruit een keuze om verder te gaan."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Abonneer op lijst"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Abonneer op/ verwijder van lijst"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Bevestigingsverzoek verstuurd"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr "Je bent aan het abonneren "
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr " naar de "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr " mailing list."
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Ga terug..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr "FOUT"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr "van de"
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr "mailing list."
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+#, fuzzy
+msgid "Back..."
+msgstr "Ga terug..."
+
+#: ../../static/t/listsub/display.html:57
+#, fuzzy
+msgid "Confirmation successful!"
+msgstr "Bevestigingsverzoek verstuurd"
+
+#: ../../static/t/listsub/display.html:59
+#, fuzzy
+msgid "Confirmation failed."
+msgstr "Instellingen"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Naam van taak"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Voorkeur e-mailadres"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "Tekst bericht toevoegen:"
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "uurformaat"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+#, fuzzy
+msgid "Logged in as"
+msgstr "Laatste login"
+
+#: ../../static/t/loggedinas.html:6
+#, fuzzy
+msgid "Not logged in."
+msgstr "Niet ingelogd"
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "op basis van"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Opnieuw inloggen"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Bewerk of verwijder deze ruimte"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Ga naar een 'verborgen' ruimte"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Maak een nieuwe ruimte aan"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Maak een nieuwe ruimte aan"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "Zap (vergeet) deze ruimte"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Toon alle vergeten ruimtes"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Lees nieuwe berichten"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Lijst van bekende ruimtes"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Waar kan ik van hieruit naar toe?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Volgende ruimte"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "...met <em>ongelezen</em> berichten"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Ga naar volgende ruimte"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(kom hier later terug)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Ongedaan maken"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "oeps! Terug naar "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Lees nieuwe berichten"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "...in deze ruimte"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Lees alle berichten"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "...oude <em>en</em> nieuwe"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Bericht opstellen"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(in deze ruimte plaatsen)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "Bestandsbibliotheek"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(Toon bestanden beschikbaar voor download)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Samenvattingspagina"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Samenvatting van mijn account"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Gebruikerslijst"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(alle geregistreerde gebruikers)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Tot ziens!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Uw wachtwoord wijzigen"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Uw nieuwe wachtwoord:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Nogmaals als bevestiging:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Uw voorkeuren en instellingen wijzigen"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Uw contactinformatie bijwerken"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Uw 'CV' toevoegen"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Uw online foto bewerken"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Mailfilters op de server bekijken/bewerken"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "Bewerk uw push email instellingen"
+
+#: ../../static/t/menu/your_info.html:9
+#, fuzzy
+msgid "Manage your OpenIDs"
+msgstr "Uw OpenID"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Bevestig verplaatsen bericht"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Dit bericht verplaatsen naar:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Lezen #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "berichten"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "oudste naar nieuwste"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "nieuwste naar oudste"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Afzender"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Laad berichten van de server, een ogenblik"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Open in nieuw venster"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Verplaatsen"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Kopieer"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Print"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Toon contacten"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Contact toevoegen"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Toon dag"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Toon maand"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Afspraak toevoegen"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Agendalijst"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Toon taken"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Taak toevoegen"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Toon notities"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Notitie toevoegen"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Verversen"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Opstellen"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Wiki home"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Deze pagina bewerken"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "Geschiedenis"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "nieuwere berichten"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Ruimte overslaan"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "Nieuwe startpagina"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "De startpagina is gewijzigd"
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+"(Opmerking: dit verandert niet de startpagina van de browser. Het verandert "
+"de pagina waarop u begint na het inloggen"
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "Geen nieuwe berichten."
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "Uw OpenID"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "is goedgekeurd."
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr "Echter, de gebruikersnaam"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "botst met een bestaande gebruiker."
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Geef alstublieft de gebruikersnaam die u wilt gebruiken."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Voorkeuren en instellingen"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Bekijk als boomstructuur (mappen)"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Tabel (ruimte) instelling"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 uurs (vm/nm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 uur"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Zondag"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Maandag"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Geen ondertekening"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "Volledig functioneel"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Veilige modus"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+#, fuzzy
+msgid "Configure Push Email"
+msgstr "Push Email"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "Push email en SMS instellingen"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+#, fuzzy
+msgid "Notify Funambol server"
+msgstr "Funambol serverpoort "
+
+#: ../../static/t/prefs/pushemail.html:31
+#, fuzzy
+msgid "Send a text message to..."
+msgstr "Stuur direct bericht naar: "
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Naam van de ruimte: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Bevindt zich op verdieping: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Standaard weergave voor ruimte: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Soort ruimte:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Openbaar (verschijnt automatisch voor iedereen)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privé - verborgen (toegankelijk voor iedereen die z'n naam kent)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privé - wachtwoord nodig: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privé - Alleen op uitnodiging"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Persoonlijk (mailbox voor u alleen)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Maak een nieuwe ruimte aan"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Naam van de ruimte: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Standaard weergave voor ruimte: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Soort ruimte:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Bewerk het Infobestand van deze ruimte"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"Tekst wordt weergegeven op de breedte van het scherm van de lezer. Voor de "
+"goede weergave zorg dat een regel in elk geval een spatie bevat."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Ga naar een verborgen ruimte"
+
+#: ../../static/t/room/display_private.html:8
+#, fuzzy
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Als u de naam kent van een verborgen (raden naam) ruimte of een ruimte met "
+"wachtwoord, kunt u de ruimte binnenkomen door de naam in te vullen.Als u "
+"eenmaal toegang heeft tot een privéruimte, zal het verschijnen in uw normale "
+"lijst met ruimtes, zodat u hier niet steeds hoeft terug te keren."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Geef naam ruimte:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Geef wachtwoord ruimte:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Instellingen"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Instelling bericht verlopen"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Toegangscontrole"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Delen"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Mailinglist service"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Herstel op afstand"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(verwijderen)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+#, fuzzy
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"De gebruikers hieronder hebben toegang tot deze ruimte. Om een gebruiker te "
+"verwijderen uit de toegangslijst, selecteer de gebruikersnaam en klik "
+"'Verwijderen'"
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Om een andere gebruiker toegang te geven tot deze ruimte vul hieronder de "
+"gebruikersnaam in en klik op 'Uitnodigen'."
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Uitnodigen:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Gebruikers"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Deze ruimte verwijderen"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+#, fuzzy
+msgid "Set or change the icon for this rooms banner"
+msgstr "Zet of wijzig het icoontje voor de banner van deze ruimte"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+#, fuzzy
+msgid "Edit this rooms Info file"
+msgstr "Bewerk het Infobestand van deze ruimte"
+
+#: ../../static/t/room/edit/tab_config.html:7
+#, fuzzy
+msgid "name of room: "
+msgstr "Naam van de ruimte: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Als privé, zorg dat huidige gebruikers ruimte vergeten"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Alleen beheerders"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Alleen-lezen ruimte"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "Alle gebruikers die berichten mogen plaatsen mogen ook wissen"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Ruimte met Bestandsmappen"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Naam van map: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Uploaden toegestaan"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Downloaden toegestaan"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Bewaar berichten op de server?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Zichtbare map"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Netwerkgedeelde ruimte"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanent (wordt niet automatisch opgeruimd)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "Onderwerp vereist (Dwing gebruikers een onderwerp op te geven)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Anonieme berichten"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Geen anonieme berichten"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Alle berichten zijn anoniem"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Gebruiker vragen bij invoer bericht"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Ruimte Beheerder: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Instelling voor verlopen berichten in deze ruimte"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Gebruik de standaardinstelling voor deze ruimte"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Instelling voor het verlopen van berichten op deze verdieping"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Gebruik systeemstandaard"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr "Haal berichten van deze POP3 accounts en sla ze op in deze ruimte:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "Hosts op afstand"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Gebruikersnaam"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Bewaar berichten op de server?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "interval"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Haal berichten van deze RSS-feeds en sla ze op in deze ruimte:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "Feed URL"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>De berichten in deze ruimte worden als <b> losse berichten</b> gemaild "
+"naar de volgende ontvangers: </i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>De berichten in deze ruimte worden als <b>als één pakket</b> gemaild naar "
+"de volgende ontvangers: </i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Voeg ontvangers toe uit 'Contacten' of andere adresboeken"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "Niet geabonneerden toestaan deze ruimte te mailen."
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "Beheersrechten nodig"
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr "Deze ruimte is ingesteld voor zelf-service bij abonneren/verwijderen."
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "De URL voor abonneren/verwijderen is: "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Niet gedeeld met"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Gedeeld met"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Knooppunt op afstand"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Naam van ruimte op afstand"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Acties"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"Als u een ruimte deelt, moeten beide kanten meewerken. Een knooppunt "
+"toevoegen aan de 'gedeelde' lijst stuurt berichten naar buiten, maar om "
+"berichten te ontvangen, moet het andere knooppunt ook zijn ingesteld om "
+"berichten naar uw systeem te verzenden. <LI>Als de naam van de ruimte op "
+"afstand leeg is weet u zeker dat de naam van de ruimte gelijk wordt geacht "
+"aan de ruimte op het knooppunt op afstand. <LI>Als de naam van de ruimte op "
+"afstand verschilt moet de ruimte op afstand zelf ook een naam ingesteld "
+"krijgen.</UL></I><br>\n"
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Informatie over deze ruimte"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Zap (vergeet/verwijder uit) de huidige ruimte"
+
+#: ../../static/t/room/zap_this.html:6
+#, fuzzy
+msgid "If you select this option,"
+msgstr "Bewerk of verwijder deze ruimte"
+
+#: ../../static/t/room/zap_this.html:8
+#, fuzzy
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+"Als u deze optie selecteert verdwijnt <em>%s</em> uit uw lijst met ruimtes.  "
+"Is dat wat u wilt?<br>\n"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Zapped (vergeten) ruimtes"
+
+#: ../../static/t/room/zapped_list.html:10
+#, fuzzy
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "Klik op willekeurige ruimte om te unzappen en ga naar die ruimte.\n"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "nieuw van"
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Kies pagina: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Zoek: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Alles"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Toevoegen of verwijderen scripts"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Voeg een nieuw script toe"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"Om een nieuw script te maken voer de gewenste scriptnaam in en klik op "
+"'Aanmaken'"
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Naam van het script: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Scripts bewerken"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Terug naar het bewerkingsscherm voor script"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Scripts verwijderen"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"Om een bestaand script te verwijderen, selecteer de scriptnaam en klik "
+"'Verwijderen'."
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "als"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Aan of Cc"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Antwoord aan"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Afwijzen-Van"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Afwijzen-Aan"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Envelop Van"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Envelop Aan"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-Flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Status"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "Lijst-ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Berichtgrootte"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "bevat"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "bevat niet"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "is"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "is niet"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "komt overeen met"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "komt niet overeen met"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Alle berichten)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "is groter dan"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "is kleiner dan"
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr "bytes"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Bewaren"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Stil verwijderen"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Afwijzen"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Verplaats bericht naar"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Doorsturen naar"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Vakantie"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Bericht:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "en dan"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "doorgaan met bewerking"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "stop"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Als nieuwe mail binnenkomt: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Filter het volgens onderstaande regels"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Laat het in mijn Inbox zonder filtering"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+"Filter het door een handmatig aangemaakt script (alleen gevorderde "
+"gebruikers)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Voeg regel toe"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"Deze installatie van Citadel is gebouwd zonder ondersteuning voor "
+"mailfilters.<br>Neem contact op met de beheerder als u deze functie nodig "
+"heeft."
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "Oude berichten"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "Nieuwe berichten"
+
+#: ../../static/t/summary/page.html:4
+#, fuzzy
+msgid "Summary page for "
+msgstr "Samenvattingspagina voor %s"
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Berichten"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Vandaag&nbsp;op&nbsp;uw&nbsp;agenda"
+
+#: ../../static/t/summary/page.html:51
+#, fuzzy
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Wie is nu online"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Over&nbsp;deze&nbsp;server"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+#, fuzzy
+msgid "running"
+msgstr "Afstemmen"
+
+#: ../../static/t/summary/page.html:65
+#, fuzzy
+msgid "with"
+msgstr "vijfde"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+#, fuzzy
+msgid "and located in"
+msgstr "en dan"
+
+#: ../../static/t/summary/page.html:68
+#, fuzzy
+msgid "Your system administrator is"
+msgstr "Naam van de systeembeheerder"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"LET OP: JavaScript is uitgeschakeld op uw computer. Veel functies van dit "
+"systeem zullen niet goed werken."
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Uw 'CV' toevoegen"
+
+#: ../../static/t/user/list.html:3
+#, fuzzy
+msgid "User list for "
+msgstr "Gebruikerslijst voor %s"
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Gebruikersnaam"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Nummer"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Toegangsniveau"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Laatste login"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Totaal aantal logins"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Totaal aantal berichten"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Gebruikersprofiel"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+#, fuzzy
+msgid "Click here to send an instant message to"
+msgstr "Klik hier om direct een bericht te sturen naar %s"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Bewerk contactinformatie"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Aanhef"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Voornaam"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Voorvoegsel"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Achternaam"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Suffix"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Naamweergave:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Titel:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organisatie:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Postbus:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Adres:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Plaats:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Prov.:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Postcode:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Land:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Telefoon thuis:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Telefoon werk:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Mobiele telefoon:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Faxnummer:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Dit adresboek is leeg."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Er is een interne fout opgetreden."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Schrijf een reactie"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "nieuwere berichten"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "oudere berichten"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d commentaren"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "permalink"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "nieuw van"
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "U heeft geen toestemming deze bron te bekijken."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "De queue is leeg"
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Ververs deze pagina"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Hosts op afstand"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Prov.:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "doorgaan met bewerking"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "Message ID"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Datum/tijd ingesteld"
+
+#: ../../static/t/view_mailq/table.html:8
+#, fuzzy
+msgid "Next attempt"
+msgstr "Laatste poging"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Ontvangers"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "van "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "aan"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "Bewerk"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Antwoord"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "AntwoordQuoted"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "AntwoordAllen"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Doorsturen"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Headers"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "View"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Download"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Toon als:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "Gebruikers op dit moment op "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr "Klik op een naam om de gebruikersinfo te lezen. Klik op"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "Stuur een direct bericht naar die gebruiker."
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(beëindig)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Ruimte"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "Van host"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Bewerk uw sessie weergave"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Dit scherm maakt het mogelijk de wijze waarop uw sessie wordt getoond in de "
+"'Wie is online' lijst te wijzigen. Om een nepnaam uit te schakelen, die u "
+"eerst had geplaatst klik eenvoudig op de 'Wijzig' knop zonder iets in te "
+"vullen in het betreffende veld. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Naam ruimte:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Hostnaam:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr "Gebruikers op dit moment op"
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr "Instellingen bewerken"
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr "Item adresboek bewerken"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Ga er naar toe"
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Selecteer de 'Deze pagina bewerken' link in de banner van de ruimte als u "
+"deze pagina wilt aanmaken."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Er is hier geen pagina genaamd '%s'"
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#~ msgid "the icon for this floor"
+#~ msgstr "het icoontje voor deze verdieping"
+
+#~ msgid "Edit %s"
+#~ msgstr "Bewerk %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Wijzigingen bewaren"
+
+#~ msgid " (work)"
+#~ msgstr " (werk)"
+
+#~ msgid " (home)"
+#~ msgstr " (thuis)"
+
+#~ msgid " (cell)"
+#~ msgstr " (mobiel)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefoon:"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Directory domeinen"
+
+#, fuzzy
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Smart hosts"
+
+#~ msgid "Create new room"
+#~ msgstr "Maak een nieuwe ruimte aan"
+
+#~ msgid "Zap this room"
+#~ msgstr "Zap deze ruimte"
+
+#~ msgid ""
+#~ "You have one or more instant messages waiting, but the Citadel Instant "
+#~ "Messenger window failed to open.  This is probably because you have a "
+#~ "popup blocker installed.  Please configure your popup blocker to allow "
+#~ "popups from this site if you wish to receive instant messages."
+#~ msgstr ""
+#~ "U heeft een of meer wachtende directe berichten, maar het Instant "
+#~ "Messenger venster kon niet worden geopend. Dit komt waarschijnlijk omdat "
+#~ "uw browser pop-up vensters blokkeert. Zorg alstublieft dat uw pop-up "
+#~ "blocker popups van deze site accepteert als u directe berichten wilt "
+#~ "ontvangen."
+
+#, fuzzy
+#~ msgid "The citadel server has to be restarted. It will be back in a minute."
+#~ msgstr ""
+#~ "De Citadel server moet opnieuw opstarten. Het is zo weer beschikbaar."
+
+#~ msgid "Change"
+#~ msgstr "Wijzigen"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Netwerkgedeelde ruimte"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Knooppunt toevoegen"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "minuten "
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Voorwaardelijk"
+
+#~ msgid "Send"
+#~ msgstr "Versturen"
+
+#~ msgid "Delete this message?"
+#~ msgstr "Verwijder dit bericht?"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Lijst met ruimtes"
+
+#~ msgid "Pictures in"
+#~ msgstr "Plaatjes in "
+
+#~ msgid "Exit"
+#~ msgstr "Stoppen"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Upload een bestand:"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Weet u zeker dat u wilt verwijderen "
+
+#~ msgid "Upload"
+#~ msgstr "Uploaden"
+
+#~ msgid "Add"
+#~ msgstr "Toevoegen"
+
+#~ msgid "Create"
+#~ msgstr "Aanmaken"
+
+#~ msgid "Kick"
+#~ msgstr "Verwijderen"
+
+#~ msgid "Invite"
+#~ msgstr "Uitnodigen"
+
+#~ msgid "User"
+#~ msgstr "Gebruiker"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Adresboek"
+
+#~ msgid "Delete user"
+#~ msgstr "Gebruiker verwijderen"
+
+#~ msgid "Delete this user?"
+#~ msgstr "Deze gebruiker verwijderen?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Verwijder regel"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "Uw inkomende mail zal door geen enkel script worden gefilterd."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "Het nu actieve script is: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Stel replicatie met andere Citadel servers in"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Toont het 'Powered by Citadel' icoontje."
+
+#~ msgid "Go to your email inbox"
+#~ msgstr "Ga naar uw email inbox"
+
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Ga naar uw persoonlijke agenda"
+
+#~ msgid "Go to your personal address book"
+#~ msgstr "Ga naar uw persoonlijk adresboek"
+
+#~ msgid "Go to your personal notes"
+#~ msgstr "Ga naar uw persoonlijke notities"
+
+#~ msgid "Go to your personal task list"
+#~ msgstr "Ga naar uw persoonlijke takenlijst"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Lijst van voor u toegankelijke ruimtes"
+
+#~ msgid "See who is online right now"
+#~ msgstr "Bekijk wie nu online is"
+
+#~ msgid ""
+#~ "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+#~ msgstr ""
+#~ "Uitgebreide menuopties: Uitgebreide opdrachten ruimtes, Account info, enz."
+
+#~ msgid "Room and system administration functions"
+#~ msgstr "Functies ruimte- en systeembeheer"
+
+#~ msgid "Reset form"
+#~ msgstr "Formulier wissen"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Deze notitie verwijderen?"
+
+#~ msgid "Create new floor"
+#~ msgstr "Maak nieuwe verdieping aan"
+
+#~ msgid "Move rule up"
+#~ msgstr "Regel naar boven"
+
+#~ msgid "Move rule down"
+#~ msgstr "Regel naar beneden"
+
+#~ msgid "Delete rule"
+#~ msgstr "Verwijder regel"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(bewerk afbeelding)"
+
+#~ msgid "Change name"
+#~ msgstr "Naam wijzigen"
+
+#~ msgid "Change CSS"
+#~ msgstr "CSS wijzigen"
+
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Weet u zeker dat u deze ruimte wilt verwijderen?"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Voer commando in:"
+
+#~ msgid "Unshare"
+#~ msgstr "Niet delen"
+
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "Gebruikersnaam beheerder (blanco is uit)"
+
+#~ msgid "Master user password"
+#~ msgstr "Wachtwoord beheerder:"
+
+#~ msgid "Delete this note?"
+#~ msgstr "Deze notitie verwijderen?"
+
+#~ msgid "List"
+#~ msgstr "Los"
+
+#~ msgid "Digest"
+#~ msgstr "Pakket"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Onderwerp"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Wilt u dit OpenID echt verwijderen?"
+
+#~ msgid "Share"
+#~ msgstr "Delen"
+
+#~ msgid "Change password"
+#~ msgstr "Wachtwoord wijzigen"
+
+#~ msgid "Change room name"
+#~ msgstr "Naam ruimte wijzigen"
+
+#~ msgid "Change host name"
+#~ msgstr "Hostnaam wijzigen"
+
+#~ msgid "Change user name"
+#~ msgstr "Gebruikersnaam wijzigen"
+
+#~ msgid ""
+#~ "Leave all messages marked as unread, go to next room with unread messages"
+#~ msgstr ""
+#~ "Laat alle berichten gemarkeerd als ongelezen, ga naar de volgende ruimte "
+#~ "met ongelezen berichten"
+
+#~ msgid "Mark all messages as read, go to next room with unread messages"
+#~ msgstr ""
+#~ "Markeer alle berichten als gelezen, ga naar de volgende ruimte met "
+#~ "ongelezen berichten"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Wijzigingen bewaren"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "U abonneert <TT>%s</TT> op de <b>%s</b> mailinglijst.  De listserver "
+#~ "heeft u een e-mail gestuurd met een extra link waarop u moet klikken om "
+#~ "het abonnement te bevestigen.  Deze extra stap is voor uw bescherming, "
+#~ "want het voorkomt dat anderen zonder uw toestemming u abonneren op "
+#~ "mailinglijsten.<br><br> Klik alstublieft op de gemailde link om uw "
+#~ "abonnement te bevestigen<br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr ""
+#~ "LET OP: mislukt Server Config te sturen; loopt er een te nieuwe citserver?"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Er is geen ruimte genaamd '%s'"
+
+#~ msgid "Network"
+#~ msgstr "Netwerk"
+
+#~ msgid "Tuning"
+#~ msgstr "Afstemmen"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Verwijder direct gewiste berichten in IMAP"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Een script met die naam bestaat al"
+
+#~ msgid ""
+#~ "A new script has been created.  Return to the script editing screen to "
+#~ "edit and activate it."
+#~ msgstr ""
+#~ "Een nieuw script is aangemaakt. Terug naar het bewerkingsscherm voor "
+#~ "bewerking en activering."
+
+#~ msgid "Delete script"
+#~ msgstr "Script verwijderen"
+
+#~ msgid "Delete this script?"
+#~ msgstr "Dit script verwijderen?"
+
+#~ msgid ""
+#~ "You are connected to %s, running %s with %s, server build %s and located "
+#~ "in %s.  Your system administrator is %s."
+#~ msgstr ""
+#~ "U bent verbonden met %s, waar %s op draait met %s, server build %s en "
+#~ "gevestigd in %s. Uw systeembeheerder is %s."
+
+#~ msgid "Yes with users list"
+#~ msgstr "Ja met gebruikerslijst"
+
+#~ msgid "Room list"
+#~ msgstr "Lijst van ruimtes"
+
+#~ msgid "View as room list"
+#~ msgstr "Toon als lijst met ruimtes"
+
+#~ msgid "View as folder list"
+#~ msgstr "Toon als mappenstructuur"
+
+#~ msgid " - powered by <a href='http://www.citadel.org'>Citadel</a>"
+#~ msgstr " - op basis van <a href=\"http://www.citadel.org\">Citadel</a>"
+
+#, fuzzy
+#~ msgid "uname"
+#~ msgstr "Bestandsnaam"
+
+#, fuzzy
+#~ msgid "text"
+#~ msgstr "volgende"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "Bestandsnaam"
+
+#, fuzzy
+#~ msgid "pname"
+#~ msgstr "Bestandsnaam"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Wachtwoord"
+
+#, fuzzy
+#~ msgid "pass"
+#~ msgstr "Taken"
+
+#, fuzzy
+#~ msgid "authbox"
+#~ msgstr "Auteur"
+
+#, fuzzy
+#~ msgid "display: none"
+#~ msgstr "Naamweergave:"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Uw wachtwoord is niet geaccepteerd."
+
+#~ msgid "If you already have an account on"
+#~ msgstr "Als u al een account heeft op"
+
+#~ msgid "enter your user name and password and click &quot;Log in.&quot;"
+#~ msgstr ""
+#~ "vul dan uw gebruikersnaam en wachtwoord in en klik op &quot;Log in.&quot;"
+
+#~ msgid "Please log off properly when finished. "
+#~ msgstr "Log correct uit als u klaar bent. "
+
+#~ msgid "See the"
+#~ msgstr "Bekijk de"
+
+#~ msgid "recommended browser list"
+#~ msgstr "aanbevolen browser lijst"
+
+#~ msgid ""
+#~ "if you have trouble using Webcit.</li> <li>You must have <i>cookies</i> "
+#~ "turned on. "
+#~ msgstr ""
+#~ "als u problemen heeft met Webcit.</li> <li><i>Cookies</i> moeten worden "
+#~ "toegestaan. "
+
+#~ msgid ""
+#~ "Also keep in mind that if your browser is configured to block pop-up "
+#~ "windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "Als uw browser pop-up vensters blokkeert, zult u geen directe berichten "
+#~ "kunnen ontvangen."
+
+#~ msgid "Enter your OpenID URL and click &quot;Log in&quot;."
+#~ msgstr "Vul uw OpenID URL in en klik op &quot;Inloggen.&quot;"
+
+#~ msgid "Click here to learn what OpenID is and how Citadel is using it."
+#~ msgstr "Klik hier voor meer info over OpenID en hoe Citadel het gebruikt."
+
+#~ msgid "Log off now?"
+#~ msgstr "Nu uitloggen?"
+
+#~ msgid "%d new of %d messages%s"
+#~ msgstr "%d nieuw van in totaal %d berichten%s"
+
+#~ msgid "(nothing)"
+#~ msgstr "(niets)"
+
+#~ msgid "unexpected end of message"
+#~ msgstr "onverwacht einde van bericht"
+
+#~ msgid "An error occurred while setting up the chat socket."
+#~ msgstr "Er is een fout opgetreden bij het opzetten van de chat socket."
+
+#~ msgid "Now exiting chat mode."
+#~ msgstr "Nu chatmode verlaten."
+
+#~ msgid "Help"
+#~ msgstr "Help"
+
+#~ msgid "List users"
+#~ msgstr "Gebruikerslijst"
+
+#~ msgid "No messages here."
+#~ msgstr "Hier geen berichten."
+
+#, fuzzy
+#~ msgid "no more messages"
+#~ msgstr "Anonieme berichten"
+
+#~ msgid ""
+#~ "Your icon bar has been updated.  Please select any of its choices to "
+#~ "continue.<br/><span style=\"font-weight: bold;\">You may need to force "
+#~ "refresh (SHIFT-F5) in order for changes to take effect</span>"
+#~ msgstr ""
+#~ "Uw iconenbalk is geupdate. Maak een willekeurige keuze om door te gaan."
+#~ "<br/><span style=\"font-weight: bold;\"> Wellicht moet u verversen (SHIFT-"
+#~ "F5) om te zorgen dat de veranderingen getoond worden</span>"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "Error retrieving RSS feed: couldn't find messages\n"
+#~ msgstr "Fout in binnenhalen RSS feed: kon geen berichten vinden\n"
+
+#~ msgid "%s from"
+#~ msgstr "%s van "
+
+#~ msgid "%s in %s"
+#~ msgstr "%s in %s"
+
+#~ msgid " on %s"
+#~ msgstr "op %s"
+
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#~ msgid ")> <select id="
+#~ msgstr ")> <select id="
+
+#~ msgid "><option> </option></select></li><??("
+#~ msgstr "><option> </option></select></li><??("
+
+#~ msgid ",1)>"
+#~ msgstr ",1)>"
+
+#~ msgid ""
+#~ "<ul><li>Enter your OpenID URL and click &quot;Log in&quot;.<li><a href="
+#~ "\"http://www.citadel.org/doku.php/documentation:openid\">Click here to "
+#~ "learn what OpenID is and how Citadel is using it.</a><li>Please log off "
+#~ "properly when finished. <li>You must use a browser that supports "
+#~ "<i>frames</i> and <i>cookies</i>. <li>Also keep in mind that if your "
+#~ "browser is configured to block pop-up windows, you will not be able to "
+#~ "receive any instant messages.<br></ul>"
+#~ msgstr ""
+#~ "<ul><li>Tik uw OpenID URL in en klik op &quot;Inloggen.&quot; <li><b><a "
+#~ "href=\"http://www.citadel.org/doku.php/documentation:openid\">Klik hier "
+#~ "voor meer info over OpenID en hoe Citadel het gebruikt.</a><li>Log "
+#~ "correct uit als u klaar bent. <li>Uw browser moet <i>frames</i> en "
+#~ "<i>cookies</i> ondersteunen. <li>Als uw browser pop-up vensters "
+#~ "blokkeert, zult u geen directe berichten kunnen ontvangen.<br></ul>"
+
+#~ msgid ""
+#~ "enter your user name and password and click &quot;Log in.&quot;<li><b>If "
+#~ "you are a new user</b>, enter the name and password you wish to use, and "
+#~ "click &quot;New User.&quot; <li>Please log off properly when finished. "
+#~ "<li>You must use a browser that supports <i>frames</i> and <i>cookies</"
+#~ "i>. <li>Also keep in mind that if your browser is configured to block pop-"
+#~ "up windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "Vul uw gebruikersnaam en wachtwoord in en klik op &quot;Inloggen.&quot; "
+#~ "<li><b>Als u een nieuwe gebruiker bent</b>, vul uw gebruikersnaam in en "
+#~ "het wachtwoord dat u wilt gebruiken en klik op &quot;Nieuwe gebruiker."
+#~ "&quot; <li>Log correct uit als u klaar bent. <li>Uw browser moet "
+#~ "<i>frames</i> en <i>cookies</i> ondersteunen. <li>Als uw browser pop-up "
+#~ "vensters blokkeert, zult u geen directe berichten kunnen ontvangen.<br /"
+#~ "></ul>"
+
+#~ msgid "Find out more about Citadel"
+#~ msgstr "Meer informatie over Citadel"
+
+#~ msgid "CITADEL"
+#~ msgstr "CITADEL"
+
+#~ msgid "Customize this menu"
+#~ msgstr "Dit menu aanpassen"
+
+#~ msgid "Internet configuration"
+#~ msgstr "Internet configuratie"
+
+#~ msgid "of %d messages."
+#~ msgstr "van %d berichten."
+
+#~ msgid " <I>from</I> "
+#~ msgstr " <I>van</I> "
+
+#~ msgid " <I>in</I> "
+#~ msgstr " <I>in</I> "
+
+#~ msgid "Edit node configuration for "
+#~ msgstr "Knooppunt instellingen bewerken voor "
+
+#~ msgid ""
+#~ "<a href=\"http://www.postfix.org/tcp_table.5.html\">Postfix TCP "
+#~ "Dictionary Port </a> (-1 to disable)"
+#~ msgstr ""
+#~ "<a href=\"http://www.postfix.org/tcp_table.5.html\">Postfix TCP "
+#~ "Dictionary Port </a> (-1 to disable)"
+
+#~ msgid "ERROR: could not open template "
+#~ msgstr "FOUT: kon template niet openen"
+
+#~ msgid ""
+#~ "<I>This message contains calendaring/scheduling information, but support "
+#~ "for calendars is not available on this particular system.  Please ask "
+#~ "your system administrator to install a new version of the Citadel web "
+#~ "service with calendaring enabled.</I><br>\n"
+#~ msgstr ""
+#~ "<I>Dit bericht bevat agenda/rooster informatie, maar ondersteuning voor "
+#~ "agenda's is niet beschikbaar op dit systeem. Vraag uw systeembeheerder a."
+#~ "u.b. een nieuwe versie van Citadel te installeren met ondersteuning voor "
+#~ "agenda's</I><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display calendar item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Kan agenda-item niet weergeven.  U ziet deze foutmelding omdat de "
+#~ "Webcit service niet is geinstalleerd met agenda-ondersteun. Neem "
+#~ "alstublieft contact op met uw systeembeheerder.</i><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display to-do item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Kan het 'te-doen'-item niet weergeven.  U ziet deze foutmelding omdat "
+#~ "de Webcit service niet is geïnstalleerd met 'te-doen'-ondersteuning. Neem "
+#~ "alstublieft contact op met uw systeembeheerder.</i><br>\n"
+
+#~ msgid "Day: "
+#~ msgstr "Dag: "
+
+#~ msgid "Year: "
+#~ msgstr "Jaar: "
+
+#~ msgid "The calendar view is not available."
+#~ msgstr "De agenda view is niet beschikbaar."
+
+#~ msgid "The tasks view is not available."
+#~ msgstr "De weergave taken is niet beschikbaar."
+
+#~ msgid "Gateway domains"
+#~ msgstr "Gateway domeinen"
+
+#~ msgid "(domains whose subdomains match Citadel hosts)"
+#~ msgstr "(domeinen waarvan de subdomeinen vallen onder Citadel hosts)"
+
+#~ msgid "(This server does not support task lists)"
+#~ msgstr "(Deze server ondersteunt geen takenlijsten)"
+
+#~ msgid "(This server does not support calendars)"
+#~ msgstr "(Deze server ondersteunt geen agenda's)"
diff --git a/webcit/po/webcit/pl.po b/webcit/po/webcit/pl.po
new file mode 100644 (file)
index 0000000..e06bc0b
--- /dev/null
@@ -0,0 +1,4426 @@
+# translation of webcit.po to pl.po
+# Copyright (C) 2008 - 2009 The Citadel Project - http://www.citadel.org
+# This file is distributed under the revised BSD license
+#
+# WebCit messages for Polish
+# Copyright (C) 2005 David Given
+# This file is distributed under GPL v3
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2013-11-27 15:35+0000\n"
+"Last-Translator: Waldemar Ogonowski <sp2ong@wp.pl>\n"
+"Language-Team: <room_citadel_translators@uncensored.citadel.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-11-28 05:10+0000\n"
+"X-Generator: Launchpad (build 16847)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Usuń"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Nowy użytkownik"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Problematyczny użytkownik"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Lokalny użytkownik"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Sieciowy użytkownik"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Preferowany użytkownik"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Admin"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Wystąpił błąd."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Zatwierdź nowych użytkowników"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Obecnie żaden użytkownik nie wymaga zatwierdzenia."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "bardzo słabe"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "słabe"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "ok"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "mocne"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Aktualny poziom dostępu: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Wybierz poziom dostępu dla tego użytkownika:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Anulowane. Hasło nie zostało zmienione."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "One nie pasują. Hasło nie zostało zmienione."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Puste hasła nie są dozwolone."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "dostępność nieznana"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "wolny"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "ZAJĘTY"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Skocz do strony: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Pierwszej"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Ostatniej"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Zaproszenie na spotkanie"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Odpowiedź uczestnika na zaproszenie"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Opublikowano wydarzenie"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "To jest nieznany rodzaj elementu kalendarza."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Podsumowanie:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Lokalizacja:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Data:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Data rozpoczęcia/czas:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Data zakończenia/czas:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Opis:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Powtarzanie"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "To jest wydarzenie cykliczne"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Uczestnik:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Jest to zmiana  '%s', które znajduje się już w kalendarzu."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr "Wydarzenie to byłoby sprzeczne z '%s', które jest już w kalendarzu."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Aktualizacja:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "KONFLIKT:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Jak chcesz odpowiedzieć na to zaproszenie?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Akceptuj"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Niepwne"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Odmowa"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Kliknij <i> Aktualizacja </i>, aby zaakceptować tę odpowiedź i aktualizować "
+"swój kalendarz."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Zaktualizuj"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignoruj"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Wystąpił błąd podczas analizowania tego elementu kalendarza."
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+"Zaakceptowałeś zaproszenie na spotkanie. Zostało wpisana do Twojego "
+"kalendarza."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Wstępnie zaakceptowałeś zaproszenie na spotkanie. Zostało  \"zaznaczone\"  w "
+"Twoim kalendarzu."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Odrzuciłeś  zaproszenie na spotkanie. Zaproszenie <b> nie </ b> będzie  "
+"wpisane do Twojego kalendarza."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Odpowiedź została wysłana do organizatora spotkania."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Twój kalendarz został zaktualizowany, aby odzwierciedlić  RSVP."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"Wybrałeś ignorowanie ten RSVP. Twój kalendarz <b> nie </b> zostanie "
+"zaktualizowany."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Widok kalendarza dziennego zaczyna się od:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Widok kalendarza dziennego kńczy się na:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Tydzień zaczyna się od:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Godzina: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minuty: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(status nieznany)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(potrzebne działanie)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(zaakceptowany)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(odrzucony)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(niepewny)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(odelegowany)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(zakoczony)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(w trakcie)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(nieokreślony)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Nie opisane wydarzenie"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "Od"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Data startowa:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Data zakończenia:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Data/czas:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Notatki:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "poprzedni"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "następny"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Tydzień"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Godzin(a/y)"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Temat"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Początek"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Koniec"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Wydarzenie całodniowe"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "W toku wydarzenie"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Nieopisane zadanie"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "Wystąpił błąd podczas pobierania tego pliku: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "sekundy"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minuty"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "godzin(y)"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "dni"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "tygodni"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "miesięcy"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "lat(a)"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "nigdy"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "pierwszy(a)"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "drugi"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "trzeci(a)"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "czwarty(a)"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "piąty(a)"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Wydarzenie"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Uczestnicy"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Dodaj lub edytuj zdarzenie"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Zestawienie"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Lokalizacja:"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Notes"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Notes"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(jesteś organizatorem)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Pokaż czas jako:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Wolny"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Zajety"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(Jeden na linie)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Kontakty"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Zasady powtarzania"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Powtarzaj co każdy"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "dzień tygodnia:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "dzień %s%d%s miesiąca"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "w "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "w miesiącu"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "co "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "roku o tej datcie"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "z"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Zakres powtarzania"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Brak daty zakończenia"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Powtarzaj to wydarzenie"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "razy"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Powtarzaj to wydarzenie aż do "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Zapisz"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Usuń"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Sprawdź dostępność uczestników"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Format czasu"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Przesyłanie pliku zostało anulowane."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Nie przesłałeś pliku."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "Twoje zdjęcie"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "ikona dla tego pokoju"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "obrazek graficzny przy logowania"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "obrazek przy wyloggowaniu"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "realloc() łąd! nie może pobrać  %d bytes: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Ustawienia ikon"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Nieprawidłowy parametr"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr " została usunięta."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr " dodana"
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Wyższa poziom dostępu jest niezbędny do korzystania z tej funkcji"
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr "Trzeba określić listę dyskusyjną, aby zapisać się."
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "Musisz podać adres e-mail, który chcesz zapisać się."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(brak tematu)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "BŁĄD:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Puta wiadomość"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Anulowane. Wiadomość nie została wysłana."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Automatycznie anulowane, ponieważ zapisano już tę wiadomość."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "Zapisane w Roboczych nie powiodło sie: "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "Odmowa wysłania pustej wiadomości.\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "Wiadmość została zapisana do Roboczych.\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Wiadomość została wysłana.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Wiadomość została wysłana.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Wiadomość nie została przeniesiona."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "Wystąpił błąd podczas pobierania tej części: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Wystąpił błąd podczas pobierania tej części: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Dołączyć podpis do wiadomości e-mail?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Użyj tego podpisu:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Domyślne kodowanie w nagłówkach e-mail:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Preferowany adres e-mail"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Preferowana nazwa wyświetlana w wiadomościach e-mail"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Preferowane nazwa wyświetlana w wiadomościach BBS"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Tryb wyświetlania skrzynki pocztowej"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Nie wiem, jak wyświetlić "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Kliknij na jakąkolwiek notatkę w celu edycji."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Zarządzanie kontem OpenID"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Czy na pewno chcesz usunąć OpenID?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(usuń)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Dodaj OpenID: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Załącz"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s nie zezwala na uwierzytelnianie za pomocą OpenID."
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Wyślij wiadomość"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Wyślij wiadomość do: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Wpisz tekst wiadomości:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Wyślij wiadomość"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Wiadomość nie została wysłana."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Wiadomość została wysłana do "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Anulowane. Ustawienia nie będą zmienione."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Ustaw jako stronę startową"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "To nie może ustawić jako strona startowa."
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Nie masz strony startowej ustawionej."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "Zalecana strona stratow"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Moje Foldery"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Anulowane. Zmiany nie zostały zapisane."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Twoje zmiany zostały zapisane."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "User '%s' wyrzucony z pokoju '%s'."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "User '%s' zaproszony do pokoju  '%s'."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Anulowane. Nowy pokój nie będzie utworzony."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Piętro zostało usunięte."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Nowe piętro zostało utworzone."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Lista pokoi"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Pokaż puste piętra"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "plik"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "pliki"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Bulletin Board"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Folder poczty"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Książka adresowa"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Kalendarz"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Lista zadań"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Lista notatek"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Lista kalendarza"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Dziennik"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Wersje robocze"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Ten serwer obsługuje już maksymalną liczbę użytkowników i nie może "
+"przyjmować żadnych dodatkowych loginów w tym czasie. Spróbuj ponownie "
+"później lub skontaktuj się z administratorem systemu."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "Otrzymałeś nieoczekiwaną odpowiedź z serwera Citadel; ratuj się."
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Jesteś podłączony do serwera z systemem Citadel  %d.%02d. \n"
+"W celu uruchomienia tej wersji WebCit musisz mieć Citadel %d.%02d lub "
+"nowszy.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Konfiguracja systemu  została zaktualizowany."
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr "Pierwsza próba oczekuje"
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Brak)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Brak)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Anulowano.  %s nie będzie zapisane."
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr " zostało zapisane."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Informacj o pokoju"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Twoje  bio"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Zakończone ?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Nazwa zadania"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Data zakończenia"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Kategoria"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Wyświetl wszystkie"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Edycja zadania"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Data rozpoczęcia:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Brak daty"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "albo"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Powiązanie  czasu"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Data zkończenia:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Zakończone:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Kategoria:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"Wystąpił błąd podczas tworzenia lub edycji tego wpisu książki adresowej.."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Zmiany nie zostały zapisane."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Nowy użytkownik został stworzony."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"Próbujesz utworzyć nowego użytkownika od wewnątrz Citadel podczas pracy w "
+"trybie uwierzytelniania hosta. W tym trybie, należy utworzyć nowego "
+"użytkownika w systemie hosta, a nie w Citadel."
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Nie można zdekodować vCard zdjęcia\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Błąd"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Nie można wejść do pokoju, aby zapisać wiadomość"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Przerwane."
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(brak nazwy)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "edycja"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Wymagana autoryzacja"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"Zasób który prosiłeś wymaga poprawnej nazwy użytkownika i hasło. Nie można "
+"się zalogować: %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Ten program nie był w stanie się połączyć . Proszę zgłosić ten problem do "
+"administratora systemu."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Czytaj więcej ..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' pokój nie jest Wiki."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Data"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Autor"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(pokaż)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Bieżąca wersja"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(cofnij)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Tytuł strony"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Wpisz polecenie serwera"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Ekran ten pozwala na wprowadzanie poleceń Citadel serwera, które nie są "
+"obsługiwane przez WebCit. Jeśli nie wiesz, co to oznacza, to ekran nie "
+"będzie zbyt użyteczna dla Ciebie."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Wpisz polecenie:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Wprowadzenie komendy (jeżeli żądanie tryb transferu SEND_LISTING):"
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr "Wykryty  nagłówek hosta "
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Wyniki poleceń serwera"
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr "Wpisz inną komendę"
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr "Powrót do menu"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Konfiguracja sieciowa"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Dodaj nowy węzeł (node)"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Obecnie skonfigurowane węzły"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "Menu Administracji Systemu"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr "Pokój Menu Admin"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Lokalne aliasy systemu (host)"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Smart hosts"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr "Hosty powiadamiające"
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "RBL hosts"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "SpamAssassin hosts"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr "ClamAV clamd hosts"
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr "Maskowane domeny"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Globalna konfiguracja"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Zarządzanie kontami użytkowników"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "Shutdown Citadel"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Pokoje i Piętra"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr "Restart Citadel"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "Wiadomość do użytkowników:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Konfiguracja strony"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr "Musisz być  pomcnikiem aby móc wyświetlić to."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "Ogólnie"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Ustawienia ikon"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "Natychmiastowe przesyłanie wiadomości (push e-mail)"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indeksowanie / księgowanie"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Dostęp"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr "Katalog"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Automatyczne czyszczenie"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Aby utworzyć nowe konto użytkownika, wprowadź żądaną nazwę użytkownika w "
+"polu poniżej i kliknij przycisk \"Utwórz\"."
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Nowy użytkownik: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Aby edytować istniejące konto użytkownika, wybierz nazwę użytkownika z listy "
+"i kliknij przycisk \"Edytuj\"."
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Edytuj konto użytkownika: "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Nazwa użytkownika"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Hasło"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Uprawnienie do wysyłania poczty internetowej"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Główny adres email"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Internetowe email aliasy"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Liczba logowań"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Wiadomości wysłane"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Poziom dostępu"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "Numer ID użytkownika"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Data i czas ostatniego logowania"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Auto-czyszczenie po ilosci dni"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Edytowanie lub usuwanie użytkowników"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Dodaj użytkowników"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Wdycja lub usuwanie użytkowników"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Dodaj, zmień, lub usuń piętra"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Nazwa węzła"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Wspólny serkretny klucz"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Host lub IP adres"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Numer portu"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Potwierdź usunięcie"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Czy na pewno chcesz usunąć "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Tak"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Nie"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr "(Edycja)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Usuń)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(Domeny, dla których ten host odbiera pocztę)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(hosts na których działa usługa clamd ClamAV)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(Domeny odwzorowywane z Global Address Book)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+"(wysłać pocztę wychodzącą do tych hostów tylko wtedy, gdy bezpośrednie "
+"dostrczenie nie jest możliwe)"
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "(Domeny w które użytkownicy mogą maskować)"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr "(URLS do powiadomień, gdy użytkownicy otrzymują nową pocztę; )"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr "Syntax: Powiadomienie:http[s]://user:password@hostname/path"
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(hosts z Realtime Blackhole Listy)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+"(jeśli występuje, przekąz wszystkie wychodzące e-mail do jednego z tych "
+"hostów)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(hosts na których działa SpamAssassin )"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Uruchom ponownie Citadel"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "Restart po poinformowaniu użytkowników"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "Uruchom ponownie, gdy wszyscy użytkownicy nic nie robią w Citadel"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "Poczekaj chwilę server Citadel jest ponownie uruchomiany ... "
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+"Poczekaj użytkownicy są informowani że serwer zostanie uruchomiony "
+"ponownie ... "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Kontrola dostępu i ustawienia zasad serwisu"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Umożliwiaj adiuktowi zapomnieć pokoje"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Kwarantanny wiadomości od użytkowników problemowych"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Nazwa miejsca kwarantanny"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Nazwa pokoju do strony logowania"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr "Tryb uwierzytelniania"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr "Autonomiczny"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr "Host based"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr "LDAP (RFC2307)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr "LDAP (Active Directory)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr "Umożliwiają anonimowy użytkownikom dostęp"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Początkowy poziom dostępu dla nowych użytkowników"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Poziom dostępu wymagane do utworzenia pokoje"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+"Automatycznie przyznania statusu pokój-doradca dla użytkowników, którzy "
+"tworzą prywatne pokoje"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+"Automatycznie przyznania statusu pokój-doradca dla użytkowników, którzy "
+"tworzą pokoje BLOG"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Ograniczanie dostępu do poczty internetowej"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "Wyłączenia tworzenia konta użytkownika samoobsługowo"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr "Wskazówka: nie należy wybierać obu opcji!"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "Wymaga rejestracji dla nowych użytkowników"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Skonfigurować automatyczne wygaśnięcie starych wiadomości"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+"Te ustawienia mogą być nadpisane na lub poszczególnych pięter lub "
+"pojedynczego pokoju."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Godzin do uruchomienia bazy danych auto-oczyszczających"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "Domyślna polityka wygasania wiadomość dal publicznych pokoi"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Nigdy automatycznie wygasa wiadomości"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Tracą ważność wg liczby wiadomości"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Wygasają według wieku wiadomości"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Liczba wiadomości lub dni: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+"Domyślna polityka wygasania wiadomość w prywatnych skrzynekach  pocztowych"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Taka sama polityka jak w pokojach  publicznych"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Domyślna czas sprzątanie użytkownika (liczba dni)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Domyślny czas  sprzątania pokoi (liczba dni)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Skonfigurować złącze LDAP dla Cytadeli"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"Zmiany dokonane na tym ekranie nie zostaną zastosowane dopiero po ponownym "
+"uruchomieniu serwera Cytadeli."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"UWAGA: Ten serwer Citadel została zbudowana bez wsparcia LDAP. Opcje te nie "
+"mają żadnego wpływu."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Nazwa hosta  LDAP server (puste, aby wyłączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Numer portu  LDAP server (puste, aby wyłączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "Podstawowa domena"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "Powiązana DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Hasło dla bind DN"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "Ogólne elementy konfiguracji systemu"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "Zmień logo Logowania"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "Zmień logo Wyloguj"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Pełna nazwa hosta np (nocall.ampr.org)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Czytelna dla użytkowników nazwa węzła"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Numer telefonu"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Prompt stronicowania (tylko dla klientów w trybie tekstowym)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Lokalizacja geograficzna: kraj, miasto"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Nazwa administratora systemu"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Domyślna strefa czasowa dla pozycji kalendarza"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "IMAP listener port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "IMAP over SSL port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr "Zachowaj oryginał z nagłówków w IMAP"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indeksowanie i księgowanie"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Ostrzeżenie: zadania te są źródłem intensywnego obciązenia"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Umożliwienie pełnego indeksu tekstowego"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "Przeprowadzić księgowanie wiadomości e-mail"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "Przeprowadzić księgowanie wiadomości nie będących pocztą"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "Przeznaczenia wiadomości e-mail z księgowanych"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "POP3 listener port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "POP3 over SSL port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr "POP3 sprowadzić częstotliwość w sekundach"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "POP3 najszybciej sprowadzić częstotliwość w sekundach"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr "Funambol server host (puste aby wyłączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "Funambol server port "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "Funambol sync source"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "Funambol auth details (user:pass)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr "Narzędzie do powiadamiania zewnetrzne (puste aby wyłączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Usługi sieciowe"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "Server IP adres (0.0.0.0 dla 'każdego IP')"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "XMPP (Jabber) client to server port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "XMPP (Jabber) server to server port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "POP3 listener port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "POP3 listener port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Zaawansowana kontrola (dostrajanie) serwera"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Maksymalna długość wiadomości"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Limit czasu połączenia z serwerem bezczynności (w sekundach)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "Częstotliwość uruchamiania sieci (w sekundach)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Maksimum sesji równoległych (0 = brak limitu)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Minimalna liczba wątków"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Maksymalna liczba wątków roboczych"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Automatyczne usuwanie ?zaangażowanych? lgów  baz danych"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "SMTP MTA port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "SMTP MSA port (-1 aby wyłączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTP over SSL port (-1 aby włączyć)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr "Przeprowadzenie kontroli RBL  zamiast po RCPT"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "Zaznacz jako spam wiadomość, zamiast odrzucenia"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr "Allow unauthenticated SMTP clients to spoof this sites domains"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "Skryguj podrobione linie Od:  podczas uwierzytelniania protokołu SMTP"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr "Postfix TCP Dictionary Port"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr "-1 aby wyłączyć"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "ManageSieve Port (-1 aby włączyć)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Dodawanie, zmienianie, usuwanie kont użytkowników"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Edycja konfiguracji systemu"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Nazwy domen i konfiguracja poczty internetowej"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Internetowe email aliasy"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "Zobacz wychodzącą kolejkę SMTP"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Wyloguj"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Podstawowe polecenia"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Twoje info"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Zaawansowane komendy pokoju"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Wczytywanie"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Anonimowo"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Napisz wiadmość"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr "Zapisz do Roboczych"
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Załączniki:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "Od"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "Do:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "DW:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "BCC:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Temat (opcjonalnie)"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Temat:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- wiadomośc przekazywana ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Zamknij okno"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Dołącz plik"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr "Usuń"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Pliki dostępne do pobrania w"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Prześlij plik:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Nazwa pliku"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Wielkość"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Zawartość"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Opis"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Prześlij zdjęcie"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Możesz przesłać zdjęcie bezpośrednio z komputera"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Wybierz plik do wysłania:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Prezentacja"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Dodaj/zmień/usuń  piętra"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Numer piętra"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Nazwa piętra"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Liczba pokoi"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "CSS piętra"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(usuń piętro)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Musisz się zalogować, aby uzyskać dostęp do tej strony."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "Zaloguj się przy użyciu<br>nazwy użytkownika i hasła"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Hasło"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Zaloguj"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Nowy użytkownik? Zarejestruj się"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+"Wprowadź login i hasło, którego chcesz używać, a następnie kliknij przycisk "
+"&quot;Nowy użytkownik&quot; "
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Zaloguj się używając OpenID"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "OpenID URL:"
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr "Zaloguj się za pomocą Google"
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr "Zaloguj się za pomocą Yahoo"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr "Zaloguj się za pomocą AOL lub AIM"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr "Wpisz swój AOL lub Nazwe użytkownika AIM:"
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "Proszę czekać"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Jest to zmiana  '%s', które znajduje się już w kalendarzu."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr "Wydarzenie to byłoby sprzeczne z '%s', które jest już w kalendarzu."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Język:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Poczta"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Zadania"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Pokoje"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Użytkownicy online"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Chat"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Zaawansowane"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Zarządzanie"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "dostosuj to menu"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "przejść do listy pokojowej"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "przejść do menu"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Moje foldery"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Dostosuj pasek ikon"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Ikony  wyświetlaj jako:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "obrazki i tekst"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "tylko obrazki"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "tylko tekst"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Wybierz ikony, które chcesz zobaczyć, wyświetlany w menu 'bar' po lewej "
+"stronie ekranu."
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Logo strony"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Ikona opisująca tę stronę"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Twoja strona z zestawieniem"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Poczta (przychodząca)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Skrót do skrzynki odbiorczej poczty e-mail"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Twoja osobista książka adresowa"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Twoje osobiste notatki"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Skrót do kalendarza osobistego"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Skrót do osobistej listy zadań"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Kliknięcie tej ikony wyświetla listę wszystkich dostępnych pokoi (lub "
+"folderów) dostępnych."
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Kot jest online?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+"Kliknięcie tej ikony wyświetla listę wszystkich aktualnie zalogowanych "
+"użytkowników"
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Kliknięcie tej ikony przechodzi w tryb rozmowy w czasie rzeczywistym z "
+"innymi użytkownikami w tym samym pokoju."
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Zaawansowane opcje"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Dostęp do pełnego menu funkcji Citadel."
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Citadel logo"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Wyświetl ikone 'Powered by Citadel'"
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"Twój pasek ikon został zaktualizowany. Proszę wybrać jedną z jego opcji, aby "
+"kontynuować."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+"Może trzeba wymusić odświeżania (Shift-F5)>, aby zmiany odniosły skutek"
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Lista subskrypcji"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "List"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Żądanie potwierdzenia wysłany"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr "Jesteś zapisany "
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr " do "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr " listy dyskusyjnej."
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+"List serwerowi wysłał Ci wiadomość e-mail z linkiem łącza internetowego, aby "
+"kliknąć, aby potwierdzić subskrypcję."
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+"Ten dodatkowy krok jest dla ochrony, ponieważ zapobiega innym zapisać się do "
+"listy bez twojej zgody."
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+"Poszę kliknąć na link, który jest w e-mail, aby została potwierdzona "
+"subskrybcja."
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Wróc ..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr "BŁĄD"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr "Wypisałeś sie"
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr "od"
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr "listy dyskusyjnej."
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+"Listserwerowi wysłał Ci wiadomość e-mail z linkiem do strony internetowego, "
+"aby kliknąć, aby potwierdzić anulowanie subskrypcji."
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+"Ten dodatkowy krok jest dla ochrony, ponieważ zapobiega aby inni nie mogli "
+"zrezygnować z wypisania sie z listy bez twojej zgody."
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+"Proszę kliknąć na link, który jest w e-mail aby wypisanie zostało "
+"potwierdzone."
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr "Wróć ..."
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr "Potwierdzenie sukces!"
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr "Potwierdzenie nie powiodło się."
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr "Może to oznaczać jedną z dwóch rzeczy:"
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+"Czekałeś zbyt długo, aby potwierdzić subskrypcję /wypisanie (Link "
+"potwierdzający jest ważny tylko przez trzy dni)"
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+"Masz <i> już </ i> z powodzeniem potwierdzenie subskrypcji / wypisania  i "
+"starasz się zrobić to ponownie."
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr "Błąd zwracany przez serwer był: "
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr "Nazwa listy:"
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr "Twój adres email:"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr "(Jeśli subskrypcjia) preferowany format: "
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr "Jedna wiadomość na raz"
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr "Strawny format"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+"Podczas próby zapisać lub wypisać się z listy mailingowej, otrzymasz "
+"wiadomość e-mail zawierającą Link do strony internetowej kliknij na "
+"ostateczne potwierdzenie."
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+"Ten dodatkowy krok jest dla ochrony, ponieważ zapobiega prze próbami przez "
+"innych  zapisać lub wypisać ciebie z list."
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr "Zalogowany jako"
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr "Nie jesteś zalogowany"
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "powered by"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Zaloguj ponownie"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Edytować lub usunąć ten pokój"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Idź do 'ukrytego' pokoju"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Utwórz nowy pokój"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Utwórz nowy pokój"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "Zapomnij ten pokój"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Listuj wszystkie zapomniane pokoje"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Przeczytaj nowe wiadomości"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Lista znanych pokoi"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Gdzie dalej?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Idź do następnego pokoju"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "...z <em>nieprzeczytanymi</em> wiadomościami"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Przejdź do następnego pkoju"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(wrócić tu później)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Wróć"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "Ups! Powrót do "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Przeczytaj nowe wiadomości"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "... w tym pokoju"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Czytaj wszystkie wiadomości"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "...stare <em>i</em> nowe"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Wprowadź wiadmomość"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(odpowiedzieć w tym pokoju)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "Biblioteka plików"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(Lista plików dostępnych do pobrania)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Strona z zestawieniem"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Podsumowanie mojego konta"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Lista użytkowników"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(wszyscy zarejstrowani użytkownicy)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Do zobaczenia!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Zmień swoje hasło"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Wprowadź nowe hasło:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Wprowadź je ponownie, aby potwierdzić:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Zmień swoje preferencje i ustawienia"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Aktualizuj swoje dane kontaktowe"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Wprowadź swoje 'bio'"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Edytuj swoje online zdjęcie"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Pokaż/edytuj filtr pocztowy od strony servera"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "Edycja Twoich ustawień push email"
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr "Zarządzaj swoim OpenIDs"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Potwierdzić przeniesienie wiadomości"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Przenieść tę wiadomość:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Czytanie #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "wiadomości"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "od najstarszych do najnowszych"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "od najnowszych do najstarszych"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Nadawca"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Ładowanie wiadomości z serwera, proszę czekać"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Otwórz w nowym oknie"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Przenieść"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Kopiuj"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Drukuj"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Zobacz kontakty"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Dodaj nowy kontakt"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Widok dnia"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Widok miesiąca"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Dodaj nowe wydarzenie"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Lista kalendarza"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Wyświetlanie zadań"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Dodaj nowe zadanie"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Wyświetlanie notatek"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Dodaj nową notatkę"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Odśwież listę wiadomości"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Napisz list"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Strona domowa Wiki"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Edytuj tę stronę"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "Historia"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr "Nowy wpis na blogu"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Pomiń ten pokój"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "Nowa strona startowa"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "Twoja strona startowa została zmieniona."
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+"(Uwaga: to nie zmienia strony startowej w przeglądarce . Zmienia stronę, "
+"którą rozpoczyna się podczas logowania do"
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "Brak nowych wiadomości."
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "Twój OpenID"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "został pomyślnie zweryfikowany."
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr "Jednak nazwa użytkownika"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "konflikty z istniejącm użytkownikiem."
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Proszę podać nazwę użytkownika, którego chcesz użyć."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Preferencje i ustawienia"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Drzewo (foldery) zobacz"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Tabela (pokoje) zobacz"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 hour (am/pm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 godzinny"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Niedziela"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Poniedziałek"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Bez podpisu"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "Pełnea funkcjonalność"
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Tryb bezpieczny"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+"Tryb bezpieczny jest mniej intensywny w przeglądarce internetowej, ale nie w "
+"pełni funkcjonalny."
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr "Konfuguracja Push Email"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "Push email i SMS ustawienia"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+"Jeśli administrator włączył funkcję, Citadel może powiadomić serwer Funambol "
+"że  otrzymałeś nowy e-mail i automatycznie synchronizować wszystkie "
+"urządzenia z klientem Funambol zainstalowany."
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+"Ewentualnie, jeśli administrator skonfigurował go, Cytadela może wysłać "
+"wiadomość tekstową do Ciebie po nadejściu nowej poczty."
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr "Zawiadamiać Funambol server"
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr "Wysłać wiadomość tekstową do ..."
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr "(Użyj formatu międzynarodowego, bez zer wiodących  np +61415011501)"
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+"Użyj niestandardowego systemu powiadamiania skonfigurowanego przez "
+"administratora"
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr "Nie wysyłaj żadnych powiadomień"
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Nazwa pokoju: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Znajduje się na piętrze: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Domyślny widok pokoju: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Typ pokoju:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Publicznych (pojawia się automatycznie dla wszystkich)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Prywatne - ukryte (dostępne dla każdego, kto zna jego nazwę)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Prywatne - wymagają hasła: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Tylko zaproszenia - prywatne"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Prywatne (poczta tylko dla Ciebie)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Utwórz nowy pokój"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Nazwa pokoju: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Domyślny widok pokoju: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Typ pokoju:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Edycja informacji o pokoju"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr "Tekst jest sformatowany dla przeglądarki."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Idź do ukrytego pokoju"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Jeśli znasz nazwę ukrytego (zgadnij-name) lub hasla pokoju można wejść do "
+"tego pokoju, wpisując jego nazwę poniżej. Po uzyskaniu dostępu do prywatnego "
+"pokoju, pojawi się w regularnych ofert w pokojach, więc nie musisz wracać "
+"tutaj."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Wpisz nazwę pokoju:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Wprowadź hasło dla pokoju:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Ustawienia"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Polityka wygasania wiadomości"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Kontrola dostępu"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Współdzielenie"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Obsługa listy mailingowej"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Zdalne pobieranie"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(usunąć)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Wymienieni poniżej użytkownicy mają dostęp do tego pokoju. Aby usunąć "
+"użytkownika z listy dostępu, wybierz nazwę użytkownika z listy i kliknij "
+"'Kick \"."
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Przyznania innemu użytkownikowi dostępu do tego pokoju, wprowadź nazwę "
+"użytkownika w polu poniżej i kliknij przycisk \"Invite\"."
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Zaproszenia:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Użytkownicy"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Usuń ten pokój"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr "Ustawić lub zmienić ikonę dla tego pokoje baner"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr "Edycja informacji o pokoju"
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr "nazwa pokoju: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Jeśli prywatny, to obecni użytkownicy zapomną ten pokój"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Preferowani użytkownicy tylko"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Pokój tylko do odczytu"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "Wszyscy użytkownicy mogą dodawać, mogą usuwać wiadomości"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Pokój katalog plików"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Nazwa katalogu: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Przesyłanie dozwolone"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Pobieranie dozwolone"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Zachować wiadomości na serwerze?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Katalog widoczny"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Sieciowo wspólny pokój"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Stałe (nie ma auto-czystki)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "Temat Wymagany (Wymuś określić temat wiadomości)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Anonimowe wiadomości"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Brak anonimowych wiadomości"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Wszystkie wiadomości są anonimowi"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Pytaj użytkownika podczas wprowadzania wiadomości"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Adiutant pokoju: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Polityka wygasania wiadomość w tym pokoju"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Użyj domyślnej polityki dla tego piętra"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Polityak wygasania wiadomość na tym piętrze"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Użyj domyślnych ustawień systemowych"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "Odległy host"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Nazwa użytkownika"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Zachować wiadomości na serwerze?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "Interwał"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Pobrać następujące kanały RSS i przechowywać je w tym pokoju:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "Kanał URL"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>Zawartość tego pokoju  zostanie wysłana jako <b> indywidualne </ b> listy "
+"do następujących  odbiorców:</i><br><br>"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>Zawartość tego pokoju  zostanie wysłana jako <b>strezczenia</b> w liscie "
+"do następujących  odbiorców</i><br><br>"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Dodaj odbiorców z listy kontaktów lub innych książek adresowych"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "Pozwól nie abonentom wysyłać mail do tego pokoju."
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "Publikacja po tego pokoju musisz mieć pozwolenie Admin'a."
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr "Pozwól na samoobsługę wniosków o  zapisanie/ wypisanie."
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "URL do zapisania / wypisania się jest: "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Nie współdzielony z"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Współdzielony z"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Nazwa węzła"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Nazwa pokoju węzła"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Działania"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"Jeśli pokój jest współdzielony musi być współdzielony z obu stron. Dodawanie "
+"węzła do listy \"Udostępnione\" wysyła wiadomości, ale w celu uzyskania "
+"wiadomości, inne węzły muszą być skonfigurowane do wysyłania wiadomości w "
+"systemie. <li> Jeśli nazwa zdalnego pokój jest pusta, to przyjmuje się, że "
+"pokój ma identyczna nazwa na zdalnym węzle. <li> Jeśli nazwa zdalnego pokój "
+"jest inna, zdalny węzeł musi również skonfigurować nazwę pokoju."
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Informacj o pokoju"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Zapomnij /wypisz się z bieżacego pokoju"
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr "Jeśli wybierzesz tę opcję,"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr "zniknie z listy pokjów. Czy to chcesz zrobić?"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Zapomniane pokoje"
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+"Kliknij na jakiekolwiek pokoju aby ustawić un-zap i przejdź do tego pokoju."
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "nowych z"
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Wybierz stronę: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Szukaj: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Wszystko"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Dodawanie lub usuwanie skryptów"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Dodaj nowy skrypt"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"Aby utworzyć nowy skrypt, wprowadź żądaną nazwę skryptu w polu poniżej i "
+"kliknij przycisk \"Utwórz\"."
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Nazwa skryptu: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Edytuj skrypty"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Powrócić do ekranu edycji skrypt"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Usuń skryptów"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"Aby usunąć istniejący skrypt, wybierz nazwę skryptu z listy i kliknij \"Usuń"
+"\"."
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Jeśli"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Do lub CC"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Reply-to"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Resent-From"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Resent-To"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Envelope From"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Envelope To"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-Flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Status"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "List-ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Wielkośc wiadomości"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "zawiera"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "nie zawiera"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "jest"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "nie jest"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "pasuje do"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "nie pasuje do"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Wszystkie wiadomości)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "większe niż"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "mniejsze niż"
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr "bajtów"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Zachowaj"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Wyrzucić po cichu"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Odrzucić"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Przenieś wiadomość do"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Przekaż do"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Urlop"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Wiadomość:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "i wtedy"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "kontynuj przetwarzanie"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "zatrzymaj"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Gdy nadejdzie nowa poczta: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Filtrować je według zasad wybranych poniżej"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Zostaw go w skrzynce odbiorczej bez filtrowania"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+"Przefiltrowanego przez edytowanie ręczne skryptu (tylko dla zaawansowanych "
+"użytkowników)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Dodaj regułę"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"Instalacja Citadel została zbudowana bez obsługi po stronie serwera "
+"filtrowania poczty. <br> Proszę skontaktować się z administratorem systemu, "
+"jeśli potrzebujesz tej funkcji<br>"
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "Stare wiadomości"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "Nowe wiadomości"
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr "Zestawienie dla "
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Wiadomości"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Dziś&nbsp;w&nbsp;twoim&nbsp;kalendarzu"
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Kto&nbsp;jest&nbsp;online"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "O&nbsp;tym&nbsp;serwerze"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr "Jesteś połączony"
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr "uruchomiona"
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr "z"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr "wersja servera"
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr "mieszczącym się w"
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr "Administrator systemu:"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"WAGA: masz wyłączoną obsługę JavaScript w przeglądarce. Wiele funkcji tego "
+"systemu nie będzie działać poprawnie."
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Wprowadź swoje 'bio'"
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr "Lista użytkownika dla "
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Nazwa użytkownika"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Numer"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Poziom dostępu"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Ostatnie logowanie"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Liczba zalogowań"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Wszystkich postów"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Profil użytkownika"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr "Kliknij tutaj, aby wysłać wiadomość błyskawiczną do"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Edycja informacji kontaktu"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Prefiks"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Imię"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Drugie imię"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Nazwisko"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Sufiks"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Wyświetlana nazwa:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Stanowisko:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organizacja:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Skrytka pocztowa:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Adres:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Miejscowość:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Stan/województwo:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Kod pocztowy:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Państwo:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Domowy telefon:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Praca telefon:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Komórkowy:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Fax numer:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Ksiązka adresowa pusta."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Wystąpił błąd wewnętrzny."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Zamieść komentarz"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "Nowsze"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "Starsze"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d komentarzy"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "permalink"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "nowych z"
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "Nie masz uprawnień, aby zobaczyć ten zasób."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "Kolejka jest pusta"
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Odśwież te strone"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Odległy host"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Stan/województwo:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "kontynuj przetwarzanie"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr "Oryginalnie pisał w: "
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "ID wiadomości"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Data/czas wysłania"
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr "Następna próba"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Adresaci"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "od "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "do"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "Edycaj"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Odpowiedź"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "Odpowiedz z cytatem"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "Odpowiedz wszystkim"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Przekaż"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Nagłówki"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "Widok"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Pobieranie"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Wyświetl jako:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "Użytkownicy obecnie na "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+"Kliknij na nazwe użykownika, aby zobaczyć informacje o użytkowniku. kliknij"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "aby wysłać wiadomość błyskawiczną do tego użytkownika."
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(zabij)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Pokój"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "Połączony z komputera"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Edytuj wyświetlanie Twojej  sesji"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Ekran ten pozwala zmienić sposób w jaki sesja pojawi się szczególy w \"Kto "
+"jest online\"\". Aby wyłączyć wszelkie \"fałszywe\" nazwy już wcześniej "
+"ustawione, wystarczy kliknąć odpowiedni przycisk \"zmiany\" bez wpisywania w "
+"odpowiednim polu. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Nazwa pokoju:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Nazwa komputera:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr "Użytkownicy obecnie na"
+
+#: ../../static/t/who/section.html:5
+#, fuzzy
+msgid "Edit configuration"
+msgstr "Konfiguracja strony"
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "Ksiązka adresowa pusta."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "w "
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Wybierz link w banerze pokoju \"Edytuj stronę\" , jeśli chcesz utworzyć tę "
+"stronę."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Brak strony o nazwie '%s' tutaj."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr "Historia zmian dla tej strony"
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr "Lista stron Wiki"
+
+#~ msgid "the icon for this floor"
+#~ msgstr "ikona dla piętra"
+
+#~ msgid "Edit %s"
+#~ msgstr "Edytuj %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Zapisz zmiany"
+
+#~ msgid " (work)"
+#~ msgstr " (praca)"
+
+#~ msgid " (home)"
+#~ msgstr " (dom)"
+
+#~ msgid " (cell)"
+#~ msgstr " (mobile)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefon:"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Katalog domen"
+
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Awaryjne sprytne hosty"
+
+#, fuzzy
+#~ msgid "Create new room"
+#~ msgstr "Utwórz nowy pokój"
+
+#, fuzzy
+#~ msgid "Zap this room"
+#~ msgstr "Pomiń ten pokój"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Sieciowo wspólny pokój"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Dodaj nowy węzeł (node)"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "minuty"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Niepwne"
+
+#, fuzzy
+#~ msgid "Send"
+#~ msgstr "Nadawca"
+
+#, fuzzy
+#~ msgid "Delete this message?"
+#~ msgstr "Usuń ten pokój"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Informacj o pokoju"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "tylko obrazki"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Prześlij plik:"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Czy na pewno chcesz usunąć "
+
+#~ msgid "Upload"
+#~ msgstr "Wyślij"
+
+#~ msgid "Add"
+#~ msgstr "Dodaj"
+
+#, fuzzy
+#~ msgid "Invite"
+#~ msgstr "Zaproszenia:"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Użytkownicy"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Książka adresowa"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Usuń skryptów"
+
+#, fuzzy
+#~ msgid "Delete this user?"
+#~ msgstr "Usuń ten pokój"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Usuń"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "woja poczta przychodząca nie będzie filtrowana przez skrypty."
+
+#~ msgid "The currently active script is: "
+#~ msgstr "Skrypt jest aktualnie aktywny: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Konfiguracja replikacji z innymi serwerami węzłami Citadel"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Wyświetl ikone 'Powered by Citadel'"
+
+#, fuzzy
+#~ msgid "Go to your email inbox"
+#~ msgstr "Skrót do skrzynki odbiorczej poczty e-mail"
+
+#, fuzzy
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Skrót do kalendarza osobistego"
+
+#, fuzzy
+#~ msgid "Go to your personal address book"
+#~ msgstr "Twoja osobista książka adresowa"
+
+#, fuzzy
+#~ msgid "Go to your personal notes"
+#~ msgstr "Twoje osobiste notatki"
+
+#, fuzzy
+#~ msgid "Go to your personal task list"
+#~ msgstr "Skrót do osobistej listy zadań"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Listuj wszystkie zapomniane pokoje"
+
+#, fuzzy
+#~ msgid "Room and system administration functions"
+#~ msgstr "Administrator systemu:"
+
+#, fuzzy
+#~ msgid "Reset form"
+#~ msgstr "Strawny format"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Usuń ten pokój"
+
+#, fuzzy
+#~ msgid "Create new floor"
+#~ msgstr "Utwórz nowy pokój"
+
+#, fuzzy
+#~ msgid "Delete rule"
+#~ msgstr "Usuń"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(edycja grafiki)"
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "Zmień nazę pokoju"
+
+#, fuzzy
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Czy na pewno chcesz usunąć "
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Wpisz polecenie:"
+
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "Nazwa użytkownika Mistrz (puste, aby wyłączyć)"
+
+#~ msgid "Master user password"
+#~ msgstr "Hasło użytkownika Mistrz"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "Usuń ten pokój"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "List-ID"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "Strawny format"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Temat"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Czy na pewno chcesz usunąć OpenID?"
+
+#, fuzzy
+#~ msgid "Share"
+#~ msgstr "Współdzielenie"
+
+#~ msgid "Change password"
+#~ msgstr "Zmień hasło"
+
+#~ msgid "Change room name"
+#~ msgstr "Zmień nazę pokoju"
+
+#~ msgid "Change host name"
+#~ msgstr "Zmień nazwe komputera"
+
+#~ msgid "Change user name"
+#~ msgstr "Zmień nazwę użytkownika"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Zapisz zmiany"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Zapisałeś się  <TT>%s</TT> do <b>%s</ b> listy dyskusyjnej. List serwer  "
+#~ "wysłał Ci wiadomość e-mail z  linkiem do strony www, aby kliknąć, aby "
+#~ "potwierdzić subskrypcję. Ten dodatkowy krok jest dla ochrony, ponieważ "
+#~ "zapobiega innym  zapisać się do listy bez twojej zgody. <br><br> Proszę "
+#~ "kliknąć na link, który dostaniesz via e-mail, Twoja subskrypcja zostanie "
+#~ "potwierdzona.<br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr ""
+#~ "UWAGA: Nie można przetworzyć Server Config, czy uruchomić nowy citserve?"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Nie ma pokoju o nazwie '%s'."
+
+#~ msgid "Network"
+#~ msgstr "Sieć"
+
+#~ msgid "Tuning"
+#~ msgstr "Dostrajanie"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Natychmiast usuwaj skasowane wiadomości z IMAP"
diff --git a/webcit/po/webcit/pt_BR.po b/webcit/po/webcit/pt_BR.po
new file mode 100644 (file)
index 0000000..6e976f2
--- /dev/null
@@ -0,0 +1,4783 @@
+# translation of webcit.po to pt_BR.po
+# Copyright (C) 2008 - 2009 The Citadel Project - http://www.citadel.org
+# Marco Goncalves <room_citadel_translators@uncensored.citadel.org>, 2008.
+#
+# Brazilian / Portuguese tranlation
+# Copyright (C) 2005 - 2009 By Marco Goncalves
+# This file is distributed under the revised BSD license
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2010-11-25 13:41+0000\n"
+"Last-Translator: Alessandro Cesar <Unknown>\n"
+"Language-Team: <room_citadel_translators@uncensored.citadel.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2010-11-26 04:44+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Excluído"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Novo Usuário"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Usuário problemático"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Usuário local"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Usuário remoto"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Usuário preferencial"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Admin"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Ocorreu um Erro."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Validar novos usuários"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Sem usuários para validar no momento"
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "muito fraco"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "fraco"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "bom"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "forte"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Nível de acesso atual: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Selecione o nível de acesso para esse usuário:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Cancelado.  A senha não foi modificada."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Eles não batem.  Senha não foi modificada."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Senhas em branco não são permitidas."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "disponibilidade desconhecida"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "disponível"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "OCUPADO"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Ir para a página: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Primeiro"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Último"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Convite para reunião"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Reposta do convite do participante"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Evento publicado"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Esse é um tipo desconhecido de item de calendário"
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Resumo:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Localização"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Data:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Dia/hora de início:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Dia/hora de término:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Descrição:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Recorrências"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Esse é um evento recorrente"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Participante:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Essa é uma atualização de '%s' que já está no seu calendário."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+"Esse evento entrará em conflito com '%s' que já está no seu calendário."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Atualização:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "CONFLITO:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Como gostaria de responder a esse convite?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Aceitar"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Incerto"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Rejeitar"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Clique em <i>Atualizar</i> para aceitar essa resposta e atualizar seu "
+"calendário."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Atualizar"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignorar"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "Ocorreu um erro ao processar esse item de calendário"
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+"Você aceitou esse convite para reunião. Esta foi inclusa no seu calendário."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Você aceitou temporariamente esse convite para reunião. Esta foi 'rabiscada' "
+"no seu calendário."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Você rejeitou esse convite para reunião.  Esta <b>não</b> foi inclusa no seu "
+"calendário."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Uma resposta foi enviada para o organizador da reunião"
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Seu calendário foi atualizado para refletir esse RSVP."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"Você escolheu ignorar esse RSVP. Seu calendário <b>não</b> foi atualizado."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "Dia da visualização do calendário começa em:"
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "Dia da visualização do calendário termina em:"
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Semana começa em:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Hora: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minuto: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(estado desconhecido)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(necessita ação)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(aceito)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(rejeitado)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(temporário)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(delegado)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(completado)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(em processo)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(nenhum)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Evento sem título"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "A partir de"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Data Inicial"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Data Final"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Data/Hora"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Notas:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "anterior"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "próximo"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Semana"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Horas"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Assunto"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Início"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Fim"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Evento ocupando todo o dia"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Evento em curso"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Tarefa Anonima"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "Ocorreu um erro ao obter esse arquivo: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "segundos"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minutos"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "horas"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "dias"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "semanas"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "meses"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "anos"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "nunca"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "primeiro"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "segundo"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "terceiro"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "quarto"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "quinto"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Evento"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Participantes"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Adicionar ou editar um evento"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Resumo"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Local"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Notas"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organizador"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(você é o organizador)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Mostrar hora como:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Livre"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Ocupado"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(Um por linha)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Contatos"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Regra de recorrência"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Repete a cada"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "Nestes dias da semana"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "nos dias %s%d%s do mês"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "em "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "do mês"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "a cada "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "ano desta data"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "de"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Intervalo de recorrência"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Nenhuma data de término"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Repetir este evento"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "vezes"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Repetir este evento até "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Salvar"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Excluir"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Checar disponibilidade do participante"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Formato de hora"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Upload de gráficos foi cancelado."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Você não fez upload do arquivo."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "sua foto"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "o ícone para essa sala"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "a figura de boas vindas para esse prompt de login"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "a figura para o banner de logoff"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "Erro de realloc()! não foi possível obter %d bytes: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Configuração da barra de ícones"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Parâmetro inválido"
+
+#: ../../inetconf.c:128
+#, fuzzy
+msgid " has been deleted."
+msgstr "%s foi excluído."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+#, fuzzy
+msgid " added."
+msgstr "adicionada"
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Requer-se acesso privilegiado para acessar essa função."
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+#, fuzzy
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "Por favor especifique o nome do usuário que você gostaria de usar."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(sem assunto)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "ERRO:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Mensagem vazia"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Cancelado.  A mensagem não foi fixada."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Cancelado automaticamente porque você já salvou essa mensagem."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "Gravação para rascunhos falhou: "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "Recusando enviar mensagem vazia\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "A mensagem foi salva em rascunhos\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "A mensagem foi enviada.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Mensagem foi fixada.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "A mensagem não foi movida."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "Um erro ocorreu ao obter essa parte: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Um erro ocorreu ao obter essa parte: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Anexar assinatura em mensagens de email?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Usar essa assinatura:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Codificação padrão para cabeçalhos de email:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Endereço de e-mail preferencial"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Nome de exibição para mensagens de e-mail preferencial"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Nome de exibição para mensagens de bulletin board preferencial"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Modo de visualização da Caixa de Mensagens"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Eu não sei como exibir "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Clique em uma nota para editá-la."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Gerenciar Contas/Associação com OpenID"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Você realmente quer excluir este OpenID?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(excluir)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Adicionar um OpenID "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Anexar"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s não é permitido autenticação via OpenID"
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Mandar mensagem instantânea"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Mandar mensagem instantânea para: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Entrar mensagem de texto:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Enviar mensagem"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Mensagem não foi enviada."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Mensagem foi enviada para "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Cancelado. Nenhuma configuração foi modificada."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Fazer dessa página minha inicial"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "Isto não é permitido como página inicial"
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Você não tem mais uma página inicial selecionada."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "Página Inicial preferencial"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Minhas Pastas"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Cancelado. Modificações não foram salvas."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Suas modificações foram salvas"
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Usuário %s foi chutado da sala %s."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Usuário %s foi convidado para a sala %s."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Cancelado. Nenhuma sala foi criada."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Andar foi excluído."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Um novo andar foi criado."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Visualização lista de salas"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Exibir andares vazios"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "arquivo"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "arquivos"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Quadro de Mensagens"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Pasta para Correio"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Caderno de Endereços"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Calendário"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Lista de Tarefas"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Lista de Notas"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Lista de Calendários"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Diário"
+
+#: ../../roomviews.c:60
+#, fuzzy
+msgid "Drafts"
+msgstr "Data"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Este servidor já atingiu o número máximo de usuários permitidos e não pode "
+"aceitar nenhum login adicional neste momento. Por favor tente novamente mais "
+"tarde ou contate seu administrador de sistemas."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "Recebida uma resposta não esperada do servidor Citadel; Salvando."
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Você está conectado à um servidor Citadel rodando Citadel %d.%02d. \n"
+"Para rodar essa versão do WebCit você também deve ter o Citadel %d.%02d ou "
+"mais novo.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Sua configuração do sistema foi atualizada."
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Nenhum)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Nada)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Cancelado.  %s não foi salvo"
+
+#: ../../sysmsgs.c:53
+#, fuzzy
+msgid " has been saved."
+msgstr "%s foi salvo."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Informações da sala"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Sua bio"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Concluído?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Nome da tarefa"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Data de vencimento"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Categoria"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Exibir Todos(as)"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Editar tarefa"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Data de início:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Sem data"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "ou"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Tempo associado"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Vencimento:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Concluído:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Categoria:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"Um erro ocorreu na criação ou edição desta entrada no caderno de endereços."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Modificações não foram salvas."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Um novo usuário foi criado."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"Você está tentando criar um novo usuário no Citadel enquanto no modo de "
+"autenticação baseado em host.  Nesse modo, você deve criar novos usuários no "
+"sistema hospedeiro, não dentro do Citadel."
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Não foi possível visualizar a foto do vcard\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Erro"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Impossibilidado de entrar na sala para salvar sua mensagem"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Abortando."
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(sem nome)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "editar"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Autorização Requerida"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"O recurso que você pediu requer um nome de usuário e senha válidos. Você "
+"pode não estar logado: %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Esse programa foi incapaz de conectar ou manter conexão com o servidor "
+"Citadel.  Se possível, reporte esse problema para seu administrador de "
+"sistema."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Continuar..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' não é uma sala Wiki."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Data"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Autor"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(exibir)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Versão atual"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(voltar)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Título da página"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "Entrar um comando de servidor"
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"Essa tela permite que você entre comandos de servidor Citadel que não são "
+"suportados pelo WebCit. Se você não sabe o que isso significa, essa tela não "
+"será de muita utilidade para você."
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "Entre comando:"
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+#, fuzzy
+msgid "Detected host header is "
+msgstr "Cabeçalho detectado do computador é %s://%s"
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "Resultados do comando"
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr "Entre outro comando"
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr "Retornar ao menu"
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Configuração da rede"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "Adicionar novo nódulo"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "Nódulos atualmente configurados"
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "Menu de administração do sistema"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+#, fuzzy
+msgid "Room Admin Menu"
+msgstr "Admin da sala: "
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "Nomes simbólicos do computador local"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "Servidores inteligentes"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "Computadores RBL"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "Computadores SpamAssassin"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr "Domínios mascaráveis"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "Configuração Global"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "Manejamento de contas de usuário"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "Desligar o Citadel"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "Salas e andares"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr "Reinicie o Citadel"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "Mensagem para seus Usuários:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "Configuração do sítio"
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+#, fuzzy
+msgid "You need to be aide to view this."
+msgstr "Você não tem permissão para visualizar esse recurso."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "Geral"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Configuração da barra de ícones"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "Email Push"
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "Indexação/Journaling"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "Acesso"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr "Diretório"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "Excluidor automático"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"Para criar uma nova conta de usuário, digite o nome de usuário desejado na "
+"caixa abaixo e clique em 'Criar'."
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "Novo usuário: "
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Para editar uma conta de usuário existente, selecione o nome de usuário na "
+"lista e clique em 'Editar'."
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "Editar conta de usuário: "
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Nome do usuário:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Senha"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "Permissão para enviar email na Internet"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Endereço de e-mail primário"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Nomes alternativos para e-mail de Internet"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "Número de logins"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "Mensagens enviadas"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "Nível de acesso"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "Número ID do usuário"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "Data e hora do último login"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "Excluir automaticamente após essa quantidade de dias"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "Editar ou excluir usuários"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "Adicionar usuários"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "Editar ou Remover usuários"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "Adicionar, modificar ou excluir andares"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "Nome do nódulo"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "Segredo compartilhado"
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "Nome do computador ou endereço IP"
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "Número da porta"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Confirmar exclusão"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Tem certeza que quer excluir "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Sim"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Não"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr "(Editar)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Excluir)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(domínios os quais esse computador recebe mensagens)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+#, fuzzy
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(computadores rodando o serviço SpamAssassin)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(domínios mapeados com o Caderno de Endereços Global)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "(Domínios cujos usuários estão autorizados a mascarar)"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(computadores rodando um 'Realtime Blackhole List')"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+"(se presente, encaminhar todas as mensagens para computadores externos para "
+"um desses computadores)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(computadores rodando o serviço SpamAssassin)"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Reiniciar agora"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "Reiniciar após 'pagear' usuários"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "Reiniciar quando todos os usuários estiverem ociosos"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "Espere enquanto o servidor Citadel é reiniciado... "
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+"Por favor espere enquanto seus usuários estão sendo 'pageados', o servidor "
+"Citadel será reiniciado logo após... "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "Configurações de controle de acesso e política do sítio"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Permitir que aides esqueçam salas"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "Mover mensagens de usuários problema para a quarentena"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "Nome da sala de quarentena"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "Nome da sala para logar páginas"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+#, fuzzy
+msgid "Authentication mode"
+msgstr "Modo de autenticação"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+#, fuzzy
+msgid "Self contained"
+msgstr "contém"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+#, fuzzy
+msgid "Host based"
+msgstr "Nome do host:"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr "LDAP (RFC2307)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr "LDAP (Diretório Ativo)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr "Permitir acesso de convidado anônimo"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "Nível de acesso inicial para novos usuários"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "Nível de acesso necessário para criar salas"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+"Permitir que criadores de salas privadas tenham status de aide das mesmas."
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+#, fuzzy
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr "Permitir que criadores de salas BLOG tenham status de aide das mesmas."
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "Restringir acesso a correio eletrônico da Internet"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+"Desabilitar criação de conta por responsabilidade do usuário (self-service)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr "Dica: não selecione os dois"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "Requerer registro de usuários novos"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "Configurar vencimento automático de mensagens antigas."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+"Essas configurações poderão ser ignoradas dependendo das configurações da "
+"sala ou andar."
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "Hora a rodar exclusão automática no banco de dados"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "Política de vencimento padrão para salas públicas"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "Nunca expirar mensagens automaticamente"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "Expirar por número de mensagens"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "Expirar por idade das mensagens"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "Número de mensagens ou dias: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr "Política de vencimento padrão para caixas de mensagens privadas"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "Usar a mesma política das salas públicas"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "Tempo padrão para exclusão automática de usuário (dias)"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "Tempo padrão para exclusão automática de sala (dias)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Configurar o conector LDAP para o Citadel"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+"Mudanças feitas nessa tela não terão efeito até você reiniciar o servidor "
+"Citadel."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+"NOTA: Esse servidor Citadel foi criado sem suporte a LDAP.  Essas opções não "
+"terão efeito."
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Nome do servidor LDAP (deixe em branco para desabilitar)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Número da porta do servidor LDAP (deixe em branco para desabilitar)"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "Base DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "Bind DN"
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "Senha para bind DN"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "Itens de configuração geral do sítio"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "Mudar Logotipo de Login"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "Mudar Logotipo de Logout"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "Nome de domínio completamente expressado (FQDN)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "Nome legível do nódulo"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "Número do telefone"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Prompt do paginador (para clientes em modo texto)"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "Local geográfico desse sistema"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "Nome do administrador do sistema"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Zona horária para itens de calendário sem zona definida"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "Porta para requisições IMAP (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "Porta para requisições IMAP sobre SSL (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr "Manter cabeçalhos originais no IMAP"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "Indexação e Journaling"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "Aviso: essas funções utilizam mais recursos do sistema."
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "Ativar índice de texto inteiro (full text index)"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "Realizar journaling de mensagens de email"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "Realizar journaling de outras mensagens (não-email)"
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "Destino (email) de mensagens onde journaling foi realizado"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "Porta para requisições POP3 (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "Porta para requisições POP3 sobre SSL (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+#, fuzzy
+msgid "POP3 fetch frequency in seconds"
+msgstr "Frequência do \"network run\" (em segundos)"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+#, fuzzy
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "Frequência do \"network run\" (em segundos)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr "Host do servidor Funambol (em branco para desativar"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "Porta do servidor Funambol "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "Fonte de sincronia Funambol"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "Det. autenticação Funambol (user:pass)"
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr "Ferramenta de pager externa (em branco para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "Serviços de rede"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "Endereço IP a ser usado pelo servidor (0.0.0.0 para 'qualquer um')"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "Porta para requisições XMPP (Jabber) (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+"Porta para requisições servidor-servidor XMPP (Jabber) (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "Porta para requisições POP3 (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "Porta para requisições POP3 (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "Controles de afinação-fina do servidor"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "Extensão máxima de mensagem"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Timeout para conexões ociosas com o servidor (em segundos)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "Frequência do \"network run\" (em segundos)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Número máximo de sessões correntes (0 = sem limites)"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "Número mínimo de \"worker threads\""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "Número máximo de \"worker threads\""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "Exlcuir automaticamente logs de banco de dados já aplicados"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "Porta para requisições SMTP MTA (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "Porta para requisições SMTP MSA (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "Porta para requisições SMTP sobre SSL (-1 para desativar)"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr "Realizar checagens RBL na conexão ao invés de após RCPT"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "Marque a mensagem como spam, ao invés de rejeitá-la"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+#, fuzzy
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+"Permitir que clientes SMTP não autenticados personifiquem (spoof) os "
+"domínios desse sítio"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "Corrigir linhas 'De:' forjadas durante autenticação SMTP"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr "-1 para desabilitar"
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "Porta para requisições ManageSieve (-1 to disable)"
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "Adicionar, modificar e excluir contas de usuários"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "Editar configurações globais do site"
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "Nomes de domínios e configuração de correio eletrônico (Internet)"
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Nomes alternativos para e-mail de Internet"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "Visualizar a fila SMTP externa"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Log off"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Comandos básicos"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "Informações sobre você"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "Comandos avançados de sala"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Carregando"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Anônimo"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "Fixar mensagem"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr "Salvar em rascunhos"
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Anexos:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "de"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "em"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "Para:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "CC:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "BCC:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Assunto (opcional):"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Assunto:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "--- mensagem encaminhada ---"
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Fechar janela"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Anexar arquivo"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+#, fuzzy
+msgid "Remove"
+msgstr "(excluir)"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Arquivos disponíveis para download em"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Fazer upload de um arquivo:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Nome do arquivo"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Tamanho"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Conteúdo"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Descrição"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Upload de imagem"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Você pode fazer upload de uma imagem diretamente do seu computador"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Selecione um arquivo para fazer upload:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Apresentação"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Adicionar/modificar/excluir andares"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Número do andar"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Nome do andar"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Numero de salas"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "CSS do andar"
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(excluir andar)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Você deve estar logado para acessar esta página."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "Log in usando um nome de usuário e senha"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Senha:"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Entrar"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Novo usuário? Cadastre-se agora"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+"entre com seu nome e senha que você deseja usar, e clique em &quot;Novo "
+"Usuário.&quot; "
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Log in usando OpenID"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "URL do OpenID:"
+
+#: ../../static/t/get_logged_in.html:90
+#, fuzzy
+msgid "Log in using Google"
+msgstr "Log in usando OpenID"
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Log in usando OpenID"
+
+#: ../../static/t/get_logged_in.html:100
+#, fuzzy
+msgid "Log in using AOL or AIM"
+msgstr "Log in usando OpenID"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr "Por favor espere"
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Essa é uma atualização de '%s' que já está no seu calendário."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr ""
+"Esse evento entrará em conflito com '%s' que já está no seu calendário."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Idioma:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Correio"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Tarefas"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Salas"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Usuários online"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Bate-papo"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Avançado"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Administração"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "personalizar esse menu"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "mudar para lista de salas"
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "mudar para menu"
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Minhas pastas"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Personalizar a barra de ícones"
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "Exibir ícones como:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "imagens e texto"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "apenas imagens"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "apenas texto"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+"Selecione os ícones que deseja ver no menu 'barra de ícones' no lado "
+"esquerdo da tela"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Logotipo do site"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "Um ícone descrevendo esse site"
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "Sua página de resumo"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "Correio (caixa de entrada)"
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "Um atalho para sua caixa de entrada"
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "Seu caderno de endereços pessoal"
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "Suas notas pessoais"
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "Um atalho para seu calendário pessoal"
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "Um atalho para sua lista de tarefas pessoal"
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+"Clicar nesse ícone exibe uma lista de todas as salas (ou pastas) acessíveis."
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Quem está online?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr "Clicar nesse ícone exibe uma lista de todos os usuários conectados."
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+"Clicar nesse ícone inicia um bate-papo em tempo real com outros usuários da "
+"mesma sala."
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Opções avançadas"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Acesso ao menu completo de funções do Citadel"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "Logotipo do Citadel"
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Mostra o ícone 'Powered by Citadel'"
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+"Sua barra de ícones foi atualizado. Por favor, selecione qualquer uma das "
+"suas escolhas para continuar."
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+"Você precisa forçar a atualização (SHIFT-F5)> para que as mudanças tenham "
+"efeito"
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Inscrição da lista"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Inscrever/desinscrever da lista"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Pedido de confirmação enviado"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+#, fuzzy
+msgid " to the "
+msgstr "em "
+
+#: ../../static/t/listsub/display.html:21
+#, fuzzy
+msgid " mailing list."
+msgstr "Serviço de correio em massa"
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Voltar..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+#, fuzzy
+msgid "ERROR"
+msgstr "ERRO:"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+#, fuzzy
+msgid "from the"
+msgstr "de "
+
+#: ../../static/t/listsub/display.html:42
+#, fuzzy
+msgid "mailing list."
+msgstr "Serviço de correio em massa"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+#, fuzzy
+msgid "Back..."
+msgstr "Voltar..."
+
+#: ../../static/t/listsub/display.html:57
+#, fuzzy
+msgid "Confirmation successful!"
+msgstr "Pedido de confirmação enviado"
+
+#: ../../static/t/listsub/display.html:59
+#, fuzzy
+msgid "Confirmation failed."
+msgstr "Configuração"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Nome da tarefa"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Endereço de e-mail preferencial"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "Entrar mensagem de texto:"
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "Formato de hora"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr "Conectado como"
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr "Não está conectado."
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "desenvolvido por"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Refazer log in"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "Editar ou excluir essa sala"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "Ir para uma sala 'escondida'"
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Criar uma nova sala"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Criar uma nova sala"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "Zap (esqueça) esta sala"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "Listar todas as salas esquecidas"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Ler mensagens novas"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "Listar salas conhecidas"
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "Aonde posso ir daqui?"
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Ir para próxima sala"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "...com mensagens <em>não lidas</em>"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "Pular para próxima sala"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(volte aqui mais tarde)"
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Desfazer 'ir'"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "oops! Voltar ao "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Ler mensagens novas"
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "...nessa sala"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Ler todas as mensagens"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "...antigas <em>e</em> novas"
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Colocar uma mensagem"
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(fixar mensagens nessa sala)"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "Biblioteca de arquivos"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(Listar arquivos disponíveis para download)"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "Página resumo"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "Resumo da minha conta"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Lista de usuários"
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(todos os usuários registrados)"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "Adeus!"
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Modificar sua senha"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Digite nova senha:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Digite novamente para confirmar:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "Modificar suas preferências e configurações"
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "Atualizar suas informações para contato"
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "Entre sua 'bio'"
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "Editar sua foto online"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Visualizar/editar filtros de correio do lado do servidor"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "Editar suas configurações de 'push email'"
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr "Gerencie seus OpenIDs"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Confirmar a movimentação da mensagem"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Mover essa mensagem para:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Lendo #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "mensagens"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "antigas para mais novas"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "novas para mais antigas"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Autor"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Carregando mensagens do servidor, por favor aguarde"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Abrir em uma nova janela"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Mover"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Copiar"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Imprimir"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "Visualizar contatos"
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Adicionar novo contato"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "Visualização por dia"
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "Visualização por mês"
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Adicionar novo evento"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "Lista de calendários"
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "Visualizar tarefas"
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Adicionar nova tarefa"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Visualizar notas"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Adicionar nova nota"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Atualizar lista de mensagens"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Escrever mensagem"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Página inicial do Wiki"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Editar essa página"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "Histórico"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "posts recentes"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Pular essa sala"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "Nova página inicial"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "Sua página inicial foi alterada."
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+"(Nota: isto não altera a página inicial do seu navegador. Ele altera a "
+"página que você começa quando você logar no"
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "Nenhuma nova mensagem."
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "Sua OpenID"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "Verificado com sucesso"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr "No entanto, o nome do usuário"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "conflito com um usuário existente."
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Por favor especifique o nome do usuário que você gostaria de usar."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "Preferências e configurações"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "Visualização em árvore (pastas)"
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "Visualização em tabela (salas)"
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 horas (am/pm)"
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 horas"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Domingo"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Segunda"
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "Sem assinatura"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "Modo seguro"
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+#, fuzzy
+msgid "Configure Push Email"
+msgstr "Email Push"
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "Configurações de 'push email' e SMS"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+"Se você souber o nome de um oculto (acho que o nome) ou sala com senha, você "
+"pode entrar naquela sala, digitando o seu nome abaixo. Depois de ganhar "
+"acesso a uma sala privada, ele irá aparecer na sua listagem de sala regular "
+"assim que você não precisa voltar sempre aqui."
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+"Alternativamente, se o administrador configurou isto, o Citadel pode enviar "
+"uma mensagem de texto para você quando chegar uma nova mensagem."
+
+#: ../../static/t/prefs/pushemail.html:26
+#, fuzzy
+msgid "Notify Funambol server"
+msgstr "Porta do servidor Funambol"
+
+#: ../../static/t/prefs/pushemail.html:31
+#, fuzzy
+msgid "Send a text message to..."
+msgstr "Mandar mensagem instantânea para: "
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+"(Use formato internacional, without any leading zeros, spaces or hypens, "
+"like +61415011501)"
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+"Use regime de notificação personalizada configuradas pelo administrador"
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr "Não envie notificações"
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Nome da sala: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "Reside no andar: "
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Visualização padrão para sala: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Tipo da sala:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Público (aparece automaticamente para todos)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privado - escondido (acessível apenas para quem sabe o nome)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privado - requer senha: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privado - apenas por convite"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Pessoal (caixa de correio pessoal)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Criar uma nova sala"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Nome da sala: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Visualização padrão para sala: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Tipo da sala:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Editar o arquivo Info dessa sala"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"O texto é formatado com o browser do leitor. Uma nova linha é forçada "
+"precedendo a nova linha por uma em branco."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Ir para uma sala oculta"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Se você souber o nome de um oculto (acho que o nome) ou sala com senha, você "
+"pode entrar naquela sala, digitando o seu nome abaixo. Depois de ganhar "
+"acesso a uma sala privada, ele irá aparecer na sua listagem de sala regular "
+"assim que você não precisa voltar sempre aqui."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Digite nome da sala:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Digite senha da sala:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Configuração"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Política de vencimento de mensagens"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "Controles de acesso"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "Compartilhamento"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Serviço de correio em massa"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Recuperação de mensagens remotas"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(excluir)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+#, fuzzy
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"Os usuários listados abaixo têm acesso à essa sala.  Para excluir um usuário "
+"da lista de acesso, selecione o nome de usuário da lista e clique em "
+"'Chutar'."
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+"Para permitir acesso de outro usuário à essa sala, digite o nome do usuário "
+"na caixa abaixo e clique em 'Convidar'."
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Convidar:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Usuários"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Remover essa sala"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+#, fuzzy
+msgid "Set or change the icon for this rooms banner"
+msgstr "Definir ou modificar o ícone para o banner dessa sala"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+#, fuzzy
+msgid "Edit this rooms Info file"
+msgstr "Editar o arquivo Info dessa sala"
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr "nome da sala: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "Se privado, fazer outros usuários esquecer a sala"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "Usuários preferenciais apenas"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "Sala somente leitura"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+"Todos os usuários com permissão para postar também podem remover mensagens"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Sala diretório de arquivos"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Nome do diretório: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Uploads permitidos"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Downloads permitidos"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Manter mensagens no servidor?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Diretório visível"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Sala compartilhada por rede"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanente (não se auto-destrói)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+"Assunto Obrigatório (Força usuários a especificar um assunto para a mensagem)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Mensagens anonimas"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Sem mensagens anonimas"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "Todas as mensagens são anonimas"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Perguntar ao usuário ao entrar mensagens"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Admin da sala: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "Política de vencimento de mensagens para essa sala"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "Usar a política padrão para esse andar"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "Política de vencimento de mensagens para esse andar"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Usar o padrão do sistema"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr "Obter mensagens dessas contas POP3 e armazená-las nessa sala:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "Servidor remoto"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Nome do usuário"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Manter mensagens no servidor?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+#, fuzzy
+msgid "Interval"
+msgstr "Geral"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Obter as seguintes fontes RSS e armazená-las nessa sala:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "URL do arquivo RSS"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i>O conteúdo dessa sala será mandado <b>como mensagens individuais</b> para "
+"os seguintes recipientes:</i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>O conteúdo dessa sala será mandado <b>de forma resumida</b> para os "
+"seguintes recipientes:</i><br><br>\n"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Adicionar recipientes de Contatos ou outros cadernos de endereços"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "Permitir que não participantes mandem mensagens para essa sala."
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "Publicação de posts na sala requer permissão do Admin."
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+"Permitir requisições para inscrever/desinscrever de responsabilidade do "
+"usuário (self-service)"
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "O endereço URL para se inscrever/desinscrever é: "
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "Não compartilhado com"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "Compartilhado com"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "Nome do nódulo remoto"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "Nome da sala remota"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Ações"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"Para compartilhar uma sala, a mesma deve ser compartilhada dos dois lados.  "
+"Adicionar um 'node' a lista de 'compartilhados' faz as mensagens saírem, mas "
+"para receber mensagens, outros 'nodes' também devem ser configurados para "
+"mandar mensagens fora de seus sistemas. <li>Se o nome da sala está em "
+"branco, assume-se que o nome da sala é igual ao do 'node' remoto.<li>Se o "
+"nome da sala é diferente, o 'node' remoto também deve configurar o nome da "
+"sala aqui.</ul></I><br>\n"
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Informações da sala"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Esquecer ou se desinscrever da sala atual"
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr "Se você selecionou esta opção,"
+
+#: ../../static/t/room/zap_this.html:8
+#, fuzzy
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+"Se você selecionar essa opção, <em>%s</em> irá desaparecer da sua lista de "
+"salas.  Gostaria mesmo de fazer isso?<br>\n"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Salas esquecidas"
+
+#: ../../static/t/room/zapped_list.html:10
+#, fuzzy
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+"Clique em qualquer sala para 'des-esquecê-la' e entrar nela em seguida.\n"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "novo de"
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "Selecione a página: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Pesquisar: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Todas"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Adicionar ou excluir scripts"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Adicionar novo script"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"Para criar um novo script, digite o nome do script desjado na caixa abaixo e "
+"clique em 'Criar'."
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Nome do script: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Editar scripts"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Retornar para a tela de edição de scripts"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Excluir scripts"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"Para excluir um script existente, selecione o nome do script na lista e "
+"clique em 'Excluir script'."
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Se"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Para ou Cc"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Responder para (reply-to)"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Reenviado-De"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Reenviado-Para"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Envelope De"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Envelope Para"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-Spam-Flag"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-Spam-Estatus"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "List-ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Tamanho da mensagem"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "contém"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "não contém"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "é"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "não é"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "bate"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "não bate"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Todas as mensagens)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "é maior que"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "é menor que"
+
+#: ../../static/t/sieve/display_one.html:59
+#, fuzzy
+msgid "bytes"
+msgstr "anos"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Manter"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Descartar silenciosamente"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Rejeitar"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Mover mensagens para"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Encaminhar para"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Férias"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Mensagem:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "e depois"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "continuar processando"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "parar"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "Quando novas mensagens chegarem: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Filtrar de acordo com as regras abaixo"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Manter em minha caixa de entrada sem filtragem"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+"Filtrar através de um script editado manualmente (apenas para usuários "
+"avançados)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Adicionar regra"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"Essa instalação do Citadel foi criada sem suporte para filtros de email na "
+"parte do servidor (server-side).<br>Contate o administrador do sistema se "
+"você precisa dessa função.<br>"
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "Mensagens antigas"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "Novas mensagens"
+
+#: ../../static/t/summary/page.html:4
+#, fuzzy
+msgid "Summary page for "
+msgstr "Página de resumo de %s"
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Mensagens"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Hoje&nbsp;no&nbsp;seu&nbsp;calendário"
+
+#: ../../static/t/summary/page.html:51
+#, fuzzy
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "Quem está&nbsp;online&nbsp;agora"
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Sobre&nbsp;esse&nbsp;servidor"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+#, fuzzy
+msgid "running"
+msgstr "Afinação"
+
+#: ../../static/t/summary/page.html:65
+#, fuzzy
+msgid "with"
+msgstr "quinto"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+#, fuzzy
+msgid "and located in"
+msgstr "e depois"
+
+#: ../../static/t/summary/page.html:68
+#, fuzzy
+msgid "Your system administrator is"
+msgstr "Nome do administrador do sistema"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"AVISO: O JavaScript do seu navegador está desabilitado. Muitas funções deste "
+"sistema não funcionarão adequadamente."
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "Entre sua 'bio'"
+
+#: ../../static/t/user/list.html:3
+#, fuzzy
+msgid "User list for "
+msgstr "Lista de usuários para %s"
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Nome de Usuário"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Número"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Nível de Acesso"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Último Login"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Número total de Logins"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Número total de Posts"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Perfil do usuário"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+#, fuzzy
+msgid "Click here to send an instant message to"
+msgstr "Clique aqui para mandar uma mensagem instantânea para %s"
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Editar informação do contato"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Prefixo"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Primeiro"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Meio"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Último"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Sufixo"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Nome para visualização:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Título:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organização:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Caixa postal:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Endereço:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Cidade:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Estado:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "CEP"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "País:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Telefone de casa:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Telefone de trabalho:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Celular"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Número de fax:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Esse caderno de endereços está vazio."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Um erro interno ocorreu."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Postar um comentário"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "posts recentes"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "posts mais antigos"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d comentários"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "novo de"
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "Você não tem permissão para visualizar esse recurso."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "A fila está vazia."
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Atualizar essa página"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Servidor remoto"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Estado:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "continuar processando"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "ID da mensagem"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Data/hora do envio"
+
+#: ../../static/t/view_mailq/table.html:8
+#, fuzzy
+msgid "Next attempt"
+msgstr "Última tentativa"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Recipientes"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "de "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "até"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "editar"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Responder"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "ResponderComCitação"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "ResponderTodos"
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Encaminhar"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Cabeçalhos"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "Visualizar"
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Download"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "Visualizar como:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "Usuário atualmente on line "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr "Clique em um nome para ler os dados de usuário. Clique aqui"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "para enviar uma mensagem instantânea para este usuário."
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(terminar)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Sala"
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "De host"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Editar a visualização de sua sessão"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Essa tela permite que você modifique a maneira que sua sessão aparece na "
+"tela 'Quem está online'. Para desligar um nome 'falso' que você configurou "
+"previamente, clique no botão 'modificar' apropriado sem digitar nada na "
+"caixa correspondente. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Nome da sala:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Nome do host:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr "Usuários ativos"
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr "Editar configuração"
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr "Editar entrada"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Ir"
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Selecione o link 'Editar essa página' no banner da sala se você quiser criar "
+"essa página."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Não há página de nome '%s' aqui."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr "Histórico de edições para esta página"
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr "Lista das páginas Wiki"
+
+#~ msgid "the icon for this floor"
+#~ msgstr "o ícone para esse andar"
+
+#~ msgid "Edit %s"
+#~ msgstr "Editar %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Salvar modificações"
+
+#~ msgid " (work)"
+#~ msgstr " (trabalho)"
+
+#~ msgid " (home)"
+#~ msgstr " Página Inicial"
+
+#~ msgid " (cell)"
+#~ msgstr " (celular)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefone:"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#~ msgid "Directory domains"
+#~ msgstr "Domínios do diretório"
+
+#, fuzzy
+#~ msgid "Fallback smart hosts"
+#~ msgstr "Servidores inteligentes"
+
+#~ msgid "Create new room"
+#~ msgstr "Criar nova sala"
+
+#~ msgid "Zap this room"
+#~ msgstr "Esquecer essa sala"
+
+#~ msgid ""
+#~ "You have one or more instant messages waiting, but the Citadel Instant "
+#~ "Messenger window failed to open.  This is probably because you have a "
+#~ "popup blocker installed.  Please configure your popup blocker to allow "
+#~ "popups from this site if you wish to receive instant messages."
+#~ msgstr ""
+#~ "Você tem uma ou mais mensagens instantâneas esperando porém a janela do "
+#~ "Citadel Instant Messenger falhou em abrir.  A causa provável é a ação de "
+#~ "um bloqueador de 'popups' instalado. Configure seu bloqueador de 'popups' "
+#~ "para permitir 'popups' desse site se quiser continuar a receber mensagens "
+#~ "instantâneas."
+
+#, fuzzy
+#~ msgid "The citadel server has to be restarted. It will be back in a minute."
+#~ msgstr "O servidor Citadel deverá ser reiniciado, Ele voltará em um minuto."
+
+#~ msgid "Change"
+#~ msgstr "Modificar"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Sala compartilhada por rede"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Adicionar nódulo"
+
+#~ msgid "idle since"
+#~ msgstr "ocioso desde"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "Minutos"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Incerto"
+
+#~ msgid "Send"
+#~ msgstr "Enviar"
+
+#~ msgid "Delete this message?"
+#~ msgstr "Excluir essa mensagem?"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Lista de salas"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "Imagens em %s"
+
+#~ msgid "Exit"
+#~ msgstr "Sair"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Fazer upload de um arquivo:"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Tem certeza que quer excluir "
+
+#~ msgid "Upload"
+#~ msgstr "Upload"
+
+#~ msgid "Add"
+#~ msgstr "Adicionar"
+
+#~ msgid "Create"
+#~ msgstr "Criar"
+
+#~ msgid "Kick"
+#~ msgstr "Chutar"
+
+#~ msgid "Invite"
+#~ msgstr "Convidar"
+
+#~ msgid "User"
+#~ msgstr "Usuário"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Caderno de Endereços"
+
+#~ msgid "Delete user"
+#~ msgstr "Excluir usuário"
+
+#~ msgid "Delete this user?"
+#~ msgstr "Excluir esse usuário?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Excluir regra"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "Mensagens novas não serão filtradas por nenhum script"
+
+#~ msgid "The currently active script is: "
+#~ msgstr "O script ativo atualmente é: "
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "Configurar replicação com outros computadores Citadel"
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Mostra o ícone 'Powered by Citadel'"
+
+#~ msgid "Go to your email inbox"
+#~ msgstr "Ir para a caixa de entrada (inbox)"
+
+#~ msgid "Go to your personal calendar"
+#~ msgstr "Ir para o seu calendário pessoal"
+
+#~ msgid "Go to your personal address book"
+#~ msgstr "Ir para seu caderno de endereços pessoal"
+
+#~ msgid "Go to your personal notes"
+#~ msgstr "Ir para notas pessoais"
+
+#~ msgid "Go to your personal task list"
+#~ msgstr "Ir para sua lista de tarefas pessoal"
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "Listar todas as suas salas acessíveis"
+
+#~ msgid "See who is online right now"
+#~ msgstr "Ver quem está online agora"
+
+#~ msgid ""
+#~ "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+#~ msgstr ""
+#~ "Menu de opções avançado: Comandos avançados de sala, Informações de "
+#~ "conta, e Bate-papo"
+
+#~ msgid "Room and system administration functions"
+#~ msgstr "Funções administrativas da sala e sistema"
+
+#~ msgid "Reset form"
+#~ msgstr "Limpar campos"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Excluir essa entrada?"
+
+#~ msgid "Create new floor"
+#~ msgstr "Criar novo andar"
+
+#~ msgid "Move rule up"
+#~ msgstr "Mover regra para cima"
+
+#~ msgid "Move rule down"
+#~ msgstr "Mover regra para baixo"
+
+#~ msgid "Delete rule"
+#~ msgstr "Excluir regra"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(editar gráfico)"
+
+#~ msgid "Change name"
+#~ msgstr "Modificar nome"
+
+#~ msgid "Change CSS"
+#~ msgstr "Modificar CSS"
+
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Tem certeza que quer remover essa sala?"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Entre comando:"
+
+#~ msgid "Unshare"
+#~ msgstr "Des-compartilhar"
+
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "Nome do usuário mestre (em branco para desativar)"
+
+#~ msgid "Master user password"
+#~ msgstr "Senha do usuário mestre"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "Excluir essa entrada?"
+
+#~ msgid "List"
+#~ msgstr "Lista"
+
+#~ msgid "Digest"
+#~ msgstr "Resumo"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Assunto"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Você realmente quer terminar essa sessão?"
+
+#~ msgid "Share"
+#~ msgstr "Compartilhar"
+
+#~ msgid "Change password"
+#~ msgstr "Modificar senha"
+
+#~ msgid "Change room name"
+#~ msgstr "Mudar nome da sala"
+
+#~ msgid "Change host name"
+#~ msgstr "Mudar nome do host"
+
+#~ msgid "Change user name"
+#~ msgstr "Mudar nome do usuário"
+
+#~ msgid ""
+#~ "Leave all messages marked as unread, go to next room with unread messages"
+#~ msgstr ""
+#~ "Deixar todas as mensagens marcadas como não lidas, ir para a próxima sala "
+#~ "com mensagens não lidas."
+
+#~ msgid "Mark all messages as read, go to next room with unread messages"
+#~ msgstr ""
+#~ "Marcar todas as mensagens como lidas, ir para a próxima sala com "
+#~ "mensagens não lidas."
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Salvar modificações"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Você está se inscrevendo em <TT>%s</TT> na lista <b>%s</b>.  O servidor "
+#~ "da lista lhe enviou um link para você confirmar sua inscrição.  Esse "
+#~ "passo extra previne que outros lhe inscrevam em listas sem seu "
+#~ "consentimento.<br /><br>Clique no link que foi mandado para você e sua "
+#~ "inscrição será confirmada.<br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr ""
+#~ "AVISO: Falha ao analisar a Configuração do Servidor; Você quer executar "
+#~ "um  novo citserver?"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Não há sala de nome '%s'."
+
+#~ msgid "Network"
+#~ msgstr "Rede"
+
+#~ msgid "Tuning"
+#~ msgstr "Afinação"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "Destruir mensagens excluídas por IMAP instantâneamente"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Um script com esse nome já existe."
+
+#~ msgid ""
+#~ "A new script has been created.  Return to the script editing screen to "
+#~ "edit and activate it."
+#~ msgstr ""
+#~ "Um novo script foi criado. Volte para a tela de edição de scripts para "
+#~ "ativá-lo."
+
+#~ msgid "Delete script"
+#~ msgstr "Excluir script"
+
+#~ msgid "Delete this script?"
+#~ msgstr "Excluir esse script?"
+
+#~ msgid ""
+#~ "You are connected to %s, running %s with %s, server build %s and located "
+#~ "in %s.  Your system administrator is %s."
+#~ msgstr ""
+#~ "Você está conectado à %s, rodando %s com %s, server build %s,  e "
+#~ "localizado em %s.  Seu administrador de sistema é %s."
+
+#~ msgid "Yes with users list"
+#~ msgstr "Sim com lista de usuários"
+
+#~ msgid "Room list"
+#~ msgstr "Lista de salas"
+
+#~ msgid "View as room list"
+#~ msgstr "Ver na lista de salas"
+
+#~ msgid "View as folder list"
+#~ msgstr "Ver como lista de pastas"
+
+#~ msgid " - powered by <a href='http://www.citadel.org'>Citadel</a>"
+#~ msgstr " - powered by <a href=\"http://www.citadel.org\">Citadel</a>"
+
+#, fuzzy
+#~ msgid "uname"
+#~ msgstr "Nome do arquivo"
+
+#, fuzzy
+#~ msgid "text"
+#~ msgstr "próximo"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "Nome do arquivo"
+
+#, fuzzy
+#~ msgid "pname"
+#~ msgstr "Nome do arquivo"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Senha"
+
+#, fuzzy
+#~ msgid "pass"
+#~ msgstr "Tarefas"
+
+#, fuzzy
+#~ msgid "authbox"
+#~ msgstr "Autor"
+
+#, fuzzy
+#~ msgid "display: none"
+#~ msgstr "Nome para visualização:"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Sua senha não foi aceita"
+
+#~ msgid "If you already have an account on"
+#~ msgstr "Se você já tiver uma conta ativa"
+
+#~ msgid "enter your user name and password and click &quot;Log in.&quot;"
+#~ msgstr "entre com seu usuário e senha e clique em &quot;Log in.&quot;"
+
+#~ msgid "Please log off properly when finished. "
+#~ msgstr "Por favor efetue o log off quando terminar "
+
+#~ msgid "See the"
+#~ msgstr "Veja o"
+
+#~ msgid "recommended browser list"
+#~ msgstr "lista de navegação recomendada"
+
+#~ msgid ""
+#~ "if you have trouble using Webcit.</li> <li>You must have <i>cookies</i> "
+#~ "turned on. "
+#~ msgstr ""
+#~ "se você tem problemas ao usar o Webcit.</li> <li>Você tem que ativar os "
+#~ "<i>cookies</i>. "
+
+#~ msgid ""
+#~ "Also keep in mind that if your browser is configured to block pop-up "
+#~ "windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "Lembre-se também que se seu browser está configurado para bloquear "
+#~ "janelas pop-up, você não estará habilitado para receber quaisquer "
+#~ "mensagens instantâneas."
+
+#~ msgid "Enter your OpenID URL and click &quot;Log in&quot;."
+#~ msgstr "Entre com sua URL do OpenID e clique em &quot;Log in&quot;."
+
+#~ msgid "Click here to learn what OpenID is and how Citadel is using it."
+#~ msgstr ""
+#~ "Clique aqui para aprender o que é o OpenID e como a Citadel está usando "
+#~ "ele."
+
+#~ msgid "Log off now?"
+#~ msgstr "Realizar log off agora?"
+
+#~ msgid "%d new of %d messages%s"
+#~ msgstr "%d mensagens novas de um total de %d%s"
+
+#~ msgid "(nothing)"
+#~ msgstr "(nada)"
+
+#~ msgid "unexpected end of message"
+#~ msgstr "fim de mensagem inesperado"
+
+#~ msgid "An error occurred while setting up the chat socket."
+#~ msgstr "Um erro ocorreu ao tentar configurar o 'soquete' do bate-papo."
+
+#~ msgid "Now exiting chat mode."
+#~ msgstr "Saindo do modo bate-papo."
+
+#~ msgid "Help"
+#~ msgstr "Ajuda"
+
+#~ msgid "List users"
+#~ msgstr "Listar usuários"
+
+#~ msgid "No messages here."
+#~ msgstr "Sem mensagens aqui."
+
+#, fuzzy
+#~ msgid "no more messages"
+#~ msgstr "Mensagens anonimas"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "Error retrieving RSS feed: couldn't find messages\n"
+#~ msgstr "Erro ao obter fonte RSS: não foi possível achar mensagens\n"
+
+#, fuzzy
+#~ msgid "%s from"
+#~ msgstr "de "
+
+#, fuzzy
+#~ msgid "%s in %s"
+#~ msgstr "Imagens em %s"
+
+#, fuzzy
+#~ msgid ""
+#~ "<ul><li>Enter your OpenID URL and click &quot;Log in&quot;.<li><a href="
+#~ "\"http://www.citadel.org/doku.php/documentation:openid\">Click here to "
+#~ "learn what OpenID is and how Citadel is using it.</a><li>Please log off "
+#~ "properly when finished. <li>You must use a browser that supports "
+#~ "<i>frames</i> and <i>cookies</i>. <li>Also keep in mind that if your "
+#~ "browser is configured to block pop-up windows, you will not be able to "
+#~ "receive any instant messages.<br></ul>"
+#~ msgstr ""
+#~ "<ul><li><b>Se você já tem uma conta em %s</b>, digite seu nome de usuário "
+#~ "e senha e clique em &quot;Log in.&quot; <li><b>Se você for um novo "
+#~ "usuário</b>, digite o nome de usuário e senha desejados, e clique em "
+#~ "&quot;Novo Usuário &quot; <li>Se possível, faça o &quot;log off &quot; "
+#~ "quando terminar de usar o sistema. <li> Seu navegador deverá suportar "
+#~ "<i>frames</i> e <i>cookies</i>. <li>Se seu browser estiver configurado "
+#~ "para bloquear <i>pop-ups</i>, você não poderá receber mensagens "
+#~ "instantâneas.<br></ul>"
+
+#, fuzzy
+#~ msgid ""
+#~ "enter your user name and password and click &quot;Log in.&quot;<li><b>If "
+#~ "you are a new user</b>, enter the name and password you wish to use, and "
+#~ "click &quot;New User.&quot; <li>Please log off properly when finished. "
+#~ "<li>You must use a browser that supports <i>frames</i> and <i>cookies</"
+#~ "i>. <li>Also keep in mind that if your browser is configured to block pop-"
+#~ "up windows, you will not be able to receive any instant messages."
+#~ msgstr ""
+#~ "<ul><li><b>Se você já tem uma conta em %s</b>, digite seu nome de usuário "
+#~ "e senha e clique em &quot;Log in.&quot; <li><b>Se você for um novo "
+#~ "usuário</b>, digite o nome de usuário e senha desejados, e clique em "
+#~ "&quot;Novo Usuário &quot; <li>Se possível, faça o &quot;log off &quot; "
+#~ "quando terminar de usar o sistema. <li> Seu navegador deverá suportar "
+#~ "<i>frames</i> e <i>cookies</i>. <li>Se seu browser estiver configurado "
+#~ "para bloquear <i>pop-ups</i>, você não poderá receber mensagens "
+#~ "instantâneas.<br></ul>"
+
+#~ msgid "Find out more about Citadel"
+#~ msgstr "Veja mais sobre o Citadel"
+
+#~ msgid "CITADEL"
+#~ msgstr "CITADEL"
+
+#~ msgid "Customize this menu"
+#~ msgstr "Personalizar esse menu"
+
+#~ msgid "Internet configuration"
+#~ msgstr "Configuração da internet"
+
+#~ msgid "of %d messages."
+#~ msgstr "de %d mensagens"
+
+#~ msgid " <I>from</I> "
+#~ msgstr " <I>de <I>"
+
+#~ msgid " <I>in</I> "
+#~ msgstr " <I>em</I> "
+
+#~ msgid "Edit node configuration for "
+#~ msgstr "Editar configuração do nódulo para"
+
+#~ msgid ""
+#~ "<a href=\"http://www.postfix.org/tcp_table.5.html\">Postfix TCP "
+#~ "Dictionary Port </a> (-1 to disable)"
+#~ msgstr ""
+#~ "<a href=\"http://www.postfix.org/tcp_table.5.html\">Porta TCP para "
+#~ "\"Dicionário Postfix\" </a> (-1 para desativar)"
+
+#~ msgid "ERROR: could not open template "
+#~ msgstr "ERRO: não foi possível abrir o \"template\""
+
+#~ msgid ""
+#~ "<I>This message contains calendaring/scheduling information, but support "
+#~ "for calendars is not available on this particular system.  Please ask "
+#~ "your system administrator to install a new version of the Citadel web "
+#~ "service with calendaring enabled.</I><br>\n"
+#~ msgstr ""
+#~ "<I>Essa mensagem contém informações de calendário/agenda, mas suporte "
+#~ "para calendários não está disponível para esse sistema em particular.  "
+#~ "Pergunte para o administrador do sistema para instalar uma nova versão do "
+#~ "serviço para web Citadel com calendários instalados.</I><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display calendar item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Não foi possível exibir um item do calendário.  Isso ocorreu porque o "
+#~ "serviço WebCit não foi instalado com suporte para calendários.  Contate o "
+#~ "administrador do sistema.</i><br>\n"
+
+#~ msgid ""
+#~ "<i>Cannot display to-do item.  You are seeing this error because your "
+#~ "WebCit service has not been installed with calendar support.  Please "
+#~ "contact your system administrator.</i><br>\n"
+#~ msgstr ""
+#~ "<i>Não foi possível exibir esse item \"para fazer\".Isso ocorreu porque o "
+#~ "serviço WebCit não foi instalado com suporte para calendários.  Contate o "
+#~ "administrador do sistema. </i><br>\n"
+
+#~ msgid "Day: "
+#~ msgstr "Dia: "
+
+#~ msgid "Year: "
+#~ msgstr "Ano: "
+
+#~ msgid "The calendar view is not available."
+#~ msgstr "A visualização por calendário não está disponível"
+
+#~ msgid "The tasks view is not available."
+#~ msgstr "A visualização por tarefa não está disponível"
+
+#~ msgid "Gateway domains"
+#~ msgstr "Domínios do gateway"
+
+#~ msgid "(domains whose subdomains match Citadel hosts)"
+#~ msgstr "(domínios cujos subdomínios contém computadores Citadel)"
+
+#~ msgid "(This server does not support task lists)"
+#~ msgstr "(Esse servidor não suporta listas de tarefas)"
+
+#~ msgid "(This server does not support calendars)"
+#~ msgstr "(Esse servidor não suporta calendários)"
diff --git a/webcit/po/webcit/ro.po b/webcit/po/webcit/ro.po
new file mode 100644 (file)
index 0000000..1ba4783
--- /dev/null
@@ -0,0 +1,4302 @@
+# Romanian translation for citadel
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2011-08-23 01:13+0000\n"
+"Last-Translator: Ciprian Panaite <Unknown>\n"
+"Language-Team: Romanian <ro@li.org>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-08-24 04:34+0000\n"
+"X-Generator: Launchpad (build 13697)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Șters"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Utilizator Nou"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Utilizator problemă"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Utilizator Local"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Utilizator de reţea"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Utilizator preferat"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Şef"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "A apărut o eroare."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Confirmă utilizatori noi"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "Nici un utilizator nu trebuie confirmat în acest moment"
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "foarte slabă"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "slabă"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "bună"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "foarte bună"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Nivel curent de acces: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Alege nivelul de acces pentru acest utilizator:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Anulat. Parola nu a fost schimbată."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Nu sunt identice. Parola n-a fost schimbată."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Nu se poate fără parolă."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "disponibilitate necunoscută"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "liber"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "OCUPAT"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Du-te la pagina: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Primul"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Ultimul"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "Invitaţie la întâlnire"
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "Răspunsul participantului la invitaţia ta"
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Eveniment publicat"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "Acesta este un tip necunoscut de element al calendarului."
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Rezumat"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Loc:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Data:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Data şi ora de început"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Data şi ora de sfârşit"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Descriere:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Recurenţă"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Acesta este un eveniment care se repetă"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "Participant:"
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Aceasta este o actualizare a '%s', care este deja în calendarul tău."
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+"Acest eveniment va intra în conflict cu '%s' care este deja în calendarul "
+"tău."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Actualizare:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "CONFLICT:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Cum vrei să răspunzi acestei invitaţii?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Accept"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "Tentativă"
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Refuz"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+"Apasă <i>Actualizare</i> pentru a accepta acest răspuns şi a actualiza "
+"calendarul"
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Actualizare"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Ignoră"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "A intervenit o eroare la analiza acestui element din calendar"
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+"Ai acceptat această invitaţie la întâlnire. A fost introdusă în calendarul "
+"tău."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Ai acceptat să încerci să onorezi această invitaţie la întâlnire. A fost "
+"trecută \"în creion\" în calendarul tău."
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Ai refuzat această invitaţie la întâlnire. Nu a fost memorată în calendarul "
+"tău."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "A fost expediat un răspuns către organizatorul întâlnirii."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+"Calendarul dumneavoastră a fost actualizat pentru a reflecta acest "
+"RSVP(Répondez s'il-vous-plaît = Răspundeți vă rog)."
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+"Ați ales să ignorați acest RSVP(Répondez s'il-vous-plaît = Răspundeți vă "
+"rog). Calendarul dumneavoastră <b>nu</b> a fost actualizat."
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Săptămâna începe cu:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Oră "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Minut "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "stare necunoscută"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "necesită acţiune"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "acceptat"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "refuzat"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(tenative)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "delegat"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "finalizat"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "în curs"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(nimic)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "Eveniment fără titlu"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "de la"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Data de început"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Data de sfârşit"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Data/ora"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Observații:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "precedent"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "următor"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Săptămână"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Ore"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Subiect"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Start"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Sfârșit"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Eveniment pentru toată ziua"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "Eveniment în desfăşurare"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Sarcină fără titlu"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "A apărut o eroare în timpul recuperării fişierului %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "secunde"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "minute"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "ore"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "zile"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "săptămâni"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "luni"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "ani"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "niciodată"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "întâi"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "al doilea"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "al treilea"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "al patrulea"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "al cincilea"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "eveniment"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "Participanți"
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Adaugă sau modifică un eveniment"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Rezumat"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Loc"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Note"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organizator"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(tu eşti organizatorul)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Arată ora ca:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Liber"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Ocupat(ă)"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(Unul pe linie)"
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Contacte"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "Regulă de recurenţă"
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Se repetă la fiecare"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "în zilele săptămânii:"
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "în ziua %s%d%s a lunii"
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "pe "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "a lunii"
+
+#: ../../event.c:658
+msgid "every "
+msgstr "la fiecare "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "an pe această dată"
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "de"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "Interval de recurenţă"
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Nu se termină"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "Repetă acest eveniment"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "ori"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Repetă acest eveniment până când "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Salvează"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Şterge"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "Verifică disponibilitatea participantului"
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Anulare"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Format oră"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Expedierea a fost anulată."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Nu ai trimis nimic."
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "poza ta"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "pictograma  acestui spaţiu"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "fotografia de salut pentru conectare"
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "fotografia pentru deconectare"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "erroare realloc() imposibil de obţinut %d bytes: %s"
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Configurare bară pictograme"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "Parametru nevalid"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr " s-a șters."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr " s-a adăugat."
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Nu ai drepturi suficiente pentru a accesa această funcţie"
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(fără subiect)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "EROARE:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Mesaj gol"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Anulat. Mesajul nu a fost afişat."
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Anulat automat deoarece deja ai salvat acest mesaj."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "Salvarea ca ciornă a eşuat: "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "Este refuzată postarea unui mesaj gol.\n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "Mesajul a fost salvat ca ciornă.\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Mesajul a fost trimis.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Mesajul a fost postat.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Mesajul nu a fost mutat."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "A apărut o eroare la recuperarea acestei părţi: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "A apărut o eroare la recuperarea acestei părţi: %s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Doreşti anexarea semnăturii la acest mesaj ?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Foloseşte această semnătură:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Set de caractere implicit pentru antetul e-mailurilor:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Adresă e-mail preferată"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "Nume preferat afişat în mesajele e-mail"
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "Nume preferat afişat în mesajele postate pe forum"
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "Mod vizualizare căsuţă poştală"
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "Nu ştiu cum să afişez "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Click pe orice notă pentru modificare"
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "Manage Account/OpenID Associations"
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Chiar vrei să ştergi acest OpenID ?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(şterge)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Adaugă un OpenID "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Ataşează"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s nu permite autentificare via OpenID"
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Trimite mesaj instantaneu"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "Trimite mesaj instantaneu către: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Introdu mesaj text:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Trimite mesaj"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Mesajul n-a fost trimis"
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "Mesajul a fost trimis către "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Anulat. Nu a fost schimbat nici un parametru."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Configurează ca pagină de start"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "Configurarea ca pagină de start nu este permisă."
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "Nu mai aveţi nici o pagină de start selectată."
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "Pagină de start preferată"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Dosarele mele"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Anulat. Modificările nu au fost salvate."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Modificările au fost salvate"
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Utilizatorul %s' a fost dat afară din spaţiul %s'"
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Utilizatorul '%s' invitat în camera  '%s'"
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Anulat. Nu a fost creat nici un spaţiu nou."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Nivelul a fost şters."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "A fost creat un nou nivel."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Vizualizare listă spaţii"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Vezi niveluri libere"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "fișier"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "fişiere"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Forum"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Dosar poştă"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Carte de adrese"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Calendar"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Listă de sarcini"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Listă note"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "Listă calendar"
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Jurnal"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Ciorne"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blog"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Acest server deserveşte acum numărul maxim admis de utilizatori şi nu poate "
+"accepta conectări suplimentare în acest moment. Încearcă mai târziu sau "
+"contactează administratorul sistemului."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"Esti conectat la un server Citadel care rulează Citadel %d.%02d.\n"
+"Pentru a putea rula această versiune a Webcit ai nevoie de versiunea  %d."
+"%02d sau mai nouă.\n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Configuraţia sistemului tău a fost actualizată."
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(Nici unul))"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Nimic)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Anulat. %s nu a fost anulat."
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr " s-a salvat."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Info spaţiu"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "Biografia ta"
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Finalizat?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Numele sarcinii"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "Limită"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Categorie"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Afișează tot"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Editează sarcină"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Dată de început:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Nici o dată"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "sau"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Timp asociat"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Termen limită"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Îndeplinit:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Categorie:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"A apărut o eroare la încercarea de a crea sau modifica această poziţie din "
+"cartea de adrese."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Modificările nu au fost salvate"
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "A fost creat un nou utilizator"
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"Tocmai încercați să creați un nou user din Citadel în timp ce rulează în "
+"modul de autentificare bazată pe host. În acest mod, trebuie să creați useri "
+"noi pe sistemul host, nu din Citafel"
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "Nu poate fi decodat foto vcard\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Eroare"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Imposibil de intrat în cameră pentru a salva mesajul"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Abandon"
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(fără nume)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "modifică"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Este necesară autorizarea"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"Resursa la care doreşti acces necesită un nume de utilizator şi o parolă "
+"valabile. Nu poţi fi conectat.\n"
+"%s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Acest program nu s-a putut conecta sau n-a putut sta conectat la serverul "
+"Citadel. Eşti rugat(ă) să raportezi această problemă administratorului de "
+"sistem."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Citeşte mai mult..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' nu este un spaţiu Wiki"
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Dată"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Autor"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(arată)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Versiune curentă"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(inversează)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Titlul paginii"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Configurare bară pictograme"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Nume utilizator"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Adresă e-mail principală:"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "Aliasuri de Internet e-mail"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Şterge)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "Aliasuri de Internet e-mail"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "Vezi lista de plecare SMTP"
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Deconectare"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Atașați fișier"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Trimite foto"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Poţi trimite o fotografie direct din computerul tău"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Alege o fotografie pentru trimitere:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Conectează-te din nou"
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Aceasta este o actualizare a '%s', care este deja în calendarul tău."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr ""
+"Acest eveniment va intra în conflict cu '%s' care este deja în calendarul "
+"tău."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Sarcini"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "Înscriere pe listă"
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "Înscriere pe listă / renunţare"
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Cerere de confirmare expediată"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+#, fuzzy
+msgid " to the "
+msgstr "pe "
+
+#: ../../static/t/listsub/display.html:21
+#, fuzzy
+msgid " mailing list."
+msgstr "Serviciul de mailing list"
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Înapoi..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+#, fuzzy
+msgid "ERROR"
+msgstr "EROARE:"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+#, fuzzy
+msgid "from the"
+msgstr "pe "
+
+#: ../../static/t/listsub/display.html:42
+#, fuzzy
+msgid "mailing list."
+msgstr "Serviciul de mailing list"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+#, fuzzy
+msgid "Back..."
+msgstr "Înapoi..."
+
+#: ../../static/t/listsub/display.html:57
+#, fuzzy
+msgid "Confirmation successful!"
+msgstr "Cerere de confirmare expediată"
+
+#: ../../static/t/listsub/display.html:59
+#, fuzzy
+msgid "Confirmation failed."
+msgstr "Cerere de confirmare expediată"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Numele sarcinii"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Adresă e-mail preferată"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "Introdu mesaj text:"
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "Format oră"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Conectează-te din nou"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Creați o nouă cameră"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Creați o nouă cameră"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Schimbă-ţi parola"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Introdu noua parolă"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Introdu-o din nou, pentru confirmare:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "Vezi/editează filtre mail pe server"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Confirmă mutarea mesajului"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Mută acest mesaj în:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Se citește #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "mesaje"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "de la vechi la noi"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "de la noi la vechi"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Expeditor"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Mută"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr ""
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Numele camerei: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "Vederea implicită pentru cameră: "
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Tipul camerei:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "Publică (este automat vizibilă tuturor)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privată - ascunsă (accesibilă oricui îi cunoaște numele)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "Privată - necesită parolă: "
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "Privată - doar pe bază de invitație"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "Personală (cutie poștală doar pentru dumneavoiastră)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Creați o nouă cameră"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Numele camerei: "
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "Vederea implicită pentru cameră: "
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Tipul camerei:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Introduceți numele camerei:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+"Textul este aranjat după browserul cititorului. Trecerea la linie nouă poate "
+"fi forţată precedând linia următoare cu un spaţiu."
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "Mergeți într-o cameră ascunsă"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"Dacă știți (sau ghiciți) numele unei camere ascunse sau parolate, puteți "
+"intra în acea cameră scriindu-i numele mai jos. Odată ce căpătați acces la o "
+"cameră privată , aceasta va apărea în lista dumneavoastră obișnuită de "
+"camere, așa că nu va trebui să continuați să reveniți aici."
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Introduceți numele camerei:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "introduceți parola camerei:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "Politica de expirare a mesajelor"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "Serviciul de mailing list"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "Aducere de la distanță"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "Cameră director de fișiere"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "Numele direcorului: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "Încărcare permisă"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Descărcare permisă"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Păstrați mesajele pe server?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "Director vizibil"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "Cameră partajată în rețea"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanentă (nu se auto-curăță)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+"Se solicită subiect (utilizatorii sunt obligați să specifice un subiect al "
+"mesajului)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "Mesaje anonime"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "Fără mesaje anonime"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "toate mesajele sunt anonime"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "Se întreabă utilizatorul la introducerea mesajelor"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "Admin-ul camerei: "
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+"Se obțin mesaje de la aceste conturi POP3 de la distanță și se stochează în "
+"această cameră:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "Hostul de la distanță"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Păstrați mesajele pe server?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "Se obțin următoarele feeduri RSS și se stochează în această cameră:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i>Conținutul acestei camere este expediat <b>sub formă de rezumat</b> "
+"următoarei liste de destinatari:</i><br><br>"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "Adăugați destinatari din Contacte sau din alte liste de adrese"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Info spaţiu"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr "Dacă selectați această opțiune,"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+"va dispărea din lista dumneavoastră de camere. Asta este ceea ce doriți să "
+"faceți?"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "Camere părăsite (uitate)"
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Tot"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Adaugă sau şterge scripturi"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Adaugă un nou script"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+"Pentru a crea un script nou, introdu numele pe care doreşti să i-l dai în "
+"caseta de mai jos şi apasă <Creează>"
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Nume script: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Modificare scripturi"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "Înapoi la ecranul de modificare scripturi"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Şterge scripturi"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+"Pentru a şterge un script existent, selectează din listă numele acestuia şi "
+"apasă <Şterge>"
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Dacă"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "Către  sau copie (cc)"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "Răspuns către"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "Retrimis de la"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "Retrimis către"
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "Plic de la"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "Plic către"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "Fanion X-Spam"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "Stare X-spam"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "ID listă"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Dimensiune mesaj"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "conține"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "nu conține"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "este"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "nu este"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "se potriveşte cu"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "nu se potrivește"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Toate mesajele)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "este mai mare decât"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "este mai mic decât"
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "Păstrează"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "Aruncă în linişte"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Respinge"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Mută mesajul în"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Retrimite către"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "Vacanță"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Mesaj:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "şi apoi"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "continuă procesarea"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "stop"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "La primirea unui nou mesaj: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "Filtrează-l după regulile de mai jos"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Lasă-l în căsuţa de intrare fără filtrare"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+"Filtrează-l folosind un script editat manual (numai pentru utilizatorii "
+"avansaţi)"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Adaugă regulă"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+"Această instalare a Citadel a fost făcută fără suport pentru filtrare mail "
+"dinspre server<br>Dacă vă trebuie această facilitate, contactaţi "
+"administratorul sistemului."
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Mesaje"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Astăzi&nbsp;în&nbsp;agenda&nbsp;ta"
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Despre&nbsp;acest&nbsp;server"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Nume utilizator"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Număr"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Nivel de acces"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Ultima conectare"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Număr de conectări"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Număr de postări"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Profil utilizator"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Modifică informaţiile de contact"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Prefix"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Prenume"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Iniţiala tatălui"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Nume de familie"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Sufix"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Nume afișat:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Titlu:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Organizație:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Căsuță poștală:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Adresă:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Localitate:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Stare:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Cod poştal:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Țară:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Telefon acasă:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Telefon serviciu:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Telefon mobil:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Fax:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Această listă de adrese este goală."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "A apărut o eroare internă"
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr ""
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "Postări mai noi"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "Postări mai vechi"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d comentarii"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "permalink"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "Nu ai acces la această resursă."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "Lista de aşteptare e goală."
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Actualizează această pagină"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "Hostul de la distanță"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Stare:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "continuă procesarea"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "ID mesaj"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "Data şi ora transmiterii"
+
+#: ../../static/t/view_mailq/table.html:8
+#, fuzzy
+msgid "Next attempt"
+msgstr "Ultima încercare"
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Destinatari"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "Modifică ecranul sesiunii tale"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"Acest ecran îţi permite să modifici modul în care sesiunea ta apare în lista "
+"<Cine-i online>. Pentru a dezactiva orice nume <fals> pe care l-ai "
+"configurat anterior, apasă pur şi simplu butonul <Modifică> aferent unei "
+"casete, fără a scrie nimic în aceasta. "
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Nume spaţiu"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Nume gazdă:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+#, fuzzy
+msgid "Edit configuration"
+msgstr "Modifică informaţiile de contact"
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "Această listă de adrese este goală."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "pe "
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Selectaţi linkul <Editează pagina> în bannerul spaţiului dacă doriţi să "
+"creaţi acest spaţiu."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Nu există aici nici o pagină numită '%s'."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#~ msgid "the icon for this floor"
+#~ msgstr "pictograma acestui nivel"
+
+#~ msgid "Edit %s"
+#~ msgstr "Modifică %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Salvează modificările"
+
+#~ msgid " (work)"
+#~ msgstr " lucru"
+
+#~ msgid " (home)"
+#~ msgstr " acasă"
+
+#~ msgid " (cell)"
+#~ msgstr " celulă"
+
+#~ msgid "Telephone:"
+#~ msgstr "Telefon"
+
+#~ msgid "E-mail:"
+#~ msgstr "E-mail:"
+
+#, fuzzy
+#~ msgid "Create new room"
+#~ msgstr "Creați o nouă cameră"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Cameră partajată în rețea"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "minute"
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "Tentativă"
+
+#, fuzzy
+#~ msgid "Send"
+#~ msgstr "Expeditor"
+
+#, fuzzy
+#~ msgid "Delete this message?"
+#~ msgstr "Şterg acest script ?"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Info spaţiu"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Încărcare permisă"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Chiar vrei să ştergi acest OpenID ?"
+
+#~ msgid "Upload"
+#~ msgstr "Trimite"
+
+#~ msgid "Add"
+#~ msgstr "Adaugă"
+
+#~ msgid "Create"
+#~ msgstr "Creează"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Utilizator Nou"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Carte de adrese"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Şterge regula"
+
+#, fuzzy
+#~ msgid "Delete this user?"
+#~ msgstr "Şterg acest script ?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Şterge regula"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr ""
+#~ "mesajele pe care le vei primi nu vor fi filtrate după nici un script"
+
+#~ msgid "The currently active script is: "
+#~ msgstr "Scriptul activ este: "
+
+#, fuzzy
+#~ msgid "Reset form"
+#~ msgstr "Format oră"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Şterg acest script ?"
+
+#, fuzzy
+#~ msgid "Create new floor"
+#~ msgstr "Creați o nouă cameră"
+
+#~ msgid "Move rule up"
+#~ msgstr "Mută regula mai sus"
+
+#~ msgid "Move rule down"
+#~ msgstr "Mută regula mai jos"
+
+#~ msgid "Delete rule"
+#~ msgstr "Şterge regula"
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "Schimbă numele spaţiului"
+
+#, fuzzy
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Chiar vrei să ştergi acest OpenID ?"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "%d comentarii"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "Şterg acest script ?"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "ID listă"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "Format oră"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Subiect"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Chiar vrei să ştergi acest OpenID ?"
+
+#~ msgid "Change password"
+#~ msgstr "Schimbă parola"
+
+#~ msgid "Change room name"
+#~ msgstr "Schimbă numele spaţiului"
+
+#~ msgid "Change host name"
+#~ msgstr "Schimbă numele gazdei:"
+
+#~ msgid "Change user name"
+#~ msgstr "Schimbă nume utilizator:"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Salvează modificările"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "Te-ai înscris <TT>%s</TT> pe lista de mail <b>%s</b>. Serverul ţi-a "
+#~ "trimis un e-mail cu o adresă web adiţională pe care trebuie să faci click "
+#~ "ca să-ţi confirmi înscrierea. Acest pas suplimentar te protejează, în "
+#~ "sensul că îi împiedică pe unii să te înscrie în liste fără ca tu să fii "
+#~ "de acord.\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr ""
+#~ "Analiza configuraţiei serverului este imposibilă; rulaţi cumva un nou "
+#~ "server Citadel ?"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Nu există nici un spaţiu numit  '%s'"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Deja există un script cu acest nume"
+
+#~ msgid ""
+#~ "A new script has been created.  Return to the script editing screen to "
+#~ "edit and activate it."
+#~ msgstr ""
+#~ "A fost creat un nou script. Întoarce-te la ecranul de editare a "
+#~ "scripturilor pentru a-l modifica şi activa."
+
+#~ msgid "Delete script"
+#~ msgstr "Şterge script"
diff --git a/webcit/po/webcit/ru.po b/webcit/po/webcit/ru.po
new file mode 100644 (file)
index 0000000..ea0a8b5
--- /dev/null
@@ -0,0 +1,4344 @@
+# translation of webcit.po to Russian
+# Copyright (C) 2008 - 2009 The Citadel Project - http://www.citadel.org
+#
+# WebCit messages for Russian
+# Copyright (C) 2009 Andrey N. Oktyabrski
+# This file is distributed under the revised BSD license
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2011-01-31 08:31+0000\n"
+"Last-Translator: Andrey Olykainen <Unknown>\n"
+"Language-Team: <room_citadel_translators@uncensored.citadel.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-11-12 04:32+0000\n"
+"X-Generator: Launchpad (build 16251)\n"
+"X-Language: ru_RU\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Удалённый"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Новый пользователь"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Неблагонадёжный пользователь"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Локальный пользователь"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Сетевой пользователь"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Привилегированный пользователь"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Администратор"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "Произошла ошибка."
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "Новые пользователи"
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+"На данный момент нет новых пользователей, требующих подтверждения "
+"регистрации."
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "слишком простой"
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "простой"
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "хороший"
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "очень хороший"
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Уровень доступа %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "Уровень доступа для пользователя:"
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "Смена пароля отменяется, он остался прежним."
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "Вы ввели разные пароли, оставляем прежний."
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Пароль не должен быть пустым"
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "доступность не известна"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "свободно"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "Занят"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "Перейти на страницу: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Первый"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Последний"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "Опубликованное событие"
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Итого:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "Расположение:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "Дата:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr "Дата/время начала:"
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "Дата/время завершения:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "Описание:"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "Повторение"
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "Повторяющееся событие"
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr "Данное событие может конфликтовать с  '%s' в вашем календаре."
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "Обновление:"
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "Конфликт:"
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "Как желаете ответить на данное приглашение?"
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "Принять"
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "Отклонить"
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr "Нажмите <i>Update</i> для принятия ответа и обновления календаря."
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "Обновить"
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "Игнорировать"
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr "Вы приняли приглашение на встречу. Она была добавлена в ваш календарь."
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+"Вы отклонили приглашение на встречу. Она <b>не</b> была добавлена в ваш "
+"календарь."
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "A reply has been sent to the meeting organiser."
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "Неделя начинается с:"
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Часы: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Минуты: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(статус неизвестен)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(требуется действие)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(принято)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(отклонено)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr ""
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(делегировано)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(завершено)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(в процессе)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(не указан)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "От"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "Дата начала:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "Дата завершения:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "Дата/время:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "Заметки:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "пред."
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "след."
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "Неделя"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "Часа(ов)"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "Тема"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "Начало"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "Завершение"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "Событие на весь день"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "Задание без заголовка"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "секунд(ы)"
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "минут(ы)"
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "часа(ов)"
+
+#: ../../event.c:74
+msgid "days"
+msgstr "дня(ей)"
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "недели(ль)"
+
+#: ../../event.c:76
+msgid "months"
+msgstr "месяца(ев)"
+
+#: ../../event.c:77
+msgid "years"
+msgstr "года(лет)"
+
+#: ../../event.c:78
+msgid "never"
+msgstr "никогда"
+
+#: ../../event.c:82
+msgid "first"
+msgstr "первый"
+
+#: ../../event.c:83
+msgid "second"
+msgstr "второй"
+
+#: ../../event.c:84
+msgid "third"
+msgstr "третий"
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "четвёртый"
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "пятый"
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "Событие"
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "Добавить или редактировать событие"
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "Сводка"
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "Расположение"
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "Заметки"
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "Organiser"
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(you are the organiser)"
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "Отображать время как:"
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "Свободно"
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "Занято"
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "Контакты"
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "Повторять каждый(ые)"
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr "каждый(ые) "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "из"
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "Нет даты окончания"
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "повторять это событие"
+
+#: ../../event.c:733
+msgid "times"
+msgstr "раз(а)"
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "Повторять это событие до "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "Сохранить"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "Удалить"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "Отмена"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Формат времени"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "Загрузка графики была отменена."
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "Вы не загрузили файл"
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "ваше фото"
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "Значёк комнаты"
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Настройка панели иконок"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+#, fuzzy
+msgid " has been deleted."
+msgstr "%s было удалено."
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+#, fuzzy
+msgid " added."
+msgstr "добавлено."
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "Требуется больше прав для доступа к этой функции."
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+#, fuzzy
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "Укажите Ваш ник (короткое имя)."
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(без темы)"
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "ОШИБКА:"
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "Пустое сообщение"
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "Отменено. Сообщение не было опубликовано"
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Автоматически отменено по скольку сообщение уже сохранено."
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "Сообщение было сохранено в черновики.\n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "Сообщение отправлено.\n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "Сообщение опубликовано.\n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "Сообщение небыло перемещено."
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "Прикрепить подпись к сообщению?"
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "Использовать подпись:"
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "Стандартный набор символов для заголовков письма:"
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "Предпочитаемый адрес эл.почты"
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Щёлкните на любой заметке, если хотите внести в неё изменения."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "Вы действительно хотите удалить OpenID?"
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(удалить)"
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "Добавить OpenID: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "Прикрепить"
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "Отправить сообщение"
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "Введите текст сообщения:"
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "Отправить сообщение"
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "Сообщение не было отправлено."
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "Отменено. Настройки не были изменены."
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "Сделать стартовой страницей"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "Предпочитаемая стартовая странице"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "Мои папки"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Отменено. Изменения не сохранены."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Ваши изменения сохранены."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Пользователь '%s' был удалён из комнаты '%s'."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Пользователь '%s' приглашен в комнату '%s'."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Отменено. Новая комната не была создана."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Этаж был удален"
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Создан новый этаж"
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr ""
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Показать пустые этажи"
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "файл"
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "файлы"
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Доска объявлений"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Почтовая папка"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Адресная книга"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Календарь"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Список задач"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "Список Заметок"
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Вики"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Журнал"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Черновики"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Блог"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "Настройки системы обновлены."
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(не указано)"
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(Ничего)"
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Отменено. %s не было сохранено."
+
+#: ../../sysmsgs.c:53
+#, fuzzy
+msgid " has been saved."
+msgstr "%s было сохранено."
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "Информация о комнате"
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "Завершено?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "Название задачи"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Категория"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Показать все"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Редактировать задачу"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Дата начала:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Без даты"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "или"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr ""
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Выполнено:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "Категория:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+"Произошла ошибка во время попытки создания или редактирования записи "
+"адресной книги."
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Изменения не были сохранены."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Создан новый пользователь."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "Ошибка"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "Невозможно войти в комнату для сохранения вашего сообщения"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "Отмена."
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(без названия)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "изменить"
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "Требуется авторизация"
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"Эта программа не может соединиться, или уже соединена с сервером Citadel.  "
+"Пожалуйста, сообщите об этом Вашему администратору."
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "Далее..."
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' не комната Вики."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Дата"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Автор"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(показать)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Текущая версия"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Заголовок страницы"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "Настройка сети"
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+#, fuzzy
+msgid "Add a new node"
+msgstr "Добавить новую заметку"
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+#, fuzzy
+msgid "System Administration Menu"
+msgstr "Администрация"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+#, fuzzy
+msgid "Room Admin Menu"
+msgstr "Информация о комнате"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+#, fuzzy
+msgid "Restart Citadel"
+msgstr "Новая стартовая страница"
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+#, fuzzy
+msgid "Message to your Users:"
+msgstr "Сообщение не было отправлено."
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+#, fuzzy
+msgid "You need to be aide to view this."
+msgstr "У вас нет разрешений для просмотра ресурса."
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+#, fuzzy
+msgid "General"
+msgstr "Отправитель"
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Настройка панели иконок"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+#, fuzzy
+msgid "Access"
+msgstr "Уровень доступа"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+#, fuzzy
+msgid "Directory"
+msgstr "История"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+#, fuzzy
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr "Для удаления скрипта, выберите скрипт из списка и нажмите \"Удалить\"."
+
+#: ../../static/t/aide/edituser/add.html:5
+#, fuzzy
+msgid "New user: "
+msgstr "Новый пользователь"
+
+#: ../../static/t/aide/edituser/box_select.html:1
+#, fuzzy
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr "Для удаления скрипта, выберите скрипт из списка и нажмите \"Удалить\"."
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "Имя пользователя:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "Пароль"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "Основной ящик электронной почты"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+#, fuzzy
+msgid "Number of logins"
+msgstr "Количество комнат"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+#, fuzzy
+msgid "Messages submitted"
+msgstr "Размер сообщения"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+#, fuzzy
+msgid "Access level"
+msgstr "Уровень доступа"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+#, fuzzy
+msgid "User ID number"
+msgstr "Имя:"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+#, fuzzy
+msgid "Edit or delete users"
+msgstr "Добавить или удалить скрипты"
+
+#: ../../static/t/aide/edituser/select.html:17
+#, fuzzy
+msgid "Add users"
+msgstr "Добавить правило"
+
+#: ../../static/t/aide/edituser/select.html:20
+#, fuzzy
+msgid "Edit or Delete users"
+msgstr "Удалённый"
+
+#: ../../static/t/aide/floorconfig.html:2
+#, fuzzy
+msgid "Add, change, or delete floors"
+msgstr "Добавить/изменить/удалить этажи"
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+#, fuzzy
+msgid "Node name"
+msgstr "Имя:"
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+#, fuzzy
+msgid "Port number"
+msgstr "Номер этажа"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "Подтвердить удаление"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "Вы действительно хотите удалить "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "Да"
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "Нет"
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr "(редактировать)"
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(Удалить)"
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "Перезагрузить сейчас"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+#, fuzzy
+msgid "Name of room to log pages"
+msgstr "Количество комнат"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+#, fuzzy
+msgid "Self contained"
+msgstr "содержит"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+#, fuzzy
+msgid "Initial access level for new users"
+msgstr "Уровень доступа для пользователя:"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+#, fuzzy
+msgid "Configure automatic expiry of old messages"
+msgstr "Подтвердить перемещение сообщения"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+#, fuzzy
+msgid "Expire by message count"
+msgstr "Пустое сообщение"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+#, fuzzy
+msgid "Expire by message age"
+msgstr "Пустое сообщение"
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+#, fuzzy
+msgid "Telephone number"
+msgstr "Телефон:"
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+#, fuzzy
+msgid "Network services"
+msgstr "Сетевой пользователь"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+#, fuzzy
+msgid "Add, change, delete user accounts"
+msgstr "Добавить/изменить/удалить этажи"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr "Глобальные псевдонимы электронной почты"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "Выйти"
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "Основные команды"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "Загрузка"
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "Анонимный"
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+#, fuzzy
+msgid "Post message"
+msgstr "Новый пользователь"
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "Вложения:"
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "от"
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "в"
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "Кому:"
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "Копия:"
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "Скрытая копия:"
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "Тема(опционально):"
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "Тема:"
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "Закрыть окно"
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "Вложить файл"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr "Удалить"
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "Файлы доступны для загрузки на"
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "Загрузить файл:"
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "Имя файла"
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "Размер"
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "Содержимое"
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "Описание"
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "Загрузить изображение"
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "Можете загрузить изображение с вашего компьютера"
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "Выберите файл для загрузки:"
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "Слайд-шоу"
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "Добавить/изменить/удалить этажи"
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "Номер этажа"
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "Название этажа"
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "Количество комнат"
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(удалить этаж)"
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Вы должны войти в систему для доступа к этой странице."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "Войдите используя имя пользователя и пароль"
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "Пароль:"
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "Вход"
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Новый пользователь? Зарегистрируйтесь сейчас"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "Войдите используя OpenID"
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "OpenID URL:"
+
+#: ../../static/t/get_logged_in.html:90
+#, fuzzy
+msgid "Log in using Google"
+msgstr "Войдите используя OpenID"
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "Войдите используя OpenID"
+
+#: ../../static/t/get_logged_in.html:100
+#, fuzzy
+msgid "Log in using AOL or AIM"
+msgstr "Войдите используя OpenID"
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "Данное событие может конфликтовать с  '%s' в вашем календаре."
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr "Данное событие может конфликтовать с  '%s' в вашем календаре."
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr "Язык:"
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "Почта"
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "Задачи"
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "Комнаты"
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "Пользователи на сайте"
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "Чат"
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "Дополнительно"
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "Администрация"
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "customise this menu"
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "Мои папки"
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "Customise the icon bar"
+
+#: ../../static/t/iconbar/edit.html:11
+#, fuzzy
+msgid "Display icons as:"
+msgstr "Отображаемое имя:"
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "картинки и текст"
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "только картинки"
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "только текст"
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "Логотип сайта"
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "Кто онлайн?"
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "Расширенные настройки"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "Запрос на подтверждение послан"
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+#, fuzzy
+msgid " to the "
+msgstr "Перейти на страницу: "
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "Назад..."
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+#, fuzzy
+msgid "ERROR"
+msgstr "ОШИБКА:"
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+#, fuzzy
+msgid "from the"
+msgstr "от "
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+#, fuzzy
+msgid "Back..."
+msgstr "Назад..."
+
+#: ../../static/t/listsub/display.html:57
+#, fuzzy
+msgid "Confirmation successful!"
+msgstr "Запрос на подтверждение послан"
+
+#: ../../static/t/listsub/display.html:59
+#, fuzzy
+msgid "Confirmation failed."
+msgstr "Конфигурация"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "Название задачи"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "Предпочитаемый адрес эл.почты"
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "Введите текст сообщения:"
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "Формат времени"
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr "Вы вошли как"
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr "Вход не выполнен."
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "Войти снова"
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+#, fuzzy
+msgid "Edit or delete this room"
+msgstr "Добавить или удалить скрипты"
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "Создать комнату"
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "Создать комнату"
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+#, fuzzy
+msgid "Zap (forget) this room"
+msgstr "Пропустить комнату"
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "Читать новые сообщения"
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "Перейти к следующей комнате"
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+#, fuzzy
+msgid "Skip to next room"
+msgstr "Пропустить комнату"
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "Упс! Назад в "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "Читать новые сообщения"
+
+#: ../../static/t/menu/basic_commands.html:10
+#, fuzzy
+msgid "...in this room"
+msgstr "Пропустить комнату"
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "Читать все сообщения"
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "Введите сообщение"
+
+#: ../../static/t/menu/basic_commands.html:12
+#, fuzzy
+msgid "(post in this room)"
+msgstr "Пропустить комнату"
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+#, fuzzy
+msgid "Summary page"
+msgstr "Итого:"
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "Список пользователей"
+
+#: ../../static/t/menu/basic_commands.html:18
+#, fuzzy
+msgid "(all registered users)"
+msgstr "Новые пользователи"
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "Смените пароль"
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "Введите новый пароль:"
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "Введите его ещё раз, для проверки:"
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+#, fuzzy
+msgid "Edit your online photo"
+msgstr "ваше фото"
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+#, fuzzy
+msgid "Manage your OpenIDs"
+msgstr "Ваш OpenID"
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "Подтвердить перемещение сообщения"
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "Переместить сообщение в:"
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "Чтение #"
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "сообщения"
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "от старых к новым"
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "от новых к станым"
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "Отправитель"
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "Загрузка сообщений с сервера, подождите"
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "Открыть в новом окне"
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "Переместить"
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "Копировать"
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "Печать"
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "Добавить новый контакт"
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "Добавить новое событие"
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "Добавить новое задание"
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "Просмотр заметок"
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "Добавить новую заметку"
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "Обновить список сообщений"
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "Написать письмо"
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Домашняя Вики"
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "Редактировать страницу"
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "История"
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "новые сообщения"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "Пропустить комнату"
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "Новая стартовая страница"
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "Стартовая страница изменена."
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "Нет новых сообщений."
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr "Ваш OpenID"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "Укажите Ваш ник (короткое имя)."
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+#, fuzzy
+msgid "24 hour"
+msgstr "часа(ов)"
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "Воскресенье"
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "Понедельник"
+
+#: ../../static/t/prefs/box.html:172
+#, fuzzy
+msgid "No signature"
+msgstr "Использовать подпись:"
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+#, fuzzy
+msgid "Send a text message to..."
+msgstr "Отправить сообщение"
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "Имя комнаты: "
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "Тип комнаты:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+#, fuzzy
+msgid "Private - require password: "
+msgstr "Введите новый пароль:"
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "Создать комнату"
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "Имя комнаты: "
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "Тип комнаты:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "Введите название комнаты:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "Введите название комнаты:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "Введите пароль комнаты:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "Конфигурация"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+#, fuzzy
+msgid "Message expire policy"
+msgstr "Размер сообщения"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(удалить)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "Приглашение:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "Пользователи"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "Удалить комнату"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr "имя комнаты: "
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+#, fuzzy
+msgid "Preferred users only"
+msgstr "Привилегированный пользователь"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+#, fuzzy
+msgid "Directory name: "
+msgstr "Имя скрипта: "
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "Загрузка разрешена"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "Сохранять сообщения на сервере?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+#, fuzzy
+msgid "Network shared room"
+msgstr "Сетевой пользователь"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+#, fuzzy
+msgid "Anonymous messages"
+msgstr "Новый пользователь"
+
+#: ../../static/t/room/edit/tab_config.html:128
+#, fuzzy
+msgid "No anonymous messages"
+msgstr "Нет новых сообщений."
+
+#: ../../static/t/room/edit/tab_config.html:133
+#, fuzzy
+msgid "All messages are anonymous"
+msgstr "(Все сообщения)"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+#, fuzzy
+msgid "Room aide: "
+msgstr "Название комнаты:"
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "Использовать значения по умолчанию"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "Имя пользователя"
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "Сохранять сообщения на сервере?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "Интервал"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+#, fuzzy
+msgid "Remote node name"
+msgstr "Имя:"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+#, fuzzy
+msgid "Remote room name"
+msgstr "Название комнаты:"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "Действия"
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "Информация о комнате"
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "выбор страницы: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "Поиск: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "Все"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "Добавить или удалить скрипты"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "Добавить новый скрипт"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "Имя скрипта: "
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "Изменить скрипты"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "Удалить скрипты"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr "Для удаления скрипта, выберите скрипт из списка и нажмите \"Удалить\"."
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "Если"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-Mailer"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "Размер сообщения"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "содержит"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "не содержит"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "не"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "совпадает"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "не совпадает"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(Все сообщения)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "больше чем"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "меньше чем"
+
+#: ../../static/t/sieve/display_one.html:59
+#, fuzzy
+msgid "bytes"
+msgstr "года(лет)"
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "Отклонить"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "Переместить сообщение в"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "Переадресовать"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "Сообщение:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "стоп"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "При получении нового письма: "
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "Оставить во входящих без фильтрации"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "Добавить правило"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "Старые сообщения"
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "Новые сообщения"
+
+#: ../../static/t/summary/page.html:4
+#, fuzzy
+msgid "Summary page for "
+msgstr "Итого:"
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "Сообщения"
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "О сервере"
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+#, fuzzy
+msgid "with"
+msgstr "пятый"
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+#, fuzzy
+msgid "Your system administrator is"
+msgstr "Администрация"
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+#, fuzzy
+msgid "User list for "
+msgstr "Список папок"
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "Имя пользователя"
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "Номер"
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "Уровень доступа"
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "Последний вход"
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "Всего входов"
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "Всего сообщений"
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "Профиль пользователя"
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "Изменить сведения о контакте"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "Префикс"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "Имя"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "Отчество"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "Фамилия"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "Суффикс"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "Отображаемое имя:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "Заголовок:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "Организация:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "Абонентский ящик:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "Адрес:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "Город:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "Штат:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "Почтовый индекс:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "Страна:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "Домашний телефон:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "Рабочий телефон:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "Мобильный телефон:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "Номер факса:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "Адресная книга пуста."
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "Произошла внутренняя ошибка."
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Опубликовать комментарий"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "новые сообщения"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "старые сообщения"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d комментариев"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "Постоянная ссылка"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "У вас нет разрешений для просмотра ресурса."
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "Обновить страницу"
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "Штат:"
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "ID сообщения"
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "Получатели"
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "от "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "Кому"
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "Изменить"
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "Ответить"
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "Вперёд"
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "Заголовки"
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "Скачать"
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+#, fuzzy
+msgid "(kill)"
+msgstr " (mobile)"
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "Комната"
+
+#: ../../static/t/who/box_list_static.html:8
+#, fuzzy
+msgid "From host"
+msgstr "От"
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "Название комнаты:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "Имя хоста:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+#, fuzzy
+msgid "Edit configuration"
+msgstr "Конфигурация"
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "Адресная книга пуста."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "Перейти на страницу: "
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "Нет страницы с названием '%s'."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#~ msgid "the icon for this floor"
+#~ msgstr "Значек для этажа"
+
+#~ msgid "Edit %s"
+#~ msgstr "Изменить %s"
+
+#~ msgid "Save changes"
+#~ msgstr "Сохранить изменения"
+
+#~ msgid " (cell)"
+#~ msgstr " (mobile)"
+
+#~ msgid "Telephone:"
+#~ msgstr "Телефон:"
+
+#~ msgid "E-mail:"
+#~ msgstr "Эл. почта:"
+
+#, fuzzy
+#~ msgid "Create new room"
+#~ msgstr "Создать комнату"
+
+#, fuzzy
+#~ msgid "Zap this room"
+#~ msgstr "Пропустить комнату"
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Сетевой пользователь"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "Добавить новую заметку"
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "минут(ы)"
+
+#, fuzzy
+#~ msgid "Send"
+#~ msgstr "Отправитель"
+
+#, fuzzy
+#~ msgid "Delete this message?"
+#~ msgstr "Удалить комнату"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "Информация о комнате"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "только картинки"
+
+#~ msgid "Exit"
+#~ msgstr "Выход"
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "Загрузить файл:"
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "Вы действительно хотите удалить "
+
+#~ msgid "Upload"
+#~ msgstr "Загрузить"
+
+#~ msgid "Add"
+#~ msgstr "Добавить"
+
+#~ msgid "Create"
+#~ msgstr "Создать"
+
+#, fuzzy
+#~ msgid "Invite"
+#~ msgstr "Приглашение:"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Пользователи"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Адресная книга"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Удалить правило"
+
+#, fuzzy
+#~ msgid "Delete this user?"
+#~ msgstr "Удалить скрипт:"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Удалённый"
+
+#~ msgid "The currently active script is: "
+#~ msgstr "Текущий активный фильтр: "
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "Новая стартовая страница"
+
+#, fuzzy
+#~ msgid "Room and system administration functions"
+#~ msgstr "Администрация"
+
+#~ msgid "Reset form"
+#~ msgstr "Очистить форму"
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "Удалить комнату"
+
+#, fuzzy
+#~ msgid "Create new floor"
+#~ msgstr "Создать комнату"
+
+#~ msgid "Delete rule"
+#~ msgstr "Удалить правило"
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "Изменить название комнаты"
+
+#, fuzzy
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "Вы действительно хотите удалить "
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "Основные команды"
+
+#, fuzzy
+#~ msgid "Master user password"
+#~ msgstr "Введите новый пароль:"
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "Удалить комнату"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "Список задач"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "Формат времени"
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "Тема"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "Вы действительно хотите удалить OpenID?"
+
+#~ msgid "Change password"
+#~ msgstr "Сменить пароль"
+
+#~ msgid "Change room name"
+#~ msgstr "Изменить название комнаты"
+
+#~ msgid "Change host name"
+#~ msgstr "Изменить имя хоста"
+
+#~ msgid "Change user name"
+#~ msgstr "Изменить имя пользователя"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "Сохранить изменения"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "Не комнаты под названием '%s'."
+
+#, fuzzy
+#~ msgid "Network"
+#~ msgstr "Сетевой пользователь"
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "Скрипт с таким именем уже существует"
+
+#~ msgid "Delete script"
+#~ msgstr "Удалить скрипт"
+
+#~ msgid "Room list"
+#~ msgstr "Список комнат"
+
+#~ msgid " - powered by <a href='http://www.citadel.org'>Citadel</a>"
+#~ msgstr " - powered by <a href=\"http://www.citadel.org\">Citadel</a>"
+
+#, fuzzy
+#~ msgid "uname"
+#~ msgstr "Имя файла"
+
+#, fuzzy
+#~ msgid "text"
+#~ msgstr "след."
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "Имя файла"
+
+#, fuzzy
+#~ msgid "pname"
+#~ msgstr "Имя файла"
+
+#, fuzzy
+#~ msgid "password"
+#~ msgstr "Пароль:"
+
+#, fuzzy
+#~ msgid "pass"
+#~ msgstr "Задачи"
+
+#, fuzzy
+#~ msgid "display: none"
+#~ msgstr "Отображаемое имя:"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Неверный пароль"
+
+#, fuzzy
+#~ msgid "Log off now?"
+#~ msgstr "Выйти"
+
+#~ msgid "Customize this menu"
+#~ msgstr "Customise this menu"
diff --git a/webcit/po/webcit/sl.po b/webcit/po/webcit/sl.po
new file mode 100644 (file)
index 0000000..334effd
--- /dev/null
@@ -0,0 +1,4003 @@
+# Slovenian translation for citadel
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2011-04-30 01:30+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Slovenian <sl@li.org>\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-08-01 04:34+0000\n"
+"X-Generator: Launchpad (build 15719)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr ""
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr ""
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr ""
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr ""
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr ""
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr ""
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr ""
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr ""
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr ""
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr ""
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr ""
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr ""
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr ""
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr ""
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr ""
+
+#: ../../availability.c:169
+msgid "free"
+msgstr ""
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr ""
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr ""
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr ""
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr ""
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr ""
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr ""
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr ""
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr ""
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr ""
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr ""
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr ""
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr ""
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr ""
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr ""
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr ""
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr ""
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr ""
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr ""
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr ""
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr ""
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr ""
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr ""
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr ""
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr ""
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr ""
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr ""
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr ""
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr ""
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr ""
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr ""
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr ""
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr ""
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr ""
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr ""
+
+#: ../../event.c:89
+msgid "Event"
+msgstr ""
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr ""
+
+#: ../../event.c:222
+msgid "Location"
+msgstr ""
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr ""
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr ""
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr ""
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr ""
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr ""
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr ""
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr ""
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr ""
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr ""
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr ""
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr ""
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr ""
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr ""
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr ""
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr ""
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr ""
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr ""
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr ""
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr ""
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr ""
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr ""
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr ""
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr ""
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr ""
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr ""
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr ""
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr ""
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr ""
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr ""
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr ""
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr ""
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr ""
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr ""
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr ""
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr ""
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr ""
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr ""
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr ""
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr ""
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+msgid "Name of the blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr ""
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr ""
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr ""
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr ""
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr ""
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+msgid "comments"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr ""
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "'here"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "There is no page called '"
+msgstr ""
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
diff --git a/webcit/po/webcit/sv.po b/webcit/po/webcit/sv.po
new file mode 100644 (file)
index 0000000..885a404
--- /dev/null
@@ -0,0 +1,4052 @@
+# Swedish translation for citadel
+# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# This file is distributed under the same license as the citadel package.
+# Henric, 2010.
+# Mikael Mustonen <mikael@mustonen.se>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2013-06-11 20:01+0000\n"
+"Last-Translator: Mikael Mustonen <mikael@mustonen.se>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-06-12 05:10+0000\n"
+"X-Generator: Launchpad (build 16667)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "Raderad"
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "Ny Användare"
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "Oönskad användare"
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "Lokal Användare"
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "Nätverks Användare"
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "Moderator"
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "Chef"
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr ""
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr ""
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr ""
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr ""
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr ""
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr ""
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "Tomt lösenord är inte tillåtet."
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr ""
+
+#: ../../availability.c:169
+msgid "free"
+msgstr ""
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr ""
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "Första"
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "Sista"
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr ""
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "Sammanfattning:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr ""
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr ""
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr ""
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr ""
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr ""
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr ""
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr ""
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr ""
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr ""
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr ""
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr ""
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr ""
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(accepterad)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr ""
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr ""
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr ""
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr ""
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr ""
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr ""
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr ""
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr ""
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr ""
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr ""
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr ""
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr ""
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr ""
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr ""
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr ""
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr ""
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr ""
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr ""
+
+#: ../../event.c:89
+msgid "Event"
+msgstr ""
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr ""
+
+#: ../../event.c:222
+msgid "Location"
+msgstr ""
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr ""
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr ""
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr ""
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr ""
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "Tidsformat"
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "bilden på rubriken vid utloggning"
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr ""
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr ""
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "Avbruten. Ändringarna sparades ej."
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "Dina ändringar har sparats."
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "Användaren '%s' har sparkats ut från rum '%s'."
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "Användaren '%s' är inbjuden till rum '%s'."
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "Avbruten. Inget nytt rum skapades."
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "Våningen har raderats."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "Ny våning har skapats."
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "Rums lista"
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "Visa tomma våningar."
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "Anslagstavla"
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "Mailkatalog"
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "Adressbok"
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "Kalender"
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "Aktivitetsfält"
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "Dagbok"
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "Utkast"
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "Blogg"
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr ""
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr ""
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr ""
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "Kategori"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "Visa alla"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "Redigera aktivitet"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "Startdatum:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "Inget datum"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "eller"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "Tid kopplad till"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "Förfallodag:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "Klar:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr ""
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "En ny användare har skapats."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr ""
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr ""
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr ""
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr ""
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+#, fuzzy
+msgid "New user: "
+msgstr "Ny Användare"
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+#, fuzzy
+msgid "Network services"
+msgstr "Nätverks Användare"
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "Du måste vara inloggad för att nå denna sida."
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "Ny användare? Registrera dig nu"
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr ""
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr ""
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+#, fuzzy
+msgid "New blog post"
+msgstr "nyare tjänster"
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+msgid "Name of the blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr ""
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+#, fuzzy
+msgid "Users"
+msgstr "Ny Användare"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+#, fuzzy
+msgid "Network shared room"
+msgstr "Nätverks Användare"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr ""
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr ""
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr "Skriv en kommentar"
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr "nyare tjänster"
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr "äldre inlägg"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d kommentarer"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr "permalänk"
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr ""
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "'here"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "There is no page called '"
+msgstr ""
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "Nätverks Användare"
+
+#~ msgid "Add"
+#~ msgstr "äLägg till"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "Ny Användare"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "Adressbok"
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "Raderad"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "Raderad"
+
+#, fuzzy
+#~ msgid "Delete rule"
+#~ msgstr "Raderad"
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "%d kommentarer"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "Aktivitetsfält"
+
+#, fuzzy
+#~ msgid "Network"
+#~ msgstr "Nätverks Användare"
+
+#~ msgid "Your password was not accepted."
+#~ msgstr "Ditt lösenord accepterades inte."
diff --git a/webcit/po/webcit/tr.po b/webcit/po/webcit/tr.po
new file mode 100644 (file)
index 0000000..5870056
--- /dev/null
@@ -0,0 +1,4022 @@
+# Turkish translation for citadel
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the citadel package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: citadel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2011-12-19 07:18+0000\n"
+"Last-Translator: Dennis T Kaplan <Unknown>\n"
+"Language-Team: Turkish <tr@li.org>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-12-20 04:36+0000\n"
+"X-Generator: Launchpad (build 14538)\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr ""
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr ""
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr ""
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr ""
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr ""
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr ""
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr ""
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr ""
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr ""
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr ""
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr ""
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr ""
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr ""
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr ""
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr ""
+
+#: ../../availability.c:169
+msgid "free"
+msgstr ""
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr ""
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr ""
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr ""
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr ""
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr ""
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr ""
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr ""
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr ""
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr ""
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr ""
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr ""
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "Saat: "
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "Dakika: "
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr ""
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr ""
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr ""
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr ""
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr ""
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr ""
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr ""
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr ""
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr ""
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr ""
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr ""
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr ""
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr ""
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr ""
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr ""
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr ""
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr ""
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr ""
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr ""
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr ""
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr ""
+
+#: ../../event.c:89
+msgid "Event"
+msgstr ""
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr ""
+
+#: ../../event.c:222
+msgid "Location"
+msgstr ""
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr ""
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr ""
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr ""
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "İptal"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr ""
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Simge Çubuğu Ayarı"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr ""
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "Herhangi bir notu düzenlemek için tıklayın."
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr ""
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr ""
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr ""
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr ""
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr ""
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr ""
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr ""
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr ""
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr ""
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr ""
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr ""
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr ""
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr ""
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"Kullanıcı maksimum sayıda ve şu anda herhangi bir ek oturumları kabul "
+"edemez. Lütfen daha sonra tekrar deneyin veya sistem yöneticinize başvurun."
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "Citadel sunucudan beklenmeyen bir yanıt; dışarı balyalama."
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr ""
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr ""
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr ""
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr ""
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr ""
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr ""
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr ""
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr ""
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr ""
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr ""
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr ""
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr ""
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "Değişiklikler kaydedilmedi."
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "Yeni bir kullanıcı oluşturuldu."
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr ""
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr ""
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr ""
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'% s' bir Wiki odası değildir."
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "Tarih"
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "Yazar"
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(göster)"
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "Kullanılan Sürüm"
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(eski haline dön)"
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "Sayfa başlığı"
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Simge Çubuğu Ayarı"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr ""
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr ""
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr ""
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+msgid "Name of the blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr ""
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr ""
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr ""
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr ""
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr ""
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+msgid "comments"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr ""
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "'here"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Bu sayfa oluşturmak istiyorsanız 'Bu sayfayı Düzenle' seçeneğini seçin."
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "'% s' adında bir sayfa yoktur."
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "Dakika: "
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "Kullanıcı adını değiştir"
+
+#~ msgid "Change user name"
+#~ msgstr "Kullanıcı adını değiştir"
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "'% s' adında oda yok."
diff --git a/webcit/po/webcit/webcit.pot b/webcit/po/webcit/webcit.pot
new file mode 100644 (file)
index 0000000..e1df699
--- /dev/null
@@ -0,0 +1,4002 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR The Citadel Project - http://www.citadel.org
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr ""
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr ""
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr ""
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr ""
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr ""
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr ""
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr ""
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr ""
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr ""
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr ""
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr ""
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr ""
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr ""
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr ""
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr ""
+
+#: ../../availability.c:169
+msgid "free"
+msgstr ""
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr ""
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr ""
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr ""
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr ""
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr ""
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr ""
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr ""
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr ""
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr ""
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr ""
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr ""
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr ""
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr ""
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr ""
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr ""
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr ""
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr ""
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr ""
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr ""
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr ""
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr ""
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr ""
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr ""
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr ""
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr ""
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr ""
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr ""
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr ""
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr ""
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr ""
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr ""
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr ""
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr ""
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr ""
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr ""
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr ""
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr ""
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr ""
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr ""
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr ""
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr ""
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr ""
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr ""
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr ""
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr ""
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr ""
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr ""
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr ""
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr ""
+
+#: ../../event.c:73
+msgid "hours"
+msgstr ""
+
+#: ../../event.c:74
+msgid "days"
+msgstr ""
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr ""
+
+#: ../../event.c:76
+msgid "months"
+msgstr ""
+
+#: ../../event.c:77
+msgid "years"
+msgstr ""
+
+#: ../../event.c:78
+msgid "never"
+msgstr ""
+
+#: ../../event.c:82
+msgid "first"
+msgstr ""
+
+#: ../../event.c:83
+msgid "second"
+msgstr ""
+
+#: ../../event.c:84
+msgid "third"
+msgstr ""
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr ""
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr ""
+
+#: ../../event.c:89
+msgid "Event"
+msgstr ""
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr ""
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr ""
+
+#: ../../event.c:222
+msgid "Location"
+msgstr ""
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr ""
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr ""
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr ""
+
+#: ../../event.c:418
+msgid "Free"
+msgstr ""
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr ""
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr ""
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr ""
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr ""
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr ""
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr ""
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr ""
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr ""
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr ""
+
+#: ../../event.c:658
+msgid "every "
+msgstr ""
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr ""
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr ""
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr ""
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr ""
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr ""
+
+#: ../../event.c:733
+msgid "times"
+msgstr ""
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr ""
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr ""
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr ""
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr ""
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr ""
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr ""
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr ""
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr ""
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr ""
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr ""
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr ""
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr ""
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+msgid " added."
+msgstr ""
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr ""
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr ""
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr ""
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr ""
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr ""
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr ""
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr ""
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr ""
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr ""
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr ""
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr ""
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr ""
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr ""
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr ""
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr ""
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr ""
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr ""
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr ""
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr ""
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr ""
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr ""
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr ""
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr ""
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr ""
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr ""
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr ""
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr ""
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr ""
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr ""
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr ""
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr ""
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr ""
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr ""
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr ""
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr ""
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr ""
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr ""
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr ""
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr ""
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr ""
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr ""
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr ""
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr ""
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr ""
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr ""
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr ""
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr ""
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr ""
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr ""
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr ""
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr ""
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr ""
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr ""
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr ""
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr ""
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr ""
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr ""
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr ""
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr ""
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr ""
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr ""
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr ""
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr ""
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr ""
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr ""
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr ""
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr ""
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr ""
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr ""
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr ""
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr ""
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr ""
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr ""
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr ""
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr ""
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr ""
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr ""
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr ""
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr ""
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr ""
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr ""
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr ""
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr ""
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr ""
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr ""
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr ""
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+msgid "Settings"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr ""
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr ""
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr ""
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr ""
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr ""
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr ""
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr ""
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr ""
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr ""
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+msgid "NNTP server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+msgid "NNTPS server port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr ""
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:4
+msgid "Global email aliases"
+msgstr ""
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr ""
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr ""
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr ""
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr ""
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr ""
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr ""
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr ""
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr ""
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr ""
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr ""
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr ""
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr ""
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr ""
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr ""
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr ""
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr ""
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr ""
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr ""
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:90
+msgid "Log in using Google"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:95
+msgid "Log in using Yahoo"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:100
+msgid "Log in using AOL or AIM"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "which is already in your calendar."
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+msgid "This event would conflict with"
+msgstr ""
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr ""
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr ""
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr ""
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr ""
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr ""
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr ""
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr ""
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr ""
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr ""
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr ""
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr ""
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+msgid " to the "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:21
+msgid " mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+msgid "ERROR"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+msgid "from the"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:42
+msgid "mailing list."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+msgid "Back..."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:57
+msgid "Confirmation successful!"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:59
+msgid "Confirmation failed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+msgid "Name of list:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:78
+msgid "Your e-mail address:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+msgid "One message at a time"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:84
+msgid "Digest format"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr ""
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr ""
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr ""
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+msgid "Create a new (public) blog"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "Zap duplicate messages"
+msgstr ""
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr ""
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr ""
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr ""
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr ""
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr ""
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr ""
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr ""
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr ""
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr ""
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr ""
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr ""
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr ""
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr ""
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr ""
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr ""
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr ""
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr ""
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr ""
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr ""
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr ""
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr ""
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr ""
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr ""
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr ""
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr ""
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr ""
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr ""
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr ""
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr ""
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr ""
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr ""
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:12
+msgid "Create a new blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+msgid "Name of the blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:39
+msgid "Default editor for blog: "
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+msgid "Type of edit room:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+msgid "Enter the room info below."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr ""
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr ""
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr ""
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr ""
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr ""
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr ""
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr ""
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr ""
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:97
+msgid "Don't send message on upload"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:36
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+msgid "Edit Room info"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr ""
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr ""
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr ""
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr ""
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr ""
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr ""
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr ""
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr ""
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:59
+msgid "bytes"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr ""
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr ""
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr ""
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr ""
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr ""
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr ""
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr ""
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../../static/t/summary/page.html:51
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+msgid "running"
+msgstr ""
+
+#: ../../static/t/summary/page.html:65
+msgid "with"
+msgstr ""
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+msgid "and located in"
+msgstr ""
+
+#: ../../static/t/summary/page.html:68
+msgid "Your system administrator is"
+msgstr ""
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+
+#: ../../static/t/user/edit_bio.html:11
+msgid "Enter your bio below."
+msgstr ""
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr ""
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr ""
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr ""
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr ""
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr ""
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr ""
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr ""
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr ""
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+msgid "Click here to send an instant message to"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr ""
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr ""
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr ""
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr ""
+
+#: ../../static/t/view_blog/comment_box.html:8
+msgid "Post a comment"
+msgstr ""
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr ""
+
+#: ../../static/t/view_blog/older_posts.html:1
+msgid "Older posts"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+msgid "comments"
+msgstr ""
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+msgid "new"
+msgstr ""
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr ""
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+msgid "Remote Sites:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:37
+msgid "Status:"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:45
+msgid "Jobs waiting for further processing:"
+msgstr ""
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:8
+msgid "Next attempt"
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr ""
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr ""
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr ""
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr ""
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr ""
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr ""
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr ""
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr ""
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr ""
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr ""
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr ""
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr ""
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr ""
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr ""
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr ""
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr ""
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr ""
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr ""
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr ""
+
+#: ../../static/t/who/section.html:5
+msgid "Edit configuration"
+msgstr ""
+
+#: ../../static/t/who/section.html:6
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "'here"
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+
+#: ../../static/t/wiki/empty.html:5
+msgid "There is no page called '"
+msgstr ""
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr ""
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr ""
diff --git a/webcit/po/webcit/zh.po b/webcit/po/webcit/zh.po
new file mode 100644 (file)
index 0000000..1f2c945
--- /dev/null
@@ -0,0 +1,4388 @@
+# WebCit messages for Chinese (Simplified)
+# Copyright (C) 2011 by elliott callaway <flingkatu@gmail.com>
+# This file is distributed under GPL v3
+#
+# , 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-08-12 19:01-0400\n"
+"PO-Revision-Date: 2011-05-19 13:33+0800\n"
+"Last-Translator: elliott callaway <flingkatu@gmail.com>\n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2010-10-23 04:47+0000\n"
+"X-Generator: Lokalize 1.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. an erased user
+#: ../../auth.c:30 ../../static/t/aide/edituser/detailview.html:51
+#: ../../static/t/aide/siteconfig/tab_access.html:35
+#: ../../static/t/aide/siteconfig/tab_access.html:46
+msgid "Deleted"
+msgstr "删除 "
+
+#. a new user
+#: ../../auth.c:33 ../../static/t/aide/edituser/detailview.html:52
+#: ../../static/t/aide/siteconfig/tab_access.html:36
+#: ../../static/t/aide/siteconfig/tab_access.html:47
+#: ../../static/t/get_logged_in.html:77
+msgid "New User"
+msgstr "新用户 "
+
+#. a trouble maker
+#: ../../auth.c:36 ../../static/t/aide/edituser/detailview.html:53
+#: ../../static/t/aide/siteconfig/tab_access.html:37
+#: ../../static/t/aide/siteconfig/tab_access.html:48
+msgid "Problem User"
+msgstr "问题的用户 "
+
+#. user with normal privileges
+#: ../../auth.c:39 ../../static/t/aide/edituser/detailview.html:54
+#: ../../static/t/aide/siteconfig/tab_access.html:38
+#: ../../static/t/aide/siteconfig/tab_access.html:49
+msgid "Local User"
+msgstr "本地用户 "
+
+#. a user that may access network resources
+#: ../../auth.c:42 ../../static/t/aide/edituser/detailview.html:55
+#: ../../static/t/aide/siteconfig/tab_access.html:39
+#: ../../static/t/aide/siteconfig/tab_access.html:50
+msgid "Network User"
+msgstr "网络用户 "
+
+#. a moderator
+#: ../../auth.c:45 ../../static/t/aide/edituser/detailview.html:56
+#: ../../static/t/aide/siteconfig/tab_access.html:40
+#: ../../static/t/aide/siteconfig/tab_access.html:51
+msgid "Preferred User"
+msgstr "首选的用户 "
+
+#. chief
+#: ../../auth.c:48 ../../static/t/aide/edituser/detailview.html:57
+#: ../../static/t/aide/siteconfig/tab_access.html:41
+#: ../../static/t/aide/siteconfig/tab_access.html:52
+msgid "Admin"
+msgstr "助手 "
+
+#: ../../auth.c:367 ../../auth.c:397 ../../vcard_edit.c:752
+#: ../../vcard_edit.c:771 ../../vcard_edit.c:841
+msgid "An error has occurred."
+msgstr "发生了一个错误"
+
+#: ../../auth.c:547 ../../static/t/aide/usermanagement.html:3
+msgid "Validate new users"
+msgstr "验证新用户 "
+
+#: ../../auth.c:567
+msgid "No users require validation at this time."
+msgstr "任何用户都不需要验证,这一次。 "
+
+#: ../../auth.c:617
+msgid "very weak"
+msgstr "很弱 "
+
+#: ../../auth.c:620
+msgid "weak"
+msgstr "弱 "
+
+#: ../../auth.c:623
+msgid "ok"
+msgstr "还行 "
+
+#: ../../auth.c:627
+msgid "strong"
+msgstr "强 "
+
+#: ../../auth.c:645
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "当前的访问级别: %d (%s)\n"
+
+#: ../../auth.c:653
+msgid "Select access level for this user:"
+msgstr "选择此用户的访问级别: "
+
+#: ../../auth.c:736
+msgid "Cancelled.  Password was not changed."
+msgstr "取消。未更改密码。 "
+
+#: ../../auth.c:745
+msgid "They don't match.  Password was not changed."
+msgstr "他们不匹配。未更改密码。 "
+
+#: ../../auth.c:751
+msgid "Blank passwords are not allowed."
+msgstr "不允许空密码。 "
+
+#.
+#. * Set to 'unknown' right from the beginning.  Unless we learn
+#. * something else, that's what we'll go with.
+#.
+#: ../../availability.c:148
+msgid "availability unknown"
+msgstr "未知的可用性"
+
+#: ../../availability.c:169
+msgid "free"
+msgstr "免费"
+
+#: ../../availability.c:179
+msgid "BUSY"
+msgstr "忙"
+
+#: ../../bbsview_renderer.c:312
+msgid "Go to page: "
+msgstr "转到页面: "
+
+#: ../../bbsview_renderer.c:354
+msgid "First"
+msgstr "第一次 "
+
+#: ../../bbsview_renderer.c:360
+msgid "Last"
+msgstr "最后 "
+
+#: ../../calendar.c:76 ../../static/t/ical/attachment/display.html:11
+msgid "Meeting invitation"
+msgstr "会议邀请 "
+
+#: ../../calendar.c:79 ../../static/t/ical/attachment/display.html:14
+msgid "Attendee's reply to your invitation"
+msgstr "您的邀请与会者的答复 "
+
+#: ../../calendar.c:82 ../../static/t/ical/attachment/display.html:17
+msgid "Published event"
+msgstr "已发布的事件 "
+
+#: ../../calendar.c:85 ../../static/t/ical/attachment/display.html:8
+msgid "This is an unknown type of calendar item."
+msgstr "这是未知的类型的日历项。 "
+
+#: ../../calendar.c:98 ../../calendar_view.c:290 ../../calendar_view.c:949
+#: ../../calendar_view.c:993 ../../calendar_view.c:1074 ../../tasks.c:248
+#: ../../static/t/ical/attachment/display.html:25
+msgid "Summary:"
+msgstr "摘要:"
+
+#: ../../calendar.c:107 ../../calendar_view.c:298 ../../calendar_view.c:954
+#: ../../calendar_view.c:998 ../../calendar_view.c:1079
+#: ../../static/t/ical/attachment/display.html:26
+msgid "Location:"
+msgstr "地点:"
+
+#: ../../calendar.c:132 ../../calendar_view.c:343 ../../calendar_view.c:960
+#: ../../static/t/ical/attachment/display.html:31
+msgid "Date:"
+msgstr "日期:"
+
+#: ../../calendar.c:139 ../../calendar_view.c:365 ../../calendar_view.c:1003
+#: ../../calendar_view.c:1089 ../../static/t/ical/attachment/display.html:32
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../../calendar.c:150 ../../calendar_view.c:368 ../../calendar_view.c:1005
+#: ../../calendar_view.c:1091 ../../static/t/ical/attachment/display.html:34
+msgid "Ending date/time:"
+msgstr "结束日期/时间:"
+
+#: ../../calendar.c:159 ../../tasks.c:339 ../../static/t/files.html:12
+#: ../../static/t/ical/attachment/display.html:38
+msgid "Description:"
+msgstr "说明"
+
+#: ../../calendar.c:168 ../../event.c:91
+#: ../../static/t/ical/attachment/display.html:41
+msgid "Recurrence"
+msgstr "复发 "
+
+#: ../../calendar.c:169 ../../event.c:508
+#: ../../static/t/ical/attachment/display.html:41
+msgid "This is a recurring event"
+msgstr "这是一个反复出现的事件 "
+
+#: ../../calendar.c:178 ../../static/t/ical/attachment/display_attendees.html:2
+msgid "Attendee:"
+msgstr "与会者: "
+
+#: ../../calendar.c:218
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "这是 '%s' 已在您的日历中的更新。 "
+
+#: ../../calendar.c:222
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr "与 %s 已经在您的日历中的情况下,此事件将发生冲突。 "
+
+#: ../../calendar.c:227 ../../static/t/ical/attachment/display_conflict.html:2
+msgid "Update:"
+msgstr "更新: "
+
+#: ../../calendar.c:228 ../../static/t/ical/attachment/display_conflict.html:3
+msgid "CONFLICT:"
+msgstr "冲突: "
+
+#: ../../calendar.c:251 ../../static/t/ical/attachment/display.html:53
+msgid "How would you like to respond to this invitation?"
+msgstr "您想如何回应这一邀请? "
+
+#: ../../calendar.c:252 ../../static/t/ical/attachment/display.html:55
+msgid "Accept"
+msgstr "接受 "
+
+#: ../../calendar.c:253 ../../static/t/ical/attachment/display.html:57
+msgid "Tentative"
+msgstr "试 "
+
+#: ../../calendar.c:254 ../../static/t/ical/attachment/display.html:59
+msgid "Decline"
+msgstr "下降 "
+
+#: ../../calendar.c:271 ../../static/t/ical/attachment/display.html:66
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr "单击 <i> 更新 </i> 接受这个答复,并更新您的日历。"
+
+#: ../../calendar.c:272 ../../static/t/ical/attachment/display.html:68
+msgid "Update"
+msgstr "更新: "
+
+#: ../../calendar.c:273 ../../static/t/ical/attachment/display.html:70
+msgid "Ignore"
+msgstr "忽略 "
+
+#: ../../calendar.c:295 ../../ical_subst.c:231
+msgid "There was an error parsing this calendar item."
+msgstr "解析此日历项时出错。 "
+
+#: ../../calendar.c:328
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr "您已接受此会议邀请。它已被输入您日历。 "
+
+#: ../../calendar.c:332
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr "您暂时接受了这次会议的邀请。它已被 '接受' 到您的日历。"
+
+#: ../../calendar.c:336
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr "您已拒绝了这次会议的邀请。它没有 <b> </b> 已输入日历。 "
+
+#: ../../calendar.c:341
+msgid "A reply has been sent to the meeting organizer."
+msgstr "会议组织者已发送答复。 "
+
+#. / Translators: RSVP aka Répondez s'il-vous-plaît Is the term
+#. / that the recipient of an ical-invitation should please
+#. / answer this request.
+#: ../../calendar.c:376
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "您的日历已被更新,以反映此 RSVP。 "
+
+#: ../../calendar.c:378
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr "您已选择忽略此 RSVP。您的日历没有 <b> </b> 已更新。 "
+
+#: ../../calendar.c:934
+msgid "Calendar day view begins at:"
+msgstr "在开始的一天日历视图: "
+
+#: ../../calendar.c:935
+msgid "Calendar day view ends at:"
+msgstr "结束一天的日历视图: "
+
+#: ../../calendar.c:936
+msgid "Week starts on:"
+msgstr "周开始时间: "
+
+#: ../../calendar_tools.c:94
+msgid "Hour: "
+msgstr "小时"
+
+#: ../../calendar_tools.c:114
+msgid "Minute: "
+msgstr "分钟"
+
+#: ../../calendar_tools.c:184
+msgid "(status unknown)"
+msgstr "(状态未知)"
+
+#: ../../calendar_tools.c:200
+#: ../../static/t/ical/attachment/display_attendees.html:6
+msgid "(needs action)"
+msgstr "(需要行动)"
+
+#: ../../calendar_tools.c:203
+#: ../../static/t/ical/attachment/display_attendees.html:7
+msgid "(accepted)"
+msgstr "(接受)"
+
+#: ../../calendar_tools.c:206
+#: ../../static/t/ical/attachment/display_attendees.html:8
+msgid "(declined)"
+msgstr "(拒绝)"
+
+#: ../../calendar_tools.c:209
+#: ../../static/t/ical/attachment/display_attendees.html:9
+msgid "(tenative)"
+msgstr "(暂定)"
+
+#: ../../calendar_tools.c:212
+#: ../../static/t/ical/attachment/display_attendees.html:10
+msgid "(delegated)"
+msgstr "(委派)"
+
+#: ../../calendar_tools.c:215
+#: ../../static/t/ical/attachment/display_attendees.html:11
+msgid "(completed)"
+msgstr "(已完成)"
+
+#: ../../calendar_tools.c:218
+#: ../../static/t/ical/attachment/display_attendees.html:12
+msgid "(in process)"
+msgstr "(进行中)"
+
+#: ../../calendar_tools.c:221
+#: ../../static/t/ical/attachment/display_attendees.html:13
+msgid "(none)"
+msgstr "(无)"
+
+#: ../../calendar_view.c:264 ../../calendar_view.c:460
+#: ../../calendar_view.c:927 ../../event.c:863
+msgid "Untitled Event"
+msgstr "未命名的事件"
+
+#: ../../calendar_view.c:289 ../../calendar_view.c:948
+#: ../../calendar_view.c:992 ../../calendar_view.c:1073
+#: ../../static/t/sieve/display_one.html:20
+msgid "From"
+msgstr "从"
+
+#: ../../calendar_view.c:347 ../../calendar_view.c:964
+msgid "Starting date:"
+msgstr "开始日期:"
+
+#: ../../calendar_view.c:353 ../../calendar_view.c:966
+msgid "Ending date:"
+msgstr "结束日期:"
+
+#: ../../calendar_view.c:361 ../../calendar_view.c:1085
+msgid "Date/time:"
+msgstr "时间:"
+
+#: ../../calendar_view.c:378 ../../calendar_view.c:970
+#: ../../calendar_view.c:1008 ../../calendar_view.c:1095
+#: ../../static/t/room/edit/tab_share.html:33
+msgid "Notes:"
+msgstr "备注:"
+
+#: ../../calendar_view.c:577 ../../calendar_view.c:713
+msgid "previous"
+msgstr "上一页"
+
+#: ../../calendar_view.c:589 ../../calendar_view.c:725
+#: ../../calendar_view.c:1298
+msgid "next"
+msgstr "下一步"
+
+#: ../../calendar_view.c:748
+msgid "Week"
+msgstr "一周"
+
+#: ../../calendar_view.c:750
+msgid "Hours"
+msgstr "时间"
+
+#: ../../calendar_view.c:751 ../../static/t/msg_listview.html:9
+#: ../../static/t/sieve/display_one.html:22
+msgid "Subject"
+msgstr "主题"
+
+#: ../../calendar_view.c:752 ../../event.c:233
+msgid "Start"
+msgstr "启动"
+
+#: ../../calendar_view.c:753 ../../event.c:280
+msgid "End"
+msgstr "结束"
+
+#: ../../calendar_view.c:947 ../../calendar_view.c:976 ../../event.c:274
+msgid "All day event"
+msgstr "全天事件"
+
+#: ../../calendar_view.c:991 ../../calendar_view.c:1014
+msgid "Ongoing event"
+msgstr "正在进行的活动"
+
+#: ../../calendar_view.c:1369 ../../tasks.c:429
+msgid "Untitled Task"
+msgstr "无标题的任务"
+
+#: ../../downloads.c:287
+#, c-format
+msgid "An error occurred while retrieving this file: %s\n"
+msgstr "检索此文件时发生错误: 是: %s\n"
+
+#: ../../event.c:71
+msgid "seconds"
+msgstr "秒 "
+
+#: ../../event.c:72
+msgid "minutes"
+msgstr "分钟 "
+
+#: ../../event.c:73
+msgid "hours"
+msgstr "时间 "
+
+#: ../../event.c:74
+msgid "days"
+msgstr "天 "
+
+#: ../../event.c:75
+msgid "weeks"
+msgstr "周 "
+
+#: ../../event.c:76
+msgid "months"
+msgstr "个月 "
+
+#: ../../event.c:77
+msgid "years"
+msgstr "年 "
+
+#: ../../event.c:78
+msgid "never"
+msgstr "永远不会 "
+
+#: ../../event.c:82
+msgid "first"
+msgstr "第一次 "
+
+#: ../../event.c:83
+msgid "second"
+msgstr "第二次 "
+
+#: ../../event.c:84
+msgid "third"
+msgstr "第三次 "
+
+#: ../../event.c:85
+msgid "fourth"
+msgstr "第四 "
+
+#: ../../event.c:86
+msgid "fifth"
+msgstr "第五届 "
+
+#: ../../event.c:89
+msgid "Event"
+msgstr "事件 "
+
+#: ../../event.c:90 ../../event.c:440 ../../event.c:452
+msgid "Attendees"
+msgstr "与会者 "
+
+#: ../../event.c:168
+msgid "Add or edit an event"
+msgstr "添加或编辑事件 "
+
+#: ../../event.c:211 ../../static/t/iconbar.html:13
+#: ../../static/t/iconbar/edit.html:29
+msgid "Summary"
+msgstr "的摘要页 "
+
+#: ../../event.c:222
+msgid "Location"
+msgstr "位置 "
+
+#: ../../event.c:330 ../../static/t/iconbar.html:34
+#: ../../static/t/iconbar/edit.html:49
+msgid "Notes"
+msgstr "备注: "
+
+#: ../../event.c:372
+msgid "Organizer"
+msgstr "主办单位 "
+
+#: ../../event.c:377
+msgid "(you are the organizer)"
+msgstr "(您的管理器) "
+
+#: ../../event.c:395
+msgid "Show time as:"
+msgstr "将时间显示为: "
+
+#: ../../event.c:418
+msgid "Free"
+msgstr "免费 "
+
+#: ../../event.c:426
+msgid "Busy"
+msgstr "忙 "
+
+#: ../../event.c:443
+msgid "(One per line)"
+msgstr "(每行一个) "
+
+#: ../../event.c:453 ../../static/t/edit/markdown_epic.html:84
+#: ../../static/t/edit/message.html:141 ../../static/t/iconbar.html:29
+#: ../../static/t/iconbar/edit.html:42
+msgid "Contacts"
+msgstr "联系人 "
+
+#: ../../event.c:516
+msgid "Recurrence rule"
+msgstr "重复规则 "
+
+#: ../../event.c:520
+msgid "Repeats every"
+msgstr "重复每个 "
+
+#. begin 'weekday_selector' div
+#: ../../event.c:538
+msgid "on these weekdays:"
+msgstr "这些平日: "
+
+#: ../../event.c:596
+#, c-format
+msgid "on day %s%d%s of the month"
+msgstr "天的 %s%d%s 的月 "
+
+#: ../../event.c:605 ../../event.c:667
+msgid "on the "
+msgstr "关于 "
+
+#: ../../event.c:629
+msgid "of the month"
+msgstr "每月 "
+
+#: ../../event.c:658
+msgid "every "
+msgstr "每个 "
+
+#: ../../event.c:659
+msgid "year on this date"
+msgstr "在此日期年 "
+
+#: ../../event.c:691 ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7
+msgid "of"
+msgstr "的 "
+
+#: ../../event.c:715
+msgid "Recurrence range"
+msgstr "重复周期范围 "
+
+#: ../../event.c:723
+msgid "No ending date"
+msgstr "没有结束日期 "
+
+#: ../../event.c:730
+msgid "Repeat this event"
+msgstr "重复此事件 "
+
+#: ../../event.c:733
+msgid "times"
+msgstr "时间 "
+
+#: ../../event.c:741
+msgid "Repeat this event until "
+msgstr "重复直到此事件 "
+
+#: ../../event.c:767 ../../tasks.c:357
+msgid "Save"
+msgstr "保存"
+
+#: ../../event.c:768 ../../tasks.c:358 ../../static/t/aide/inet/section.html:5
+#: ../../static/t/msg_listview.html:27 ../../static/t/navbar.html:116
+#: ../../static/t/view_blog/comment.html:11
+#: ../../static/t/view_blog/post.html:24 ../../static/t/view_message.html:31
+msgid "Delete"
+msgstr "删除"
+
+#: ../../event.c:769
+msgid "Check attendee availability"
+msgstr "检查与会者的可用性 "
+
+#: ../../event.c:770 ../../paging.c:60 ../../tasks.c:359
+#: ../../static/t/confirmlogoff.html:4
+#: ../../static/t/edit/markdown_epic.html:76
+#: ../../static/t/edit/message.html:133
+#: ../../static/t/edit/message/attachments_pane.html:82
+msgid "Cancel"
+msgstr "取消"
+
+#: ../../fmt_date.c:306
+msgid "Time format"
+msgstr "时间格式 "
+
+#: ../../graphics.c:47 ../../graphics.c:120
+msgid "Graphics upload has been cancelled."
+msgstr "图形上载已被取消。 "
+
+#: ../../graphics.c:53 ../../graphics.c:126
+msgid "You didn't upload a file."
+msgstr "你才上传的文件 "
+
+#: ../../graphics.c:174
+msgid "your photo"
+msgstr "你的照片 "
+
+#: ../../graphics.c:180
+msgid "the icon for this room"
+msgstr "这间屋子的图标 "
+
+#: ../../graphics.c:188
+msgid "graphics to be displayed on the login screen"
+msgstr "登录提示的 Greetingpicture "
+
+#: ../../graphics.c:196
+msgid "the Logoff banner picture"
+msgstr "注销横幅图片 "
+
+#: ../../html2html.c:131
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../../iconbar.c:323
+msgid "Iconbar Setting"
+msgstr "Iconbar 设置"
+
+#: ../../icontheme.c:173
+msgid "Icon Theme"
+msgstr ""
+
+#: ../../inetconf.c:112 ../../inetconf.c:121 ../../inetconf.c:135
+#: ../../inetconf.c:161 ../../netconf.c:157 ../../netconf.c:184
+#: ../../netconf.c:192 ../../netconf.c:240 ../../netconf.c:248
+msgid "Invalid Parameter"
+msgstr "无效的参数"
+
+#: ../../inetconf.c:128
+msgid " has been deleted."
+msgstr "已被删除。 "
+
+#. <domain> added status message
+#: ../../inetconf.c:146
+#, fuzzy
+msgid " added."
+msgstr "添加。 "
+
+#: ../../inetconf.c:238 ../../roomlist.c:50 ../../roomlist.c:378
+#: ../../roomlist.c:510 ../../roomlist.c:605 ../../siteconfig.c:55
+#: ../../siteconfig.c:73 ../../static/t/room/edit/tab_access.html:44
+#: ../../static/t/room/edit/tab_config.html:155
+#: ../../static/t/room/edit/tab_expire.html:73
+msgid "Higher access is required to access this function."
+msgstr "访问此功能需要较高的访问。"
+
+#: ../../listsub.c:33 ../../listsub.c:70 ../../listsub.c:106
+#: ../../listsub.c:113
+msgid "You need to specify the mailinglist to subscribe to."
+msgstr ""
+
+#: ../../listsub.c:40 ../../listsub.c:77
+#, fuzzy
+msgid "You need to specify the email address you'd like to subscribe with."
+msgstr "请指定您想要使用的用户名。"
+
+#: ../../mailview_renderer.c:72
+msgid "(no subject)"
+msgstr "(无主题) "
+
+#: ../../messages.c:60
+msgid "ERROR:"
+msgstr "错误: "
+
+#: ../../messages.c:78
+msgid "Empty message"
+msgstr "空消息 "
+
+#: ../../messages.c:1004
+msgid "Cancelled.  Message was not posted."
+msgstr "取消。不发送消息。 "
+
+#: ../../messages.c:1007
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "因为您已经保存此邮件时自动取消。 "
+
+#: ../../messages.c:1031
+msgid "Saved to Drafts failed: "
+msgstr "保存到草稿失败: "
+
+#: ../../messages.c:1098
+msgid "Refusing to post empty message.\n"
+msgstr "拒绝后空的消息。 \n"
+
+#: ../../messages.c:1124
+msgid "Message has been saved to Drafts.\n"
+msgstr "消息已保存到草稿。 \n"
+
+#: ../../messages.c:1134
+msgid "Message has been sent.\n"
+msgstr "邮件已发送。 \n"
+
+#: ../../messages.c:1137
+msgid "Message has been posted.\n"
+msgstr "邮件已发送。 \n"
+
+#: ../../messages.c:1737
+msgid "The message was not moved."
+msgstr "该消息是不会移动。 "
+
+#: ../../messages.c:1776
+#, c-format
+msgid "An error occurred while retrieving this part: %s/%s\n"
+msgstr "检索此部分时发生错误: %s/%s\n"
+
+#: ../../messages.c:1818
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "检索此部分时发生错误:%s\n"
+
+#: ../../messages.c:2031
+msgid "Attach signature to email messages?"
+msgstr "将签名附加到电子邮件吗? "
+
+#: ../../messages.c:2034
+msgid "Use this signature:"
+msgstr "使用此签名: "
+
+#: ../../messages.c:2036
+msgid "Default character set for email headers:"
+msgstr "默认字符集的电子邮件标题: "
+
+#: ../../messages.c:2039
+msgid "Preferred email address"
+msgstr "首选的电子邮件地址 "
+
+#: ../../messages.c:2041
+msgid "Preferred display name for email messages"
+msgstr "电子邮件首选的显示名称 "
+
+#: ../../messages.c:2045
+msgid "Preferred display name for bulletin board posts"
+msgstr "公告板上岗的首选的显示名称 "
+
+#: ../../messages.c:2048
+msgid "Mailbox view mode"
+msgstr "邮箱视图模式 "
+
+#: ../../msg_renderers.c:1183
+msgid "I don't know how to display "
+msgstr "我不知道如何显示 "
+
+#: ../../notes.c:345
+msgid "Click on any note to edit it."
+msgstr "单击任何注释,对其进行编辑。 "
+
+#: ../../openid.c:28
+msgid "Manage Account/OpenID Associations"
+msgstr "管理帐户/OpenID 协会 "
+
+#: ../../openid.c:46
+msgid "Do you really want to delete this OpenID?"
+msgstr "您确实要删除此 OpenID 吗? "
+
+#: ../../openid.c:47
+msgid "(delete)"
+msgstr "(删除) "
+
+#: ../../openid.c:55
+msgid "Add an OpenID: "
+msgstr "添加 OpenID: "
+
+#: ../../openid.c:58
+msgid "Attach"
+msgstr "附加 "
+
+#: ../../openid.c:62
+#, c-format
+msgid "%s does not permit authentication via OpenID."
+msgstr "%s 不允许通过 OpenID 的身份验证。 "
+
+#: ../../paging.c:29
+msgid "Send instant message"
+msgstr "发送即时消息 "
+
+#: ../../paging.c:37
+msgid "Send an instant message to: "
+msgstr "发送即时消息: "
+
+#: ../../paging.c:51
+msgid "Enter message text:"
+msgstr "输入消息的文本: "
+
+#: ../../paging.c:59 ../../static/t/edit/markdown_epic.html:50
+#: ../../static/t/edit/message.html:107
+msgid "Send message"
+msgstr "发送邮件 "
+
+#: ../../paging.c:78
+msgid "Message was not sent."
+msgstr "消息未被发送。 "
+
+#: ../../paging.c:89
+msgid "Message has been sent to "
+msgstr "邮件已发送到 "
+
+#: ../../preferences.c:880
+msgid "Cancelled.  No settings were changed."
+msgstr "取消。没有设置被更改。"
+
+#: ../../preferences.c:1128
+msgid "Make this my start page"
+msgstr "这使我的起始页"
+
+#: ../../preferences.c:1166
+msgid "This isn't allowed to become the start page."
+msgstr "这不被获准成为开始页。"
+
+#: ../../preferences.c:1168
+msgid "You no longer have a start page selected."
+msgstr "您不再需要选定的起始页。"
+
+#: ../../preferences.c:1220
+msgid "Prefered startpage"
+msgstr "首选的起始页"
+
+#: ../../roomlist.c:105
+msgid "My Folders"
+msgstr "我的文件夹"
+
+#: ../../roomops.c:728 ../../roomops.c:1085 ../../sieve.c:135
+msgid "Cancelled.  Changes were not saved."
+msgstr "取消。未保存的更改"
+
+#: ../../roomops.c:877 ../../sieve.c:142
+msgid "Your changes have been saved."
+msgstr "已保存您的更改"
+
+#: ../../roomops.c:933
+#, c-format
+msgid "User '%s' kicked out of room '%s'."
+msgstr "用户 %s 踢出房间 %s。 "
+
+#: ../../roomops.c:950
+#, c-format
+msgid "User '%s' invited to room '%s'."
+msgstr "用户 '%s' 邀请到 '%s' 的房间。 "
+
+#: ../../roomops.c:984
+msgid "Cancelled.  No new room was created."
+msgstr "取消。不创建任何新的房间。 "
+
+#: ../../roomops.c:1340
+msgid "Floor has been deleted."
+msgstr "地板已被删除."
+
+#: ../../roomops.c:1364
+msgid "New floor has been created."
+msgstr "已创建新的地板。 "
+
+#: ../../roomops.c:1443
+msgid "Room list view"
+msgstr "房间列表视图 "
+
+#: ../../roomops.c:1446
+msgid "Show empty floors"
+msgstr "显示空层 "
+
+#: ../../roomtokens.c:579
+msgid "file"
+msgstr "文件 "
+
+#: ../../roomtokens.c:581
+msgid "files"
+msgstr "文件 "
+
+#: ../../roomviews.c:51
+msgid "Bulletin Board"
+msgstr "公告板 "
+
+#: ../../roomviews.c:52
+msgid "Mail Folder"
+msgstr "邮件文件夹 "
+
+#: ../../roomviews.c:53
+msgid "Address Book"
+msgstr "通讯簿 "
+
+#: ../../roomviews.c:54 ../../static/t/iconbar.html:24
+#: ../../static/t/iconbar/edit.html:55
+msgid "Calendar"
+msgstr "日历 "
+
+#: ../../roomviews.c:55
+msgid "Task List"
+msgstr "任务列表 "
+
+#: ../../roomviews.c:56
+msgid "Notes List"
+msgstr "注释列表 "
+
+#: ../../roomviews.c:57
+msgid "Wiki"
+msgstr "Wiki "
+
+#: ../../roomviews.c:58
+msgid "Calendar List"
+msgstr "日历列表 "
+
+#: ../../roomviews.c:59
+msgid "Journal"
+msgstr "杂志 "
+
+#: ../../roomviews.c:60
+msgid "Drafts"
+msgstr "草稿 "
+
+#: ../../roomviews.c:61
+msgid "Blog"
+msgstr "博客 "
+
+#: ../../serv_func.c:201
+msgid ""
+"This server is already serving its maximum number of users and cannot accept "
+"any additional logins at this time.  Please try again later or contact your "
+"system administrator."
+msgstr ""
+"此服务器已服务的最大用户数和不能接受在这个时候任何额外的登录。请稍后再试,或"
+"联系您系统管理员。 "
+
+#: ../../serv_func.c:206 ../../serv_func.c:235
+msgid "Received unexpected answer from Citadel server; bailing out."
+msgstr "从城堡服务器 ; 收到意外的答案纾困。 "
+
+#: ../../serv_func.c:244
+#, c-format
+msgid ""
+"You are connected to a Citadel server running Citadel %d.%02d. \n"
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "
+"newer.\n"
+"\n"
+"\n"
+msgstr ""
+"您连接到运行城堡 %d.%0 城堡服务器2d。 \n"
+"为了运行此版本的 WebCit 也必须有城堡 %d.%02d 或更新。 \n"
+"\n"
+"\n"
+
+#: ../../siteconfig.c:347
+msgid "Your system configuration has been updated."
+msgstr "已更新您的系统配置。"
+
+#: ../../smtpqueue.c:181
+msgid "First Attempt pending"
+msgstr ""
+
+#: ../../summary.c:128
+msgid "(None)"
+msgstr "(无) "
+
+#: ../../summary.c:184
+msgid "(Nothing)"
+msgstr "(无) "
+
+#: ../../sysmsgs.c:27
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "取消。%s 是不会保存。 "
+
+#: ../../sysmsgs.c:53
+msgid " has been saved."
+msgstr "已被保存。 "
+
+#: ../../sysmsgs.c:69
+msgid "Room info"
+msgstr "房间信息 "
+
+#: ../../sysmsgs.c:70
+msgid "Your bio"
+msgstr "您的生物 "
+
+#: ../../tasks.c:93
+msgid "Completed?"
+msgstr "完成吗?"
+
+#: ../../tasks.c:95
+msgid "Name of task"
+msgstr "任务的名称"
+
+#: ../../tasks.c:97
+msgid "Date due"
+msgstr "到期日期"
+
+#: ../../tasks.c:99
+msgid "Category"
+msgstr "类别"
+
+#: ../../tasks.c:101
+msgid "Show All"
+msgstr "显示所有"
+
+#: ../../tasks.c:224
+msgid "Edit task"
+msgstr "编辑任务"
+
+#: ../../tasks.c:259
+msgid "Start date:"
+msgstr "开始日期:"
+
+#: ../../tasks.c:267 ../../tasks.c:297
+msgid "No date"
+msgstr "没有日期"
+
+#: ../../tasks.c:271 ../../tasks.c:300
+msgid "or"
+msgstr "组织:"
+
+#: ../../tasks.c:285 ../../tasks.c:314
+msgid "Time associated"
+msgstr "相关联的时间"
+
+#: ../../tasks.c:289
+msgid "Due date:"
+msgstr "截止日期:"
+
+#: ../../tasks.c:318
+msgid "Completed:"
+msgstr "完成:"
+
+#: ../../tasks.c:329
+msgid "Category:"
+msgstr "类别:"
+
+#: ../../useredit.c:650
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr "尝试创建或编辑此通讯簿条目时出错。 "
+
+#: ../../useredit.c:757
+msgid "Changes were not saved."
+msgstr "未保存的更改 "
+
+#: ../../useredit.c:852
+msgid "A new user has been created."
+msgstr "已创建一个新用户。 "
+
+#: ../../useredit.c:856
+msgid ""
+"You are attempting to create a new user from within Citadel while running in "
+"host based authentication mode.  In this mode, you must create new users on "
+"the host system, not within Citadel."
+msgstr ""
+"您试图在运行时创建一个新的用户,从城堡内基于主机的身份验证模式。在此模式中,"
+"您必须在创建新用户主机系统,不能在城堡。 "
+
+#: ../../vcard_edit.c:565
+msgid "Could Not decode vcard photo\n"
+msgstr "可以不 decode 电子名片 photo\n"
+
+#: ../../vcard_edit.c:653
+msgid "Error"
+msgstr "错误"
+
+#: ../../vcard_edit.c:728
+msgid "Unable to enter the room to save your message"
+msgstr "无法输入要保存您的邮件室"
+
+#: ../../vcard_edit.c:732
+msgid "Aborting."
+msgstr "中止"
+
+#: ../../vcard_edit.c:948
+msgid "(no name)"
+msgstr "(没有名称)"
+
+#: ../../vcard_edit.c:1090
+msgid "edit"
+msgstr "编辑 "
+
+#: ../../vcard_edit.c:1118
+msgid "failed to load vcard"
+msgstr ""
+
+#: ../../webcit.c:350
+msgid "Authorization Required"
+msgstr "所需的授权 "
+
+#: ../../webcit.c:358
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+"您请求的资源要求有效的用户名和密码。你能不能不会被记录: 是:没有名为 '%s' 的"
+"空间。 %s\n"
+
+#: ../../webcit.c:675
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+"此程序无法连接或保持与城堡服务器的连接。请报告此问题,您的系统管理员联系。 "
+
+#: ../../webcit.c:682
+msgid "Read More..."
+msgstr "阅读更多... "
+
+#: ../../wiki.c:42
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "%s' 不是一个 Wiki 的房间。 "
+
+#: ../../wiki.c:118 ../../static/t/msg_listview.html:11
+msgid "Date"
+msgstr "提交的日期/时间 "
+
+#: ../../wiki.c:119
+msgid "Author"
+msgstr "作者 "
+
+#: ../../wiki.c:138 ../../wiki.c:148
+msgid "(show)"
+msgstr "(显示) "
+
+#: ../../wiki.c:139 ../../static/t/navbar.html:145
+#: ../../static/t/navbar.html:176
+msgid "Current version"
+msgstr "当前版本 "
+
+#: ../../wiki.c:152
+msgid "(revert)"
+msgstr "(恢复) "
+
+#: ../../wiki.c:214
+msgid "Page title"
+msgstr "页标题 "
+
+#: ../../static/t/addressbook/namelist.html:4
+msgid "Add:"
+msgstr ""
+
+#: ../../static/t/aide/display_generic_cmd.html:4
+msgid "Enter a server command"
+msgstr "输入一个服务器的命令 "
+
+#: ../../static/t/aide/display_generic_cmd.html:12
+msgid ""
+"This screen allows you to enter Citadel server commands which are not "
+"supported by WebCit.  If you do not know what that means, then this screen "
+"will not be of much use to you."
+msgstr ""
+"此屏幕允许您输入城堡服务器命令而不是WebCit 的支持。如果你不知道这意味着什么,"
+"然后此屏幕不会给你多大用处。 "
+
+#: ../../static/t/aide/display_generic_cmd.html:15
+msgid "Enter command:"
+msgstr "请输入命令: "
+
+#: ../../static/t/aide/display_generic_cmd.html:17
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "输入 (如果要求 SEND_LISTING 传输模式) 的命令: "
+
+#: ../../static/t/aide/display_generic_cmd.html:20
+msgid "Detected host header is "
+msgstr "检测到的主机标头 "
+
+#: ../../static/t/aide/display_generic_result.html:2
+msgid "Server command results"
+msgstr "服务器命令的结果 "
+
+#: ../../static/t/aide/display_generic_result.html:18
+msgid "Enter another command"
+msgstr "请输入另一个命令 "
+
+#: ../../static/t/aide/display_generic_result.html:19
+msgid "Return to menu"
+msgstr "返回到菜单 "
+
+#: ../../static/t/aide/display_ignetconf.html:4
+msgid "Network configuration"
+msgstr "网络配置 "
+
+#: ../../static/t/aide/display_ignetconf.html:10
+#: ../../static/t/aide/ignetconf/add.html:5
+#: ../../static/t/aide/ignetconf/edit_node.html:5
+msgid "Add a new node"
+msgstr "添加一个新节点 "
+
+#: ../../static/t/aide/display_ignetconf.html:14
+msgid "Currently configured nodes"
+msgstr "当前配置的节点 "
+
+#: ../../static/t/aide/display_inetconf.html:5
+#: ../../static/t/aide/display_menu.html:5
+msgid "System Administration Menu"
+msgstr "系统管理菜单"
+
+#: ../../static/t/aide/display_inetconf.html:6
+#: ../../static/t/aide/display_menu.html:6
+msgid "Room Admin Menu"
+msgstr "房间的助手菜单"
+
+#: ../../static/t/aide/display_inetconf.html:14
+msgid "Local host aliases"
+msgstr "本地主机别名"
+
+#: ../../static/t/aide/display_inetconf.html:15
+msgid "Smart hosts"
+msgstr "智能主机"
+
+#: ../../static/t/aide/display_inetconf.html:16
+msgid "Notification hosts"
+msgstr "通知主机"
+
+#: ../../static/t/aide/display_inetconf.html:20
+msgid "RBL hosts"
+msgstr "RBL 主机"
+
+#: ../../static/t/aide/display_inetconf.html:21
+msgid "SpamAssassin hosts"
+msgstr "SpamAssassin 主机"
+
+#: ../../static/t/aide/display_inetconf.html:22
+msgid "ClamAV clamd hosts"
+msgstr "ClamAV clamd 主机"
+
+#: ../../static/t/aide/display_inetconf.html:23
+msgid "Masqueradable domains"
+msgstr "Masqueradable 域"
+
+#: ../../static/t/aide/display_logstatus.html:4
+msgid "Temporarily enable debug logging for components"
+msgstr ""
+
+#: ../../static/t/aide/display_logstatus.html:13
+msgid ""
+"This screen allows you to enable debug logging of components of the current "
+"citserver process. The setting is non-restart permanent. If you want it to "
+"be enabled permanently add it to the CITADEL_LOGDEBUG environment variable "
+"in your init script."
+msgstr ""
+
+#: ../../static/t/aide/display_menu.html:12
+msgid "Global Configuration"
+msgstr "全局配置"
+
+#: ../../static/t/aide/display_menu.html:14
+msgid "User account management"
+msgstr "用户帐户管理"
+
+#: ../../static/t/aide/display_menu.html:16
+msgid "Shutdown Citadel"
+msgstr "关闭城堡"
+
+#: ../../static/t/aide/display_menu.html:18
+msgid "Rooms and Floors"
+msgstr "客房和地板"
+
+#: ../../static/t/aide/display_serverrestart.html:25
+msgid "Restart Citadel"
+msgstr "重新启动城堡 "
+
+#: ../../static/t/aide/display_serverrestart_page.html:4
+msgid "Message to your Users:"
+msgstr "给您的用户的消息:"
+
+#: ../../static/t/aide/display_sitewide_config.html:3
+msgid "Site configuration"
+msgstr "怀胎配置 "
+
+#: ../../static/t/aide/display_sitewide_config.html:6
+#: ../../static/t/aide/edituser/select.html:9
+msgid "You need to be aide to view this."
+msgstr "您需要查看这的助手。 "
+
+#: ../../static/t/aide/display_sitewide_config.html:12
+msgid "General"
+msgstr "一般 "
+
+#: ../../static/t/aide/display_sitewide_config.html:14
+#, fuzzy
+msgid "Settings"
+msgstr "Iconbar 设置"
+
+#: ../../static/t/aide/display_sitewide_config.html:15
+msgid "SMTP"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:16
+msgid "IMAP4"
+msgstr ""
+
+#: ../../static/t/aide/display_sitewide_config.html:17
+msgid "Pop3"
+msgstr "Pop3"
+
+#: ../../static/t/aide/display_sitewide_config.html:19
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:1
+msgid "Push Email"
+msgstr "推进电子邮件 "
+
+#: ../../static/t/aide/display_sitewide_config.html:21
+msgid "Indexing/Journaling"
+msgstr "索引/日记"
+
+#: ../../static/t/aide/display_sitewide_config.html:23
+msgid "Access"
+msgstr "访问"
+
+#: ../../static/t/aide/display_sitewide_config.html:24
+msgid "Directory"
+msgstr "目录"
+
+#: ../../static/t/aide/display_sitewide_config.html:25
+msgid "Auto-purger"
+msgstr "自动普格尔"
+
+#: ../../static/t/aide/edituser/add.html:1
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+"若要创建一个新的用户帐户,在下面的框中输入所需的用户名称 然后单击创建。"
+
+#: ../../static/t/aide/edituser/add.html:5
+msgid "New user: "
+msgstr "新用户:"
+
+#: ../../static/t/aide/edituser/box_select.html:1
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr "若要编辑现有的用户帐户,请从列表中选择用户名和 单击编辑。"
+
+#: ../../static/t/aide/edituser/detailview.html:4
+msgid "Edit user account: "
+msgstr "编辑用户帐户:"
+
+#: ../../static/t/aide/edituser/detailview.html:20
+#: ../../static/t/get_logged_in.html:55 ../../static/t/get_logged_in.html:70
+#: ../../static/t/openid_manual_create.html:9 ../../static/t/who/edit.html:39
+msgid "User name:"
+msgstr "用户名:"
+
+#: ../../static/t/aide/edituser/detailview.html:24
+#: ../../static/t/room/edit/tab_feed.html:15
+msgid "Password"
+msgstr "密码"
+
+#: ../../static/t/aide/edituser/detailview.html:28
+msgid "Permission to send Internet mail"
+msgstr "发送 Internet 邮件的权限"
+
+#: ../../static/t/aide/edituser/detailview.html:32
+#: ../../static/t/vcard/edit.html:59
+msgid "Primary Internet e-mail address"
+msgstr "主要的互联网电子邮件地址"
+
+#: ../../static/t/aide/edituser/detailview.html:36
+#: ../../static/t/vcard/edit.html:62
+msgid "Internet e-mail aliases"
+msgstr "互联网电子邮件别名"
+
+#: ../../static/t/aide/edituser/detailview.html:40
+msgid "Number of logins"
+msgstr "登录名的数目"
+
+#: ../../static/t/aide/edituser/detailview.html:44
+msgid "Messages submitted"
+msgstr "提交邮件"
+
+#: ../../static/t/aide/edituser/detailview.html:48
+msgid "Access level"
+msgstr "访问级别"
+
+#: ../../static/t/aide/edituser/detailview.html:62
+msgid "User ID number"
+msgstr "用户 ID 号"
+
+#: ../../static/t/aide/edituser/detailview.html:66
+msgid "Date and time of last login"
+msgstr "上次登入时间的日期和时间"
+
+#: ../../static/t/aide/edituser/detailview.html:76
+msgid "Auto-purge after this many days"
+msgstr "这几天后自动清除"
+
+#: ../../static/t/aide/edituser/select.html:5
+msgid "Edit or delete users"
+msgstr "编辑或删除用户"
+
+#: ../../static/t/aide/edituser/select.html:17
+msgid "Add users"
+msgstr "添加用户"
+
+#: ../../static/t/aide/edituser/select.html:20
+msgid "Edit or Delete users"
+msgstr "编辑或删除用户"
+
+#: ../../static/t/aide/floorconfig.html:2
+msgid "Add, change, or delete floors"
+msgstr "添加、 更改或删除层 "
+
+#: ../../static/t/aide/ignetconf/add.html:15
+#: ../../static/t/aide/ignetconf/edit_node.html:15
+#: ../../static/t/aide/siteconfig/tab_general.html:8
+msgid "Node name"
+msgstr "节点名称 "
+
+#: ../../static/t/aide/ignetconf/add.html:17
+#: ../../static/t/aide/ignetconf/edit_node.html:17
+msgid "Shared secret"
+msgstr "共享的密钥 "
+
+#: ../../static/t/aide/ignetconf/add.html:19
+#: ../../static/t/aide/ignetconf/edit_node.html:19
+msgid "Host or IP address"
+msgstr "主机或 IP 地址 "
+
+#: ../../static/t/aide/ignetconf/add.html:21
+#: ../../static/t/aide/ignetconf/edit_node.html:21
+msgid "Port number"
+msgstr "端口号 "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:5
+msgid "Confirm delete"
+msgstr "确认删除 "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:11
+msgid "Are you sure you want to delete "
+msgstr "您确实要删除 "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:14
+#: ../../static/t/iconbar/edit.html:19 ../../static/t/iconbar/edit.html:26
+#: ../../static/t/iconbar/edit.html:32 ../../static/t/iconbar/edit.html:39
+#: ../../static/t/iconbar/edit.html:45 ../../static/t/iconbar/edit.html:52
+#: ../../static/t/iconbar/edit.html:58 ../../static/t/iconbar/edit.html:64
+#: ../../static/t/iconbar/edit.html:70 ../../static/t/iconbar/edit.html:76
+#: ../../static/t/iconbar/edit.html:82 ../../static/t/iconbar/edit.html:88
+#: ../../static/t/prefs/box.html:194 ../../static/t/prefs/box.html:246
+msgid "Yes"
+msgstr "\"是\" "
+
+#: ../../static/t/aide/ignetconf/display_confirm_delete.html:16
+#: ../../static/t/iconbar/edit.html:20 ../../static/t/iconbar/edit.html:27
+#: ../../static/t/iconbar/edit.html:33 ../../static/t/iconbar/edit.html:40
+#: ../../static/t/iconbar/edit.html:46 ../../static/t/iconbar/edit.html:53
+#: ../../static/t/iconbar/edit.html:59 ../../static/t/iconbar/edit.html:65
+#: ../../static/t/iconbar/edit.html:71 ../../static/t/iconbar/edit.html:77
+#: ../../static/t/iconbar/edit.html:83 ../../static/t/iconbar/edit.html:89
+#: ../../static/t/prefs/box.html:196 ../../static/t/prefs/box.html:248
+msgid "No"
+msgstr "无 "
+
+#: ../../static/t/aide/ignetconf/section.html:4
+msgid "(Edit)"
+msgstr "(编辑) "
+
+#: ../../static/t/aide/ignetconf/section.html:5
+#: ../../static/t/view_mailq/message.html:2
+msgid "(Delete)"
+msgstr "(删除) "
+
+#: ../../static/t/aide/inet/aliases.html:2
+msgid "(domains for which this host receives mail)"
+msgstr "(域,此主机接收邮件)"
+
+#: ../../static/t/aide/inet/clamav.html:2
+msgid "(hosts running the ClamAV clamd service)"
+msgstr "(主机运行 ClamAV clamd 服务)"
+
+#: ../../static/t/aide/inet/dirnames.html:2
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(域映射与全局通讯簿)"
+
+#: ../../static/t/aide/inet/fallbackhosts.html:2
+msgid "(send outbound mail to these hosts only when direct delivery fails)"
+msgstr "(发送出站邮件,这些主机直接传递失败时,才)"
+
+#: ../../static/t/aide/inet/masqdomains.html:2
+msgid "(Domains as which users are allowed to masquerade)"
+msgstr "(允许哪些用户作为域伪装) "
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "(URLS for notifications when users receive new mails; )"
+msgstr "(当用户收到新邮件 ; 通知 URL)"
+
+#: ../../static/t/aide/inet/notify.html:2
+msgid "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+msgstr "Syntax: Notificationtemplatename:http[s]://user:password@hostname/path"
+
+#: ../../static/t/aide/inet/rbldns.html:2
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(主机运行实时黑名单)"
+
+#: ../../static/t/aide/inet/smarthosts.html:2
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr "(如果存在的话,所有出站邮件转发到这些主机之一)"
+
+#: ../../static/t/aide/inet/spamass.html:2
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(主机运行 SpamAssassin 服务)"
+
+#: ../../static/t/aide/restart.html:2
+msgid "Restart Now"
+msgstr "现在重新启动"
+
+#: ../../static/t/aide/restart.html:3
+msgid "Restart after paging users"
+msgstr "重新启动后寻呼用户"
+
+#: ../../static/t/aide/restart.html:4
+msgid "Restart when all users are idle"
+msgstr "所有用户都均处于空闲状态时重新启动"
+
+#: ../../static/t/aide/serverrestart/box.html:3
+msgid "Please wait while the Citadel server is restarted... "
+msgstr "请城堡服务器重新启动,稍候... "
+
+#: ../../static/t/aide/serverrestart/box_page_do.html:3
+msgid ""
+"Please wait while your users are being paged, the citadel server will be "
+"restarted after that... "
+msgstr "请等待您的用户都被分页,城堡服务器会重新启动后... "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:1
+msgid "Access controls and site policy settings"
+msgstr "访问控制和网站策略设置 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:5
+msgid "Allow aides to zap (forget) rooms"
+msgstr "允许歼灭的助手 (忘了) 的房间 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:9
+msgid "Quarantine messages from problem users"
+msgstr "问题用户隔离的邮件 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:12
+msgid "Name of quarantine room"
+msgstr "隔离房间的名称 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:17
+msgid "Name of room to log pages"
+msgstr "房间到登录页的名称 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:22
+msgid "Authentication mode"
+msgstr "身份验证模式 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:24
+msgid "Self contained"
+msgstr "自载 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:25
+msgid "Host based"
+msgstr "基于主机 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:26
+msgid "LDAP (RFC2307)"
+msgstr "LDAP (RFC2307)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:27
+msgid "LDAP (Active Directory)"
+msgstr "LDAP (Active Directory)"
+
+#: ../../static/t/aide/siteconfig/tab_access.html:30
+msgid "Allow anonymous guest access"
+msgstr "允许匿名来宾访问 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:33
+msgid "Initial access level for new users"
+msgstr "新用户的的初始的访问级别 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:44
+msgid "Access level required to create rooms"
+msgstr "创建房间所需的访问级别 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:55
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr "自动授予用户创建包房房间助手状态 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:58
+#, fuzzy
+msgid "Automatically grant room-aide status to users who create BLOG rooms"
+msgstr "自动授予用户创建包房房间助手状态 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:61
+msgid "Restrict access to Internet mail"
+msgstr "限制访问 Internet 邮件 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Disable self-service user account creation"
+msgstr "禁用自助服务的用户帐户创建 "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:66
+msgid "Hint: do not select both!"
+msgstr "提示: 请不要选择两个 ! "
+
+#: ../../static/t/aide/siteconfig/tab_access.html:69
+msgid "Require registration for new users"
+msgstr "为新用户需要注册 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:1
+msgid "Configure automatic expiry of old messages"
+msgstr "配置自动到期的旧邮件 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:2
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr "每层或每个房间的基础上,可以重写这些设置。 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:6
+msgid "Hour to run database auto-purge"
+msgstr "小时运行数据库自动清除 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:66
+msgid "Default message expire policy for public rooms"
+msgstr "默认邮件过期,公共机房的政策 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:68
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:86
+#: ../../static/t/room/edit/tab_expire.html:18
+#: ../../static/t/room/edit/tab_expire.html:46
+msgid "Never automatically expire messages"
+msgstr "永远不会自动使邮件过期 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:71
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:89
+#: ../../static/t/room/edit/tab_expire.html:21
+#: ../../static/t/room/edit/tab_expire.html:49
+msgid "Expire by message count"
+msgstr "过期的邮件数 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:73
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:92
+#: ../../static/t/room/edit/tab_expire.html:24
+#: ../../static/t/room/edit/tab_expire.html:52
+msgid "Expire by message age"
+msgstr "过期的信息时代 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:75
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:94
+#: ../../static/t/room/edit/tab_expire.html:26
+#: ../../static/t/room/edit/tab_expire.html:54
+msgid "Number of messages or days: "
+msgstr "消息或几天的数目: "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:81
+msgid "Default message expire policy for private mailboxes"
+msgstr "默认消息过期专用邮箱策略 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:83
+msgid "Same policy as public rooms"
+msgstr "公用房间相同的策略 "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:99
+msgid "Default user purge time (days)"
+msgstr "默认用户清除时间 (天) "
+
+#: ../../static/t/aide/siteconfig/tab_autopurger.html:102
+msgid "Default room purge time (days)"
+msgstr "默认的房间清除时间 (天) "
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:1
+msgid "Configure the LDAP connector for Citadel"
+msgstr "配置 Citdael 的 LDAP 接头 "
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:3
+#: ../../static/t/aide/siteconfig/tab_imap.html:2
+#: ../../static/t/aide/siteconfig/tab_setting.html:1
+#: ../../static/t/aide/siteconfig/tab_smtp.html:2
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr "在此屏幕上所做的更改将不会生效,直到重新启动城堡的服务器。 "
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:4
+msgid ""
+"NOTE: This Citadel server has been built without LDAP support.  These "
+"options will have no effect."
+msgstr "注意: 此城堡服务器建成了无 LDAP 支持。这些选项将不起作用。 "
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:9
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "(若要禁用空白) 的 LDAP 服务器的主机名 "
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:13
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "(若要禁用空白) 的 LDAP 服务器的主机名 "
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:16
+msgid "Base DN"
+msgstr "基地 DN "
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:19
+msgid "Bind DN"
+msgstr "绑定 DN "
+
+#: ../../static/t/aide/siteconfig/tab_directory.html:22
+msgid "Password for bind DN"
+msgstr "DN 绑定密码 "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:1
+msgid "General site configuration items"
+msgstr "一般站点的配置项 "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:5
+msgid "Change Login Logo"
+msgstr "更改登录徽标 "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:6
+msgid "Change Logout Logo"
+msgstr "更改注销徽标 "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:11
+msgid "Fully qualified domain name"
+msgstr "完全限定的域名 "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:14
+msgid "Human-readable node name"
+msgstr "人类可读的节点名称 "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:18
+msgid "Telephone number"
+msgstr "电话号码 "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:22
+msgid "Paginator prompt (for text mode clients)"
+msgstr "目前提示 (文本模式的客户端) "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:25
+msgid "Geographic location of this system"
+msgstr "此系统的地理位置 "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:28
+msgid "Name of system administrator"
+msgstr "系统管理员的名称 "
+
+#: ../../static/t/aide/siteconfig/tab_general.html:31
+msgid "Default timezone for unzoned calendar items"
+msgstr "Unzoned 的日历项目的默认时区 "
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:1
+msgid "IMAP"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:5
+msgid "IMAP listener port (-1 to disable)"
+msgstr "IMAP 侦听器端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:8
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "IMAP 通过 SSL 端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_imap.html:11
+msgid "Keep original from headers in IMAP"
+msgstr "保持原始邮件头从 IMAP "
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:1
+msgid "Indexing and Journaling"
+msgstr "索引和日记 "
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:2
+msgid "Warning: these facilities are resource intensive."
+msgstr "警告: 这些设施会占用大量资源。 "
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:6
+msgid "Enable full text index"
+msgstr "启用全文索引 "
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:9
+msgid "Perform journaling of email messages"
+msgstr "执行日志记录的电子邮件 "
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:13
+msgid "Perform journaling of non-email messages"
+msgstr "执行非电子邮件消息的日志记录 "
+
+#: ../../static/t/aide/siteconfig/tab_indexing.html:16
+msgid "Email destination of journalized messages"
+msgstr "日记中记录的消息的电子邮件目标 "
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:1
+msgid "POP3"
+msgstr "POP3"
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:6
+msgid "POP3 listener port (-1 to disable)"
+msgstr "POP3 侦听器端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:9
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "POP3 通过 SSL 端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:12
+msgid "POP3 fetch frequency in seconds"
+msgstr "以秒为单位的 POP3 回迁频率 "
+
+#: ../../static/t/aide/siteconfig/tab_pop3.html:15
+msgid "POP3 fastest fetch frequency in seconds"
+msgstr "以秒为单位的 POP3 最快回迁频率 "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:5
+msgid "Funambol server host (blank to disable)"
+msgstr "战略性服务器主机 (禁用空白) "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:8
+msgid "Funambol server port "
+msgstr "战略性服务器端口 "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:11
+msgid "Funambol sync source"
+msgstr "战略性同步源 "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:14
+msgid "Funambol auth details (user:pass)"
+msgstr "战略性身份验证的详细信息 (用户: 通) "
+
+#: ../../static/t/aide/siteconfig/tab_pushmail.html:17
+msgid "External pager tool (blank to disable)"
+msgstr "外部页导航工具 (禁用空白) "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:5
+msgid "Network services"
+msgstr "网络服务 "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:7
+#, fuzzy
+msgid "Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)"
+msgstr "服务器 IP 地址 (任何 0.0.0.0) "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:10
+msgid "XMPP (Jabber) client to server port (-1 to disable)"
+msgstr "XMPP (Jabber) 客户端到服务器端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:13
+msgid "XMPP (Jabber) server to server port (-1 to disable)"
+msgstr "XMPP (Jabber) 服务器到服务器端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:16
+#, fuzzy
+msgid "NNTP server port (-1 to disable)"
+msgstr "POP3 侦听器端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:19
+#, fuzzy
+msgid "NNTPS server port (-1 to disable)"
+msgstr "POP3 侦听器端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:22
+msgid "Advanced server fine-tuning controls"
+msgstr "微调控件的高级的服务器 "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:24
+msgid "Maximum message length"
+msgstr "最大消息长度 "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:27
+msgid "Server connection idle timeout (in seconds)"
+msgstr "服务器连接空闲超时时间 (以秒为单位) "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:30
+msgid "Network run frequency (in seconds)"
+msgstr "网络运行频率 (以秒为单位) "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:33
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "最大并发会话 (0 = 无限制) "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:38
+msgid "Minimum number of worker threads"
+msgstr "工作线程的最小数目 "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:41
+msgid "Maximum number of worker threads"
+msgstr "工作线程的最大数目 "
+
+#: ../../static/t/aide/siteconfig/tab_setting.html:46
+msgid "Automatically delete committed database logs"
+msgstr "会自动删除已提交的数据库的日志 "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:1
+msgid "SMTP-Servers"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:5
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "MTA SMTP 端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:8
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "MSA SMTP 端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:11
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTP 通过 SSL 端口 (禁用-1) "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:14
+msgid "Perform RBL checks upon connect instead of after RCPT"
+msgstr "执行 RBL 检查后的连接而不是后 RCPT "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:17
+msgid "Flag message as spam, instead of rejecting it"
+msgstr "将邮件标记为垃圾邮件,而不是拒绝 "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:20
+msgid "Allow unauthenticated SMTP clients to spoof this sites domains"
+msgstr "允许未经身份验证的 SMTP 客户端欺骗这个站点域 "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:23
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "从正确伪造: 经过身份验证的 SMTP 在行 "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:27
+msgid "No, allow any address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:30
+msgid "Only change the From: header if the address is not valid for the user"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:33
+msgid "Yes, always place the user's primary email address in the From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:36
+msgid "No, REJECT messages containing an invalid From: header"
+msgstr ""
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "Postfix TCP Dictionary Port"
+msgstr "后缀的词典 TCP 端口 "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:43
+msgid "-1 to disable"
+msgstr "若要禁用-1 "
+
+#: ../../static/t/aide/siteconfig/tab_smtp.html:46
+msgid "ManageSieve Port (-1 to disable)"
+msgstr "ManageSieve 端口 (禁用-1) "
+
+#: ../../static/t/aide/usermanagement.html:2
+msgid "Add, change, delete user accounts"
+msgstr "添加、 更改、 删除用户帐户"
+
+#: ../../static/t/aide/global_config.html:2
+msgid "Edit site-wide configuration"
+msgstr "编辑站点范围的配置 "
+
+#: ../../static/t/aide/global_config.html:3
+msgid "Domain names and Internet mail configuration"
+msgstr "域名及互联网邮件配置 "
+
+#: ../../static/t/aide/global_config.html:4
+#, fuzzy
+msgid "Global email aliases"
+msgstr "互联网电子邮件别名"
+
+#: ../../static/t/aide/global_config.html:5
+#: ../../static/t/view_mailq/header.html:3
+msgid "View the outbound SMTP queue"
+msgstr "查看出站 SMTP 队列 "
+
+#: ../../static/t/confirmlogoff.html:3 ../../static/t/iconbar.html:80
+#: ../../static/t/logout.html:10 ../../static/t/menu/basic_commands.html:19
+msgid "Log off"
+msgstr "注销 "
+
+#: ../../static/t/display_main_menu.html:9
+msgid "Basic commands"
+msgstr "基本命令"
+
+#: ../../static/t/display_main_menu.html:12
+msgid "Your info"
+msgstr "您的信息"
+
+#: ../../static/t/display_main_menu.html:14
+msgid "Advanced room commands"
+msgstr "高级的房命令"
+
+#: ../../static/t/edit/markdown_epic.html:13 ../../static/t/iconbar.html:50
+#: ../../static/t/iconbar.html:59
+msgid "Loading"
+msgstr "加载 "
+
+#: ../../static/t/edit/markdown_epic.html:33
+#: ../../static/t/edit/message.html:27 ../../static/t/edit/message.html:36
+msgid "Anonymous"
+msgstr "匿名 "
+
+#: ../../static/t/edit/markdown_epic.html:51
+#: ../../static/t/edit/message.html:108
+msgid "Post message"
+msgstr "邮政消息 "
+
+#: ../../static/t/edit/markdown_epic.html:59
+#: ../../static/t/edit/message.html:116
+msgid "Save to Drafts"
+msgstr "保存到草稿 "
+
+#: ../../static/t/edit/markdown_epic.html:67
+#: ../../static/t/edit/message.html:124
+#: ../../static/t/edit/message/attachments_pane.html:7
+msgid "Attachments:"
+msgstr "附件: "
+
+#: ../../static/t/edit/message.html:21
+msgid "from"
+msgstr "从 "
+
+#: ../../static/t/edit/message.html:45
+msgid "in"
+msgstr "在中 "
+
+#: ../../static/t/edit/message.html:49
+msgid "To:"
+msgstr "自: "
+
+#: ../../static/t/edit/message.html:55 ../../static/t/view_message.html:14
+#: ../../static/t/view_message/print.html:15
+msgid "CC:"
+msgstr "抄送: "
+
+#: ../../static/t/edit/message.html:61
+msgid "BCC:"
+msgstr "密件抄送: "
+
+#: ../../static/t/edit/message.html:69
+msgid "Subject (optional):"
+msgstr "(可选) 的主题: "
+
+#: ../../static/t/edit/message.html:69 ../../static/t/view_message.html:15
+#: ../../static/t/view_message/print.html:16
+#: ../../static/t/view_message/replyquote.html:8
+msgid "Subject:"
+msgstr "主题: "
+
+#: ../../static/t/edit/message.html:84
+msgid "--- forwarded message ---"
+msgstr "— — 转发的消息 — — "
+
+#: ../../static/t/edit/message/attachments_pane.html:5
+#: ../../static/t/get_logged_in.html:7
+msgid "Close window"
+msgstr "关闭窗口 "
+
+#: ../../static/t/edit/message/attachments_pane.html:63
+msgid "Drop files here to upload"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:66
+msgid "Attach file"
+msgstr "附加文件"
+
+#: ../../static/t/edit/message/attachments_pane.html:69
+msgid "Processing dropped files..."
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:83
+msgid "Retry"
+msgstr ""
+
+#: ../../static/t/edit/message/attachments_pane.html:84
+msgid "Remove"
+msgstr "删除 "
+
+#: ../../static/t/files.html:4
+msgid "Files available for download in"
+msgstr "可供下载的文件 "
+
+#: ../../static/t/files.html:9
+msgid "Upload a file:"
+msgstr "上传的文件: "
+
+#: ../../static/t/files.html:30
+msgid "Filename"
+msgstr "文件名 "
+
+#: ../../static/t/files.html:31
+msgid "Size"
+msgstr "大小 "
+
+#: ../../static/t/files.html:32
+msgid "Content"
+msgstr "内容 "
+
+#: ../../static/t/files.html:33
+msgid "Description"
+msgstr "说明 "
+
+#: ../../static/t/files/graphicsupload.html:2
+msgid "Image upload"
+msgstr "图片上传 "
+
+#: ../../static/t/files/graphicsupload.html:6
+msgid "You can upload an image directly from your computer"
+msgstr "您可以直接从您的计算机上传的映像 "
+
+#: ../../static/t/files/graphicsupload.html:8
+msgid "Please select a file to upload:"
+msgstr "请选择要上载的文件: "
+
+#: ../../static/t/files/section_onefile.html:20
+msgid "Slideshow"
+msgstr "幻灯片放映 "
+
+#: ../../static/t/floors.html:4
+msgid "Add/change/delete floors"
+msgstr "添加、 更改或删除层 "
+
+#: ../../static/t/floors.html:10
+msgid "Floor number"
+msgstr "层数 "
+
+#: ../../static/t/floors.html:11
+msgid "Floor name"
+msgstr "楼面名称 "
+
+#: ../../static/t/floors.html:12
+msgid "Number of rooms"
+msgstr "房间数 "
+
+#: ../../static/t/floors.html:13
+msgid "Floor CSS"
+msgstr "地板 CSS "
+
+#: ../../static/t/floors_edit_one.html:11
+msgid "(delete floor)"
+msgstr "(删除楼) "
+
+#: ../../static/t/get_logged_in.html:3
+msgid "You must be logged in to access this page."
+msgstr "您必须登录访问此页。 "
+
+#: ../../static/t/get_logged_in.html:53
+msgid "Log in using a user name and password"
+msgstr "使用用户名和密码登录 "
+
+#: ../../static/t/get_logged_in.html:58 ../../static/t/get_logged_in.html:73
+msgid "Password:"
+msgstr "密码: "
+
+#: ../../static/t/get_logged_in.html:62 ../../static/t/get_logged_in.html:86
+#: ../../static/t/get_logged_in.html:91 ../../static/t/get_logged_in.html:96
+#: ../../static/t/get_logged_in.html:105 ../../static/t/iconbar.html:88
+#: ../../static/t/login.html:17
+msgid "Log in"
+msgstr "登录 "
+
+#: ../../static/t/get_logged_in.html:63 ../../static/t/get_logged_in.html:67
+msgid "New user?  Register now"
+msgstr "新用户?立即注册 "
+
+#: ../../static/t/get_logged_in.html:68
+msgid ""
+"enter the name and password you wish to use, and click &quot;New User.&quot; "
+msgstr "输入的名称和密码,您想要使用,并单击 &quot;新用户.&quot;"
+
+#: ../../static/t/get_logged_in.html:81
+msgid "Log in using OpenID"
+msgstr "使用 OpenID 登录 "
+
+#: ../../static/t/get_logged_in.html:83
+msgid "OpenID URL:"
+msgstr "OpenID 的 URL: "
+
+#: ../../static/t/get_logged_in.html:90
+#, fuzzy
+msgid "Log in using Google"
+msgstr "使用 OpenID 登录 "
+
+#: ../../static/t/get_logged_in.html:95
+#, fuzzy
+msgid "Log in using Yahoo"
+msgstr "使用 OpenID 登录 "
+
+#: ../../static/t/get_logged_in.html:100
+#, fuzzy
+msgid "Log in using AOL or AIM"
+msgstr "使用 OpenID 登录 "
+
+#: ../../static/t/get_logged_in.html:102
+msgid "Enter your AOL or AIM screen name:"
+msgstr ""
+
+#: ../../static/t/get_logged_in.html:113
+msgid "Please wait"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+msgid "This is an update of"
+msgstr ""
+
+#: ../../static/t/ical/attachment/display_conflict.html:5
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "which is already in your calendar."
+msgstr "这是 '%s' 已在您的日历中的更新。 "
+
+#: ../../static/t/ical/attachment/display_conflict.html:6
+#, fuzzy
+msgid "This event would conflict with"
+msgstr "与 %s 已经在您的日历中的情况下,此事件将发生冲突。 "
+
+#: ../../static/t/iconbar.html:7
+msgid "Language:"
+msgstr ""
+
+#: ../../static/t/iconbar.html:19
+msgid "Mail"
+msgstr "邮件 "
+
+#: ../../static/t/iconbar.html:39 ../../static/t/iconbar/edit.html:61
+#: ../../static/t/summary/page.html:30
+msgid "Tasks"
+msgstr "任务 "
+
+#: ../../static/t/iconbar.html:48 ../../static/t/iconbar/edit.html:67
+msgid "Rooms"
+msgstr "客房 "
+
+#: ../../static/t/iconbar.html:57
+msgid "Online users"
+msgstr "在线用户 "
+
+#: ../../static/t/iconbar.html:62 ../../static/t/iconbar/edit.html:79
+msgid "Chat"
+msgstr "聊天 "
+
+#: ../../static/t/iconbar.html:65
+msgid "Advanced"
+msgstr "高级 "
+
+#: ../../static/t/iconbar.html:72 ../../static/t/room/edit.html:5
+#: ../../static/t/room/edit/editroom.html:4
+msgid "Administration"
+msgstr "政府 "
+
+#: ../../static/t/iconbar.html:83
+msgid "customize this menu"
+msgstr "自定义此菜单 "
+
+#: ../../static/t/iconbar.html:92
+msgid "switch to room list"
+msgstr "切换到房间列表 "
+
+#: ../../static/t/iconbar.html:93
+msgid "switch to menu"
+msgstr "切换到菜单 "
+
+#: ../../static/t/iconbar.html:94
+msgid "My folders"
+msgstr "我的文件夹 "
+
+#: ../../static/t/iconbar/edit.html:4 ../../static/t/iconbar/save.html:4
+msgid "Customize the icon bar"
+msgstr "自定义图标栏 "
+
+#: ../../static/t/iconbar/edit.html:11
+msgid "Display icons as:"
+msgstr "显示为图标,请: "
+
+#: ../../static/t/iconbar/edit.html:12
+msgid "pictures and text"
+msgstr "图片和文本 "
+
+#: ../../static/t/iconbar/edit.html:13
+msgid "pictures only"
+msgstr "只有图片 "
+
+#: ../../static/t/iconbar/edit.html:14
+msgid "text only"
+msgstr "纯文字版 "
+
+#: ../../static/t/iconbar/edit.html:16
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr "选择您想要对 '图标栏菜单中显示的图标在屏幕的左侧。 "
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "Site logo"
+msgstr "站点徽标 "
+
+#: ../../static/t/iconbar/edit.html:23
+msgid "An icon describing this site"
+msgstr "描述此站点图标 "
+
+#: ../../static/t/iconbar/edit.html:29
+msgid "Your summary page"
+msgstr "摘要页面 "
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "Mail (inbox)"
+msgstr "邮件 (收件箱) "
+
+#: ../../static/t/iconbar/edit.html:36
+msgid "A shortcut to your email Inbox"
+msgstr "快捷方式到您的电子邮件收件箱 "
+
+#: ../../static/t/iconbar/edit.html:42
+msgid "Your personal address book"
+msgstr "个人通讯簿 "
+
+#: ../../static/t/iconbar/edit.html:49
+msgid "Your personal notes"
+msgstr "您个人的笔记 "
+
+#: ../../static/t/iconbar/edit.html:55
+msgid "A shortcut to your personal calendar"
+msgstr "快捷方式到您的个人日历 "
+
+#: ../../static/t/iconbar/edit.html:61
+msgid "A shortcut to your personal task list"
+msgstr "您的个人任务列表快捷方式 "
+
+#: ../../static/t/iconbar/edit.html:67
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr "单击此图标显示列表中的所有可访问的房间 (或文件夹)可用。 "
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Who is online?"
+msgstr "在线是谁? "
+
+#: ../../static/t/iconbar/edit.html:73
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr "单击此图标会显示当前记录的所有用户的列表。 "
+
+#: ../../static/t/iconbar/edit.html:79
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr "单击此图标进入实时聊天模式与其他用户在同一房间。"
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Advanced options"
+msgstr "高级的选项 "
+
+#: ../../static/t/iconbar/edit.html:85
+msgid "Access to the complete menu of Citadel functions."
+msgstr "城堡功能的完整菜单访问。 "
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Citadel logo"
+msgstr "城堡徽标 "
+
+#: ../../static/t/iconbar/edit.html:91
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "显示提供动力的城堡' 图标 "
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"Your icon bar has been updated. Please select any of its choices to continue."
+msgstr "已更新您的图标栏。请选择继续其选择的任何类情况的发生。 "
+
+#: ../../static/t/iconbar/save.html:11
+msgid ""
+"You may need to force refresh (SHIFT-F5)> in order for changes to take effect"
+msgstr "您可能需要进行强制刷新 (shift 键 F5) > 为了使更改生效 "
+
+#: ../../static/t/listsub/display.html:6
+msgid "List subscription"
+msgstr "订阅列表 "
+
+#: ../../static/t/listsub/display.html:12
+msgid "List subscribe/unsubscribe"
+msgstr "订阅的列表/insibscribe "
+
+#: ../../static/t/listsub/display.html:18
+#: ../../static/t/listsub/display.html:37
+msgid "Confirmation request sent"
+msgstr "发送确认请求 "
+
+#: ../../static/t/listsub/display.html:19
+msgid "You are subscribing "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:20
+#, fuzzy
+msgid " to the "
+msgstr "关于 "
+
+#: ../../static/t/listsub/display.html:21
+#, fuzzy
+msgid " mailing list."
+msgstr "邮件列表服务"
+
+#: ../../static/t/listsub/display.html:22
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your subscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:23
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe you to lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:25
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"subscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:27
+msgid "Go back..."
+msgstr "回去。。。 "
+
+#: ../../static/t/listsub/display.html:30
+#: ../../static/t/listsub/display.html:50
+#, fuzzy
+msgid "ERROR"
+msgstr "错误: "
+
+#: ../../static/t/listsub/display.html:38
+msgid "You are unsubscribing"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:40
+#, fuzzy
+msgid "from the"
+msgstr "从 "
+
+#: ../../static/t/listsub/display.html:42
+#, fuzzy
+msgid "mailing list."
+msgstr "邮件列表服务"
+
+#: ../../static/t/listsub/display.html:43
+msgid ""
+"The listserver has sent you an e-mail with one additional Web link for you "
+"to click on to confirm your unsubscription."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:44
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to unsubscribe you from lists without your consent."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:46
+msgid ""
+"Please click on the link which is being e-mailed to you and your "
+"unsubscription will be confirmed."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:47
+#, fuzzy
+msgid "Back..."
+msgstr "回去。。。 "
+
+#: ../../static/t/listsub/display.html:57
+#, fuzzy
+msgid "Confirmation successful!"
+msgstr "发送确认请求 "
+
+#: ../../static/t/listsub/display.html:59
+#, fuzzy
+msgid "Confirmation failed."
+msgstr "配置"
+
+#: ../../static/t/listsub/display.html:60
+msgid "This could mean one of two things:"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:62
+msgid ""
+"You waited too long to confirm your subscribe/unsubscribe request (the "
+"confirmation link is only valid for three days)"
+msgstr ""
+
+#: ../../static/t/listsub/display.html:63
+msgid ""
+"You have <i>already</i> successfully confirmed your subscribe/unsubscribe "
+"request and are attempting to do it again."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:65
+msgid "The error returned by the server was: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:73
+#, fuzzy
+msgid "Name of list:"
+msgstr "任务的名称"
+
+#: ../../static/t/listsub/display.html:78
+#, fuzzy
+msgid "Your e-mail address:"
+msgstr "首选的电子邮件地址 "
+
+#: ../../static/t/listsub/display.html:82
+msgid "(If subscribing) preferred format: "
+msgstr ""
+
+#: ../../static/t/listsub/display.html:83
+#, fuzzy
+msgid "One message at a time"
+msgstr "输入消息的文本: "
+
+#: ../../static/t/listsub/display.html:84
+#, fuzzy
+msgid "Digest format"
+msgstr "时间格式 "
+
+#: ../../static/t/listsub/display.html:92
+msgid ""
+"When you attempt to subscribe or unsubscribe to a mailing list, you will "
+"receive an e-mail containing one additional web link to click on for final "
+"confirmation."
+msgstr ""
+
+#: ../../static/t/listsub/display.html:93
+msgid ""
+"This extra step is for your protection, as it prevents others from being "
+"able to subscribe or unsubscribe you to lists."
+msgstr ""
+
+#: ../../static/t/loggedinas.html:3
+msgid "Logged in as"
+msgstr "作为登录 "
+
+#: ../../static/t/loggedinas.html:6
+msgid "Not logged in."
+msgstr "未登录。 "
+
+#: ../../static/t/login.html:7
+msgid "powered by"
+msgstr "提供者"
+
+#: ../../static/t/logout.html:16
+msgid "Log in again"
+msgstr "再次登录 "
+
+#: ../../static/t/menu/advanced_roomcommands.html:3
+msgid "Edit or delete this room"
+msgstr "编辑或删除这个房间 "
+
+#: ../../static/t/menu/advanced_roomcommands.html:5
+msgid "Go to a 'hidden' room"
+msgstr "转到隐藏的房间 "
+
+#: ../../static/t/menu/advanced_roomcommands.html:6
+#: ../../static/t/room/create.html:11
+msgid "Create a new room"
+msgstr "创建一个新的房间 "
+
+#: ../../static/t/menu/advanced_roomcommands.html:7
+#, fuzzy
+msgid "Create a new (public) blog"
+msgstr "创建一个新的房间 "
+
+#: ../../static/t/menu/advanced_roomcommands.html:8
+msgid "Zap (forget) this room"
+msgstr "歼灭 (忘记) 这个房间 "
+
+#: ../../static/t/menu/advanced_roomcommands.html:9
+msgid "List all forgotten rooms"
+msgstr "列出所有的房间都被遗忘 "
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+#, fuzzy
+msgid "Zap duplicate messages"
+msgstr "阅读新邮件 "
+
+#: ../../static/t/menu/advanced_roomcommands.html:10
+msgid "(Messages of similar subject, sender and date are moved to trash)"
+msgstr ""
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "List known rooms"
+msgstr "已知房间列表 "
+
+#: ../../static/t/menu/basic_commands.html:3
+msgid "Where can I go from here?"
+msgstr "哪儿可以从这里? "
+
+#: ../../static/t/menu/basic_commands.html:4 ../../static/t/navbar.html:207
+msgid "Goto next room"
+msgstr "转到隔壁房间 "
+
+#: ../../static/t/menu/basic_commands.html:4
+msgid "...with <em>unread</em> messages"
+msgstr "… … 以 <em> 未读的 </em> 消息 "
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "Skip to next room"
+msgstr "跳到隔壁房间 "
+
+#: ../../static/t/menu/basic_commands.html:5
+msgid "(come back here later)"
+msgstr "(回来以后) "
+
+#: ../../static/t/menu/basic_commands.html:6 ../../static/t/navbar.html:5
+msgid "Ungoto"
+msgstr "Ungoto"
+
+#: ../../static/t/menu/basic_commands.html:6
+msgid "oops! Back to "
+msgstr "哎呀 !回 "
+
+#: ../../static/t/menu/basic_commands.html:10 ../../static/t/navbar.html:13
+msgid "Read new messages"
+msgstr "阅读新邮件 "
+
+#: ../../static/t/menu/basic_commands.html:10
+msgid "...in this room"
+msgstr "... 这房间 "
+
+#: ../../static/t/menu/basic_commands.html:11 ../../static/t/navbar.html:19
+msgid "Read all messages"
+msgstr "阅读所有邮件 "
+
+#: ../../static/t/menu/basic_commands.html:11
+msgid "...old <em>and</em> new"
+msgstr "….old <em> 和 </em> 新 "
+
+#: ../../static/t/menu/basic_commands.html:12 ../../static/t/navbar.html:25
+msgid "Enter a message"
+msgstr "输入的消息 "
+
+#: ../../static/t/menu/basic_commands.html:12
+msgid "(post in this room)"
+msgstr "(在这个房间里发布) "
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "File library"
+msgstr "文件库 "
+
+#: ../../static/t/menu/basic_commands.html:13
+msgid "(List files available for download)"
+msgstr "(列出可供下载的文件) "
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary page"
+msgstr "摘要页 "
+
+#: ../../static/t/menu/basic_commands.html:17
+msgid "Summary of my account"
+msgstr "我的账户的摘要 "
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "User list"
+msgstr "的用户列表 "
+
+#: ../../static/t/menu/basic_commands.html:18
+msgid "(all registered users)"
+msgstr "(所有已注册的用户) "
+
+#: ../../static/t/menu/basic_commands.html:19
+msgid "Bye!"
+msgstr "再见 ! "
+
+#: ../../static/t/menu/change_pw.html:6 ../../static/t/menu/your_info.html:4
+msgid "Change your password"
+msgstr "更改您的密码 "
+
+#: ../../static/t/menu/change_pw.html:16
+msgid "Enter new password:"
+msgstr "输入新的密码: "
+
+#: ../../static/t/menu/change_pw.html:20
+msgid "Enter it again to confirm:"
+msgstr "输入并再次确认: "
+
+#: ../../static/t/menu/your_info.html:2
+msgid "Change your preferences and settings"
+msgstr "更改您的首选项和设置 "
+
+#: ../../static/t/menu/your_info.html:3
+msgid "Update your contact information"
+msgstr "更新您的联系信息 "
+
+#: ../../static/t/menu/your_info.html:5
+msgid "Enter your 'bio'"
+msgstr "请输入您的生物 "
+
+#: ../../static/t/menu/your_info.html:6
+msgid "Edit your online photo"
+msgstr "编辑您的在线照片 "
+
+#: ../../static/t/menu/your_info.html:7 ../../static/t/sieve/list.html:5
+#: ../../static/t/sieve/none.html:4
+msgid "View/edit server-side mail filters"
+msgstr "查看/编辑服务器端邮件筛选器"
+
+#: ../../static/t/menu/your_info.html:8
+msgid "Edit your push email settings"
+msgstr "编辑你推电子邮件设置 "
+
+#: ../../static/t/menu/your_info.html:9
+msgid "Manage your OpenIDs"
+msgstr "管理您的 OpenIDs "
+
+#: ../../static/t/msg/confirm_move.html:4
+msgid "Confirm move of message"
+msgstr "确认消息的移动 "
+
+#: ../../static/t/msg/confirm_move.html:12
+msgid "Move this message to:"
+msgstr "移动到此消息: "
+
+#: ../../static/t/msg_listselector_bottom.html:2
+#: ../../static/t/msg_listselector_top.html:2
+msgid "Reading #"
+msgstr "阅读 # "
+
+#: ../../static/t/msg_listselector_bottom.html:7
+#: ../../static/t/msg_listselector_top.html:7 ../../static/t/roombanner.html:3
+#: ../../static/t/roombanner.html:11 ../../static/t/roombanner.html:12
+msgid "messages"
+msgstr "邮件 "
+
+#: ../../static/t/msg_listselector_bottom.html:12
+#: ../../static/t/msg_listselector_top.html:12
+msgid "oldest to newest"
+msgstr "最早到最新 "
+
+#: ../../static/t/msg_listselector_bottom.html:20
+#: ../../static/t/msg_listselector_top.html:20
+msgid "newest to oldest"
+msgstr "最新到旧 "
+
+#: ../../static/t/msg_listview.html:10 ../../static/t/sieve/display_one.html:24
+#: ../../static/t/view_mailq/table.html:10
+msgid "Sender"
+msgstr "发件人 "
+
+#: ../../static/t/msg_listview.html:18
+msgid "Loading messages from server, please wait"
+msgstr "从服务器加载的邮件,请稍候 "
+
+#: ../../static/t/msg_listview.html:24
+msgid "Open in new window"
+msgstr "在新窗口中打开 "
+
+#: ../../static/t/msg_listview.html:25 ../../static/t/view_message.html:30
+msgid "Move"
+msgstr "移动 "
+
+#: ../../static/t/msg_listview.html:26
+msgid "Copy"
+msgstr "副本 "
+
+#: ../../static/t/msg_listview.html:28 ../../static/t/view_message.html:34
+msgid "Print"
+msgstr "打印 "
+
+#: ../../static/t/navbar.html:34
+msgid "View contacts"
+msgstr "查看联系人 "
+
+#: ../../static/t/navbar.html:40
+msgid "Add new contact"
+msgstr "添加新联系人 "
+
+#: ../../static/t/navbar.html:49
+msgid "Day view"
+msgstr "天视图 "
+
+#: ../../static/t/navbar.html:55
+msgid "Month view"
+msgstr "月视图 "
+
+#: ../../static/t/navbar.html:61
+msgid "Add new event"
+msgstr "添加新事件 "
+
+#: ../../static/t/navbar.html:70
+msgid "Calendar list"
+msgstr "日历列表 "
+
+#: ../../static/t/navbar.html:79
+msgid "View tasks"
+msgstr "查看任务 "
+
+#: ../../static/t/navbar.html:85
+msgid "Add new task"
+msgstr "添加新任务 "
+
+#: ../../static/t/navbar.html:94
+msgid "View notes"
+msgstr "查看备注 "
+
+#: ../../static/t/navbar.html:101
+msgid "Add new note"
+msgstr "添加新的注释 "
+
+#: ../../static/t/navbar.html:110
+msgid "Refresh message list"
+msgstr "刷新消息列表 "
+
+#: ../../static/t/navbar.html:122
+msgid "Write mail"
+msgstr "写邮件 "
+
+#: ../../static/t/navbar.html:132 ../../static/t/navbar.html:163
+msgid "Wiki home"
+msgstr "Wiki 回家 "
+
+#: ../../static/t/navbar.html:139 ../../static/t/navbar.html:170
+msgid "Edit this page"
+msgstr "编辑此页 "
+
+#: ../../static/t/navbar.html:145 ../../static/t/navbar.html:176
+msgid "History"
+msgstr "历史 "
+
+#: ../../static/t/navbar.html:152 ../../static/t/navbar.html:183
+msgid "publish to blog"
+msgstr ""
+
+#: ../../static/t/navbar.html:193
+msgid "New blog post"
+msgstr ""
+
+#: ../../static/t/navbar.html:201
+msgid "Skip this room"
+msgstr "跳过这间屋子 "
+
+#: ../../static/t/navbar.html:212
+msgid "Resend Mailqueue now"
+msgstr ""
+
+#: ../../static/t/newstartpage.html:4
+msgid "New start page"
+msgstr "新的起始页 "
+
+#: ../../static/t/newstartpage.html:9
+msgid "Your start page has been changed."
+msgstr "已更改您的起始页。 "
+
+#: ../../static/t/newstartpage.html:12
+msgid ""
+"(Note: this does not change your browser's home page. It changes the page "
+"you begin on when you log on to"
+msgstr "(注: 这不会更改您的浏览器的主页。它会更改页当您登录到您在开始 "
+
+#: ../../static/t/no_new_msgs.html:3
+msgid "No new messages."
+msgstr "没有新的消息。"
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "Your OpenID"
+msgstr ""
+
+#: ../../static/t/openid_manual_create.html:2
+msgid "was successfully verified."
+msgstr "已成功验证。"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "However, the user name"
+msgstr "但是,用户名称"
+
+#: ../../static/t/openid_manual_create.html:3
+msgid "conflicts with an existing user."
+msgstr "与现有用户的冲突。"
+
+#: ../../static/t/openid_manual_create.html:5
+msgid "Please specify the user name you would like to use."
+msgstr "请指定您想要使用的用户名。"
+
+#: ../../static/t/preferences.html:4 ../../static/t/preferences.html:7
+msgid "Preferences and settings"
+msgstr "首选项和设置"
+
+#: ../../static/t/prefs/box.html:9
+msgid "Tree (folders) view"
+msgstr "(文件夹) 树视图 "
+
+#: ../../static/t/prefs/box.html:11
+msgid "Table (rooms) view"
+msgstr "表 (房间) 视图 "
+
+#: ../../static/t/prefs/box.html:20
+msgid "12 hour (am/pm)"
+msgstr "12 小时 (am/pm) "
+
+#: ../../static/t/prefs/box.html:24
+msgid "24 hour"
+msgstr "24 小时 "
+
+#: ../../static/t/prefs/box.html:150
+msgid "Sunday"
+msgstr "星期日 "
+
+#: ../../static/t/prefs/box.html:151
+msgid "Monday"
+msgstr "星期一 "
+
+#: ../../static/t/prefs/box.html:172
+msgid "No signature"
+msgstr "没有签名 "
+
+#: ../../static/t/prefs/box.html:234
+msgid "Full-functionality"
+msgstr "全功能 "
+
+#: ../../static/t/prefs/box.html:237
+msgid "Safe mode"
+msgstr "安全模式 "
+
+#: ../../static/t/prefs/box.html:238
+msgid ""
+"Safe mode is less intensive on your web browser, but not as fully featured."
+msgstr "安全模式是少用 web 浏览器,但不是充分的特色。 "
+
+#: ../../static/t/prefs/pushemail.html:2
+msgid "Configure Push Email"
+msgstr "配置邮件推送 "
+
+#: ../../static/t/prefs/pushemail.html:9
+msgid "Push email and SMS settings"
+msgstr "推动电子邮件和短信设置"
+
+#: ../../static/t/prefs/pushemail.html:17
+msgid ""
+"If your administrator has enabled the functionality, Citadel can notify a "
+"Funambol server that you haved recieved new email and automatically "
+"syncronize any devices you have with the Funambol client installed."
+msgstr ""
+"如果您的管理员已启用该功能,可以通知城堡战略性服务器,您收到的所见所闻新的电"
+"子邮件和自动同步您拥有的任何设备战略性客户端安装。 "
+
+#: ../../static/t/prefs/pushemail.html:20
+msgid ""
+"Alternatively, if the administrator has configured it, Citadel can send a "
+"text message to you when new mail arrives."
+msgstr "另外,如果管理员已配置它,城堡可以发送新邮件到达时的文本消息。 "
+
+#: ../../static/t/prefs/pushemail.html:26
+msgid "Notify Funambol server"
+msgstr "通知的战略性服务器"
+
+#: ../../static/t/prefs/pushemail.html:31
+msgid "Send a text message to..."
+msgstr "发送文本消息..."
+
+#: ../../static/t/prefs/pushemail.html:33
+msgid ""
+"(Use international format, without any leading zeros, spaces or hypens, like "
+"+61415011501)"
+msgstr "(使用国际标准格式,没有任何前导零、 空格或连像+61415011501) "
+
+#: ../../static/t/prefs/pushemail.html:38
+msgid "Use custom notification scheme configured by your Admin"
+msgstr "使用自定义通知计划由您的管理员配置 "
+
+#: ../../static/t/prefs/pushemail.html:43
+msgid "Don‘t send any notifications"
+msgstr "不要发送任何通知 "
+
+#: ../../static/t/room/create.html:18
+msgid "Name of room: "
+msgstr "文件室的名称:"
+
+#: ../../static/t/room/create.html:20 ../../static/t/room/create_blog.html:31
+#: ../../static/t/room/edit/tab_config.html:11
+msgid "Resides on floor: "
+msgstr "驻留在地板上:"
+
+#: ../../static/t/room/create.html:32
+msgid "Default view for room: "
+msgstr "房间的默认视图:"
+
+#: ../../static/t/room/create.html:70
+#: ../../static/t/room/edit/tab_config.html:17
+msgid "Type of room:"
+msgstr "房间类型:"
+
+#: ../../static/t/room/create.html:75
+#: ../../static/t/room/edit/tab_config.html:23
+msgid "Public (automatically appears to everyone)"
+msgstr "公共 (每个人都自动显示)"
+
+#: ../../static/t/room/create.html:79
+#: ../../static/t/room/edit/tab_config.html:29
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "私人-隐藏 (可向任何人知道它的名称)"
+
+#: ../../static/t/room/create.html:83 ../../static/t/room/create_blog.html:53
+#: ../../static/t/room/edit/tab_config.html:36
+msgid "Private - require password: "
+msgstr "私人-需要密码:"
+
+#: ../../static/t/room/create.html:88 ../../static/t/room/create_blog.html:58
+#: ../../static/t/room/edit/tab_config.html:45
+msgid "Private - invitation only"
+msgstr "仅限邀请私营"
+
+#: ../../static/t/room/create.html:92
+#: ../../static/t/room/edit/tab_config.html:52
+msgid "Personal (mailbox for you only)"
+msgstr "个人 (仅为您邮箱)"
+
+#: ../../static/t/room/create_blog.html:12
+#, fuzzy
+msgid "Create a new blog"
+msgstr "创建一个新的房间 "
+
+#: ../../static/t/room/create_blog.html:20
+msgid "This is the new edit room for your blog"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:21
+msgid ""
+"Once you've saved your edits, you can press 'publish' to make your writings "
+"visible in the blog."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:22
+msgid "click this link to start your first article"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:23
+msgid "Edit this page and copy plus edit the above to add more articles."
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "You may link previously uploaded images like this:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:24
+msgid "assuming its name is test.jpg"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:29
+#, fuzzy
+msgid "Name of the blog: "
+msgstr "文件室的名称:"
+
+#: ../../static/t/room/create_blog.html:39
+#, fuzzy
+msgid "Default editor for blog: "
+msgstr "房间的默认视图:"
+
+#: ../../static/t/room/create_blog.html:41
+msgid ""
+"Articles will be published from wiki articles to the blog. Choose your "
+"prefered source wiki format:"
+msgstr ""
+
+#: ../../static/t/room/create_blog.html:48
+#, fuzzy
+msgid "Type of edit room:"
+msgstr "房间类型:"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11
+#, fuzzy
+msgid "Enter the room info below."
+msgstr "编辑此房间信息文件"
+
+#: ../../static/t/room/create_blog.html:73
+#: ../../static/t/room/edit_info.html:11 ../../static/t/user/edit_bio.html:11
+msgid ""
+"The text is formatted to the reader's browser. A newline is forced by "
+"preceding the next line by a blank."
+msgstr "读者的浏览器设置文本格式。前面的一片空白的下一行,会强制换行。 "
+
+#: ../../static/t/room/display_private.html:7
+msgid "Go to a hidden room"
+msgstr "转到一个隐藏的房间"
+
+#: ../../static/t/room/display_private.html:8
+msgid ""
+"If you know the name of a hidden (guess-name) or passworded room, you can "
+"enter that room by typing its name below.  Once you gain access to a private "
+"room, it will appear in your regular room listings so you don‘t have to keep "
+"returning here."
+msgstr ""
+"如果您知道隐藏 (猜名称) 或 passworded 房间的名称,您可以 输入通过键入其名称"
+"下面的那间屋子里。一旦您访问一个私有 房间,它将出现在您定期房间列表使您不必保"
+"持 返回在这里。"
+
+#: ../../static/t/room/display_private.html:14
+msgid "Enter room name:"
+msgstr "输入房间名称:"
+
+#: ../../static/t/room/display_private.html:21
+msgid "Enter room password:"
+msgstr "输入房间密码:"
+
+#: ../../static/t/room/edit.html:6 ../../static/t/room/edit/editroom.html:5
+msgid "Configuration"
+msgstr "配置"
+
+#: ../../static/t/room/edit.html:7 ../../static/t/room/edit/editroom.html:6
+msgid "Message expire policy"
+msgstr "邮件过期这层政策"
+
+#: ../../static/t/room/edit.html:8 ../../static/t/room/edit/editroom.html:7
+msgid "Access controls"
+msgstr "访问控制和网站策略设置"
+
+#: ../../static/t/room/edit.html:9 ../../static/t/room/edit/editroom.html:8
+msgid "Sharing"
+msgstr "共享"
+
+#: ../../static/t/room/edit.html:10 ../../static/t/room/edit/editroom.html:9
+msgid "Mailing list service"
+msgstr "邮件列表服务"
+
+#: ../../static/t/room/edit.html:11 ../../static/t/room/edit/editroom.html:10
+msgid "Remote retrieval"
+msgstr "远程检索"
+
+#: ../../static/t/room/edit/alias_removal.html:1
+#: ../../static/t/room/edit/digestrecp_removal.html:1
+#: ../../static/t/room/edit/listrecp_removal.html:1
+#: ../../static/t/room/edit/participate_removal.html:1
+#: ../../static/t/room/edit/pop3client_removal.html:9
+#: ../../static/t/room/edit/rssclient_removal.html:5
+msgid "(remove)"
+msgstr "(删除)"
+
+#: ../../static/t/room/edit/tab_access.html:5
+msgid ""
+"The users listed below have access to this room. To remove a user from the "
+"access list, select the user name from the list and click 'Kick'."
+msgstr ""
+"下面列出的用户有权访问这个房间。若要删除用户从 访问列表中,从列表中选择用户名"
+"称,然后单击 '踢'。"
+
+#: ../../static/t/room/edit/tab_access.html:21
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr "要授予这个房间另一个用户访问,在框中输入用户名 下面,单击邀请。"
+
+#: ../../static/t/room/edit/tab_access.html:28
+msgid "Invite:"
+msgstr "邀请:"
+
+#: ../../static/t/room/edit/tab_access.html:37
+msgid "Users"
+msgstr "用户"
+
+#: ../../static/t/room/edit/tab_admin.html:5
+msgid "Delete this room"
+msgstr "删除这个房间"
+
+#: ../../static/t/room/edit/tab_admin.html:10
+msgid "Set or change the icon for this rooms banner"
+msgstr "设置或更改此房间旗帜的图标"
+
+#: ../../static/t/room/edit/tab_admin.html:14
+msgid "Edit this rooms Info file"
+msgstr "编辑此房间信息文件"
+
+#: ../../static/t/room/edit/tab_config.html:7
+msgid "name of room: "
+msgstr "文件室的名称:"
+
+#: ../../static/t/room/edit/tab_config.html:56
+msgid "If private, cause current users to forget room"
+msgstr "如果是私有的导致当前用户忘记室"
+
+#: ../../static/t/room/edit/tab_config.html:62
+msgid "Preferred users only"
+msgstr "首选的用户只"
+
+#: ../../static/t/room/edit/tab_config.html:67
+msgid "Read-only room"
+msgstr "只读的房间"
+
+#: ../../static/t/room/edit/tab_config.html:72
+msgid "All users allowed to post may also delete messages"
+msgstr "允许发布的所有用户,也可以都删除邮件"
+
+#: ../../static/t/room/edit/tab_config.html:77
+msgid "File directory room"
+msgstr "文件目录室"
+
+#: ../../static/t/room/edit/tab_config.html:81
+msgid "Directory name: "
+msgstr "目录名称:"
+
+#: ../../static/t/room/edit/tab_config.html:87
+msgid "Uploading allowed"
+msgstr "上载允许"
+
+#: ../../static/t/room/edit/tab_config.html:92
+msgid "Downloading allowed"
+msgstr "下载允许"
+
+#: ../../static/t/room/edit/tab_config.html:97
+#, fuzzy
+msgid "Don't send message on upload"
+msgstr "在服务器上保留邮件吗?"
+
+#: ../../static/t/room/edit/tab_config.html:102
+msgid "Visible directory"
+msgstr "可见的目录"
+
+#: ../../static/t/room/edit/tab_config.html:109
+msgid "Network shared room"
+msgstr "网络共享空间"
+
+#: ../../static/t/room/edit/tab_config.html:114
+msgid "Permanent (does not auto-purge)"
+msgstr "常驻 (并不自动清除)"
+
+#: ../../static/t/room/edit/tab_config.html:119
+msgid "Subject Required (Force users to specify a message subject)"
+msgstr "所需的主题 (强制用户指定邮件主题)"
+
+#: ../../static/t/room/edit/tab_config.html:122
+msgid "Anonymous messages"
+msgstr "匿名消息"
+
+#: ../../static/t/room/edit/tab_config.html:128
+msgid "No anonymous messages"
+msgstr "没有匿名消息"
+
+#: ../../static/t/room/edit/tab_config.html:133
+msgid "All messages are anonymous"
+msgstr "所有消息都是匿名"
+
+#: ../../static/t/room/edit/tab_config.html:138
+msgid "Prompt user when entering messages"
+msgstr "提示用户输入消息时"
+
+#: ../../static/t/room/edit/tab_config.html:142
+msgid "Room aide: "
+msgstr "房间的助手:"
+
+#: ../../static/t/room/edit/tab_expire.html:9
+msgid "Message expire policy for this room"
+msgstr "邮件过期的这间屋子的政策"
+
+#: ../../static/t/room/edit/tab_expire.html:15
+msgid "Use the default policy for this floor"
+msgstr "这种地板使用默认策略"
+
+#: ../../static/t/room/edit/tab_expire.html:37
+msgid "Message expire policy for this floor"
+msgstr "邮件过期这层政策"
+
+#: ../../static/t/room/edit/tab_expire.html:43
+msgid "Use the system default"
+msgstr "使用系统默认值"
+
+#: ../../static/t/room/edit/tab_feed.html:2
+msgid ""
+"Retrieve messages from these remote POP3 accounts and store them in this "
+"room:"
+msgstr "从这些远程 POP3 帐户检索消息,并将它们存储在此 房间:"
+
+#: ../../static/t/room/edit/tab_feed.html:13
+msgid "Remote host"
+msgstr "远程主机"
+
+#: ../../static/t/room/edit/tab_feed.html:14
+#: ../../static/t/who/box_list_static.html:6 ../../static/t/who/summary.html:5
+msgid "User name"
+msgstr "用户名称 "
+
+#: ../../static/t/room/edit/tab_feed.html:16
+msgid "Keep messages on server?"
+msgstr "在服务器上保留邮件吗?"
+
+#: ../../static/t/room/edit/tab_feed.html:17
+msgid "Interval"
+msgstr "时间间隔"
+
+#: ../../static/t/room/edit/tab_feed.html:32
+msgid "Fetch the following RSS feeds and store them in this room:"
+msgstr "获取以下的 RSS 订阅源,并将它们存储在这个房间里:"
+
+#: ../../static/t/room/edit/tab_feed.html:45
+msgid "Feed URL"
+msgstr "饲料的 URL"
+
+#: ../../static/t/room/edit/tab_listserv.html:6
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br><br>"
+msgstr ""
+"<i> 这个房间里的内容都被作为单个邮件 </b> 邮寄 <b> 以下列列表中的收件人: </"
+"i> <br/> <br/>"
+
+#: ../../static/t/room/edit/tab_listserv.html:23
+#, fuzzy
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br><br>"
+msgstr ""
+"<i> 这个房间里的内容都被以邮寄 <b>,来以月刊形式 </b> 以下列表中的收件人: </"
+"i> <br/> <br/>"
+
+#: ../../static/t/room/edit/tab_listserv.html:43
+msgid "Posts to this room will be sent to these mailing lists"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:44
+msgid ""
+"All messages posted / mailed into this room will be sent to these email "
+"addresses. If you link this with mailinglist subscriptions, make shure the "
+"default sender address below matches the subscribed address. You will see "
+"your messages twice once the mailinglist sends it back to you."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:66
+msgid "Add recipients from Contacts or other address books"
+msgstr "从联系人或其他通讯簿添加收件人"
+
+#: ../../static/t/room/edit/tab_listserv.html:75
+msgid "Allow non-subscribers to mail to this room."
+msgstr "允许订阅服务器以便将邮件到这个房间。"
+
+#: ../../static/t/room/edit/tab_listserv.html:81
+msgid "Room post publication needs Admin permission."
+msgstr "房间后的出版物需求助手的权限。"
+
+#: ../../static/t/room/edit/tab_listserv.html:86
+msgid "Allow self-service subscribe/unsubscribe requests."
+msgstr "允许自助服务订阅退订的请求。"
+
+#: ../../static/t/room/edit/tab_listserv.html:92
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "订阅取消订阅的 URL 是:"
+
+#: ../../static/t/room/edit/tab_listserv.html:110
+msgid "Which from address should be used: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:123
+msgid "none (not advised)"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:135
+msgid "Alternative public emailaddresses pointing to this room: "
+msgstr ""
+
+#: ../../static/t/room/edit/tab_listserv.html:150
+msgid "All Domains"
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:5
+msgid "Not shared with"
+msgstr "不与共享"
+
+#: ../../static/t/room/edit/tab_share.html:6
+msgid "Shared with"
+msgstr "与共享"
+
+#: ../../static/t/room/edit/tab_share.html:12
+#: ../../static/t/room/edit/tab_share.html:22
+msgid "Remote node name"
+msgstr "远程节点名称"
+
+#: ../../static/t/room/edit/tab_share.html:13
+#: ../../static/t/room/edit/tab_share.html:23
+msgid "Remote room name"
+msgstr "远程房间名称"
+
+#: ../../static/t/room/edit/tab_share.html:14
+#: ../../static/t/room/edit/tab_share.html:24
+msgid "Actions"
+msgstr "行动"
+
+#: ../../static/t/room/edit/tab_share.html:36
+#, fuzzy
+msgid ""
+"When sharing a room, it must be shared from both ends.  Adding a node to the "
+"'shared' list sends messages out, but in order to receive messages, the "
+"other nodes must be configured to send messages out to your system as well."
+msgstr ""
+"当共享一个房间,必须从两端共享它。添加节点 共享列表发送出去,但为了接收邮件,"
+"邮件 必须将的邮件发送到您的系统以及配置其他节点。 <li> 如果远程房间名称为空,"
+"则假定的房间名称是 相同的远程节点上。<li> 如果远程房间名称是不同的 远程节点还"
+"必须配置在这里的房间的名称。"
+
+#: ../../static/t/room/edit/tab_share.html:38
+msgid ""
+"If the remote room name is blank, it is assumed that the room name is "
+"identical on the remote node."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:40
+msgid ""
+"If the remote room name is different, the remote node must also configure "
+"the name of the room here."
+msgstr ""
+
+#: ../../static/t/room/edit/tab_share.html:42
+msgid ""
+"Re-sharing may stress your system and produce large spoolfiles that need to "
+"be transmitted; All messages in this room not originating from this node are "
+"re-spooled and re-sent with the next networker run."
+msgstr ""
+
+#: ../../static/t/room/edit_info.html:8 ../../static/t/user/edit_bio.html:8
+#, fuzzy
+msgid "Edit Room info"
+msgstr "房间信息 "
+
+#: ../../static/t/room/zap_this.html:3
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "歼灭 (忘记/退订) 现时的房间"
+
+#: ../../static/t/room/zap_this.html:6
+msgid "If you select this option,"
+msgstr "如果您选择此选项,"
+
+#: ../../static/t/room/zap_this.html:8
+msgid "will disappear from your room list.  Is this what you wish to do?"
+msgstr "将从您的房间列表中消失。这是你想做的吗?"
+
+#: ../../static/t/room/zapped_list.html:7
+msgid "Zapped (forgotten) rooms"
+msgstr "该地 (被遗忘) 室"
+
+#: ../../static/t/room/zapped_list.html:10
+msgid "Click on any room to un-zap it and goto that room."
+msgstr "单击任何房间以联合国 zap 上它,并转到那个房间。"
+
+#: ../../static/t/roombanner.html:3 ../../static/t/roombanner.html:11
+#: ../../static/t/roombanner.html:12
+msgid "new of"
+msgstr "新的 "
+
+#: ../../static/t/roombanner.html:29
+msgid "Select page: "
+msgstr "选择的页面: "
+
+#: ../../static/t/searchomatic.html:4
+msgid "Search: "
+msgstr "搜索: "
+
+#: ../../static/t/select_messageindex_all.html:1
+#: ../../static/t/sieve/display_one.html:34
+msgid "All"
+msgstr "所有"
+
+#: ../../static/t/sieve/add.html:3
+msgid "Add or delete scripts"
+msgstr "添加或删除脚本"
+
+#: ../../static/t/sieve/add.html:7
+msgid "Add a new script"
+msgstr "添加一个新的脚本"
+
+#: ../../static/t/sieve/add.html:8
+msgid ""
+"To create a new script, enter the desired script name in the box below and "
+"click 'Create'."
+msgstr "若要创建一个新的脚本,在下面的框中输入所需的脚本名称并单击创建"
+
+#: ../../static/t/sieve/add.html:12
+msgid "Script name: "
+msgstr "脚本的名称:"
+
+#: ../../static/t/sieve/add.html:16
+msgid "Edit scripts"
+msgstr "编辑脚本"
+
+#: ../../static/t/sieve/add.html:18
+msgid "Return to the script editing screen"
+msgstr "返回到该脚本编辑屏幕"
+
+#: ../../static/t/sieve/add.html:21
+msgid "Delete scripts"
+msgstr "删除脚本"
+
+#: ../../static/t/sieve/add.html:22
+msgid ""
+"To delete an existing script, select the script name from the list and click "
+"'Delete'."
+msgstr "若要删除现有的脚本,从列表中选择脚本名称并单击删除"
+
+#: ../../static/t/sieve/display_one.html:16
+msgid "If"
+msgstr "如果"
+
+#: ../../static/t/sieve/display_one.html:21
+msgid "To or Cc"
+msgstr "或抄送"
+
+#: ../../static/t/sieve/display_one.html:23
+msgid "Reply-to"
+msgstr "回复"
+
+#: ../../static/t/sieve/display_one.html:25
+msgid "Resent-From"
+msgstr "近期从"
+
+#: ../../static/t/sieve/display_one.html:26
+msgid "Resent-To"
+msgstr "近年来 "
+
+#: ../../static/t/sieve/display_one.html:27
+msgid "Envelope From"
+msgstr "从信封"
+
+#: ../../static/t/sieve/display_one.html:28
+msgid "Envelope To"
+msgstr "信封"
+
+#: ../../static/t/sieve/display_one.html:29
+msgid "X-Mailer"
+msgstr "X-发件人"
+
+#: ../../static/t/sieve/display_one.html:30
+msgid "X-Spam-Flag"
+msgstr "X-垃圾邮件标志"
+
+#: ../../static/t/sieve/display_one.html:31
+msgid "X-Spam-Status"
+msgstr "X-垃圾邮件状态"
+
+#: ../../static/t/sieve/display_one.html:32
+msgid "List-ID"
+msgstr "列表 ID"
+
+#: ../../static/t/sieve/display_one.html:33
+msgid "Message size"
+msgstr "邮件大小"
+
+#: ../../static/t/sieve/display_one.html:41
+msgid "contains"
+msgstr "包含"
+
+#: ../../static/t/sieve/display_one.html:42
+msgid "does not contain"
+msgstr "不包含"
+
+#: ../../static/t/sieve/display_one.html:43
+msgid "is"
+msgstr "是"
+
+#: ../../static/t/sieve/display_one.html:44
+msgid "is not"
+msgstr "不是"
+
+#: ../../static/t/sieve/display_one.html:45
+msgid "matches"
+msgstr "匹配"
+
+#: ../../static/t/sieve/display_one.html:46
+msgid "does not match"
+msgstr "不匹配"
+
+#: ../../static/t/sieve/display_one.html:52
+msgid "(All messages)"
+msgstr "(所有消息)"
+
+#: ../../static/t/sieve/display_one.html:56
+msgid "is larger than"
+msgstr "大于"
+
+#: ../../static/t/sieve/display_one.html:57
+msgid "is smaller than"
+msgstr "小于"
+
+#: ../../static/t/sieve/display_one.html:59
+#, fuzzy
+msgid "bytes"
+msgstr "年 "
+
+#: ../../static/t/sieve/display_one.html:65
+msgid "Keep"
+msgstr "保持"
+
+#: ../../static/t/sieve/display_one.html:66
+msgid "Discard silently"
+msgstr "默默地放弃"
+
+#: ../../static/t/sieve/display_one.html:67
+msgid "Reject"
+msgstr "拒绝"
+
+#: ../../static/t/sieve/display_one.html:68
+msgid "Move message to"
+msgstr "移动消息"
+
+#: ../../static/t/sieve/display_one.html:69
+msgid "Forward to"
+msgstr "转发到"
+
+#: ../../static/t/sieve/display_one.html:70
+msgid "Vacation"
+msgstr "度假"
+
+#: ../../static/t/sieve/display_one.html:82
+msgid "Message:"
+msgstr "消息:"
+
+#: ../../static/t/sieve/display_one.html:90
+msgid "and then"
+msgstr "然后"
+
+#: ../../static/t/sieve/display_one.html:93
+msgid "continue processing"
+msgstr "继续处理"
+
+#: ../../static/t/sieve/display_one.html:94
+msgid "stop"
+msgstr "停止"
+
+#: ../../static/t/sieve/list.html:14
+msgid "When new mail arrives: "
+msgstr "新邮件到达时:"
+
+#: ../../static/t/sieve/list.html:15 ../../static/t/sieve/list.html:20
+msgid "Filter it according to rules selected below"
+msgstr "根据下面所选的规则来对其进行筛选"
+
+#: ../../static/t/sieve/list.html:19
+msgid "Leave it in my inbox without filtering"
+msgstr "不需要筛选将它留在我的收件箱"
+
+#: ../../static/t/sieve/list.html:21
+msgid "Filter it through a manually edited script (advanced users only)"
+msgstr "通过手动编辑脚本 (仅适用于高级用户) 对其进行筛选"
+
+#: ../../static/t/sieve/list.html:31
+msgid "Add rule"
+msgstr "添加规则"
+
+#: ../../static/t/sieve/none.html:9
+msgid ""
+"This installation of Citadel was built without support for server-side mail "
+"filtering.<br>Please contact your system administrator if you require this "
+"feature.<br>"
+msgstr "此安装的城堡建成不支持服务器端邮件过滤 <br> 请联系您的系统管理员联系。"
+
+#: ../../static/t/start_of_new_msgs.html:4
+msgid "Old messages"
+msgstr "旧邮件 "
+
+#: ../../static/t/start_of_new_msgs.html:8
+msgid "New messages"
+msgstr "新邮件 "
+
+#: ../../static/t/summary/page.html:4
+msgid "Summary page for "
+msgstr "的摘要页 "
+
+#: ../../static/t/summary/page.html:21
+msgid "Messages"
+msgstr "邮件 "
+
+#: ../../static/t/summary/page.html:39
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "今天 & nbsp; 对 & nbsp; 你 & nbsp; 日历 "
+
+#: ../../static/t/summary/page.html:51
+#, fuzzy
+msgid "Who‘s&nbsp;online&nbsp;now"
+msgstr "谁的 & nbsp; 在线 & nbsp; 现在 "
+
+#: ../../static/t/summary/page.html:60
+msgid "About&nbsp;this&nbsp;server"
+msgstr "关于 & nbsp; 此 & nbsp; 服务器 "
+
+#: ../../static/t/summary/page.html:63
+msgid "You are connected to"
+msgstr ""
+
+#: ../../static/t/summary/page.html:64
+#, fuzzy
+msgid "running"
+msgstr "调整"
+
+#: ../../static/t/summary/page.html:65
+#, fuzzy
+msgid "with"
+msgstr "第五届 "
+
+#: ../../static/t/summary/page.html:66
+msgid "server build"
+msgstr ""
+
+#: ../../static/t/summary/page.html:67
+#, fuzzy
+msgid "and located in"
+msgstr "然后"
+
+#: ../../static/t/summary/page.html:68
+#, fuzzy
+msgid "Your system administrator is"
+msgstr "系统管理员的名称 "
+
+#: ../../static/t/trailing.html:18
+msgid ""
+"WARNING: You have JavaScript disabled in your web browser.  Many functions "
+"of this system will not work properly."
+msgstr ""
+"警告: 您必须在您的 web 浏览器中禁用 JavaScript。许多函数 这一系统将无法正常"
+"工作。"
+
+#: ../../static/t/user/edit_bio.html:11
+#, fuzzy
+msgid "Enter your bio below."
+msgstr "请输入您的生物 "
+
+#: ../../static/t/user/list.html:3
+msgid "User list for "
+msgstr "的用户列表 "
+
+#: ../../static/t/user/list.html:9
+msgid "User Name"
+msgstr "用户名称 "
+
+#: ../../static/t/user/list.html:10
+msgid "Number"
+msgstr "编号 "
+
+#: ../../static/t/user/list.html:11
+msgid "Access Level"
+msgstr "访问级别 "
+
+#: ../../static/t/user/list.html:12
+msgid "Last Login"
+msgstr "上次登入时间 "
+
+#: ../../static/t/user/list.html:13
+msgid "Total Logins"
+msgstr "总登录 "
+
+#: ../../static/t/user/list.html:14
+msgid "Total Posts"
+msgstr "总帖子 "
+
+#: ../../static/t/user/show.html:4 ../../static/t/who/bio.html:4
+msgid "User profile"
+msgstr "用户配置文件 "
+
+#: ../../static/t/user/show.html:9 ../../static/t/who/bio.html:11
+#, fuzzy
+msgid "Click here to send an instant message to"
+msgstr "单击此处以发送到 的即时消息 "
+
+#: ../../static/t/vcard/edit.html:1
+msgid "Edit contact information"
+msgstr "编辑联系信息"
+
+#: ../../static/t/vcard/edit.html:9
+msgid "Prefix"
+msgstr "前缀"
+
+#: ../../static/t/vcard/edit.html:10
+msgid "First Name"
+msgstr "第一名"
+
+#: ../../static/t/vcard/edit.html:11
+msgid "Middle Name"
+msgstr "中间名"
+
+#: ../../static/t/vcard/edit.html:12
+msgid "Last Name"
+msgstr "姓氏"
+
+#: ../../static/t/vcard/edit.html:13
+msgid "Suffix"
+msgstr "后缀"
+
+#: ../../static/t/vcard/edit.html:26
+msgid "Display name:"
+msgstr "显示名称:"
+
+#: ../../static/t/vcard/edit.html:27
+msgid "Title:"
+msgstr "标题:"
+
+#: ../../static/t/vcard/edit.html:28
+msgid "Organization:"
+msgstr "组织:"
+
+#: ../../static/t/vcard/edit.html:33
+msgid "PO box:"
+msgstr "信箱:"
+
+#: ../../static/t/vcard/edit.html:34
+msgid "Address:"
+msgstr "地址:"
+
+#: ../../static/t/vcard/edit.html:36
+msgid "City:"
+msgstr "城市:"
+
+#: ../../static/t/vcard/edit.html:37
+msgid "State:"
+msgstr "状态:"
+
+#: ../../static/t/vcard/edit.html:38
+msgid "ZIP code:"
+msgstr "邮政编码:"
+
+#: ../../static/t/vcard/edit.html:39
+msgid "Country:"
+msgstr "国家:"
+
+#: ../../static/t/vcard/edit.html:45
+msgid "Home telephone:"
+msgstr "家庭电话:"
+
+#: ../../static/t/vcard/edit.html:46
+msgid "Work telephone:"
+msgstr "工作电话:"
+
+#: ../../static/t/vcard/edit.html:49
+msgid "Mobile telephone:"
+msgstr "移动电话:"
+
+#: ../../static/t/vcard/edit.html:50
+msgid "Fax number:"
+msgstr "传真号码:"
+
+#: ../../static/t/vcard/list/empty.html:2
+msgid "This address book is empty."
+msgstr "此通讯簿是空"
+
+#: ../../static/t/vcard/list/internal_error.html:2
+msgid "An internal error has occurred."
+msgstr "发生内部错误。"
+
+#: ../../static/t/view_blog/comment_box.html:8
+#, fuzzy
+msgid "Post a comment"
+msgstr "%d 的评论 "
+
+#: ../../static/t/view_blog/newer_posts.html:1
+msgid "Newer posts"
+msgstr ""
+
+#: ../../static/t/view_blog/older_posts.html:1
+#, fuzzy
+msgid "Older posts"
+msgstr "文件夹列表"
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:1
+#, fuzzy
+msgid "comments"
+msgstr "%d 的评论 "
+
+#: ../../static/t/view_blog/show_commentlink.html:1
+#: ../../static/t/view_blog/show_no_comments.html:3
+msgid "permalink"
+msgstr ""
+
+#: ../../static/t/view_blog/show_no_comments.html:2
+#, fuzzy
+msgid "new"
+msgstr "新的 "
+
+#: ../../static/t/view_mailq/footer.html:5
+#: ../../static/t/view_mailq/footer_empty.html:9
+msgid "You do not have permission to view this resource."
+msgstr "您没有查看此资源的权限。 "
+
+#: ../../static/t/view_mailq/footer_empty.html:4
+msgid "The queue is empty."
+msgstr "队列为空 "
+
+#: ../../static/t/view_mailq/header.html:14
+#: ../../static/t/view_mailq/header.html:47
+msgid "Refresh this page"
+msgstr "刷新此页 "
+
+#: ../../static/t/view_mailq/header.html:20
+msgid "HINT"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:21
+msgid ""
+"Citadel reattempts sending mail per interval; it starts at 60 second, and "
+"doubles each time. You can however bypass this mechanism once; all messages "
+"will be reattempted on the next queue run."
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:22
+msgid "OK, got you, lets go!"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:29
+msgid "Reschedule all messages for delivery on next queue run"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:35
+msgid "Currently active mail delivery jobs"
+msgstr ""
+
+#: ../../static/t/view_mailq/header.html:36
+#, fuzzy
+msgid "Remote Sites:"
+msgstr "远程主机"
+
+#: ../../static/t/view_mailq/header.html:37
+#, fuzzy
+msgid "Status:"
+msgstr "状态:"
+
+#: ../../static/t/view_mailq/header.html:45
+#, fuzzy
+msgid "Jobs waiting for further processing:"
+msgstr "继续处理"
+
+#: ../../static/t/view_mailq/message.html:6
+msgid "Originaly posted in: "
+msgstr ""
+
+#: ../../static/t/view_mailq/table.html:4
+msgid "Message ID"
+msgstr "消息 ID "
+
+#: ../../static/t/view_mailq/table.html:6
+msgid "Date/time submitted"
+msgstr "提交的日期/时间 "
+
+#: ../../static/t/view_mailq/table.html:8
+#, fuzzy
+msgid "Next attempt"
+msgstr "上次尝试 "
+
+#: ../../static/t/view_mailq/table.html:12
+msgid "Recipients"
+msgstr "收件人 "
+
+#: ../../static/t/view_message.html:7 ../../static/t/view_message/print.html:8
+#: ../../static/t/view_message/replyquote.html:3
+#: ../../static/t/view_message/replyquote.html:7
+#: ../../static/t/view_submessage.html:4
+msgid "from "
+msgstr "从 "
+
+#: ../../static/t/view_message.html:13
+#: ../../static/t/view_message/print.html:14
+msgid "to"
+msgstr "自 "
+
+#: ../../static/t/view_message.html:18
+msgid "Edit"
+msgstr "编辑 "
+
+#: ../../static/t/view_message.html:21 ../../static/t/view_message.html:25
+msgid "Reply"
+msgstr "答复 "
+
+#: ../../static/t/view_message.html:22
+msgid "ReplyQuoted"
+msgstr "引用回复"
+
+#: ../../static/t/view_message.html:26
+msgid "ReplyAll"
+msgstr "全部回复 "
+
+#: ../../static/t/view_message.html:27
+msgid "Forward"
+msgstr "转发 "
+
+#: ../../static/t/view_message.html:33
+msgid "Headers"
+msgstr "标题 "
+
+#: ../../static/t/view_message/inline_attach.html:4
+#: ../../static/t/view_message/list_attach.html:3
+msgid "View"
+msgstr "视图 "
+
+#: ../../static/t/view_message/inline_attach.html:5
+#: ../../static/t/view_message/list_attach.html:4
+msgid "Download"
+msgstr "下载 "
+
+#: ../../static/t/viewomatic.html:4
+msgid "View as:"
+msgstr "查看为:"
+
+#: ../../static/t/who.html:13
+msgid "Users currently on "
+msgstr "当前的用户 "
+
+#: ../../static/t/who.html:22
+msgid "Click on a name to read user info.  Click on"
+msgstr "单击其名称可读取用户信息。单击"
+
+#: ../../static/t/who.html:24
+msgid "to send an instant message to that user."
+msgstr "向该用户发送即时消息。 "
+
+#: ../../static/t/who/activesmtpsessions_one.html:13
+#: ../../static/t/who/section.html:4
+msgid "(kill)"
+msgstr "(杀) "
+
+#: ../../static/t/who/box_list_static.html:7 ../../static/t/who/summary.html:6
+msgid "Room"
+msgstr "房间 "
+
+#: ../../static/t/who/box_list_static.html:8
+msgid "From host"
+msgstr "从主机 "
+
+#: ../../static/t/who/edit.html:5
+msgid "Edit your session display"
+msgstr "编辑您的会话显示"
+
+#: ../../static/t/who/edit.html:10
+msgid ""
+"This screen allows you to change the way your session appears in the 'Who is "
+"online' listing. To turn off any 'fake' name you've previously set, simply "
+"click the appropriate 'change' button without typing anything in the "
+"corresponding box. "
+msgstr ""
+"此屏幕允许您更改您的会话在 '谁在线列表中的显示的方式。若要关闭以前设置的任何 "
+"'假' 的名称,只需单击适当的更改按钮无需输入任何内容在相应的框中。"
+
+#: ../../static/t/who/edit.html:18
+msgid "Room name:"
+msgstr "房间名称:"
+
+#: ../../static/t/who/edit.html:29
+msgid "Host name:"
+msgstr "主机名:"
+
+#: ../../static/t/who/list_static_header.html:1
+msgid "Users currently on"
+msgstr "当前的用户 "
+
+#: ../../static/t/who/section.html:5
+#, fuzzy
+msgid "Edit configuration"
+msgstr "怀胎配置 "
+
+#: ../../static/t/who/section.html:6
+#, fuzzy
+msgid "Edit address book entry"
+msgstr "此通讯簿是空"
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "'here"
+msgstr "关于 "
+
+#: ../../static/t/wiki/empty.html:7
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr "房间标题栏中选择编辑此页链接,如果你想创建该页面。 "
+
+#: ../../static/t/wiki/empty.html:5
+#, fuzzy
+msgid "There is no page called '"
+msgstr "没有在这里称为 '%s' 的页面。 "
+
+#: ../../static/t/wiki/history.html:1
+msgid "History of edits for this page"
+msgstr "编辑此页的历史 "
+
+#: ../../static/t/wiki/pagelist.html:1
+msgid "List of Wiki pages"
+msgstr "Wiki 页面的列表 "
+
+#~ msgid "the icon for this floor"
+#~ msgstr "这层图标 "
+
+#~ msgid "Edit %s"
+#~ msgstr "编辑 %s"
+
+#~ msgid "Save changes"
+#~ msgstr "保存更改"
+
+#~ msgid " (work)"
+#~ msgstr "(工作)"
+
+#~ msgid " (home)"
+#~ msgstr "(首页)"
+
+#~ msgid " (cell)"
+#~ msgstr "(单元格)"
+
+#~ msgid "Telephone:"
+#~ msgstr "电话:"
+
+#~ msgid "E-mail:"
+#~ msgstr "电子邮件:"
+
+#~ msgid "Directory domains"
+#~ msgstr "目录域"
+
+#~ msgid "Fallback smart hosts"
+#~ msgstr "备用的智能主机"
+
+#, fuzzy
+#~ msgid "Create new room"
+#~ msgstr "创建一个新的房间 "
+
+#, fuzzy
+#~ msgid "Zap this room"
+#~ msgstr "跳过这间屋子 "
+
+#, fuzzy
+#~ msgid "Networked Room"
+#~ msgstr "网络共享空间"
+
+#, fuzzy
+#~ msgid "Add node?"
+#~ msgstr "添加一个新节点 "
+
+#, fuzzy
+#~ msgid "Minutes"
+#~ msgstr "分钟 "
+
+#, fuzzy
+#~ msgid "active"
+#~ msgstr "试 "
+
+#, fuzzy
+#~ msgid "Send"
+#~ msgstr "发件人 "
+
+#, fuzzy
+#~ msgid "Delete this message?"
+#~ msgstr "删除这个房间"
+
+#, fuzzy
+#~ msgid "Room Logo"
+#~ msgstr "房间列表"
+
+#, fuzzy
+#~ msgid "Pictures in"
+#~ msgstr "只有图片 "
+
+#, fuzzy
+#~ msgid "Upload failed"
+#~ msgstr "上传的文件: "
+
+#, fuzzy
+#~ msgid "Are you shure you want to delete {filename}?"
+#~ msgstr "您确实要删除 "
+
+#~ msgid "Upload"
+#~ msgstr "上传 "
+
+#~ msgid "Add"
+#~ msgstr "添加 "
+
+#~ msgid "Create"
+#~ msgstr "创建"
+
+#, fuzzy
+#~ msgid "Invite"
+#~ msgstr "邀请:"
+
+#, fuzzy
+#~ msgid "User"
+#~ msgstr "用户"
+
+#, fuzzy
+#~ msgid "Addressbook Popup"
+#~ msgstr "通讯簿 "
+
+#, fuzzy
+#~ msgid "Delete user"
+#~ msgstr "删除规则"
+
+#, fuzzy
+#~ msgid "Delete this user?"
+#~ msgstr "删除此脚本吗?"
+
+#, fuzzy
+#~ msgid "Delete File"
+#~ msgstr "删除规则"
+
+#~ msgid "Your incoming mail will not be filtered through any scripts."
+#~ msgstr "您收到的邮件不会通过任何脚本过滤"
+
+#~ msgid "The currently active script is: "
+#~ msgstr "当前处于活动状态的脚本是:"
+
+#~ msgid "Configure replication with other Citadel servers"
+#~ msgstr "与其他城堡服务器配置复制 "
+
+#, fuzzy
+#~ msgid "Powered by Citadel"
+#~ msgstr "显示提供动力的城堡' 图标 "
+
+#, fuzzy
+#~ msgid "Go to your email inbox"
+#~ msgstr "快捷方式到您的电子邮件收件箱 "
+
+#, fuzzy
+#~ msgid "Go to your personal calendar"
+#~ msgstr "快捷方式到您的个人日历 "
+
+#, fuzzy
+#~ msgid "Go to your personal address book"
+#~ msgstr "个人通讯簿 "
+
+#, fuzzy
+#~ msgid "Go to your personal notes"
+#~ msgstr "您个人的笔记 "
+
+#, fuzzy
+#~ msgid "Go to your personal task list"
+#~ msgstr "您的个人任务列表快捷方式 "
+
+#, fuzzy
+#~ msgid "List all your accessible rooms"
+#~ msgstr "列出所有的房间都被遗忘 "
+
+#, fuzzy
+#~ msgid "Room and system administration functions"
+#~ msgstr "系统管理员的名称 "
+
+#~ msgid "Reset form"
+#~ msgstr "重置表单 "
+
+#, fuzzy
+#~ msgid "Delete this entry?"
+#~ msgstr "删除这个房间"
+
+#, fuzzy
+#~ msgid "Create new floor"
+#~ msgstr "创建一个新的房间 "
+
+#~ msgid "Move rule up"
+#~ msgstr "向上移动规则"
+
+#~ msgid "Move rule down"
+#~ msgstr "向下移动规则"
+
+#~ msgid "Delete rule"
+#~ msgstr "删除规则"
+
+#~ msgid "(edit graphic)"
+#~ msgstr "(编辑图形) "
+
+#, fuzzy
+#~ msgid "Change name"
+#~ msgstr "更改房间名称:"
+
+#, fuzzy
+#~ msgid "Are you sure you want to delete this room?"
+#~ msgstr "您确实要删除 "
+
+#, fuzzy
+#~ msgid "Send command"
+#~ msgstr "请输入命令: "
+
+#~ msgid "Master user name (blank to disable)"
+#~ msgstr "主用户名称 (禁用空白) "
+
+#~ msgid "Master user password"
+#~ msgstr "主用户密码 "
+
+#, fuzzy
+#~ msgid "Delete this note?"
+#~ msgstr "删除这个房间"
+
+#, fuzzy
+#~ msgid "List"
+#~ msgstr "列表 ID"
+
+#, fuzzy
+#~ msgid "Digest"
+#~ msgstr "时间格式 "
+
+#, fuzzy
+#~ msgid "Set"
+#~ msgstr "主题"
+
+#, fuzzy
+#~ msgid "Do you really want to kill this session?"
+#~ msgstr "您确实要删除此 OpenID 吗? "
+
+#, fuzzy
+#~ msgid "Share"
+#~ msgstr "共享"
+
+#~ msgid "Change password"
+#~ msgstr "更改密码 "
+
+#~ msgid "Change room name"
+#~ msgstr "更改房间名称:"
+
+#~ msgid "Change host name"
+#~ msgstr "更改主机名称"
+
+#~ msgid "Change user name"
+#~ msgstr "更改用户名"
+
+#, fuzzy
+#~ msgid "Save changes?"
+#~ msgstr "保存更改"
+
+#~ msgid ""
+#~ "You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "
+#~ "listserver has sent you an e-mail with one additional Web link for you to "
+#~ "click on to confirm your subscription.  This extra step is for your "
+#~ "protection, as it prevents others from being able to subscribe you to "
+#~ "lists without your consent.<br><br>Please click on the link which is "
+#~ "being e-mailed to you and your subscription will be confirmed.<br>\n"
+#~ msgstr ""
+#~ "您的订阅 <TT> %s </TT> 到 <b> %s </b> 邮件列表中。\"信笺已向您发送带有一个"
+#~ "附加的 Web 链接,为您的电子邮件单击以确认您的订购。这种额外的步骤是为你作"
+#~ "为它的保护,防止他人能够为您订阅列表没有你的同意,<br> <br> 请点击以下链接"
+#~ "正在 e-邮寄给您,并将确认您的订购。 <br>\n"
+
+#~ msgid ""
+#~ "WARNING: Failed to parse Server Config; do you run a to new citserver?"
+#~ msgstr "警告: 无法解析服务器配置 ;你跑到新的 citserver 做吗? "
+
+#~ msgid "There is no room called '%s'."
+#~ msgstr "没有名为 '%s' 的空间。 "
+
+#~ msgid "Network"
+#~ msgstr "网络"
+
+#~ msgid "Tuning"
+#~ msgstr "调整"
+
+#~ msgid "Instantly expunge deleted messages in IMAP"
+#~ msgstr "立即债权在 IMAP 中已删除的邮件 "
+
+#~ msgid "A script by that name already exists."
+#~ msgstr "脚本通过该名称已存在"
+
+#~ msgid ""
+#~ "A new script has been created.  Return to the script editing screen to "
+#~ "edit and activate it."
+#~ msgstr "已创建一个新的脚本。返回脚本编辑屏幕编辑,并将其激活。"
+
+#~ msgid "Delete script"
+#~ msgstr "删除脚本"
+
+#~ msgid ""
+#~ "You are connected to %s, running %s with %s, server build %s and located "
+#~ "in %s.  Your system administrator is %s."
+#~ msgstr ""
+#~ "您连接到 %s,运行服务器生成 %s%s %s 与位于 %s。%s 您的系统管理员联系。 "
+
+#~ msgid "Yes with users list"
+#~ msgstr "是用户列表 "
+
+#~ msgid " - powered by <a href='http://www.citadel.org'>Citadel</a>"
+#~ msgstr "-由 < href='http://www.citadel.org'> </a> "
+
+#~ msgid "Room list"
+#~ msgstr "房间列表"
+
+#~ msgid "View as room list"
+#~ msgstr "查看房间列表"
+
+#~ msgid "View as folder list"
+#~ msgstr "查看文件夹列表"
diff --git a/webcit/preferences.c b/webcit/preferences.c
new file mode 100644 (file)
index 0000000..ae381cc
--- /dev/null
@@ -0,0 +1,1282 @@
+/*
+ * Manage user preferences with a little help from the Citadel server.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "dav.h"
+
+HashList *PreferenceHooks;
+extern HashList *HandlerHash;
+
+typedef struct _PrefDef {
+       ePrefType eType;
+       StrBuf *Setting;
+       const char *PrefStr;
+       PrefEvalFunc OnLoad;
+       StrBuf *OnLoadName;
+} PrefDef;
+
+typedef struct _Preference {
+       PrefDef *Type;
+       ePrefType eFlatPrefType;
+
+       StrBuf *Key;
+       StrBuf *Val;
+
+       long lval;
+       long decoded;
+       StrBuf *DeQPed;
+} Preference;
+
+void DestroyPrefDef(void *vPrefDef)
+{
+       PrefDef *Prefdef = (PrefDef*) vPrefDef;
+       FreeStrBuf(&Prefdef->Setting);
+       FreeStrBuf(&Prefdef->OnLoadName);
+       free(Prefdef);
+}
+
+void DestroyPreference(void *vPref)
+{
+       Preference *Pref = (Preference*) vPref;
+       FreeStrBuf(&Pref->Key);
+       FreeStrBuf(&Pref->Val);
+       FreeStrBuf(&Pref->DeQPed);
+       free(Pref);
+
+}
+
+void _RegisterPreference(const char *Setting, long SettingLen, 
+                        const char *PrefStr, 
+                        ePrefType Type, 
+                        PrefEvalFunc OnLoad, 
+                        const char *OnLoadName)
+{
+       PrefDef *Newpref = (PrefDef*) malloc(sizeof(PrefDef));
+       Newpref->Setting = NewStrBufPlain(Setting, SettingLen);
+       Newpref->PrefStr = PrefStr;
+       Newpref->eType = Type;
+       Newpref->OnLoad = OnLoad;
+       if (Newpref->OnLoad != NULL) {
+               Newpref->OnLoadName = NewStrBufPlain(OnLoadName, -1);
+       }
+       else
+               Newpref->OnLoadName = NULL;
+       Put(PreferenceHooks, Setting, SettingLen, Newpref, DestroyPrefDef);
+}
+
+const char *PrefGetLocalStr(const char *Setting, long len)
+{
+       void *hash_value;
+       if (GetHash(PreferenceHooks, Setting, len, &hash_value) != 0) {
+               PrefDef *Newpref = (PrefDef*) hash_value;
+               return _(Newpref->PrefStr);
+
+       }
+       return "";
+}
+
+#ifdef DBG_PREFS_HASH
+inline const char *PrintPref(void *vPref)
+{
+       Preference *Pref = (Preference*) vPref;
+       if (Pref->DeQPed != NULL)
+               return ChrPtr(Pref->DeQPed);
+       else 
+               return ChrPtr(Pref->Val);
+}
+#endif
+
+void GetPrefTypes(HashList *List)
+{
+       HashPos *It;
+       long len;
+       const char *Key;
+       void *vSetting;
+       void *vPrefDef;
+       Preference *Pref;
+       PrefDef *PrefType;
+
+       It = GetNewHashPos(List, 0);
+       while (GetNextHashPos(List, It, &len, &Key, &vSetting)) 
+       {
+               Pref = (Preference*) vSetting;
+               if (GetHash(PreferenceHooks, SKEY(Pref->Key), &vPrefDef) && 
+                   (vPrefDef != NULL)) 
+               {
+                       PrefType = (PrefDef*) vPrefDef;
+                       Pref->Type = PrefType;
+                       Pref->eFlatPrefType = Pref->Type->eType;
+
+                       syslog(LOG_DEBUG, "Loading [%s]with type [%d] [\"%s\"]\n",
+                               ChrPtr(Pref->Key),
+                               Pref->Type->eType,
+                               ChrPtr(Pref->Val));
+
+                       switch (Pref->Type->eType)
+                       {
+                       case PRF_UNSET: /* WHUT? */
+                               break;
+                       case PRF_STRING:
+                               break;
+                       case PRF_INT:
+                               Pref->lval = StrTol(Pref->Val);
+                               Pref->decoded = 1;
+                               break;
+                       case PRF_QP_STRING:
+                               Pref->DeQPed = NewStrBufPlain(NULL, StrLength(Pref->Val));
+                               StrBufEUid_unescapize(Pref->DeQPed, Pref->Val);
+                               Pref->decoded = 1;
+                               break;
+                       case PRF_YESNO:
+                               Pref->lval = strcmp(ChrPtr(Pref->Val), "yes") == 0;
+                               Pref->decoded = 1;
+                               break;
+                       }
+
+                       if (PrefType->OnLoad != NULL){
+
+                               syslog(LOG_DEBUG, "Loading with: -> %s(\"%s\", %ld)\n",
+                                       ChrPtr(PrefType->OnLoadName),
+                                       ChrPtr(Pref->Val),
+                                       Pref->lval);
+                               PrefType->OnLoad(Pref->Val, Pref->lval);
+                       }
+               }
+       }
+       DeleteHashPos(&It);
+}
+
+void ParsePref(HashList **List, StrBuf *ReadBuf)
+{
+       int Done = 0;
+       Preference *Data = NULL;
+       Preference *LastData = NULL;
+                               
+       while (!Done) {
+               if (StrBuf_ServGetln(ReadBuf) < 0)
+                       break;
+               if ( (StrLength(ReadBuf)==3) && 
+                    !strcmp(ChrPtr(ReadBuf), "000")) {
+                       Done = 1;
+                       break;
+               }
+
+               if ((ChrPtr(ReadBuf)[0] == ' ') &&
+                   (LastData != NULL)) {
+                       StrBufAppendBuf(LastData->Val, ReadBuf, 1);
+               }
+               else {
+                       LastData = Data = malloc(sizeof(Preference));
+                       memset(Data, 0, sizeof(Preference));
+                       Data->Key = NewStrBuf();
+                       Data->Val = NewStrBuf();
+                       StrBufExtract_token(Data->Key, ReadBuf, 0, '|');
+                       StrBufExtract_token(Data->Val, ReadBuf, 1, '|');
+
+                       /***************** BEGIN VILE SLEAZY HACK ************************/
+
+                       /* some users might still have this start page configured, which now breaks */
+
+                       if (    (!strcasecmp(ChrPtr(Data->Key), "startpage"))
+                               && (!strcasecmp(ChrPtr(Data->Val), "/do_template?template=summary_page"))
+                       ) {
+                               FreeStrBuf(&Data->Val);
+                               Data->Val = NewStrBufPlain(HKEY("/summary"));
+                       }
+
+                       /******************* END VILE SLEAZY HACK ************************/
+
+                       if (!IsEmptyStr(ChrPtr(Data->Key)))
+                       {
+                               Put(*List, 
+                                   SKEY(Data->Key),
+                                   Data, 
+                                   DestroyPreference);
+                       }
+                       else 
+                       {
+                               StrBufTrim(ReadBuf);
+                               syslog(LOG_INFO, "ignoring spurious preference line: [%s]\n", 
+                                       ChrPtr(ReadBuf));
+                               DestroyPreference(Data);
+                               LastData = NULL;
+                       }
+                       Data = NULL;
+               }
+       }
+       GetPrefTypes(*List);
+}
+
+
+/*
+ * display preferences dialog
+ */
+void load_preferences(void) 
+{
+       folder Room;
+       wcsession *WCC = WC;
+       int Done = 0;
+       StrBuf *ReadBuf;
+       long msgnum = 0L;
+       
+       memset(&Room, 0, sizeof(folder));
+       ReadBuf = NewStrBufPlain(NULL, SIZ * 4);
+       if (goto_config_room(ReadBuf, &Room) != 0) {
+               FreeStrBuf(&ReadBuf);
+               FlushFolder(&Room);
+
+               return; /* oh well. */
+       }
+
+       serv_puts("MSGS ALL|0|1");
+       StrBuf_ServGetln(ReadBuf);
+       if (GetServerStatus(ReadBuf, NULL) == 8) {
+               serv_puts("subj|__ WebCit Preferences __");
+               serv_puts("000");
+       }
+       while (!Done && (StrBuf_ServGetln(ReadBuf) >= 0)) {
+               if ( (StrLength(ReadBuf)==3) && !strcmp(ChrPtr(ReadBuf), "000")) {
+                       Done = 1;
+                       break;
+               }
+               msgnum = StrTol(ReadBuf);
+       }
+
+       if (msgnum > 0L) {
+               serv_printf("MSG0 %ld", msgnum);
+               StrBuf_ServGetln(ReadBuf);
+               if (GetServerStatus(ReadBuf, NULL) == 1) {
+                       while ( (StrBuf_ServGetln(ReadBuf) >= 0)
+                               && (strcmp(ChrPtr(ReadBuf), "text")
+                               && strcmp(ChrPtr(ReadBuf), "000"))
+                       ) {
+                               /* flush */
+                       }
+                       if (!strcmp(ChrPtr(ReadBuf), "text")) {
+                               ParsePref(&WCC->hash_prefs, ReadBuf);
+                       }
+               }
+       }
+
+       /* Go back to the room we're supposed to be in */
+       if (StrLength(WCC->CurRoom.name) > 0) {
+               serv_printf("GOTO %s", ChrPtr(WCC->CurRoom.name));
+               StrBuf_ServGetln(ReadBuf);
+               GetServerStatus(ReadBuf, NULL);
+       }
+       FreeStrBuf(&ReadBuf);
+       FlushFolder(&Room);
+}
+
+
+/*
+ * Go to the user's configuration room, creating it if necessary.
+ * returns 0 on success or nonzero upon failure.
+ */
+int goto_config_room(StrBuf *Buf, folder *Room) 
+{
+       serv_printf("GOTO %s", USERCONFIGROOM);
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 2) {  /* try to create the config room if not there */
+               serv_printf("CRE8 1|%s|4|0", USERCONFIGROOM);
+               StrBuf_ServGetln(Buf);
+               GetServerStatus(Buf, NULL);
+
+               serv_printf("GOTO %s", USERCONFIGROOM);
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatus(Buf, NULL) != 2) {
+                       return(1);
+               }
+       }
+       ParseGoto(Room, Buf);
+       return(0);
+}
+
+void WritePrefsToServer(HashList *Hash)
+{
+       wcsession *WCC = WC;
+       long len;
+       HashPos *HashPos;
+       void *vPref;
+       const char *Key;
+       Preference *Pref;
+       StrBuf *SubBuf = NULL;
+       
+       Hash = WCC->hash_prefs;
+#ifdef DBG_PREFS_HASH
+       dbg_PrintHash(Hash, PrintPref, NULL);
+#endif
+       HashPos = GetNewHashPos(Hash, 0);
+       while (GetNextHashPos(Hash, HashPos, &len, &Key, &vPref)!=0)
+       {
+               size_t nchars;
+               if (vPref == NULL)
+                       continue;
+               Pref = (Preference*) vPref;
+               nchars = StrLength(Pref->Val);
+               if (nchars > 80){
+                       int n = 0;
+                       size_t offset, nchars;
+                       if (SubBuf == NULL)
+                               SubBuf = NewStrBufPlain(NULL, SIZ);
+                       nchars = 1;
+                       offset = 0;
+                       while (nchars > 0) {
+                               if (n == 0)
+                                       nchars = 70;
+                               else 
+                                       nchars = 80;
+                               
+                               nchars = StrBufSub(SubBuf, Pref->Val, offset, nchars);
+                               
+                               if (n == 0) {
+                                       serv_printf("%s|%s", ChrPtr(Pref->Key), ChrPtr(SubBuf));
+                               }
+                               else {
+                                       serv_printf(" %s", ChrPtr(SubBuf));
+                               }
+                               
+                               offset += nchars;
+                               nchars = StrLength(Pref->Val) - offset;
+                               n++;
+                       }
+                       
+               }
+               else {
+                       serv_printf("%s|%s", ChrPtr(Pref->Key), ChrPtr(Pref->Val));
+               }
+               
+       }
+       FreeStrBuf(&SubBuf);
+       DeleteHashPos(&HashPos);
+}
+
+/*
+ * save the modifications
+ */
+void save_preferences(void) 
+{
+       folder Room;
+       wcsession *WCC = WC;
+       int Done = 0;
+       StrBuf *ReadBuf;
+       long msgnum = 0L;
+       
+       ReadBuf = NewStrBuf();
+       memset(&Room, 0, sizeof(folder));
+       if (goto_config_room(ReadBuf, &Room) != 0) {
+               FreeStrBuf(&ReadBuf);
+               FlushFolder(&Room);
+
+               return; /* oh well. */
+       }
+
+       /* make shure the config room has the right type, else it might reject our config */
+       if (Room.view != VIEW_BBS) {
+               serv_printf("VIEW %d", VIEW_BBS);
+               StrBuf_ServGetln(ReadBuf);
+               if (GetServerStatus(ReadBuf, NULL) != 2) {
+                       /* UPS? */
+               }
+               else if (goto_config_room(ReadBuf, &Room) != 0) {
+                       FreeStrBuf(&ReadBuf);
+                       FlushFolder(&Room);
+                       
+                       return; /* oh well. */
+               }
+       }
+
+       serv_puts("MSGS ALL|0|1");
+       StrBuf_ServGetln(ReadBuf);
+       if (GetServerStatus(ReadBuf, NULL) == 8) {
+               serv_puts("subj|__ WebCit Preferences __");
+               serv_puts("000");
+       }
+       while (!Done && (StrBuf_ServGetln(ReadBuf) >= 0)) {
+               if ( (StrLength(ReadBuf)==3) && !strcmp(ChrPtr(ReadBuf), "000")) {
+                       Done = 1;
+                       break;
+               }
+               msgnum = StrTol(ReadBuf);
+       }
+
+       if (msgnum > 0L) {
+               serv_printf("DELE %ld", msgnum);
+               StrBuf_ServGetln(ReadBuf);
+               GetServerStatus(ReadBuf, NULL);
+       }
+
+       serv_printf("ENT0 1||0|1|__ WebCit Preferences __|");
+       StrBuf_ServGetln(ReadBuf);
+       if (GetServerStatus(ReadBuf, NULL) == 4) {
+
+               WritePrefsToServer(WCC->hash_prefs);
+               serv_puts("");
+               serv_puts("000");
+       }
+
+       /** Go back to the room we're supposed to be in */
+       if (StrLength(WCC->CurRoom.name) > 0) {
+               serv_printf("GOTO %s", ChrPtr(WCC->CurRoom.name));
+               StrBuf_ServGetln(ReadBuf);
+               GetServerStatus(ReadBuf, NULL);
+       }
+       FreeStrBuf(&ReadBuf);
+       FlushFolder(&Room);
+}
+
+/*
+ * query the actual setting of key in the citadel database
+ *
+ * key         config key to query
+ * keylen      length of the key string
+ * value       StrBuf-value to the key to get
+ * returns:    found?
+ */
+int get_pref_backend(const char *key, size_t keylen, Preference **Pref)
+{
+       void *hash_value = NULL;
+#ifdef DBG_PREFS_HASH
+       dbg_PrintHash(WC->hash_prefs, PrintPref, NULL);
+#endif
+       if (GetHash(WC->hash_prefs, key, keylen, &hash_value) == 0) {
+               *Pref = NULL;
+               return 0;
+       }
+       else {
+               *Pref = (Preference*) hash_value;
+               return 1;
+       }
+}
+
+int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value)
+{
+       Preference *Pref;
+       int Ret;
+
+       Ret = get_pref_backend(key, keylen, &Pref);
+       if (Ret != 0)
+               *value = Pref->Val;
+       else
+               *value = NULL;
+       return Ret;
+}
+
+/*
+ * Write a key into the webcit preferences database for this user
+ *
+ * key                 key whichs value is to be modified
+ * keylen              length of the key string
+ * value               value to set
+ * save_to_server      1 = flush all data to the server, 0 = cache it for now
+ */
+long compare_preference(const Preference *PrefA, const Preference *PrefB)
+{
+       ePrefType TypeA, TypeB;
+
+       if (PrefA->Type != NULL) {
+               TypeA = PrefA->Type->eType;
+       }
+       else {
+               TypeA = PrefA->eFlatPrefType;
+       }
+
+       if (PrefB->Type != NULL) {
+               TypeB = PrefB->Type->eType;
+       }
+       else {
+               TypeB = PrefB->eFlatPrefType;
+       }
+
+       if (    (TypeA != PRF_UNSET)
+               && (TypeB != PRF_UNSET)
+               && (TypeA != TypeB)
+       ) {
+               if (TypeA > TypeB) {
+                       return 1;
+               }
+               else {  /* (PrefA->Type < PrefB->Type) */
+                       return -1;
+               }
+       }
+
+       if (TypeB == PRF_UNSET) {
+               TypeA = PRF_UNSET;
+       }
+                   
+       switch (TypeA)
+       {
+       default:
+       case PRF_UNSET:
+       case PRF_STRING:
+               return strcmp(ChrPtr(PrefA->Val), ChrPtr(PrefB->Val));
+       case PRF_YESNO:
+       case PRF_INT:
+               if (PrefA->lval == PrefB->lval)
+                       return 0;
+               else if (PrefA->lval > PrefB->lval)
+                       return 1;
+               else
+                       return -1;
+       case PRF_QP_STRING:
+               return strcmp(ChrPtr(PrefA->DeQPed), 
+                             ChrPtr(PrefB->DeQPed));
+       }
+}
+
+
+/*
+ * Write a key into the webcit preferences database for this user
+ *
+ * key                 key which value is to be modified
+ * keylen              length of the key string
+ * value               value to set
+ * save_to_server      1 = flush all data to the server, 0 = cache it for now
+ */
+void set_preference_backend(const char *key, size_t keylen, 
+                           long lvalue, 
+                           StrBuf *value, 
+                           long lPrefType,
+                           int save_to_server, 
+                           PrefDef *PrefType) 
+{
+       wcsession *WCC = WC;
+       void *vPrefDef;
+       void *vPrefB;
+       Preference *Pref;
+
+       Pref = (Preference*) malloc(sizeof(Preference));
+       memset(Pref, 0, sizeof(Preference));
+       Pref->Key = NewStrBufPlain(key, keylen);
+
+       if ((PrefType == NULL) &&
+           GetHash(PreferenceHooks, SKEY(Pref->Key), &vPrefDef) && 
+           (vPrefDef != NULL))
+               PrefType = (PrefDef*) vPrefDef;
+
+       if (PrefType != NULL)
+       {
+               Pref->Type = PrefType;
+               Pref->eFlatPrefType = PrefType->eType;
+               if (Pref->Type->eType != lPrefType)
+                       syslog(LOG_WARNING, "warning: saving preference with wrong type [%s] %d != %ld \n",
+                               key, Pref->Type->eType, lPrefType);
+               switch (Pref->Type->eType)
+               {
+               case PRF_UNSET: /* default to string... */
+               case PRF_STRING:
+                       Pref->Val = value;
+                       Pref->decoded = 1;
+                       break;
+               case PRF_INT:
+                       Pref->lval = lvalue;
+                       Pref->Val = value;
+                       if (Pref->Val == NULL)
+                               Pref->Val = NewStrBufPlain(NULL, 64);
+                       StrBufPrintf(Pref->Val, "%ld", lvalue);
+                       Pref->decoded = 1;
+                       break;
+               case PRF_QP_STRING:
+                       Pref->DeQPed = value;
+                       Pref->Val = NewStrBufPlain(NULL, StrLength(Pref->DeQPed) * 3);
+                       StrBufEUid_escapize(Pref->Val, Pref->DeQPed);
+                       Pref->decoded = 1;
+                       break;
+               case PRF_YESNO:
+                       Pref->lval = lvalue;
+                       if (lvalue) 
+                               Pref->Val = NewStrBufPlain(HKEY("yes"));
+                       else
+                               Pref->Val = NewStrBufPlain(HKEY("no"));
+                       Pref->decoded = 1;
+                       break;
+               }
+               if (Pref->Type->OnLoad != NULL)
+                       Pref->Type->OnLoad(Pref->Val, Pref->lval);
+       }
+       else {
+               Pref->eFlatPrefType = lPrefType;
+               switch (lPrefType)
+               {
+               case PRF_STRING:
+                       Pref->Val = value;
+                       Pref->decoded = 1;
+                       break;
+               case PRF_INT:
+                       Pref->lval = lvalue;
+                       Pref->Val = value;
+                       if (Pref->Val == NULL)
+                               Pref->Val = NewStrBufPlain(NULL, 64);
+                       StrBufPrintf(Pref->Val, "%ld", lvalue);
+                       Pref->decoded = 1;
+                       break;
+               case PRF_QP_STRING:
+                       Pref->DeQPed = value;
+                       Pref->Val = NewStrBufPlain(NULL, StrLength(Pref->DeQPed) * 3);
+                       StrBufEUid_escapize(Pref->Val, Pref->DeQPed);
+                       Pref->decoded = 1;
+                       break;
+               case PRF_YESNO:
+                       Pref->lval = lvalue;
+                       if (lvalue) 
+                               Pref->Val = NewStrBufPlain(HKEY("yes"));
+                       else
+                               Pref->Val = NewStrBufPlain(HKEY("no"));
+                       Pref->decoded = 1;
+                       break;
+               }
+       }
+
+       if ((save_to_server != 0) && 
+           GetHash(WCC->hash_prefs, key, keylen, &vPrefB) && 
+           (vPrefB != NULL) && 
+           (compare_preference (Pref, vPrefB) == 0))
+               save_to_server = 0;
+
+       Put(WCC->hash_prefs, key, keylen, Pref, DestroyPreference);
+       
+       if (save_to_server) WCC->SavePrefsToServer = 1;
+}
+
+void set_PREFERENCE(const char *key, size_t keylen, StrBuf *value, int save_to_server) 
+{
+       set_preference_backend(key, keylen, 0, value, PRF_STRING, save_to_server, NULL);
+}
+
+int get_PREF_LONG(const char *key, size_t keylen, long *value, long Default)
+{
+       Preference *Pref;
+       int Ret;
+
+       Ret = get_pref_backend(key, keylen, &Pref);
+       if (Ret == 0) {
+               *value = Default;
+               return 0;
+       }
+
+       if (Pref->decoded)
+               *value = Pref->lval;
+       else {
+               *value = Pref->lval = atol(ChrPtr(Pref->Val));
+               Pref->decoded = 1;
+       }
+       return Ret;
+}
+
+
+void set_PREF_LONG(const char *key, size_t keylen, long value, int save_to_server)
+{
+       set_preference_backend(key, keylen, value, NULL, PRF_INT, save_to_server, NULL);
+}
+
+int get_PREF_YESNO(const char *key, size_t keylen, int *value, int Default)
+{
+       Preference *Pref;
+       int Ret;
+
+       Ret = get_pref_backend(key, keylen, &Pref);
+       if (Ret == 0) {
+               *value = Default;
+               return 0;
+       }
+
+       if (Pref->decoded)
+               *value = Pref->lval;
+       else {
+               *value = Pref->lval = strcmp(ChrPtr(Pref->Val), "yes") == 0;
+               Pref->decoded = 1;
+       }
+       return Ret;
+}
+
+void set_PREF_YESNO(const char *key, size_t keylen, long value, int save_to_server)
+{
+       set_preference_backend(key, keylen, value, NULL, PRF_YESNO, save_to_server, NULL);
+}
+
+int get_room_prefs_backend(const char *key, size_t keylen, 
+                          Preference **Pref)
+{
+       StrBuf *pref_name;
+       int Ret;
+
+       pref_name = NewStrBufPlain (HKEY("ROOM:"));
+       StrBufAppendBuf(pref_name, WC->CurRoom.name, 0);
+       StrBufAppendBufPlain(pref_name, HKEY(":"), 0);
+       StrBufAppendBufPlain(pref_name, key, keylen, 0);
+       Ret = get_pref_backend(SKEY(pref_name), Pref);
+       FreeStrBuf(&pref_name);
+
+       return Ret;
+}
+
+const StrBuf *get_X_PREFS(const char *key, size_t keylen, 
+                         const char *xkey, size_t xkeylen)
+{
+       int ret;
+       StrBuf *pref_name;
+       Preference *Prf;
+       
+       pref_name = NewStrBufPlain (HKEY("XPREF:"));
+       StrBufAppendBufPlain(pref_name, xkey, xkeylen, 0);
+       StrBufAppendBufPlain(pref_name, HKEY(":"), 0);
+       StrBufAppendBufPlain(pref_name, key, keylen, 0);
+
+       ret = get_pref_backend(SKEY(pref_name), &Prf);
+       FreeStrBuf(&pref_name);
+
+       if (ret)
+               return Prf->Val;
+       else return NULL;
+}
+
+void set_X_PREFS(const char *key, size_t keylen, const char *xkey, size_t xkeylen, StrBuf *value, int save_to_server)
+{
+       StrBuf *pref_name;
+       
+       pref_name = NewStrBufPlain (HKEY("XPREF:"));
+       StrBufAppendBufPlain(pref_name, xkey, xkeylen, 0);
+       StrBufAppendBufPlain(pref_name, HKEY(":"), 0);
+       StrBufAppendBufPlain(pref_name, key, keylen, 0);
+
+       set_preference_backend(SKEY(pref_name), 0, value, PRF_STRING, save_to_server, NULL);
+       FreeStrBuf(&pref_name);
+}
+
+
+long get_ROOM_PREFS_LONG(const char *key, size_t keylen, long *value, long Default)
+{
+       Preference *Pref;
+       int Ret;
+
+       Ret = get_room_prefs_backend(key, keylen, &Pref);
+
+       if (Ret == 0) {
+               *value = Default;
+               return 0;
+       }
+
+       if (Pref->decoded)
+               *value = Pref->lval;
+       else {
+               *value = Pref->lval = atol(ChrPtr(Pref->Val));
+               Pref->decoded = 1;
+       }
+       return Ret;
+}
+
+
+StrBuf *get_ROOM_PREFS(const char *key, size_t keylen)
+{
+       Preference *Pref;
+       int Ret;
+
+       Ret = get_room_prefs_backend(key, keylen, &Pref);
+
+       if (Ret == 0) {
+               return NULL;
+       }
+       else 
+               return Pref->Val;
+}
+
+void set_ROOM_PREFS(const char *key, size_t keylen, StrBuf *value, int save_to_server)
+{
+       StrBuf *pref_name;
+       
+       pref_name = NewStrBufPlain (HKEY("ROOM:"));
+       StrBufAppendBuf(pref_name, WC->CurRoom.name, 0);
+       StrBufAppendBufPlain(pref_name, HKEY(":"), 0);
+       StrBufAppendBufPlain(pref_name, key, keylen, 0);
+       set_preference_backend(SKEY(pref_name), 0, value, PRF_STRING, save_to_server, NULL);
+       FreeStrBuf(&pref_name);
+}
+
+
+void GetPreferences(HashList *Setting)
+{
+        wcsession *WCC = WC;
+       HashPos *It;
+       long len;
+       const char *Key;
+       void *vSetting;
+       PrefDef *PrefType;
+       StrBuf *Buf;
+       long lval;
+       HashList *Tmp;
+
+       Tmp = WCC->hash_prefs;
+       WCC->hash_prefs = Setting;
+
+       It = GetNewHashPos(PreferenceHooks, 0);
+       while (GetNextHashPos(PreferenceHooks, It, &len, &Key, &vSetting)) {
+               PrefType = (PrefDef*) vSetting;
+
+               if (!HaveBstr(SKEY(PrefType->Setting)))
+                       continue;
+               switch (PrefType->eType) {
+               case PRF_UNSET:
+               case PRF_STRING:
+                       Buf = NewStrBufDup(SBstr(SKEY(PrefType->Setting)));
+                       set_preference_backend(SKEY(PrefType->Setting),
+                                              0, 
+                                              Buf, 
+                                              PRF_STRING,
+                                              1, 
+                                              PrefType);
+                       break;
+               case PRF_INT:
+                       lval = LBstr(SKEY(PrefType->Setting));
+                       set_preference_backend(SKEY(PrefType->Setting),
+                                              lval, 
+                                              NULL, 
+                                              PRF_INT,
+                                              1, 
+                                              PrefType);
+                       break;
+               case PRF_QP_STRING:
+                       Buf = NewStrBufDup(SBstr(SKEY(PrefType->Setting)));
+                       set_preference_backend(SKEY(PrefType->Setting),
+                                              0, 
+                                              Buf, 
+                                              PRF_QP_STRING,
+                                              1, 
+                                              PrefType);
+                       break;
+               case PRF_YESNO:
+                       lval = YesBstr(SKEY(PrefType->Setting));
+                       set_preference_backend(SKEY(PrefType->Setting),
+                                              lval, 
+                                              NULL, 
+                                              PRF_YESNO,
+                                              1, 
+                                              PrefType);
+                       break;
+               }
+       }
+       WCC->hash_prefs = Tmp;
+       DeleteHashPos(&It);
+}
+
+
+/*
+ * Commit new preferences and settings
+ */
+void set_preferences(void)
+{      
+       if (!havebstr("change_button")) {
+               AppendImportantMessage(_("Cancelled.  No settings were changed."), -1);
+               display_main_menu();
+               return;
+       }
+       GetPreferences(WC->hash_prefs);
+       display_main_menu();
+}
+
+
+void tmplput_CFG_Value(StrBuf *Target, WCTemplputParams *TP)
+{
+       Preference *Pref;
+       if (get_pref_backend(TKEY(0), &Pref))
+       {
+               if (Pref->Type == NULL) {
+                       StrBufAppendTemplate(Target, TP, Pref->Val, 1);
+               }
+               switch (Pref->Type->eType)
+               {
+               case PRF_UNSET: /* default to string... */
+               case PRF_STRING:
+                       StrBufAppendTemplate(Target, TP, Pref->Val, 1);
+                       break;
+               case PRF_INT:
+                       if (Pref->decoded != 1) {
+                               if (Pref->Val == NULL)
+                                       Pref->Val = NewStrBufPlain(NULL, 64);
+                               StrBufPrintf(Pref->Val, "%ld", Pref->lval);
+                               Pref->decoded = 1;
+                       }
+                       StrBufAppendTemplate(Target, TP, Pref->Val, 1);
+                       break;
+               case PRF_QP_STRING:
+                       if (Pref->decoded != 1) {
+                               if (Pref->DeQPed == NULL)
+                                       Pref->DeQPed = NewStrBufPlain(NULL, StrLength(Pref->Val));
+                                       
+                               StrBufEUid_unescapize(Pref->DeQPed, Pref->Val);
+                               Pref->decoded = 1;
+                       }
+                       StrBufAppendTemplate(Target, TP, Pref->DeQPed, 1);
+                       break;
+               case PRF_YESNO:
+                       if (Pref->decoded != 1) {
+                               Pref->lval = strcmp(ChrPtr(Pref->Val), "yes") == 0;
+                               Pref->decoded = 1;
+                       }
+                       StrBufAppendTemplate(Target, TP, Pref->Val, 1);
+                       break;
+               }
+       }
+}
+
+void tmplput_CFG_Descr(StrBuf *Target, WCTemplputParams *TP)
+{
+       const char *SettingStr;
+       SettingStr = PrefGetLocalStr(TKEY(0));
+       if (SettingStr != NULL) 
+               StrBufAppendBufPlain(Target, SettingStr, -1, 0);
+}
+void tmplput_CFG_RoomValueLong(StrBuf *Target, WCTemplputParams *TP)
+{
+       long lvalue;
+       long defval = 0;
+
+       if (HAVE_PARAM(1))
+               defval = GetTemplateTokenNumber(Target, TP, 1, 0);
+       get_ROOM_PREFS_LONG(TKEY(0), &lvalue, defval);
+       StrBufAppendPrintf(Target, "%ld", lvalue);
+}
+void tmplput_CFG_RoomValue(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *pref = get_ROOM_PREFS(TKEY(0));
+       if (pref != NULL) 
+               StrBufAppendBuf(Target, pref, 0);
+}
+int ConditionalHasRoomPreference(StrBuf *Target, WCTemplputParams *TP) 
+{
+       if (get_ROOM_PREFS(TP->Tokens->Params[0]->Start, 
+                          TP->Tokens->Params[0]->len) != NULL) 
+               return 1;
+  
+       return 0;
+}
+
+int ConditionalPreference(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Pref;
+
+       if (!get_PREFERENCE(TKEY(2), &Pref)) 
+               return 0;
+       
+       if (!HAVE_PARAM(3)) {
+               return 1;
+       }
+       else if (IS_NUMBER(TP->Tokens->Params[3]->Type))
+       {
+               return StrTol(Pref) == GetTemplateTokenNumber (Target, TP, 3, 0);
+       }
+       else 
+       {
+               const char *pch;
+               long len;
+               
+               GetTemplateTokenString(Target, TP, 3, &pch, &len);
+               
+               return ((len == StrLength(Pref)) &&
+                       (strcmp(pch, ChrPtr(Pref)) == 0));
+       }
+}
+
+int ConditionalHasPreference(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Pref;
+
+       if (!get_PREFERENCE(TKEY(2), &Pref) || 
+           (Pref == NULL)) 
+               return 0;
+       else 
+               return 1;
+}
+
+
+/********************************************************************************
+ *                 preferences stored discrete in citserver
+ ********************************************************************************/
+CtxType CTX_VEA = CTX_NONE;
+typedef struct __ValidEmailAddress {
+       StrBuf *Address;
+       int IsDefault;
+}ValidEmailAddress;
+
+void DeleteValidEmailAddress(void *v)
+{
+       ValidEmailAddress *VEA = (ValidEmailAddress*)v;
+       FreeStrBuf(&VEA->Address);
+       free(VEA);
+}
+void tmplput_VEA(StrBuf *Target, WCTemplputParams *TP)
+{
+       ValidEmailAddress* VEA = (ValidEmailAddress*) CTX((CTX_VEA));
+       StrBufAppendTemplate(Target, TP, VEA->Address, 0);
+}
+int ConditionalPreferenceIsDefaulVEA(StrBuf *Target, WCTemplputParams *TP)
+{
+       ValidEmailAddress* VEA = (ValidEmailAddress*) CTX((CTX_VEA));
+       return VEA->IsDefault;
+}
+HashList *GetGVEAHash(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Rcp;
+       HashList *List = NULL;
+       int Done = 0;
+       int i, n = 1;
+       char N[64];
+       StrBuf *DefaultFrom = NULL;
+       const StrBuf *EnvelopeTo;
+       ValidEmailAddress *VEA;
+
+       get_preference("defaultfrom", &DefaultFrom);
+       EnvelopeTo = sbstr("nvto");
+       Rcp = NewStrBuf();
+       serv_puts("GVEA");
+       StrBuf_ServGetln(Rcp);
+       if (GetServerStatus(Rcp, NULL) == 1) {
+               FlushStrBuf(Rcp);
+               List = NewHash(1, NULL);
+               while (!Done && (StrBuf_ServGetln(Rcp)>=0)) {
+                       if ( (StrLength(Rcp)==3) && 
+                            !strcmp(ChrPtr(Rcp), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else {
+                               VEA = (ValidEmailAddress*) malloc(sizeof(ValidEmailAddress));
+                               i = snprintf(N, sizeof(N), "%d", n);
+                               StrBufTrim(Rcp);
+                               VEA->Address = Rcp;
+                               if (StrLength(EnvelopeTo) > 0)
+                                       VEA->IsDefault = strstr(ChrPtr(EnvelopeTo), ChrPtr(Rcp)) != NULL;
+                               else if (StrLength(DefaultFrom) > 0)
+                                       VEA->IsDefault = !strcmp(ChrPtr(Rcp), ChrPtr(DefaultFrom));
+                               else
+                                       VEA->IsDefault = 0;
+
+                               Put(List, N, i, VEA, DeleteValidEmailAddress);
+                               Rcp = NewStrBuf();
+                       }
+                       n++;
+               }
+       }
+       FreeStrBuf(&Rcp);
+       return List;
+}
+void DeleteGVEAHash(HashList **KillMe)
+{
+       DeleteHash(KillMe);
+}
+
+HashList *GetGVSNHash(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Rcp;
+       HashList *List = NULL;
+       int Done = 0;
+       int i, n = 1;
+       char N[64];
+
+       Rcp = NewStrBuf();
+       serv_puts("GVSN");
+       StrBuf_ServGetln(Rcp);
+       if (GetServerStatus(Rcp, NULL) == 1) {
+               FlushStrBuf(Rcp);
+               List = NewHash(1, NULL);
+               while (!Done && (StrBuf_ServGetln(Rcp)>=0)) {
+                       if ( (StrLength(Rcp)==3) && 
+                            !strcmp(ChrPtr(Rcp), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else {
+                               i = snprintf(N, sizeof(N), "%d", n);
+                               StrBufTrim(Rcp);
+                               Put(List, N, i, Rcp, HFreeStrBuf);
+                               Rcp = NewStrBuf();
+                       }
+                       n++;
+               }
+       }
+       FreeStrBuf(&Rcp);
+       return List;
+}
+void DeleteGVSNHash(HashList **KillMe)
+{
+       DeleteHash(KillMe);
+}
+
+
+
+
+/*
+ * Offer to make any page the user's "start page" (only if logged in)
+ */
+void offer_start_page(StrBuf *Target, WCTemplputParams *TP)
+{
+       if (WC->logged_in) {
+               wc_printf("<a href=\"change_start_page?startpage=");
+               urlescputs(ChrPtr(WC->Hdr->this_page));
+               wc_printf("\">");
+               wc_printf(_("Make this my start page"));
+               wc_printf("</a>");
+       };
+}
+
+
+/*
+ * Change the user's start page
+ */
+void change_start_page(void) 
+{
+       const char *pch;
+       void *vHandler;
+       int ProhibitSave = 0;
+       const StrBuf *pStartPage = sbstr("startpage");
+
+       if (pStartPage != NULL) {
+               pch = strchr(ChrPtr(pStartPage), '?');
+
+               if ((pch != NULL) && (
+                           GetHash(HandlerHash, ChrPtr(pStartPage), pch - ChrPtr(pStartPage), &vHandler), 
+                           (vHandler != NULL) &&
+                           ((((WebcitHandler*)vHandler)->Flags & PROHIBIT_STARTPAGE) != 0)))
+               { /* OK, This handler doesn't want to be set as start page, prune it. */
+                       ProhibitSave = 1;
+               }
+       }
+
+       if ((pStartPage == NULL) || 
+           (ProhibitSave == 1))
+       {
+               set_preference_backend(HKEY("startpage"), 
+                                      0, 
+                                      NewStrBufPlain(HKEY("")),
+                                      PRF_STRING,
+                                      1, 
+                                      NULL);
+               if (ProhibitSave == 1)
+                       AppendImportantMessage(_("This isn't allowed to become the start page."), -1);
+               else
+                       AppendImportantMessage(_("You no longer have a start page selected."), -1);
+               display_main_menu();
+               return;
+       }
+
+
+
+       set_preference_backend(HKEY("startpage"), 
+                              0, 
+                              NewStrBufDup(pStartPage),
+                              PRF_STRING,
+                              1, 
+                              NULL);
+
+       output_headers(1, 1, 0, 0, 0, 0);
+       do_template("newstartpage");
+       wDumpContent(1);
+}
+
+
+void LoadStartpage(StrBuf *URL, long lvalue)
+{
+       const char *pch;
+       void *vHandler;
+       pch = strchr(ChrPtr(URL), '?');
+       if (pch == NULL) {
+               /* purge the sins of the past... */
+               pch = strchr(ChrPtr(URL), '&');
+               if (pch != NULL) {
+                       StrBufPeek(URL, pch, -1, '?');
+                       WC->SavePrefsToServer = 1;
+               }
+       }
+       else if (GetHash(HandlerHash, ChrPtr(URL), pch - ChrPtr(URL), &vHandler), 
+                (vHandler != NULL) &&
+                ((((WebcitHandler*)vHandler)->Flags & PROHIBIT_STARTPAGE) != 0))
+       { /* OK, This handler doesn't want to be set as start page, prune it. */
+               FlushStrBuf(URL);
+               WC->SavePrefsToServer = 1;
+       }
+}
+
+
+void 
+InitModule_PREFERENCES
+(void)
+{
+       RegisterCTX(CTX_VEA);
+
+       WebcitAddUrlHandler(HKEY("set_preferences"), "", 0, set_preferences, 0);
+       WebcitAddUrlHandler(HKEY("change_start_page"), "", 0, change_start_page, 0);
+
+       RegisterPreference("startpage", _("Prefered startpage"), PRF_STRING, LoadStartpage);
+
+       RegisterNamespace("OFFERSTARTPAGE", 0, 0, offer_start_page, NULL, CTX_NONE);
+       RegisterNamespace("PREF:ROOM:VALUE", 1, 2, tmplput_CFG_RoomValue,  NULL, CTX_NONE);
+       RegisterNamespace("PREF:ROOM:VALUE:INT", 1, 2, tmplput_CFG_RoomValueLong,  NULL, CTX_NONE);
+       RegisterNamespace("PREF:VALUE", 1, 2, tmplput_CFG_Value, NULL, CTX_NONE);
+       
+       RegisterNamespace("PREF:DESCR", 1, 1, tmplput_CFG_Descr, NULL, CTX_NONE);
+
+       RegisterConditional("COND:PREF", 4, ConditionalPreference, CTX_NONE);
+       RegisterConditional("COND:PREF:SET", 4, ConditionalHasPreference, CTX_NONE);
+       RegisterConditional("COND:ROOM:SET", 4, ConditionalHasRoomPreference, CTX_NONE);
+       
+       RegisterIterator("PREF:VALID:EMAIL:ADDR", 0, NULL, 
+                        GetGVEAHash, NULL, DeleteGVEAHash, CTX_VEA, CTX_NONE, IT_NOFLAG);
+       RegisterNamespace("PREF:VALID:EMAIL:ADDR:STR", 1, 1, tmplput_VEA, NULL, CTX_VEA);
+       RegisterConditional("COND:PREF:VALID:EMAIL:ADDR:STR", 4, ConditionalPreferenceIsDefaulVEA, CTX_VEA);
+
+       RegisterIterator("PREF:VALID:EMAIL:NAME", 0, NULL, 
+                        GetGVSNHash, NULL, DeleteGVSNHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+
+}
+
+
+void 
+ServerStartModule_PREFERENCES
+(void)
+{
+       PreferenceHooks = NewHash(1, NULL);
+}
+
+
+
+void 
+ServerShutdownModule_PREFERENCES
+(void)
+{
+       DeleteHash(&PreferenceHooks);
+}
+
+void
+SessionDetachModule__PREFERENCES
+(wcsession *sess)
+{
+       if (sess->SavePrefsToServer) {
+               save_preferences();
+               sess->SavePrefsToServer = 0;
+       }
+}
+
+void
+SessionNewModule_PREFERENCES
+(wcsession *sess)
+{
+       sess->hash_prefs = NewHash(1,NULL);
+}
+
+void 
+SessionDestroyModule_PREFERENCES
+(wcsession *sess)
+{
+       DeleteHash(&sess->hash_prefs);
+}
diff --git a/webcit/preferences.h b/webcit/preferences.h
new file mode 100644 (file)
index 0000000..7a30a7b
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+
+typedef enum _ePrefType{
+       PRF_UNSET = 0,
+       PRF_STRING = 1,
+       PRF_INT = 2,
+       PRF_QP_STRING = 3,
+       PRF_YESNO = 4
+} ePrefType;
+
+
+typedef void (*PrefEvalFunc)(StrBuf *Preference, long lvalue); 
+
+void _RegisterPreference(const char *Setting, long SettingLen, 
+                        const char *PrefStr, 
+                        ePrefType Type, 
+                        PrefEvalFunc OnLoad, 
+                        const char *OnLoadName);
+
+#define RegisterPreference(a, b, c, d) _RegisterPreference(a, sizeof(a) -1, b, c, d, #d)
+
+void load_preferences(void);
+void save_preferences(void);
+#define get_preference(a, b) get_PREFERENCE(a, sizeof(a) - 1, b)
+#define get_pref(a, b)       get_PREFERENCE(SKEY(a), b)
+int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value);
+#define set_preference(a, b, c) set_PREFERENCE(a, sizeof(a) - 1, b, c)
+#define set_pref(a, b, c)       set_PREFERENCE(SKEY(a), b, c)
+void set_PREFERENCE(const char *key, size_t keylen, StrBuf *value, int save_to_server);
+
+#define get_pref_long(a, b, c) get_PREF_LONG(a, sizeof(a) - 1, b, c)
+int get_PREF_LONG(const char *key, size_t keylen, long *value, long Default);
+#define set_pref_long(a, b, c) set_PREF_LONG(a, sizeof(a) - 1, b, c)
+void set_PREF_LONG(const char *key, size_t keylen, long value, int save_to_server);
+
+#define get_pref_yesno(a, b, c) get_PREF_YESNO(a, sizeof(a) - 1, b, c)
+int get_PREF_YESNO(const char *key, size_t keylen, int *value, int Default);
+#define set_pref_yesno(a, b, c) set_PREF_YESNO(a, sizeof(a) - 1, b, c)
+void set_PREF_YESNO(const char *key, size_t keylen, long value, int save_to_server);
+
+#define get_room_pref(a) get_ROOM_PREFS(a, sizeof(a) - 1)
+StrBuf *get_ROOM_PREFS(const char *key, size_t keylen);
+
+#define set_room_pref(a, b, c) set_ROOM_PREFS(a, sizeof(a) - 1, b, c)
+void set_ROOM_PREFS(const char *key, size_t keylen, StrBuf *value, int save_to_server);
+#define get_room_pref_long(a, b, c) get_ROOM_PREFS_LONG(a, sizeof(a) - 1, b, c)
+long get_ROOM_PREFS_LONG(const char *key, size_t keylen, long *value, long Default);
+
+
+#define get_x_pref(a, b) get_ROOM_PREFS(a, sizeof(a) - 1, b, sizeof(b) - 1)
+const StrBuf *get_X_PREFS(const char *key, size_t keylen, 
+                         const char *xkey, size_t xkeylen);
+
+#define set_x_pref(a, b, c) set_ROOM_PREFS(a, sizeof(a) - 1, b, sizeof(b) - 1, c, d)
+void set_X_PREFS(const char *key, size_t keylen, const char *xkey, size_t xkeylen, StrBuf *value, int save_to_server);
+
+int goto_config_room(StrBuf *Buf, folder *room);
diff --git a/webcit/pushemail.c b/webcit/pushemail.c
new file mode 100644 (file)
index 0000000..92fd026
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Edits a users push email settings 
+ * Author: Mathew McBride <matt@mcbridematt.dhs.org>
+ */
+#include "webcit.h"
+
+void display_pushemail(void) 
+{
+       folder Room;
+       int Done = 0;
+       StrBuf *Buf;
+       long vector[8] = {8, 0, 0, 1, 2, 3, 4, 5};
+       WCTemplputParams SubTP;
+       char mobnum[20];
+
+       StackContext(NULL, &SubTP, &vector, CTX_LONGVECTOR, 0, NULL);
+       vector[0] = 16;
+
+       /* Find any existing settings*/
+       Buf = NewStrBuf();
+       memset(&Room, 0, sizeof(folder));
+       if (goto_config_room(Buf, &Room) == 0) {
+               int msgnum = 0;
+               serv_puts("MSGS ALL|0|1");
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatus(Buf, NULL) == 8) {
+                       serv_puts("subj|__ Push email settings __");
+                       serv_puts("000");
+                       while (!Done &&
+                              StrBuf_ServGetln(Buf) >= 0) {
+                               if ( (StrLength(Buf)==3) && 
+                                    !strcmp(ChrPtr(Buf), "000")) {
+                                       Done = 1;
+                                       break;
+                               }
+                               msgnum = StrTol(Buf);
+                       }
+               }
+               if (msgnum > 0L) {
+               serv_printf("MSG0 %d", msgnum);
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatus(Buf, NULL) == 1) {
+                       int i =0;
+                       Done = 0;
+                       while (!Done &&
+                              StrBuf_ServGetln(Buf) >= 0) {
+                               if (( (StrLength(Buf)==3) && 
+                                     !strcmp(ChrPtr(Buf), "000"))||
+                                   ((StrLength(Buf)==4) && 
+                                    !strcmp(ChrPtr(Buf), "text")))
+                               {
+                                       Done = 1;
+                                       break;
+                               }
+                       }
+                       if (!strcmp(ChrPtr(Buf), "text")) {
+                               Done = 0;
+                               while (!Done &&
+                                      StrBuf_ServGetln(Buf) >= 0) {
+                                       if ( (StrLength(Buf)==3) && 
+                                            !strcmp(ChrPtr(Buf), "000")) {
+                                               Done = 1;
+                                               break;
+                                       }
+                                       if (strncasecmp(ChrPtr(Buf), "none", 4) == 0) {
+                                               vector[1] = 0;
+                                       } else if (strncasecmp(ChrPtr(Buf), "textmessage", 11) == 0) {
+                                               vector[1] = 1;
+                                               i++;
+                                       } else if (strncasecmp(ChrPtr(Buf), "funambol", 8) == 0) {
+                                               vector[1] = 2;
+                                       } else if (strncasecmp(ChrPtr(Buf), "httpmessage", 12) == 0) {
+                                               vector[1] = 3;
+                                       } else if (i == 1) {
+                                               strncpy(mobnum, ChrPtr(Buf), 20);
+                                               i++;
+                                       }
+                               }       
+                       }
+               }
+               }
+               serv_printf("GOTO %s", ChrPtr(WC->CurRoom.name));
+               StrBuf_ServGetln(Buf);
+               GetServerStatus(Buf, NULL);
+       }
+       FlushFolder(&Room);
+       output_headers(1, 1, 1, 0, 0, 0);
+       DoTemplate(HKEY("prefs_pushemail"), NULL, &SubTP);
+       wDumpContent(1);
+       UnStackContext(&SubTP);
+       FreeStrBuf(&Buf);
+}
+
+void save_pushemail(void) 
+{
+       folder Room;
+       int Done = 0;
+       StrBuf *Buf;
+       char buf[SIZ];
+       int msgnum = 0;
+       char *pushsetting = bstr("pushsetting");
+       char *sms = NULL;
+
+       if (strncasecmp(pushsetting, "textmessage", 11) == 0) {
+               sms = bstr("user_sms_number");
+       }
+       Buf = NewStrBuf();
+       memset(&Room, 0, sizeof(folder));
+       if (goto_config_room(Buf, &Room) != 0) {
+               FreeStrBuf(&Buf);
+               FlushFolder(&Room);
+               return; /* oh well. */
+       }
+       FlushFolder(&Room);
+
+       serv_puts("MSGS ALL|0|1");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 8) {
+               serv_puts("subj|__ Push email settings __");
+               serv_puts("000");
+       } else {
+               printf("Junk in save_pushemail buffer!: %s\n", buf);
+               FreeStrBuf(&Buf);
+               return;
+       }
+
+       while (!Done &&
+              StrBuf_ServGetln(Buf) >= 0) {
+               if ( (StrLength(Buf)==3) && 
+                    !strcmp(ChrPtr(Buf), "000")) {
+                       Done = 1;
+                       break;
+               }
+               msgnum = StrTol(Buf);
+       }
+
+       if (msgnum > 0L) {
+               serv_printf("DELE %d", msgnum);
+               StrBuf_ServGetln(Buf);
+               GetServerStatus(Buf, NULL);
+       }
+
+       serv_printf("ENT0 1||0|1|__ Push email settings __|");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 4) {
+               serv_puts(pushsetting);
+               if (sms != NULL) {
+               serv_puts(sms);
+               } 
+               serv_puts("");
+               serv_puts("000");
+       }
+
+       /** Go back to the room we're supposed to be in */
+       serv_printf("GOTO %s", ChrPtr(WC->CurRoom.name));
+       StrBuf_ServGetln(Buf);
+       GetServerStatus(Buf, NULL);
+       http_redirect("display_pushemail");
+       FreeStrBuf(&Buf);
+}
+
+void 
+InitModule_PUSHMAIL
+(void)
+{
+       WebcitAddUrlHandler(HKEY("display_pushemail"), "", 0, display_pushemail, 0);
+       WebcitAddUrlHandler(HKEY("save_pushemail"), "", 0, save_pushemail, 0);
+}
diff --git a/webcit/roomchat.c b/webcit/roomchat.c
new file mode 100644 (file)
index 0000000..3b0091e
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * This module handles multiuser chat.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+/*
+ * Display the screen containing multiuser chat for a room.
+ */
+void do_chat(void)
+{
+       char buf[256];
+
+       WC->last_chat_seq = 0;
+       WC->last_chat_user[0] = 0;
+
+       output_headers(1, 1, 1, 0, 0, 0);
+       do_template("roomchat");
+
+       serv_puts("RCHT enter");
+       serv_getln(buf, sizeof buf);
+
+       wDumpContent(1);
+}
+
+
+/*
+ * Receiving side of the chat window.  
+ * This does JavaScript writes to
+ * other divs whenever it refreshes and finds new data.
+ */
+void chat_recv(void) {
+       char buf[SIZ];
+       char cl_user[SIZ];
+
+       serv_printf("RCHT poll|%d", WC->last_chat_seq);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               WC->last_chat_seq = extract_int(&buf[4], 0);
+               extract_token(cl_user, &buf[4], 2, '|', sizeof cl_user);
+
+               /* who is speaking ... */
+               if (strcasecmp(cl_user, WC->last_chat_user)) {
+                       wc_printf("<br>\n");
+                       if (!strcasecmp(cl_user, ChrPtr(WC->wc_fullname))) {
+                               wc_printf("<span class=\"chat_myname_class\">");
+                       }
+                       else {
+                               wc_printf("<span class=\"chat_notmyname_class\">");
+                       }
+                       escputs(cl_user);
+                       strcpy(WC->last_chat_user, cl_user);
+
+                       wc_printf(": </span>");
+               }
+               else {
+                       wc_printf("&nbsp;&nbsp;&nbsp;");
+               }
+
+               /* what did they say ... */
+               wc_printf("<span class=\"chat_text_class\">");
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       escputs(buf);
+               }
+               wc_printf("<br></span>\n");
+       }
+}
+
+
+/*
+ * This is the sending side of the chat window.  The form is designed to transmit asynchronously.
+ */
+void chat_send(void) {
+       char send_this[SIZ];
+       char buf[SIZ];
+
+       begin_ajax_response();
+
+       if (havebstr("send_this")) {
+               strcpy(send_this, bstr("send_this"));
+       }
+       else {
+               strcpy(send_this, "");
+       }
+
+       if (havebstr("exit_button")) {
+               strcpy(send_this, "/quit");
+       }
+
+       if (!IsEmptyStr(send_this)) {
+               serv_puts("RCHT send");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '4') {
+                       text_to_server(send_this);
+                       serv_puts("000");
+               }
+       }
+       end_ajax_response();
+}
+
+
+/*
+ * wholist for chat
+ */
+void chat_rwho(void) {
+       char buf[1024];
+
+       serv_puts("RCHT rwho");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       if (!strcasecmp(buf, ChrPtr(WC->wc_fullname))) {
+                               wc_printf("<span class=\"chat_myname_class\">");
+                       }
+                       else {
+                               wc_printf("<span class=\"chat_notmyname_class\">");
+                       }
+                       wc_printf("<img src=\"static/webcit_icons/essen/16x16/chat.png\">");
+                       escputs(buf);
+                       wc_printf("</span><br>\n");
+               }
+       }
+}
+
+
+/*
+ * advise the Citadel server that the user is navigating away from the chat window
+ */
+void chat_exit(void) {
+       char buf[1024];
+
+       serv_puts("RCHT exit");
+       serv_getln(buf, sizeof buf);            /* Throw away the server reply */
+}
+
+
+
+void 
+InitModule_ROOMCHAT
+(void)
+{
+       WebcitAddUrlHandler(HKEY("chat"), "", 0, do_chat, 0);
+       WebcitAddUrlHandler(HKEY("chat_recv"), "", 0, chat_recv, AJAX);
+       WebcitAddUrlHandler(HKEY("chat_rwho"), "", 0, chat_rwho, AJAX);
+       WebcitAddUrlHandler(HKEY("chat_exit"), "", 0, chat_exit, AJAX);
+       WebcitAddUrlHandler(HKEY("chat_send"), "", 0, chat_send, 0);
+}
+
+
+void 
+SessionDestroyModule_ROOMCHAT
+(wcsession *sess)
+{
+       /* nothing here anymore */
+}
diff --git a/webcit/roomlist.c b/webcit/roomlist.c
new file mode 100644 (file)
index 0000000..b9f967c
--- /dev/null
@@ -0,0 +1,979 @@
+/*
+ * room listings and filters.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+typedef enum __eRoomParamType {
+       eNotSet,
+       eDomain,
+       eAlias
+}eRoomParamType;
+
+HashList *GetWhoKnowsHash(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Line;
+       StrBuf *Token;
+       long State;
+       HashList *Whok = NULL;
+       int Done = 0;
+       int n = 0;
+
+       serv_puts("WHOK");
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, &State) == 1) 
+       {
+               Whok = NewHash(1, Flathash);
+               while(!Done && (StrBuf_ServGetln(Line) >= 0) )
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {
+                       
+                               const char *Pos = NULL;
+                               Token = NewStrBufPlain (NULL, StrLength(Line));
+                               StrBufExtract_NextToken(Token, Line, &Pos, '|');
+
+                               Put(Whok, 
+                                   IKEY(n),
+                                   Token, 
+                                   HFreeStrBuf);
+                               n++;
+                       }
+       }
+       else if (State == 550)
+               AppendImportantMessage(_("Higher access is required to access this function."), -1);
+
+
+       FreeStrBuf(&Line);
+       return Whok;
+}
+
+
+void DeleteFloor(void *vFloor)
+{
+       Floor *pFloor;
+       pFloor = (Floor*) vFloor;
+       FreeStrBuf(&pFloor->Name);
+       free(pFloor);
+}
+
+int SortFloorsByNameOrder(const void *vfloor1, const void *vfloor2) 
+{
+       Floor *f1 = (Floor*) GetSearchPayload(vfloor1);
+       Floor *f2 = (Floor*) GetSearchPayload(vfloor2);
+       
+       /* prefer My floor over alpabetical sort */
+       if (f1->ID == VIRTUAL_MY_FLOOR)
+               return 1;
+       if (f2->ID == VIRTUAL_MY_FLOOR)
+               return -1;
+
+       return strcmp(ChrPtr(f1->Name), ChrPtr(f2->Name));
+}
+
+HashList *GetFloorListHash(StrBuf *Target, WCTemplputParams *TP) 
+{
+       int Done = 0;
+       const char *Err;
+       StrBuf *Buf;
+       HashList *floors;
+       HashList *floorsbyname;
+       HashPos *it;
+       Floor *pFloor;
+       void *vFloor;
+       const char *Pos;
+       int i;
+       wcsession *WCC = WC;
+       const char *HashKey;
+       long HKLen;
+
+
+       if (WCC->Floors != NULL)
+               return WCC->Floors;
+       WCC->Floors = floors = NewHash(1, Flathash);
+       WCC->FloorsByName = floorsbyname = NewHash(1, NULL);
+       Buf = NewStrBuf();
+
+       pFloor = (Floor*) malloc(sizeof(Floor));
+       pFloor->ID = VIRTUAL_MY_FLOOR;
+       pFloor->Name = NewStrBufPlain(_("My Folders"), -1);
+       pFloor->NRooms = 0;
+       
+       Put(floors, IKEY(pFloor->ID), pFloor, DeleteFloor);
+       Put(floorsbyname, SKEY(pFloor->Name), pFloor, reference_free_handler);
+
+       serv_puts("LFLR"); /* get floors */
+       StrBufTCP_read_line(Buf, &WC->serv_sock, 0, &Err); /* '100', we hope */
+       if (GetServerStatus(Buf, NULL) == 1) 
+       {
+               while(!Done && StrBuf_ServGetln(Buf) >= 0)
+                       if ( (StrLength(Buf)==3) && 
+                            !strcmp(ChrPtr(Buf), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {
+                       
+                               Pos = NULL;
+
+                               pFloor = (Floor*) malloc(sizeof(Floor));
+                               pFloor->ID = StrBufExtractNext_int(Buf, &Pos, '|');
+                               pFloor->Name = NewStrBufPlain(NULL, StrLength(Buf));
+                               StrBufExtract_NextToken(pFloor->Name, Buf, &Pos, '|');
+                               pFloor->NRooms = StrBufExtractNext_long(Buf, &Pos, '|');
+
+                               Put(floors, IKEY(pFloor->ID), pFloor, DeleteFloor);
+                               Put(floorsbyname, SKEY(pFloor->Name), pFloor, reference_free_handler);
+                       }
+       }
+       FreeStrBuf(&Buf);
+       
+       /* now lets pre-sort them alphabeticaly. */
+       i = 1;
+       SortByPayload(floors, SortFloorsByNameOrder);
+       it = GetNewHashPos(floors, 0);
+       while ( GetNextHashPos(floors, it, &HKLen, &HashKey, &vFloor)) 
+               ((Floor*) vFloor)->AlphaN = i++;
+       DeleteHashPos(&it);
+       SortByHashKeyStr(floors);
+
+       return floors;
+}
+
+HashList *GetZappedRoomListHash(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       if (WCC->Floors == NULL)
+               GetFloorListHash(Target, TP);
+       serv_puts("LZRM -1");
+       return GetRoomListHash(Target, TP);
+}
+HashList *GetRoomListHashLKRA(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       if (WCC->Floors == NULL)
+               GetFloorListHash(Target, TP);
+       if (WCC->Rooms == NULL) 
+       {
+               serv_puts("LKRA");
+               WCC->Rooms =  GetRoomListHash(Target, TP);
+       }
+       return WCC->Rooms;
+}
+
+HashList *GetRoomListHashLPRM(StrBuf *Target, WCTemplputParams *TP) 
+{
+       serv_puts("LPRM");
+       return GetRoomListHash(Target, TP);
+}
+
+
+void FlushIgnetCfgs(folder *room)
+{
+       int i;
+       if (room->IgnetCfgs[maxRoomNetCfg] == (HashList*) StrBufNOTNULL)
+       {
+               for (i = ignet_push_share; i < maxRoomNetCfg; i++)
+                       DeleteHash(&room->IgnetCfgs[i]);
+       }
+       memset(&room->IgnetCfgs, 0, sizeof(HashList *) * (maxRoomNetCfg + 1));
+       room->RoomAlias = NULL;
+
+}
+
+void FlushFolder(folder *room)
+{
+       int i;
+
+       FreeStrBuf(&room->XAPass);
+       FreeStrBuf(&room->Directory);
+       FreeStrBuf(&room->RoomAide);
+       FreeStrBuf(&room->XInfoText);
+       room->XHaveInfoTextLoaded = 0;
+
+       FreeStrBuf(&room->name);
+
+       FlushIgnetCfgs(room);
+
+       if (room->RoomNameParts != NULL)
+       {
+               for (i=0; i < room->nRoomNameParts; i++)
+                       FreeStrBuf(&room->RoomNameParts[i]);
+               free(room->RoomNameParts);
+       }
+       memset(room, 0, sizeof(folder));
+}
+
+void vDeleteFolder(void *vFolder)
+{
+       folder *room;
+
+       room = (folder*) vFolder;
+       FlushFolder(room);
+
+       free(room);
+}
+
+
+HashList *GetRoomListHash(StrBuf *Target, WCTemplputParams *TP) 
+{
+       int Done = 0;
+       HashList *rooms;
+       folder *room;
+       StrBuf *Buf;
+       const char *Pos;
+       void *vFloor;
+       wcsession *WCC = WC;
+       CompareFunc SortIt;
+       WCTemplputParams SubTP;
+
+       Buf = NewStrBuf();
+       rooms = NewHash(1, NULL);
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 1) 
+       {
+               while(!Done && (StrBuf_ServGetln(Buf) >= 0))
+                       if ( (StrLength(Buf)==3) && 
+                            !strcmp(ChrPtr(Buf), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {                               
+                               Pos = NULL;
+                               room = (folder*) malloc (sizeof(folder));
+                               memset(room, 0, sizeof(folder));
+
+                               /* Load the base data from the server reply */
+                               room->name = NewStrBufPlain(NULL, StrLength(Buf));
+                               StrBufExtract_NextToken(room->name, Buf, &Pos, '|');
+
+                               room->QRFlags = StrBufExtractNext_long(Buf, &Pos, '|');
+                               room->floorid = StrBufExtractNext_int(Buf, &Pos, '|');
+                               room->Order = StrBufExtractNext_long(Buf, &Pos, '|');
+                               room->QRFlags2 = StrBufExtractNext_long(Buf, &Pos, '|');
+
+                               room->RAFlags = StrBufExtractNext_long(Buf, &Pos, '|');
+
+/*
+  ACWHUT?
+  room->ACL = NewStrBufPlain(NULL, StrLength(Buf));
+  StrBufExtract_NextToken(room->ACL, Buf, &Pos, '|');
+*/
+
+                               room->view = StrBufExtractNext_long(Buf, &Pos, '|');
+                               room->defview = StrBufExtractNext_long(Buf, &Pos, '|');
+                               room->lastchange = StrBufExtractNext_long(Buf, &Pos, '|');
+
+                               /* Evaluate the Server sent data for later use */
+                               /* find out, whether we are in a sub-room */
+                               room->nRoomNameParts = StrBufNum_tokens(room->name, '\\');
+                               if (room->nRoomNameParts > 1)
+                               {
+                                       int i;
+
+                                       Pos = NULL;
+                                       room->RoomNameParts = malloc(sizeof(StrBuf*) * (room->nRoomNameParts + 1));
+                                       memset(room->RoomNameParts, 0, sizeof(StrBuf*) * (room->nRoomNameParts + 1));
+                                       for (i=0; i < room->nRoomNameParts; i++)
+                                       {
+                                               room->RoomNameParts[i] = NewStrBuf();
+                                               StrBufExtract_NextToken(room->RoomNameParts[i],
+                                                                       room->name, &Pos, '\\');
+                                       }
+                               }
+
+                               /* Private mailboxes on the main floor get remapped to the personal folder */
+                               if ((room->QRFlags & QR_MAILBOX) && 
+                                   (room->floorid == 0))
+                               {
+                                       room->floorid = VIRTUAL_MY_FLOOR;
+                                       if ((room->nRoomNameParts == 1) && 
+                                           (StrLength(room->name) == 4) && 
+                                           (strcmp(ChrPtr(room->name), "Mail") == 0))
+                                       {
+                                               room->is_inbox = 1;
+                                       }
+
+                               }
+                               /* get a pointer to the floor we're on: */
+                               GetHash(WCC->Floors, IKEY(room->floorid), &vFloor);
+                               room->Floor = (const Floor*) vFloor;
+
+
+
+                               /* now we know everything, remember it... */
+                               Put(rooms, SKEY(room->name), room, vDeleteFolder);
+                       }
+       }
+
+       SubTP.Filter.ContextType = CTX_ROOMS;
+       SortIt = RetrieveSort(&SubTP, NULL, 0, HKEY("fileunsorted"), 0);
+       if (SortIt != NULL)
+               SortByPayload(rooms, SortIt);
+       else 
+               SortByPayload(rooms, SortRoomsByListOrder);
+       FreeStrBuf(&Buf);
+       return rooms;
+}
+
+HashList *GetThisRoomMAlias(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+       StrBuf *Line;
+       StrBuf *Token;
+       HashList *Aliases = NULL;
+       const char *pComma;
+       long aliaslen;
+       long locallen;
+       long State;
+       
+       serv_puts("GNET "FILE_MAILALIAS);
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, &State) == 1) 
+       {
+               int Done = 0;
+               int n = 0;
+
+               Aliases = NewHash(1, NULL);
+               while(!Done && (StrBuf_ServGetln(Line) >= 0))
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000"))
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {
+                               pComma = strchr(ChrPtr(Line), ',');
+                               if (pComma == NULL)
+                                       continue;
+                               aliaslen = pComma - ChrPtr(Line);
+                               locallen = StrLength(Line) - 1 - aliaslen;
+                               if (locallen - 5 != StrLength(WCC->CurRoom.name))
+                                       continue;
+                               if (strncmp(pComma + 1, "room_", 5) != 0)
+                                       continue;
+
+                               if (strcasecmp(pComma + 6, ChrPtr(WCC->CurRoom.name)) != 0)
+                                       continue;
+                               Token = NewStrBufPlain(ChrPtr(Line), aliaslen);
+                               Put(Aliases, 
+                                   IKEY(n),
+                                   Token, 
+                                   HFreeStrBuf);
+                               n++;
+                       }
+       }
+       else if (State == 550)
+               AppendImportantMessage(_("Higher access is required to access this function."), -1);
+
+       FreeStrBuf(&Line);
+
+       return Aliases;
+}
+
+
+void AppendPossibleAliasWithDomain(
+       HashList *PossibleAliases,
+       long *nPossibleAliases,
+       const HashList *Domains, 
+       const char *prefix,
+       long len,
+       const char* Alias,
+       long AliasLen)
+{
+       const StrBuf *OneDomain;
+       StrBuf *Line;
+       HashPos *It = NULL;
+       const char *Key;
+       long KLen;
+       void *pV;
+       int n;
+
+       It = GetNewHashPos(Domains, 1);
+       n = *nPossibleAliases;
+       while (GetNextHashPos(Domains, It, &KLen, &Key, &pV))
+       {
+               OneDomain = (const StrBuf*) pV;
+               Line = NewStrBuf();
+               StrBufAppendBufPlain(Line, prefix, len, 0);
+               StrBufAppendBufPlain(Line, Alias, AliasLen, 0);
+               StrBufAppendBufPlain(Line, HKEY("@"), 0);
+               StrBufAppendBuf(Line, OneDomain, 0);
+
+               Put(PossibleAliases, 
+                   IKEY(n),
+                   Line, 
+                   HFreeStrBuf);
+               n++;
+       }
+       DeleteHashPos(&It);
+       *nPossibleAliases = n;
+}
+
+HashList *GetThisRoomPossibleMAlias(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+       HashList *Domains;
+       StrBuf *Line;
+       StrBuf *Token;
+       StrBuf *RoomName;
+       HashList *PossibleAliases = NULL;
+       
+       const char *pComma;
+       const char *pAt;
+       long aliaslen;
+       long locallen;
+       long State;
+       long n = 0;
+
+       Domains = GetValidDomainNames(Target, TP);
+       if (Domains == NULL)
+               return NULL;
+       if (GetCount(Domains) == 0) {
+               DeleteHash(&Domains);
+               return NULL;
+       }
+       PossibleAliases = NewHash(1, NULL);
+       Line = NewStrBuf();
+       RoomName = NewStrBufDup(WCC->CurRoom.name);
+       StrBufAsciify(RoomName, '_');
+       StrBufReplaceChars(RoomName, ' ', '_');
+
+       AppendPossibleAliasWithDomain(PossibleAliases,
+                                     &n,
+                                     Domains,
+                                     HKEY("room_"),
+                                     SKEY(RoomName));
+
+
+       serv_puts("GNET "FILE_MAILALIAS);
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, &State) == 1) 
+       {
+               int Done = 0;
+
+               while(!Done && (StrBuf_ServGetln(Line) >= 0))
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000"))
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {
+                               pComma = strchr(ChrPtr(Line), ',');
+                               if (pComma == NULL)
+                                       continue;
+                               aliaslen = pComma - ChrPtr(Line);
+                               locallen = StrLength(Line) - 1 - aliaslen;
+                               if (locallen - 5 != StrLength(WCC->CurRoom.name))
+                                       continue;
+                               if (strncmp(pComma + 1, "room_", 5) != 0)
+                                       continue;
+
+                               if (strcasecmp(pComma + 6, ChrPtr(WCC->CurRoom.name)) != 0)
+                                       continue;
+                               pAt = strchr(ChrPtr(Line), '@');
+                               if ((pAt == NULL) || (pAt > pComma))
+                               {
+                                       AppendPossibleAliasWithDomain(PossibleAliases,
+                                                                     &n,
+                                                                     Domains,
+                                                                     HKEY(""),
+                                                                     ChrPtr(Line),
+                                                                     aliaslen);
+                                       n++;
+                               }
+                               else
+                               {
+                                       
+                                       Token = NewStrBufPlain(ChrPtr(Line), aliaslen);
+                                       Put(PossibleAliases,
+                                           IKEY(n),
+                                           Token,
+                                           HFreeStrBuf);
+                                       n++;
+                               }
+                       }
+       }
+       else if (State == 550)
+               AppendImportantMessage(_("Higher access is required to access this function."), -1);
+       DeleteHash(&Domains);
+       FreeStrBuf(&Line);
+       FreeStrBuf(&RoomName);
+       return PossibleAliases;
+}
+
+
+HashList *GetNetConfigHash(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+       StrBuf *Line;
+       StrBuf *Token;
+       StrBuf *Content;
+       long WantThisOne;
+       long PutTo;
+       long State;
+       
+       WantThisOne = GetTemplateTokenNumber(Target, TP, 5, -1);
+       if ((WantThisOne < 0) || (WantThisOne > maxRoomNetCfg))
+               return NULL;
+       if (WCC->CurRoom.IgnetCfgs[maxRoomNetCfg] == (HashList*) StrBufNOTNULL)
+               return WCC->CurRoom.IgnetCfgs[WantThisOne];
+
+       WCC->CurRoom.IgnetCfgs[maxRoomNetCfg] = (HashList*) StrBufNOTNULL;
+       serv_puts("GNET");
+       Line = NewStrBuf();
+       Token = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, &State) == 1) 
+       {
+               const char *Pos = NULL;
+               int Done = 0;
+               int HaveRoomMailAlias = 0;
+
+               while(!Done && (StrBuf_ServGetln(Line) >= 0))
+               {
+                       if (StrLength(Line) == 0)
+                               continue;
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000"))
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {
+                               StrBufExtract_NextToken(Token, Line, &Pos, '|');
+                               PutTo = GetTokenDefine(SKEY(Token), -1);
+                               if (PutTo == roommailalias)
+                               {
+                                       if (HaveRoomMailAlias > 0)
+                                               continue; /* Only ONE alias possible! */
+                                       HaveRoomMailAlias++;
+                               }
+                               if ((PutTo >= 0) && 
+                                   (PutTo < maxRoomNetCfg) &&
+                                   (Pos != StrBufNOTNULL))
+                               {
+                                       int n;
+                                       HashList *SubH;
+                                       
+                                       if (WCC->CurRoom.IgnetCfgs[PutTo] == NULL)
+                                       {
+                                               n = 0;
+                                               WCC->CurRoom.IgnetCfgs[PutTo] = NewHash(1, NULL);
+                                       }
+                                       else 
+                                       {
+                                               n = GetCount(WCC->CurRoom.IgnetCfgs[PutTo]);
+                                       }
+                                       SubH = NewHash(1, NULL);
+                                       Put(WCC->CurRoom.IgnetCfgs[PutTo], 
+                                           IKEY(n),
+                                           SubH, 
+                                           HDeleteHash);
+                                       n = 1; /* #0 is the type... */
+                                       while (Pos != StrBufNOTNULL) {
+                                               Content = NewStrBuf();
+                                               StrBufExtract_NextToken(Content, Line, &Pos, '|');
+
+                                               if ((PutTo == roommailalias) && n == 1)
+                                                       WCC->CurRoom.RoomAlias = Content;
+
+                                               Put(SubH, 
+                                                   IKEY(n),
+                                                   Content, 
+                                                   HFreeStrBuf);
+                                               n++;
+                                       }
+                               }
+                               Pos = NULL;
+                       }
+               }
+       }
+       else if (State == 550)
+               AppendImportantMessage(_("Higher access is required to access this function."), -1);
+
+       FreeStrBuf(&Line);
+       FreeStrBuf(&Token);
+
+       return WCC->CurRoom.IgnetCfgs[WantThisOne];
+}
+
+/** Unused function that orders rooms by the listorder flag */
+int SortRoomsByListOrder(const void *room1, const void *room2) 
+{
+       folder *r1 = (folder*) GetSearchPayload(room1);
+       folder *r2 = (folder*) GetSearchPayload(room2);
+  
+       if (r1->Order == r2->Order) return 0;
+       if (r1->Order > r2->Order) return 1;
+       return -1;
+}
+
+int CompareRoomListByFloorRoomPrivFirst(const void *room1, const void *room2) 
+{
+       folder *r1 = (folder*) GetSearchPayload(room1);
+       folder *r2 = (folder*) GetSearchPayload(room2);
+  
+       if ((r1->Floor == NULL)  ||
+           (r2->Floor == NULL))
+               return 0;
+               
+       /**
+        * are we on the same floor? else sort by floor.
+        */
+       if (r1->Floor != r2->Floor)
+       {
+               /**
+                * the private rooms are first in any case.
+                */
+               if (r1->Floor->ID == VIRTUAL_MY_FLOOR)
+                       return -1;
+               if (r2->Floor->ID == VIRTUAL_MY_FLOOR)
+                       return 1;
+               /**
+                * else decide alpaheticaly by floorname
+                */
+               return (r1->Floor->AlphaN > r2->Floor->AlphaN)? 1 : -1;
+       }
+
+       /**
+        * if we have different levels of subdirectories, 
+        * we want the toplevel to be first, regardless of sort
+        * sequence.
+        */
+       if (((r1->nRoomNameParts > 1) || 
+           (r2->nRoomNameParts > 1)    )&&
+           (r1->nRoomNameParts != r2->nRoomNameParts))
+       {
+               int i, ret;
+               int nparts = (r1->nRoomNameParts > r2->nRoomNameParts)?
+                       r2->nRoomNameParts : r1->nRoomNameParts;
+
+               for (i=0; i < nparts; i++)
+               {
+                       ret = strcmp (ChrPtr(r1->name), 
+                                     ChrPtr(r2->name));
+                       /**
+                        * Deltas in common parts? exit here.
+                        */
+                       if (ret != 0) 
+                               return ret;
+               }
+
+               /**
+                * who's a subdirectory of whom?
+                */
+               if (r1->nRoomNameParts > r2->nRoomNameParts)
+                       return 1;
+               else
+                       return -1;
+
+       }
+
+       /**
+        * else just sort alphabeticaly.
+        */
+       return strcmp (ChrPtr(r1->name), 
+                      ChrPtr(r2->name));
+}
+
+int CompareRoomListByFloorRoomPrivFirstRev(const void *room1, const void *room2) 
+{
+       folder *r1 = (folder*) GetSearchPayload(room1);
+       folder *r2 = (folder*) GetSearchPayload(room2);
+
+       if ((r1->Floor == NULL)  ||
+           (r2->Floor == NULL))
+               return 0;
+
+       /**
+        * are we on the same floor? else sort by floor.
+        */
+       if (r2->Floor != r1->Floor)
+       {
+               /**
+                * the private rooms are first in any case.
+                */
+               if (r1->Floor->ID == VIRTUAL_MY_FLOOR)
+                       return -1;
+               if (r2->Floor->ID == VIRTUAL_MY_FLOOR)
+                       return 1;
+               /**
+                * else decide alpaheticaly by floorname
+                */
+
+               return (r1->Floor->AlphaN < r2->Floor->AlphaN)? 1 : -1;
+       }
+
+       /**
+        * if we have different levels of subdirectories, 
+        * we want the toplevel to be first, regardless of sort
+        * sequence.
+        */
+       if (((r1->nRoomNameParts > 1) || 
+           (r2->nRoomNameParts > 1)    )&&
+           (r1->nRoomNameParts != r2->nRoomNameParts))
+       {
+               int i, ret;
+               int nparts = (r1->nRoomNameParts > r2->nRoomNameParts)?
+                       r2->nRoomNameParts : r1->nRoomNameParts;
+
+               for (i=0; i < nparts; i++)
+               {
+                       /**
+                        * special cases if one room is top-level...
+                        */
+                       if (r2->nRoomNameParts == 1)
+                               ret = strcmp (ChrPtr(r2->name), 
+                                             ChrPtr(r1->RoomNameParts[i]));
+                       else if (r1->nRoomNameParts == 1)
+                               ret = strcmp (ChrPtr(r2->RoomNameParts[i]),
+                                             ChrPtr(r1->name));
+                       else 
+                               ret = strcmp (ChrPtr(r2->RoomNameParts[i]), 
+                                             ChrPtr(r1->RoomNameParts[i]));
+                       /**
+                        * Deltas in common parts? exit here.
+                        */
+                       if (ret != 0) 
+                               return ret;
+               }
+
+               /**
+                * who's a subdirectory of whom?
+                */
+               if (r1->nRoomNameParts > r2->nRoomNameParts)
+                       return 1;
+               else
+                       return -1;
+       }
+
+       return strcmp (ChrPtr(r2->name), 
+                      ChrPtr(r1->name));
+}
+
+int GroupchangeRoomListByFloorRoomPrivFirst(const void *room1, const void *room2) 
+{
+       folder *r1 = (folder*) room1;
+       folder *r2 = (folder*) room2;
+  
+
+       if ((r1->Floor == NULL)  ||
+           (r2->Floor == NULL))
+               return 0;
+               
+       if (r1->Floor == r2->Floor)
+               return 0;
+       else 
+       {
+               wcsession *WCC = WC;
+               static int columns = 3;
+               int boxes_per_column = 0;
+               int nf;
+
+               nf = GetCount(WCC->Floors);
+               while (nf % columns != 0) ++nf;
+               boxes_per_column = (nf / columns);
+               if (boxes_per_column < 1)
+                       boxes_per_column = 1;
+               if (r1->Floor->AlphaN % boxes_per_column == 0)
+                       return 2;
+               else 
+                       return 1;
+       }
+}
+
+
+int CompareRooms(const folder *room1, const folder *room2) 
+{
+       if ((room1 == NULL) || (room2 == NULL))
+               return -1;
+       return CompareRoomListByFloorRoomPrivFirst(room1, room2);
+}
+
+int ConditionalThisRoomIsStrBufContextAlias(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession       *WCC = WC;
+       const char      *pVal;
+       long             len;
+       eRoomParamType   ParamType;
+
+       ParamType = GetTemplateTokenNumber(Target, TP, 2, eNotSet);
+       GetTemplateTokenString(Target, TP, 3, &pVal, &len);
+
+       if (ParamType == eNotSet)
+       {
+               return StrLength(WCC->CurRoom.RoomAlias) == 0;
+       }
+       else if (ParamType == eDomain)
+       {
+               const StrBuf *CtxStr = (const StrBuf*) CTX(CTX_STRBUF);
+               const char *pAt;
+
+               if (CtxStr == NULL) 
+                       return 0;
+               
+               if (StrLength(WCC->CurRoom.RoomAlias) == 0)
+                       return 0;
+
+               if (strncmp(ChrPtr(WCC->CurRoom.RoomAlias), "room_", 5) != 0)
+                       return 0;
+
+               pAt = strchr(ChrPtr(WCC->CurRoom.RoomAlias), '@');
+               if (pAt == NULL)
+                       return 0;
+               return strcmp(pAt + 1, ChrPtr(CtxStr)) == 0;
+       }
+       else if (ParamType == eAlias)
+       {
+               const StrBuf *CtxStr = (const StrBuf*) CTX(CTX_STRBUF);
+
+               if (CtxStr == NULL) 
+                       return 0;
+               
+               if (StrLength(WCC->CurRoom.RoomAlias) == 0)
+                       return 0;
+
+               return strcmp(ChrPtr(WCC->CurRoom.RoomAlias), ChrPtr(CtxStr)) == 0;
+       }
+       else
+       {
+               LogTemplateError(Target, "TokenParameter", 2, TP, 
+                                "Invalid paramtype; need one of [eNotSet|eDomain|eAlias]");
+               return 0;
+       }
+
+}
+
+int ConditionalRoomIsRESTSubRoom(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession  *WCC = WC;
+       folder     *Folder = (folder *)CTX(CTX_ROOMS);
+       HashPos    *it;
+       StrBuf     * Dir;
+       void       *vDir;
+       long        len;
+        const char *Key;
+       int i, j, urlp;
+       int delta;
+
+
+       /* list only folders relative to the current floor... */
+       if (Folder->Floor != WCC->CurrentFloor)
+               return 0;
+
+       urlp = GetCount(WCC->Directory);
+       delta = Folder->nRoomNameParts - urlp + 1;
+
+       syslog(LOG_DEBUG, "\n->%s: %d - %ld ", 
+              ChrPtr(Folder->name), 
+              urlp, 
+              Folder->nRoomNameParts);
+       /* list only the floors which are in relation to the dav_depth header */
+       if (WCC->Hdr->HR.dav_depth != delta) {
+               syslog(LOG_DEBUG, "1\n");
+               return 0;
+       }
+
+
+       it = GetNewHashPos(WCC->Directory, 0);
+       /* Fast forward the floorname we checked above... */
+       GetNextHashPos(WCC->Directory, it, &len, &Key, &vDir);
+
+       if (Folder->nRoomNameParts > 1) {               
+               for (i = 0, j = 1; 
+                    (i > Folder->nRoomNameParts) && (j > urlp); 
+                    i++, j++)
+               {
+                       if (!GetNextHashPos(WCC->Directory, 
+                                           it, &len, &Key, &vDir) ||
+                           (vDir == NULL))
+                       {
+                               DeleteHashPos(&it);
+
+                               syslog(LOG_DEBUG, "3\n");
+                               return 0;
+                       }
+                       Dir = (StrBuf*) vDir;
+                       if (strcmp(ChrPtr(Folder->RoomNameParts[i]), 
+                                  ChrPtr(Dir)) != 0)
+                       {
+                               DeleteHashPos(&it);
+                               syslog(LOG_DEBUG, "4\n");
+                               return 0;
+                       }
+               }
+               DeleteHashPos(&it);
+               return 1;
+       }
+       else {
+               if (!GetNextHashPos(WCC->Directory, 
+                                   it, &len, &Key, &vDir) ||
+                   (vDir == NULL))
+               {
+                       DeleteHashPos(&it);
+                       
+                       syslog(LOG_DEBUG, "5\n");
+                       return WCC->Hdr->HR.dav_depth == 1;
+               }
+               DeleteHashPos(&it);
+               Dir = (StrBuf*) vDir;
+               if (WCC->Hdr->HR.dav_depth == 0) {
+                       return (strcmp(ChrPtr(Folder->name), 
+                                      ChrPtr(Dir))
+                               == 0);
+
+               }
+               return 0;
+       }
+}
+
+
+void 
+InitModule_ROOMLIST
+(void)
+{
+       /* we duplicate this, just to be shure its already done. */
+       RegisterCTX(CTX_ROOMS);
+       RegisterCTX(CTX_FLOORS);
+
+       RegisterIterator("ITERATE:THISROOM:WHO_KNOWS", 0, NULL, GetWhoKnowsHash, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+       RegisterIterator("ITERATE:THISROOM:GNET", 1, NULL, GetNetConfigHash, NULL, NULL, CTX_STRBUFARR, CTX_NONE, IT_NOFLAG);
+       RegisterIterator("ITERATE:THISROOM:MALIAS", 1, NULL, GetThisRoomMAlias, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+       RegisterIterator("ITERATE:THISROOM:POSSIBLE:MALIAS", 1, NULL, GetThisRoomPossibleMAlias, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+
+       RegisterIterator("LFLR", 0, NULL, GetFloorListHash, NULL, NULL, CTX_FLOORS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
+       RegisterIterator("LKRA", 0, NULL, GetRoomListHashLKRA, NULL, NULL, CTX_ROOMS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
+       RegisterIterator("LZRM", 0, NULL, GetZappedRoomListHash, NULL, DeleteHash, CTX_ROOMS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
+       RegisterIterator("LPRM", 0, NULL, GetRoomListHashLPRM, NULL, DeleteHash, CTX_ROOMS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
+
+
+       REGISTERTokenParamDefine(eNotSet);
+       REGISTERTokenParamDefine(eDomain);
+       REGISTERTokenParamDefine(eAlias);
+
+
+       RegisterConditional("COND:ROOM:REST:ISSUBROOM", 0, ConditionalRoomIsRESTSubRoom, CTX_ROOMS);
+
+       RegisterConditional("COND:THISROOM:ISALIAS:CONTEXTSTR", 0, ConditionalThisRoomIsStrBufContextAlias, CTX_NONE);
+
+       RegisterSortFunc(HKEY("byfloorroom"),
+                        NULL, 0,
+                        CompareRoomListByFloorRoomPrivFirst,
+                        CompareRoomListByFloorRoomPrivFirstRev,
+                        GroupchangeRoomListByFloorRoomPrivFirst,
+                        CTX_ROOMS);
+
+}
diff --git a/webcit/roomops.c b/webcit/roomops.c
new file mode 100644 (file)
index 0000000..9d8699c
--- /dev/null
@@ -0,0 +1,1482 @@
+// Lots of different room-related operations.
+//
+// Copyright (c) 1996-2022 by the citadel.org team
+//
+// This program is open source software.  You can redistribute it and/or
+// modify it under the terms of the GNU General Public License, version 3.
+//
+// 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.
+
+#include "webcit.h"
+#include "webserver.h"
+
+ConstStr QRFlagList[] = {
+       {HKEY(strof(QR_PERMANENT))},
+       {HKEY(strof(QR_INUSE))},
+       {HKEY(strof(QR_PRIVATE))},
+       {HKEY(strof(QR_PASSWORDED))},
+       {HKEY(strof(QR_GUESSNAME))},
+       {HKEY(strof(QR_DIRECTORY))},
+       {HKEY(strof(QR_UPLOAD))},
+       {HKEY(strof(QR_DOWNLOAD))},
+       {HKEY(strof(QR_VISDIR))},
+       {HKEY(strof(QR_ANONONLY))},
+       {HKEY(strof(QR_ANONOPT))},
+       {HKEY(strof(QR_NETWORK))},
+       {HKEY(strof(QR_PREFONLY))},
+       {HKEY(strof(QR_READONLY))},
+       {HKEY(strof(QR_MAILBOX))}
+};
+ConstStr QR2FlagList[] = {
+       {HKEY(strof(QR2_SYSTEM))},
+       {HKEY(strof(QR2_SELFLIST))},
+       {HKEY(strof(QR2_COLLABDEL))},
+       {HKEY(strof(QR2_SUBJECTREQ))},
+       {HKEY(strof(QR2_SMTP_PUBLIC))},
+       {HKEY(strof(QR2_MODERATED))},
+       {HKEY(strof(QR2_NOUPLMSG))}, 
+       {HKEY("")}, 
+       {HKEY("")}, 
+       {HKEY("")}, 
+       {HKEY("")}, 
+       {HKEY("")}, 
+       {HKEY("")}, 
+       {HKEY("")}, 
+       {HKEY("")}
+};
+
+
+void _DBG_QR(long QR) {
+       int i = 1;
+       int j=0;
+       StrBuf *QRVec;
+
+       QRVec = NewStrBufPlain(NULL, 256);
+       while (i != 0) {
+               if ((QR & i) != 0) {
+                       if (StrLength(QRVec) > 0) {
+                               StrBufAppendBufPlain(QRVec, HKEY(" | "), 0);
+                       }
+                       StrBufAppendBufPlain(QRVec, CKEY(QRFlagList[j]), 0);
+               }
+               i = i << 1;
+               j++;
+       }
+       syslog(LOG_DEBUG, "DBG: QR-Vec [%ld] [%s]\n", QR, ChrPtr(QRVec));
+       FreeStrBuf(&QRVec);
+}
+
+
+void _DBG_QR2(long QR2) {
+       int i = 1;
+       int j=0;
+       StrBuf *QR2Vec;
+
+       QR2Vec = NewStrBufPlain(NULL, 256);
+       while (i != 0) {
+               if ((QR2 & i) != 0) {
+                       if (StrLength(QR2Vec) > 0) {
+                               StrBufAppendBufPlain(QR2Vec, HKEY(" | "), 0);
+                       }
+                       StrBufAppendBufPlain(QR2Vec, CKEY(QR2FlagList[j]), 0);
+               }
+               i = i << 1;
+               j++;
+       }
+       syslog(LOG_DEBUG, "DBG: QR2-Vec [%ld] [%s]\n", QR2, ChrPtr(QR2Vec));
+       FreeStrBuf(&QR2Vec);
+}
+
+
+// "GOTO" commands
+
+void dotskip(void) {
+       smart_goto(sbstr("room"));
+}
+
+
+void dotgoto(void) {
+       if (!havebstr("room")) {
+               readloop(readnew, eUseDefault);
+               return;
+       }
+       if (WC->CurRoom.view != VIEW_MAILBOX) {
+               // dotgoto acts like dotskip when we're in a mailbox view
+               slrp_highest();
+       }
+       smart_goto(sbstr("room"));
+}
+
+
+// goto next room
+void smart_goto(const StrBuf *next_room) {
+       if (gotoroom(next_room) / 100 == 2) {
+               readloop(readnew, eUseDefault);
+       }
+       else {
+               do_404();
+       }
+}
+
+
+// goto a private room
+void goto_private(void) {
+       char hold_rm[SIZ];
+       StrBuf *Buf;
+       const StrBuf *gr_name;
+       long err;
+
+       if (!havebstr("ok_button")) {
+               display_main_menu();
+               return;
+       }
+       gr_name = sbstr("gr_name");
+       Buf = NewStrBuf();
+       strcpy(hold_rm, ChrPtr(WC->CurRoom.name));
+       serv_printf("GOTO %s|%s", ChrPtr(gr_name), bstr("gr_pass"));
+       StrBuf_ServGetln(Buf);
+       if  (GetServerStatus(Buf, &err) == 2) {
+               FlushRoomlist();
+               smart_goto(gr_name);
+               FreeStrBuf(&Buf);
+               return;
+       }
+       if (err == 540) {
+               DoTemplate(HKEY("room_display_private"), NULL, &NoCtx);
+               FreeStrBuf(&Buf);
+               return;
+       }
+       StrBufCutLeft(Buf, 4);
+       AppendImportantMessage (SKEY(Buf));
+       Buf = NewStrBufPlain(HKEY("_BASEROOM_"));
+       smart_goto(Buf);
+       FreeStrBuf(&Buf);
+       return;
+}
+
+
+// back end routine to take the session to a new room
+long gotoroom(const StrBuf *gname) {
+       wcsession *WCC = WC;
+       StrBuf *Buf;
+       static long ls = (-1L);
+       long err = 0;
+       int room_name_supplied = 0;
+       int is_baseroom = 0;
+       int failvisibly;
+
+       // on fail, should we fallback to _BASEROOM_?
+       failvisibly = ibstr("failvisibly");
+
+       // store ungoto information
+       if (StrLength(gname) > 0) {
+               room_name_supplied = 1;
+       }
+       if (room_name_supplied) {
+               strcpy(WCC->ugname, ChrPtr(WCC->CurRoom.name));
+               if (!strcasecmp(ChrPtr(gname), "_BASEROOM_")) {
+                       is_baseroom = 1;
+               }
+       }
+       WCC->uglsn = ls;
+       Buf = NewStrBuf();
+
+       // move to the new room
+       if (room_name_supplied) {
+               serv_printf("GOTO %s", ChrPtr(gname));
+       }
+       else {
+               // or just refresh the current state...
+               serv_printf("GOTO 00000000000000000000");
+       }
+       StrBuf_ServGetln(Buf);
+       if  (GetServerStatus(Buf, &err) != 2) {
+               if (failvisibly) {
+                       FreeStrBuf(&Buf);
+                       return err;
+               }
+               serv_puts("GOTO _BASEROOM_");
+               StrBuf_ServGetln(Buf);
+               // well, we know that this is the fallback case, but we're interested that the first command didn't work out in first place.
+               if (GetServerStatus(Buf, NULL) != 2) {
+                       FreeStrBuf(&Buf);
+                       return err;
+               }
+       }
+       FlushFolder(&WCC->CurRoom);
+       ParseGoto(&WCC->CurRoom, Buf);
+
+       if (room_name_supplied) {
+               remove_march(WCC->CurRoom.name);
+               if (is_baseroom) {
+                       remove_march(gname);
+               }
+       }
+       FreeStrBuf(&Buf);
+       return err;
+}
+
+
+void ParseGoto(folder *room, StrBuf *Line) {
+       wcsession *WCC = WC;
+       const char *Pos;
+       int flag;
+       void *vFloor = NULL;
+       StrBuf *pBuf;
+
+       if (StrLength(Line) < 4) {
+               return;
+       }
+       
+       // ignore the command state...
+       Pos = ChrPtr(Line) + 4;
+
+       if (room->RoomNameParts != NULL) {
+               int i;
+               for (i=0; i < room->nRoomNameParts; i++) {
+                       FreeStrBuf(&room->RoomNameParts[i]);
+               }
+               free(room->RoomNameParts);
+               room->RoomNameParts = NULL;
+       }
+
+       pBuf = room->name;  
+       if (pBuf == NULL) {
+               pBuf = NewStrBufPlain(NULL, StrLength(Line));
+       }
+       else {
+               FlushStrBuf(pBuf);
+       }
+       memset(room, 0, sizeof(folder));
+       room->name = pBuf;
+
+       StrBufExtract_NextToken(room->name, Line, &Pos, '|');
+
+       room->nNewMessages = StrBufExtractNext_long(Line, &Pos, '|'); 
+       if (room->nNewMessages > 0) {
+               room->RAFlags |= UA_HASNEWMSGS;
+       }
+
+       room->nTotalMessages = StrBufExtractNext_long(Line, &Pos, '|');
+       room->ShowInfo =  StrBufExtractNext_long(Line, &Pos, '|');
+       room->QRFlags = StrBufExtractNext_long(Line, &Pos, '|');
+       DBG_QR(room->QRFlags);
+       room->HighestRead = StrBufExtractNext_long(Line, &Pos, '|');
+       room->LastMessageRead = StrBufExtractNext_long(Line, &Pos, '|');
+       room->is_inbox = StrBufExtractNext_long(Line, &Pos, '|');
+
+       flag = StrBufExtractNext_long(Line, &Pos, '|');
+       if (WCC->is_aide || flag) {
+               room->RAFlags |= UA_ADMINALLOWED;
+       }
+
+       StrBufExtractNext_long(Line, &Pos, '|');                        // position 9 is unused
+       room->floorid = StrBufExtractNext_int(Line, &Pos, '|');
+       room->view = StrBufExtractNext_long(Line, &Pos, '|');
+       room->defview = StrBufExtractNext_long(Line, &Pos, '|');
+
+       flag = StrBufExtractNext_long(Line, &Pos, '|');
+       if (flag) {
+               room->RAFlags |= UA_ISTRASH;
+       }
+
+       room->QRFlags2 = StrBufExtractNext_long(Line, &Pos, '|');
+       DBG_QR2(room->QRFlags2);
+
+       // find out whether we are in a sub-room
+       room->nRoomNameParts = StrBufNum_tokens(room->name, '\\');
+       if (room->nRoomNameParts > 1) {
+               int i;
+               
+               Pos = NULL;
+               room->RoomNameParts = malloc(sizeof(StrBuf*) * (room->nRoomNameParts + 1));
+               memset(room->RoomNameParts, 0, sizeof(StrBuf*) * (room->nRoomNameParts + 1));
+               for (i=0; i < room->nRoomNameParts; i++) {
+                       room->RoomNameParts[i] = NewStrBuf();
+                       StrBufExtract_NextToken(room->RoomNameParts[i], room->name, &Pos, '\\');
+               }
+       }
+
+       /* Private mailboxes on the main floor get remapped to the personal folder */
+       if ((room->QRFlags & QR_MAILBOX) && (room->floorid == 0)) {
+               room->floorid = VIRTUAL_MY_FLOOR;
+               if ((room->nRoomNameParts == 1) && (StrLength(room->name) == 4) && (strcmp(ChrPtr(room->name), "Mail") == 0)) {
+                       room->is_inbox = 1;
+               }
+               
+       }
+       /* get a pointer to the floor we're on: */
+       if (WCC->Floors == NULL)
+               GetFloorListHash(NULL, NULL);
+
+       GetHash(WCC->Floors, IKEY(room->floorid), &vFloor);
+       room->Floor = (const Floor*) vFloor;
+}
+
+
+/*
+ * Delete the current room
+ */
+void delete_room(void) {
+       StrBuf *Line = NewStrBuf();
+       const StrBuf *GoBstr;
+       
+       GoBstr = sbstr("go");
+
+       if (GoBstr != NULL) {
+               if (gotoroom(GoBstr) == 200) {
+                       serv_puts("KILL 1");
+                       StrBuf_ServGetln(Line);
+                       if (GetServerStatusMsg(Line, NULL, 1, 2) == 2) {
+                               StrBuf *Buf;
+                               
+                               FlushRoomlist ();
+                               Buf = NewStrBufPlain(HKEY("_BASEROOM_"));
+                               smart_goto(Buf);
+                               FreeStrBuf(&Buf);
+                               FreeStrBuf(&Line);
+                               return;
+                       }
+               }
+       }
+       display_main_menu();
+       FreeStrBuf(&Line);
+}
+
+
+// zap a room
+void zap(void) {
+       char buf[SIZ];
+       StrBuf *final_destination;
+
+       // If the forget-room routine fails for any reason, we fall back to the current room; otherwise, we go to the Lobby
+       final_destination = NewStrBufDup(WC->CurRoom.name);
+
+       if (havebstr("ok_button")) {
+               serv_printf("GOTO %s", ChrPtr(WC->CurRoom.name));
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       serv_puts("FORG");
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '2') {
+                               FlushStrBuf(final_destination);
+                               StrBufAppendBufPlain(final_destination, HKEY("_BASEROOM_"), 0);
+                       }
+               }
+               FlushRoomlist ();
+       }
+       smart_goto(final_destination);
+       FreeStrBuf(&final_destination);
+}
+
+
+// mark all messages in current room as having been read
+void slrp_highest(void) {
+       char buf[256];
+
+       serv_puts("SLRP HIGHEST");
+       serv_getln(buf, sizeof buf);
+}
+
+
+// Modify rooms
+
+void LoadRoomAide(void) {
+       wcsession *WCC = WC;
+       StrBuf *Buf;
+       
+       if (WCC->CurRoom.RoomAideLoaded) {
+               return;
+       }
+
+       WCC->CurRoom.RoomAideLoaded = 1;
+       Buf = NewStrBuf();
+       serv_puts("GETA");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 2) {
+               FlushStrBuf(WCC->CurRoom.RoomAide);
+               AppendImportantMessage (ChrPtr(Buf) + 4, StrLength(Buf) - 4);
+       }
+       else {
+               const char *Pos;
+
+               Pos = ChrPtr(Buf) + 4;
+
+               FreeStrBuf(&WCC->CurRoom.RoomAide);
+               WCC->CurRoom.RoomAide = NewStrBufPlain (NULL, StrLength (Buf));
+
+               StrBufExtract_NextToken(WCC->CurRoom.RoomAide, Buf, &Pos, '|'); 
+       }
+       FreeStrBuf (&Buf);
+}
+
+
+int SaveRoomAide(folder *Room) {
+       StrBuf *Buf;
+       Buf = NewStrBuf ();
+       serv_printf("SETA %s", ChrPtr(Room->RoomAide));
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 2) {
+               StrBufCutLeft(Buf, 4);
+               AppendImportantMessage (SKEY(Buf));
+               FreeStrBuf(&Buf);
+               return 0;
+       }
+       FreeStrBuf(&Buf);
+       return 1;
+}
+
+
+int GetCurrentRoomFlags(folder *Room, int CareForStatusMessage) {
+       StrBuf *Buf;
+
+       Buf = NewStrBuf();
+       serv_puts("GETR");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 2) {
+               FlushStrBuf(Room->XAPass);
+               FlushStrBuf(Room->Directory);
+               StrBufCutLeft(Buf, 4);
+               if (CareForStatusMessage)
+                       AppendImportantMessage (SKEY(Buf));
+               FreeStrBuf(&Buf);
+               Room->XALoaded = 2;
+               return 0;
+       }
+       else {
+               const char *Pos;
+
+               Pos = ChrPtr(Buf) + 4;
+
+               FreeStrBuf(&Room->XAPass);
+               FreeStrBuf(&Room->Directory);
+
+               Room->XAPass = NewStrBufPlain (NULL, StrLength (Buf));
+               Room->Directory = NewStrBufPlain (NULL, StrLength (Buf));
+
+               FreeStrBuf(&Room->name);
+               Room->name = NewStrBufPlain(NULL, StrLength(Buf));
+               StrBufExtract_NextToken(Room->name, Buf, &Pos, '|'); 
+                                       
+               StrBufExtract_NextToken(Room->XAPass, Buf, &Pos, '|'); 
+               StrBufExtract_NextToken(Room->Directory, Buf, &Pos, '|'); 
+               
+               Room->QRFlags = StrBufExtractNext_long(Buf, &Pos, '|');
+               Room->floorid = StrBufExtractNext_long(Buf, &Pos, '|');
+               Room->Order = StrBufExtractNext_long(Buf, &Pos, '|');
+               Room->defview = StrBufExtractNext_long(Buf, &Pos, '|');
+               Room->QRFlags2 = StrBufExtractNext_long(Buf, &Pos, '|');
+               FreeStrBuf (&Buf);
+               Room->XALoaded = 1;
+               return 1;
+       }
+}
+
+
+int SetCurrentRoomFlags(folder *Room) {
+       StrBuf *Buf;
+
+       Buf = NewStrBuf();
+       DBG_QR(Room->QRFlags);
+       DBG_QR2(Room->QRFlags2);
+
+       serv_printf("SETR %s|%s|%s|%ld|%d|%d|%ld|%ld|%ld",
+                   ChrPtr(Room->name),
+                   ChrPtr(Room->XAPass),
+                   ChrPtr(Room->Directory),
+                   Room->QRFlags, 
+                   Room->BumpUsers,
+                   Room->floorid, 
+                   Room->Order,
+                   Room->defview,
+                   Room->QRFlags2);
+
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 2) {
+               StrBufCutLeft(Buf, 4);
+               AppendImportantMessage (SKEY(Buf));
+               FreeStrBuf(&Buf);
+               return 0;
+       } else {
+               FreeStrBuf(&Buf);
+               return 1;
+       }
+}
+
+
+void LoadRoomXA (void) {
+       wcsession *WCC = WC;
+               
+       if (WCC->CurRoom.XALoaded > 0)
+               return;
+
+       GetCurrentRoomFlags(&WCC->CurRoom, 0);
+}
+
+
+void LoadXRoomPic(void) {
+       wcsession *WCC = WC;
+       StrBuf *Buf;
+       off_t bytes;
+       
+       if (WCC->CurRoom.XHaveRoomPicLoaded) {
+               return;
+       }
+
+       WCC->CurRoom.XHaveRoomPicLoaded = 1;
+       Buf = NewStrBuf();
+       serv_puts("DLRI");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 6) {
+               StrBufCutLeft(Buf, 4);
+               bytes = StrBufExtract_long(Buf, 0, '|');
+               WCC->CurRoom.XHaveRoomPic = 1;
+               StrBuf_ServGetBLOBBuffered(Buf, bytes);         // discard the data
+       }
+       else {
+               WCC->CurRoom.XHaveRoomPic = 0;
+       }
+       FreeStrBuf (&Buf);
+}
+
+
+void LoadXRoomInfoText(void) {
+       wcsession *WCC = WC;
+       StrBuf *Buf;
+       int Done = 0;
+       
+       if (WCC->CurRoom.XHaveInfoTextLoaded) {
+               return;
+       }
+
+       WCC->CurRoom.XHaveInfoTextLoaded = 1;
+       Buf = NewStrBuf();
+
+       serv_puts("RINF");
+
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 1) {
+               WCC->CurRoom.XInfoText = NewStrBuf ();
+               
+               while (!Done && StrBuf_ServGetln(Buf)>=0) {
+                       if ( (StrLength(Buf)==3) && 
+                            !strcmp(ChrPtr(Buf), "000")) 
+                               Done = 1;
+                       else 
+                               StrBufAppendBuf(WCC->CurRoom.XInfoText, Buf, 0);
+               }
+       }
+
+       FreeStrBuf(&Buf);
+}
+
+
+void LoadXRoomXCountFiles(void) {
+       wcsession *WCC = WC;
+       StrBuf *Buf;
+       int Done = 0;
+       
+       if (WCC->CurRoom.XHaveDownloadCount) {
+               return;
+       }
+
+       WCC->CurRoom.XHaveDownloadCount = 1;
+       Buf = NewStrBuf();
+       serv_puts("RDIR");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 1) {
+               
+               while (!Done && StrBuf_ServGetln(Buf)>=0) {
+                       if ( (StrLength(Buf)==3) && 
+                            !strcmp(ChrPtr(Buf), "000")) 
+                               Done = 1;
+                       else 
+                               WCC->CurRoom.XDownloadCount++;
+               }
+       }
+
+       FreeStrBuf (&Buf);
+}
+
+
+// Toggle self-service list subscription
+void toggle_self_service(void) {
+       wcsession *WCC = WC;
+
+       if (GetCurrentRoomFlags (&WCC->CurRoom, 1) == 0)
+               return;
+
+       if (yesbstr("QR2_SelfList")) 
+               WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 | QR2_SELFLIST;
+       else 
+               WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 & ~QR2_SELFLIST;
+
+       if (yesbstr("QR2_SMTP_PUBLIC")) 
+               WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 | QR2_SMTP_PUBLIC;
+       else
+               WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 & ~QR2_SMTP_PUBLIC;
+
+       if (yesbstr("QR2_Moderated")) 
+               WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 | QR2_MODERATED;
+       else
+               WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 & ~QR2_MODERATED;
+       if (yesbstr("QR2_SubsOnly")) 
+               WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 | QR2_SMTP_PUBLIC;
+       else
+               WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 & ~QR2_SMTP_PUBLIC;
+
+       SetCurrentRoomFlags (&WCC->CurRoom);
+
+       output_headers(1, 1, 1, 0, 0, 0);       
+       do_template("room_edit");
+       wDumpContent(1);
+}
+
+
+// save new parameters for a room
+void editroom(void) {
+       wcsession *WCC = WC;
+       const StrBuf *Ptr;
+       const StrBuf *er_name;
+       const StrBuf *er_password;
+       const StrBuf *er_dirname;
+       const StrBuf *er_roomaide;
+       const StrBuf *templ;
+       int succ1, succ2;
+
+       templ = sbstr("template");
+       if (!havebstr("ok_button")) {
+               putlbstr("success", 0);
+               AppendImportantMessage(_("Cancelled.  Changes were not saved."), -1);
+               if (templ != NULL) {
+                       output_headers(1, 0, 0, 0, 0, 0);       
+                       DoTemplate(SKEY(templ), NULL, &NoCtx);
+                       end_burst();
+               }
+               else {
+                       output_headers(1, 1, 1, 0, 0, 0);       
+                       do_template("room_edit");
+                       wDumpContent(1);
+               }
+               return;
+       }
+
+       if (GetCurrentRoomFlags (&WCC->CurRoom, 1) == 0) {
+               putlbstr("success", 0);
+               if (templ != NULL) {
+                       output_headers(1, 0, 0, 0, 0, 0);       
+                       DoTemplate(SKEY(templ), NULL, &NoCtx);
+                       end_burst();
+               }
+               else {
+                       output_headers(1, 1, 1, 0, 0, 0);       
+                       do_template("room_edit");
+                       wDumpContent(1);
+               }
+               return;
+       }
+
+       LoadRoomAide();
+       WCC->CurRoom.QRFlags &= !(QR_PRIVATE | QR_PASSWORDED | QR_GUESSNAME);
+
+       Ptr = sbstr("type");
+       if (!strcmp(ChrPtr(Ptr), "invonly")) {
+               WCC->CurRoom.QRFlags |= (QR_PRIVATE);
+       }
+       if (!strcmp(ChrPtr(Ptr), "hidden")) {
+               WCC->CurRoom.QRFlags |= (QR_PRIVATE | QR_GUESSNAME);
+       }
+       if (!strcmp(ChrPtr(Ptr), "passworded")) {
+               WCC->CurRoom.QRFlags |= (QR_PRIVATE | QR_PASSWORDED);
+       }
+       if (!strcmp(ChrPtr(Ptr), "personal")) {
+               WCC->CurRoom.QRFlags |= QR_MAILBOX;
+       }
+       else {
+               WCC->CurRoom.QRFlags &= ~QR_MAILBOX;
+       }
+
+       if (yesbstr("prefonly")) {
+               WCC->CurRoom.QRFlags |= QR_PREFONLY;
+       }
+       else {
+               WCC->CurRoom.QRFlags &= ~QR_PREFONLY;
+       }
+
+       if (yesbstr("readonly")) {
+               WCC->CurRoom.QRFlags |= QR_READONLY;
+       }
+       else {
+               WCC->CurRoom.QRFlags &= ~QR_READONLY;
+       }
+
+       if (yesbstr("collabdel")) {
+               WCC->CurRoom.QRFlags2 |= QR2_COLLABDEL;
+       }
+       else {
+               WCC->CurRoom.QRFlags2 &= ~QR2_COLLABDEL;
+       }
+
+       if (yesbstr("permanent")) {
+               WCC->CurRoom.QRFlags |= QR_PERMANENT;
+       }
+       else {
+               WCC->CurRoom.QRFlags &= ~QR_PERMANENT;
+       }
+
+       if (yesbstr("subjectreq")) {
+               WCC->CurRoom.QRFlags2 |= QR2_SUBJECTREQ;
+       }
+       else {
+               WCC->CurRoom.QRFlags2 &= ~QR2_SUBJECTREQ;
+       }
+
+       if (yesbstr("network")) {
+               WCC->CurRoom.QRFlags |= QR_NETWORK;
+       }
+       else {
+               WCC->CurRoom.QRFlags &= ~QR_NETWORK;
+       }
+
+       if (yesbstr("directory")) {
+               WCC->CurRoom.QRFlags |= QR_DIRECTORY;
+       }
+       else {
+               WCC->CurRoom.QRFlags &= ~QR_DIRECTORY;
+       }
+
+       if (yesbstr("ulallowed")) {
+               WCC->CurRoom.QRFlags |= QR_UPLOAD;
+       }
+       else {
+               WCC->CurRoom.QRFlags &= ~QR_UPLOAD;
+       }
+
+       if (yesbstr("dlallowed")) {
+               WCC->CurRoom.QRFlags |= QR_DOWNLOAD;
+       }
+       else {
+               WCC->CurRoom.QRFlags &= ~QR_DOWNLOAD;
+       }
+
+       if (yesbstr("ulmsg")) {
+               WCC->CurRoom.QRFlags2 |= QR2_NOUPLMSG;
+       }
+       else {
+               WCC->CurRoom.QRFlags2 &= ~QR2_NOUPLMSG;
+       }
+
+       if (yesbstr("visdir")) {
+               WCC->CurRoom.QRFlags |= QR_VISDIR;
+       }
+       else {
+               WCC->CurRoom.QRFlags &= ~QR_VISDIR;
+       }
+
+       Ptr = sbstr("anon");
+
+       WCC->CurRoom.QRFlags &= ~(QR_ANONONLY | QR_ANONOPT);
+       if (!strcmp(ChrPtr(Ptr), "anononly"))
+               WCC->CurRoom.QRFlags |= QR_ANONONLY;
+       if (!strcmp(ChrPtr(Ptr), "anon2"))
+               WCC->CurRoom.QRFlags |= QR_ANONOPT;
+
+       er_name     = sbstr("er_name");
+       er_dirname  = sbstr("er_dirname");
+       er_roomaide = sbstr("er_roomaide");
+       er_password = sbstr("er_password");
+
+       FlushStrBuf(WCC->CurRoom.name);
+       StrBufAppendBuf(WCC->CurRoom.name, er_name, 0);
+
+       FlushStrBuf(WCC->CurRoom.Directory);
+       StrBufAppendBuf(WCC->CurRoom.Directory, er_dirname, 0);
+
+       FlushStrBuf(WCC->CurRoom.RoomAide);
+       StrBufAppendBuf(WCC->CurRoom.RoomAide, er_roomaide, 0);
+
+       FlushStrBuf(WCC->CurRoom.XAPass);
+       StrBufAppendBuf(WCC->CurRoom.XAPass, er_password, 0);
+
+       WCC->CurRoom.BumpUsers = yesbstr("bump");
+
+       WCC->CurRoom.floorid = ibstr("er_floor");
+
+       succ1 = SetCurrentRoomFlags(&WCC->CurRoom);
+
+       succ2 = SaveRoomAide (&WCC->CurRoom);
+       
+       if (succ1 + succ2 == 0) {
+               putlbstr("success", 1);
+               AppendImportantMessage (_("Your changes have been saved."), -1);
+       }
+       else {
+               putlbstr("success", 0);
+       }
+       if (templ != NULL) {
+               output_headers(1, 0, 0, 0, 0, 0);       
+               DoTemplate(SKEY(templ), NULL, &NoCtx);
+               end_burst();
+       }
+       else {
+               output_headers(1, 1, 1, 0, 0, 0);       
+               do_template("room_edit");
+               wDumpContent(1);
+       }
+       return;
+}
+
+
+// Display form for Invite, Kick, and show Who Knows a room
+void do_invt_kick(void) {
+       StrBuf *Buf, *User;
+       const StrBuf *UserNames;
+       int Kick, Invite;
+       wcsession *WCC = WC;
+
+       if (GetCurrentRoomFlags(&WCC->CurRoom, 1) == 1) {
+               const char *Pos;
+               UserNames = sbstr("username");
+               Kick = havebstr("kick_button");
+               Invite = havebstr("invite_button");
+
+               User = NewStrBufPlain(NULL, StrLength(UserNames));
+               Buf = NewStrBuf();
+               
+               Pos = ChrPtr(UserNames);
+               while (Pos != StrBufNOTNULL) {
+                       StrBufExtract_NextToken(User, UserNames, &Pos, ',');
+                       StrBufTrim(User);
+                       if ((StrLength(User) > 0) && (Kick)) {
+                               serv_printf("KICK %s", ChrPtr(User));
+                               if (StrBuf_ServGetln(Buf) < 0)
+                                       break;
+                               if (GetServerStatus(Buf, NULL) != 2) {
+                                       StrBufCutLeft(Buf, 4);
+                                       AppendImportantMessage(SKEY(Buf));
+                               }
+                               else {
+                                       StrBufPrintf(Buf, _("User '%s' kicked out of room '%s'."), ChrPtr(User), ChrPtr(WCC->CurRoom.name));
+                                       AppendImportantMessage(SKEY(Buf));
+                               }
+                       }
+                       else if ((StrLength(User) > 0) && (Invite)) {
+                               serv_printf("INVT %s", ChrPtr(User));
+                               if (StrBuf_ServGetln(Buf) < 0)
+                                       break;
+                               if (GetServerStatus(Buf, NULL) != 2) {
+                                       StrBufCutLeft(Buf, 4);
+                                       AppendImportantMessage(SKEY(Buf));
+                               }
+                               else {
+                                       StrBufPrintf(Buf, _("User '%s' invited to room '%s'."), ChrPtr(User), ChrPtr(WCC->CurRoom.name));
+                                       AppendImportantMessage(SKEY(Buf));
+                               }
+                       }
+                }
+        }
+
+       output_headers(1, 1, 1, 0, 0, 0);       
+       do_template("room_edit");
+       wDumpContent(1);
+}
+
+
+/*
+ * Create a new room
+ */
+void entroom(void) {
+       StrBuf *Line;
+       const StrBuf *er_name;
+       const StrBuf *er_type;
+       const StrBuf *er_password;
+       const StrBuf *template;
+       int er_floor;
+       int er_num_type;
+       int er_view;
+       wcsession *WCC = WC;
+
+       template = sbstr("template");
+       if ((WCC == NULL) || !havebstr("ok_button")) {
+               putlbstr("success", 0);
+               AppendImportantMessage(_("Cancelled.  No new room was created."), -1);
+               if (template != NULL) {
+                       output_headers(1, 0, 0, 0, 0, 0);       
+                       DoTemplate(SKEY(template), NULL, &NoCtx);
+                       end_burst();
+               }
+               else {
+                       display_main_menu();
+               }
+               return;
+       }
+       er_name = sbstr("er_name");
+       er_type = sbstr("type");
+       er_password = sbstr("er_password");
+       er_floor = ibstr("er_floor");
+       er_view = ibstr("er_view");
+
+       er_num_type = 0;
+       if (!strcmp(ChrPtr(er_type), "hidden"))
+               er_num_type = 1;
+       else if (!strcmp(ChrPtr(er_type), "passworded"))
+               er_num_type = 2;
+       else if (!strcmp(ChrPtr(er_type), "invonly"))
+               er_num_type = 3;
+       else if (!strcmp(ChrPtr(er_type), "personal"))
+               er_num_type = 4;
+
+       serv_printf("CRE8 1|%s|%d|%s|%d|%d|%d", 
+                   ChrPtr(er_name), 
+                   er_num_type, 
+                   ChrPtr(er_password), 
+                   er_floor, 
+                   0, 
+                   er_view);
+
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatusMsg(Line, NULL, 1, 2) != 2) {
+               putlbstr("success", 0);
+               FreeStrBuf(&Line);
+               if (template != NULL) {
+                       output_headers(1, 0, 0, 0, 0, 0);       
+                       DoTemplate(SKEY(template), NULL, &NoCtx);
+                       end_burst();
+               }
+               else {
+                       display_main_menu();
+               }
+               return;
+       }
+       /** TODO: Room created, now update the left hand icon bar for this user */
+       gotoroom(er_name);
+
+       serv_printf("VIEW %d", er_view);
+       StrBuf_ServGetln(Line);
+       FreeStrBuf(&Line); /* TODO: should we care about errors? */
+       WCC->CurRoom.view = er_view;
+
+       putlbstr("success", 1);
+       if (template != NULL) {
+               output_headers(1, 0, 0, 0, 0, 0);       
+               DoTemplate(SKEY(template), NULL, &NoCtx);
+               end_burst();
+       }
+       else if ( (WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) {
+               output_headers(1, 1, 1, 0, 0, 0);       
+               do_template("room_edit");
+               wDumpContent(1);
+       }
+       else {
+               smart_goto(WCC->CurRoom.name);
+       }
+       FreeStrBuf(&Line);
+}
+
+
+// Change the view for this room
+void change_view(void) {
+       int newview;
+       char buf[SIZ];
+
+       newview = lbstr("view");
+       serv_printf("VIEW %d", newview);
+       serv_getln(buf, sizeof buf);
+       WC->CurRoom.view = newview;
+       smart_goto(WC->CurRoom.name);
+}
+
+
+/*
+ * Set the message expire policy for this room and/or floor
+ */
+void set_room_policy(void) {
+       StrBuf *Line;
+
+       if (!havebstr("ok_button")) {
+               AppendImportantMessage(_("Cancelled.  Changes were not saved."), -1);
+               output_headers(1, 1, 1, 0, 0, 0);       
+               do_template("room_edit");
+               wDumpContent(1);
+               return;
+       }
+
+       Line = NewStrBuf();
+
+       serv_printf("SPEX room|%d|%d", ibstr("roompolicy"), ibstr("roomvalue"));
+       StrBuf_ServGetln(Line);
+       GetServerStatusMsg(Line, NULL, 1, 0);
+       if (WC->axlevel >= 6) {
+               serv_printf("SPEX floor|%d|%d", ibstr("floorpolicy"), ibstr("floorvalue"));
+               StrBuf_ServGetln(Line);
+               GetServerStatusMsg(Line, NULL, 1, 0);
+       }
+       FreeStrBuf(&Line);
+       ReloadCurrentRoom();
+
+       output_headers(1, 1, 1, 0, 0, 0);       
+       do_template("room_edit");
+       wDumpContent(1);
+}
+
+
+
+/*
+ * Perform changes to a room's network configuration
+ */
+void netedit(void) {
+       char buf[SIZ];
+       char line[SIZ];
+       char cmpa0[SIZ];
+       char cmpa1[SIZ];
+       char cmpb0[SIZ];
+       char cmpb1[SIZ];
+       int i, num_addrs;
+       StrBuf *Line;
+       StrBuf *TmpBuf;
+       int malias = 0;
+       int malias_set_default = 0;
+       char sepchar = '|';
+       int Done;
+
+       line[0] = '\0';
+        if (havebstr("force_room")) {
+                gotoroom(sbstr("force_room"));
+       }
+       /*/ TODO: do line dynamic! */
+       if (havebstr("line_pop3host")) {
+               strcpy(line, bstr("prefix"));
+               strcat(line, bstr("line_pop3host"));
+               strcat(line, "|");
+               strcat(line, bstr("line_pop3user"));
+               strcat(line, "|");
+               strcat(line, bstr("line_pop3pass"));
+               strcat(line, "|");
+               strcat(line, ibstr("line_pop3keep") ? "1" : "0" );
+               strcat(line, "|");
+               sprintf(&line[strlen(line)],"%ld", lbstr("line_pop3int"));
+               strcat(line, bstr("suffix"));
+       }
+       else if (havebstr("line")) {
+               strcpy(line, bstr("prefix"));
+               strcat(line, bstr("line"));
+               strcat(line, bstr("suffix"));
+       }
+       else if (havebstr("alias")) {
+               const char *domain;
+               domain = bstr("aliasdomain");
+               if ((domain == NULL) || IsEmptyStr(domain))
+               {
+                       malias_set_default = 1;
+                       strcpy(line, bstr("prefix"));
+                       strcat(line, bstr("default_aliasdomain"));
+               }
+               else
+               {
+                       malias = 1;
+                       sepchar = ',';
+                       strcat(line, bstr("prefix"));
+                       if (!IsEmptyStr(domain))
+                       {
+                               strcat(line, "@");
+                               strcat(line, domain);
+                       }
+                       strcat(line, ",");
+                       strcat(line, "room_");
+                       strcat(line, ChrPtr(WC->CurRoom.name));
+               }
+       }
+       else {
+               output_headers(1, 1, 1, 0, 0, 0);       
+               do_template("room_edit");
+               wDumpContent(1);
+               return;
+       }
+
+       Line = NewStrBuf();
+       TmpBuf = NewStrBuf();
+       if (malias)
+               serv_puts("GNET "FILE_MAILALIAS);
+       else
+               serv_puts("GNET");
+       StrBuf_ServGetln(Line);
+       if  (GetServerStatus(Line, NULL) != 1) {
+               AppendImportantMessage(SRV_STATUS_MSG(Line));   
+               FreeStrBuf(&Line);
+               output_headers(1, 1, 1, 0, 0, 0);       
+               do_template("room_edit");
+               wDumpContent(1);
+               return;
+       }
+
+       /** This loop works for add *or* remove.  Spiffy, eh? */
+       Done = 0;
+       extract_token(cmpb0, line, 0, sepchar, sizeof cmpb0);
+       extract_token(cmpb1, line, 1, sepchar, sizeof cmpb1);
+       while (!Done && StrBuf_ServGetln(Line)>=0) {
+               if ( (StrLength(Line)==3) && 
+                    !strcmp(ChrPtr(Line), "000")) 
+               {
+                       Done = 1;
+               }
+               else
+               {
+                       if (StrLength(Line) == 0)
+                               continue;
+
+                       if (malias_set_default)
+                       {
+                               if (strncasecmp(ChrPtr(Line), HKEY("roommailalias|")) != 0)
+                               {
+                                       StrBufAppendBufPlain(Line, HKEY("\n"), 0);
+                                       StrBufAppendBuf(TmpBuf, Line, 0);
+                               }
+                       }
+                       else
+                       {
+                               extract_token(cmpa0, ChrPtr(Line), 0, sepchar, sizeof cmpa0);
+                               extract_token(cmpa1, ChrPtr(Line), 1, sepchar, sizeof cmpa1);
+                               if ( (strcasecmp(cmpa0, cmpb0)) || (strcasecmp(cmpa1, cmpb1)) )
+                               {
+                                       StrBufAppendBufPlain(Line, HKEY("\n"), 0);
+                                       StrBufAppendBuf(TmpBuf, Line, 0);
+                               }
+                       }
+               }
+       }
+
+       if (malias)
+               serv_puts("SNET "FILE_MAILALIAS);
+       else
+               serv_puts("SNET");
+       StrBuf_ServGetln(Line);
+       if  (GetServerStatus(Line, NULL) != 4) {
+
+               AppendImportantMessage(SRV_STATUS_MSG(Line));   
+               output_headers(1, 1, 1, 0, 0, 0);       
+               do_template("room_edit");
+               wDumpContent(1);
+               FreeStrBuf(&Line);
+               FreeStrBuf(&TmpBuf);
+               return;
+       }
+
+       serv_putbuf(TmpBuf);
+       FreeStrBuf(&TmpBuf);
+
+       if (havebstr("add_button")) {
+               num_addrs = num_tokens(bstr("line"), ',');
+               if (num_addrs < 2) {
+                       /* just adding one node or address */
+                       serv_puts(line);
+               }
+               else {
+                       /* adding multiple addresses separated by commas */
+                       for (i=0; i<num_addrs; ++i) {
+                               strcpy(line, bstr("prefix"));
+                               extract_token(buf, bstr("line"), i, ',', sizeof buf);
+                               string_trim(buf);
+                               strcat(line, buf);
+                               strcat(line, bstr("suffix"));
+                               serv_puts(line);
+                       }
+               }
+       }
+
+       serv_puts("000");
+       serv_puts("NOOP");
+       StrBuf_ServGetln(Line);
+       if  (GetServerStatus(Line, NULL) != 2) { /* WHOOOPS? ERROR? */
+               AppendImportantMessage(SRV_STATUS_MSG(Line));   
+               StrBuf_ServGetln(Line); /* resync... */
+       }
+
+
+       FlushIgnetCfgs(&WC->CurRoom);
+       FreeStrBuf(&Line);
+
+       output_headers(1, 1, 1, 0, 0, 0);       
+       do_template("room_edit");
+       wDumpContent(1);
+}
+
+/*
+ * Known rooms list (box style)
+ */
+void knrooms(void)
+{
+       DeleteHash(&WC->Rooms);
+       output_headers(1, 1, 1, 0, 0, 0); 
+       do_template("knrooms");
+       wDumpContent(1);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*******************************************************************************
+ ********************** FLOOR Coomands *****************************************
+ ******************************************************************************/
+
+
+
+/*
+ * delete the actual floor
+ */
+void delete_floor(void) {
+       int floornum;
+       StrBuf *Buf;
+       const char *Err;
+               
+       floornum = ibstr("floornum");
+       Buf = NewStrBuf();
+       serv_printf("KFLR %d|1", floornum);
+       
+       StrBufTCP_read_line(Buf, &WC->serv_sock, 0, &Err);
+
+       if (GetServerStatus(Buf, NULL) == 2) {
+               StrBufPlain(Buf, _("Floor has been deleted."),-1);
+       }
+       else {
+               StrBufCutLeft(Buf, 4);
+       }
+       AppendImportantMessage (SKEY(Buf));
+
+       FlushRoomlist();
+       http_transmit_thing(ChrPtr(do_template("floors")), 0);
+       FreeStrBuf(&Buf);
+}
+
+/*
+ * start creating a new floor
+ */
+void create_floor(void) {
+       StrBuf *Buf;
+       const char *Err;
+
+       Buf = NewStrBuf();
+       serv_printf("CFLR %s|1", bstr("floorname"));
+       StrBufTCP_read_line(Buf, &WC->serv_sock, 0, &Err);
+
+       if (GetServerStatus(Buf, NULL) == 2) {
+               StrBufPlain(Buf, _("New floor has been created."),-1);
+       }
+       else {
+               StrBufCutLeft(Buf, 4);
+       }
+       AppendImportantMessage (SKEY(Buf));
+       FlushRoomlist();
+       http_transmit_thing(ChrPtr(do_template("floors")), 0);
+       FreeStrBuf(&Buf);
+}
+
+
+/*
+ * rename this floor
+ */
+void rename_floor(void) {
+       StrBuf *Buf;
+
+       Buf = NewStrBuf();
+       FlushRoomlist();
+
+       serv_printf("EFLR %d|%s", ibstr("floornum"), bstr("floorname"));
+       StrBuf_ServGetln(Buf);
+
+       StrBufCutLeft(Buf, 4);
+       AppendImportantMessage (SKEY(Buf));
+
+       http_transmit_thing(ChrPtr(do_template("floors")), 0);
+       FreeStrBuf(&Buf);
+}
+
+
+
+void jsonRoomFlr(void) 
+{
+       /* Send as our own (application/json) content type */
+       hprintf("HTTP/1.1 200 OK\r\n");
+       hprintf("Content-type: application/json; charset=utf-8\r\n");
+       hprintf("Server: %s / %s\r\n", PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software));
+       hprintf("Connection: close\r\n");
+       hprintf("Pragma: no-cache\r\nCache-Control: no-store\r\nExpires:-1\r\n");
+       begin_burst();
+       DoTemplate(HKEY("json_roomflr"),NULL,&NoCtx);
+       end_burst(); 
+}
+
+void _FlushRoomList(wcsession *WCC)
+{
+       free_march_list(WCC);
+       DeleteHash(&WCC->Floors);
+       DeleteHash(&WCC->Rooms);
+       DeleteHash(&WCC->FloorsByName);
+       FlushFolder(&WCC->CurRoom);
+}
+
+void ReloadCurrentRoom(void)
+{
+       wcsession *WCC = WC;
+       StrBuf *CurRoom;
+
+       CurRoom = WCC->CurRoom.name;
+       WCC->CurRoom.name = NULL;
+       _FlushRoomList(WCC);
+       gotoroom(CurRoom);
+       FreeStrBuf(&CurRoom);
+}
+
+void FlushRoomlist(void)
+{
+       wcsession *WCC = WC;
+       _FlushRoomList(WCC);
+}
+
+
+void 
+InitModule_ROOMOPS
+(void)
+{
+       RegisterPreference("roomlistview",
+                           _("Room list view"),
+                           PRF_STRING,
+                           NULL);
+        RegisterPreference("emptyfloors", _("Show empty floors"), PRF_YESNO, NULL);
+
+       WebcitAddUrlHandler(HKEY("json_roomflr"), "", 0, jsonRoomFlr, 0);
+
+       WebcitAddUrlHandler(HKEY("delete_floor"), "", 0, delete_floor, 0);
+       WebcitAddUrlHandler(HKEY("rename_floor"), "", 0, rename_floor, 0);
+       WebcitAddUrlHandler(HKEY("create_floor"), "", 0, create_floor, 0);
+
+       WebcitAddUrlHandler(HKEY("knrooms"), "", 0, knrooms, ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("dotgoto"), "", 0, dotgoto, NEED_URL);
+       WebcitAddUrlHandler(HKEY("dotskip"), "", 0, dotskip, NEED_URL);
+
+       WebcitAddUrlHandler(HKEY("goto_private"), "", 0, goto_private, NEED_URL);
+       WebcitAddUrlHandler(HKEY("zap"), "", 0, zap, 0);
+       WebcitAddUrlHandler(HKEY("entroom"), "", 0, entroom, 0);
+       WebcitAddUrlHandler(HKEY("do_invt_kick"), "", 0, do_invt_kick, 0);
+       
+       WebcitAddUrlHandler(HKEY("netedit"), "", 0, netedit, 0);
+       WebcitAddUrlHandler(HKEY("editroom"), "", 0, editroom, 0);
+       WebcitAddUrlHandler(HKEY("delete_room"), "", 0, delete_room, 0);
+       WebcitAddUrlHandler(HKEY("set_room_policy"), "", 0, set_room_policy, 0);
+       WebcitAddUrlHandler(HKEY("changeview"), "", 0, change_view, 0);
+       WebcitAddUrlHandler(HKEY("toggle_self_service"), "", 0, toggle_self_service, 0);
+
+
+       REGISTERTokenParamDefine(QR_PERMANENT);
+       REGISTERTokenParamDefine(QR_INUSE);
+       REGISTERTokenParamDefine(QR_PRIVATE);
+       REGISTERTokenParamDefine(QR_PASSWORDED);
+       REGISTERTokenParamDefine(QR_GUESSNAME);
+       REGISTERTokenParamDefine(QR_DIRECTORY);
+       REGISTERTokenParamDefine(QR_UPLOAD);
+       REGISTERTokenParamDefine(QR_DOWNLOAD);
+       REGISTERTokenParamDefine(QR_VISDIR);
+       REGISTERTokenParamDefine(QR_ANONONLY);
+       REGISTERTokenParamDefine(QR_ANONOPT);
+       REGISTERTokenParamDefine(QR_NETWORK);
+       REGISTERTokenParamDefine(QR_PREFONLY);
+       REGISTERTokenParamDefine(QR_READONLY);
+       REGISTERTokenParamDefine(QR_MAILBOX);
+       REGISTERTokenParamDefine(QR2_SYSTEM);
+       REGISTERTokenParamDefine(QR2_SELFLIST);
+       REGISTERTokenParamDefine(QR2_COLLABDEL);
+       REGISTERTokenParamDefine(QR2_SUBJECTREQ);
+       REGISTERTokenParamDefine(QR2_SMTP_PUBLIC);
+       REGISTERTokenParamDefine(QR2_MODERATED);
+       REGISTERTokenParamDefine(QR2_NOUPLMSG);
+
+       REGISTERTokenParamDefine(UA_KNOWN);
+       REGISTERTokenParamDefine(UA_GOTOALLOWED);
+       REGISTERTokenParamDefine(UA_HASNEWMSGS);
+       REGISTERTokenParamDefine(UA_ZAPPED);
+       REGISTERTokenParamDefine(UA_POSTALLOWED);
+       REGISTERTokenParamDefine(UA_ADMINALLOWED);
+       REGISTERTokenParamDefine(UA_DELETEALLOWED);
+       REGISTERTokenParamDefine(UA_REPLYALLOWED);
+       REGISTERTokenParamDefine(UA_ISTRASH);
+
+       REGISTERTokenParamDefine(US_NEEDVALID);
+       REGISTERTokenParamDefine(US_PERM);
+       REGISTERTokenParamDefine(US_LASTOLD);
+       REGISTERTokenParamDefine(US_EXPERT);
+       REGISTERTokenParamDefine(US_UNLISTED);
+       REGISTERTokenParamDefine(US_NOPROMPT);
+       REGISTERTokenParamDefine(US_PROMPTCTL);
+       REGISTERTokenParamDefine(US_DISAPPEAR);
+       REGISTERTokenParamDefine(US_REGIS);
+       REGISTERTokenParamDefine(US_PAGINATOR);
+       REGISTERTokenParamDefine(US_INTERNET);
+       REGISTERTokenParamDefine(US_FLOORS);
+       REGISTERTokenParamDefine(US_COLOR);
+       REGISTERTokenParamDefine(US_USER_SET);
+
+       REGISTERTokenParamDefine(VIEW_BBS);
+       REGISTERTokenParamDefine(VIEW_MAILBOX); 
+       REGISTERTokenParamDefine(VIEW_ADDRESSBOOK);
+       REGISTERTokenParamDefine(VIEW_CALENDAR);        
+       REGISTERTokenParamDefine(VIEW_TASKS);   
+       REGISTERTokenParamDefine(VIEW_NOTES);           
+       REGISTERTokenParamDefine(VIEW_WIKI);            
+       REGISTERTokenParamDefine(VIEW_CALBRIEF);
+       REGISTERTokenParamDefine(VIEW_JOURNAL);
+       REGISTERTokenParamDefine(VIEW_BLOG);
+       REGISTERTokenParamDefine(VIEW_QUEUE);
+
+       /* GNET types: */
+       /* server internal, we need to know but ignore them. */
+       REGISTERTokenParamDefine(subpending);
+       REGISTERTokenParamDefine(unsubpending);
+       REGISTERTokenParamDefine(lastsent);
+
+       REGISTERTokenParamDefine(ignet_push_share);
+       { /* these are the parts of an IGNET push config */
+               REGISTERTokenParamDefine(GNET_IGNET_NODE);
+               REGISTERTokenParamDefine(GNET_IGNET_ROOM);
+       }
+       REGISTERTokenParamDefine(listrecp);
+       REGISTERTokenParamDefine(digestrecp);
+       REGISTERTokenParamDefine(pop3client);
+       { /* These are the parts of a pop3 client line... */
+               REGISTERTokenParamDefine(GNET_POP3_HOST);
+               REGISTERTokenParamDefine(GNET_POP3_USER);
+               REGISTERTokenParamDefine(GNET_POP3_DONT_DELETE_REMOTE);
+               REGISTERTokenParamDefine(GNET_POP3_INTERVAL);
+       }
+       REGISTERTokenParamDefine(rssclient);
+       REGISTERTokenParamDefine(participate);
+       REGISTERTokenParamDefine(roommailalias);
+
+
+
+}
+
+
+void 
+SessionDestroyModule_ROOMOPS
+(wcsession *sess)
+{
+       _FlushRoomList (sess);
+}
+
diff --git a/webcit/roomops.h b/webcit/roomops.h
new file mode 100644 (file)
index 0000000..c29a101
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+
+#define VIRTUAL_MY_FLOOR -1
+
+/*
+ * This struct holds a list of rooms for "Goto" operations.
+ */
+struct march {
+       struct march *next;       /* pointer to next in linked list */
+       char march_name[128];     /* name of room */
+       int march_floor;          /* floor number of room */
+       int march_order;          /* sequence in which we are to visit this room */
+};
+
+/*
+ * This struct holds a list of rooms for client display. It is a binary tree.
+ */
+struct roomlisting {
+       struct roomlisting *lnext;      /* pointer to 'left' tree node */
+       struct roomlisting *rnext;      /* pointer to 'right' tree node */
+       char rlname[128];               /* name of room */
+       unsigned rlflags;               /* room flags */
+       int rlfloor;                    /* the floor it resides on */
+       int rlorder;                    /* room listing order */
+};
+
+
+
+
+
+typedef struct _floor {
+       int ID;
+       StrBuf *Name;
+       long NRooms;
+       long AlphaN;
+} Floor;
+
+/*
+ * Data structure for roomlist-to-folderlist conversion 
+ */
+struct __ofolder {
+       int floor;      /* which floor is it on */
+       char room[SIZ]; /* which roomname ??? */
+       char name[SIZ]; /* which is its own name??? */
+       int hasnewmsgs; /* are there unread messages inside */
+       int is_mailbox; /* is it a mailbox?  */
+       int selectable; /* can we select it ??? */
+       int view;       /* whats its default view? inbox/calendar.... */
+       int num_rooms;  /* If this is a floor, how many rooms does it have */
+};
+
+
+
+/*
+ * Data structure for roomlist-to-folderlist conversion 
+ */
+typedef struct _folder {
+       /* Data citserver tells us about the room */
+       long QRFlags;    /* roomflags */
+       long QRFlags2;    /* Bitbucket NO2 */
+       long RAFlags;
+
+       int view;       /* whats its default view? inbox/calendar.... */
+       long defview;
+       long lastchange; /* todo... */
+
+       /* later evaluated data from the serverdata */
+       StrBuf *name;   /* the full name of the room we're talking about */
+       long nRoomNameParts;
+       StrBuf **RoomNameParts;
+
+       int floorid;      /* which floor is it on */
+       const Floor *Floor;   /* point to the floor we're on.. */
+
+       int hasnewmsgs; /* are there unread messages inside */
+       int is_inbox;   /* is it a mailbox?  */
+
+       int RoomAideLoaded;
+       StrBuf *RoomAide;
+
+/* only available if GNET contains this */
+       const StrBuf* RoomAlias; /* by what mail will this room send mail? */
+
+/* only available if GETR was run */
+       int XALoaded;
+       StrBuf *XAPass;
+       StrBuf *Directory;
+       long Order;
+
+/* Only available from the GOTO context... */
+       long nNewMessages;
+       long nTotalMessages;
+       long LastMessageRead;
+       long HighestRead;
+       int ShowInfo;
+       int IsTrash;
+/* Only available if certain other commands ran */
+       int XHaveRoomPic;
+       int XHaveRoomPicLoaded;
+
+       int XHaveInfoTextLoaded;
+       StrBuf *XInfoText;
+
+       int XHaveDownloadCount;
+       int XDownloadCount;
+       
+       int BumpUsers; /* if SETR set to 1 to make all users who knew this room to forget about it. */
+
+       HashList *IgnetCfgs[maxRoomNetCfg + 1];
+} folder;
+
+HashList *GetFloorListHash(StrBuf *Target, WCTemplputParams *TP);
+void vDeleteFolder(void *vFolder);
+void FlushFolder(folder *room);
+void FlushIgnetCfgs(folder *room);
+void ParseGoto(folder *proom, StrBuf *Line);
+void FlushRoomlist(void); /* release our caches, so a deleted / zapped room disapears */
+void ReloadCurrentRoom(void); /* Flush cache; reload current state */
+
+HashList *GetFloorListHash(StrBuf *Target, WCTemplputParams *TP);
+HashList *GetRoomListHash(StrBuf *Target, WCTemplputParams *TP);
+int SortRoomsByListOrder(const void *room1, const void *room2);
+void tmplput_roombanner(StrBuf *Target, WCTemplputParams *TP);
+
+
+void LoadRoomAide(void);
+void LoadRoomXA (void);
+void LoadXRoomPic(void);
+void LoadXRoomInfoText(void);
+void LoadXRoomXCountFiles(void);
+
+long gotoroom(const StrBuf *gname);
+
+void slrp_highest(void);
+void remove_march(const StrBuf *aaa);
+void dotskip(void);
+void smart_goto(const StrBuf *next_room);
+void free_march_list(wcsession *wcf);
+
+/*
+ * wrapper around usual sort-comparator; private rooms will allways be prefered, -1 if one of them NULL
+ */
+int CompareRooms(const folder *room1, const folder *room2);
+
+
+#define REST_TOPLEVEL 0
+#define REST_IN_NAMESPACE (1<<0)
+#define REST_IN_FLOOR (1<<1)
+#define REST_IN_ROOM (1<<2)
+#define REST_HAVE_SUB_ROOMS (1<<3)
+#define REST_GOT_LOCAL_PART (1<<4)
+#define REST_NONEXIST (1<<5)
+
+
+extern CtxType CTX_ROOMS;
+extern CtxType CTX_FLOORS;
diff --git a/webcit/roomtokens.c b/webcit/roomtokens.c
new file mode 100644 (file)
index 0000000..199cc3c
--- /dev/null
@@ -0,0 +1,686 @@
+/*
+ * Lots of different room-related operations.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+CtxType CTX_ROOMS = CTX_NONE;
+CtxType CTX_FLOORS = CTX_NONE;
+
+/*
+ * Embed the room banner
+ *
+ * got                 The information returned from a GOTO server command
+ * navbar_style        Determines which navigation buttons to display
+ */
+void tmplput_roombanner(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       
+       /* Refresh current room states.  Doesn't work? gotoroom(NULL); */
+
+       wc_printf("<div id=\"banner\">\n");
+
+       /* The browser needs some information for its own use */
+       wc_printf("<script type=\"text/javascript\">    \n"
+                 "     room_is_trash = %d;             \n"
+                 "</script>\n",
+                 ((WC->CurRoom.RAFlags & UA_ISTRASH) != 0)
+       );
+
+       /*
+        * If the user happens to select the "make this my start page" link,
+        * we want it to remember the URL as a "/dotskip" one instead of
+        * a "skip" or "gotonext" or something like that.
+        */
+       if (WCC->Hdr->this_page == NULL) {
+               WCC->Hdr->this_page = NewStrBuf();
+       }
+       StrBufPrintf(WCC->Hdr->this_page, "dotskip?room=%s", ChrPtr(WC->CurRoom.name));
+
+       do_template("roombanner");
+
+       do_template("navbar");
+       wc_printf("</div>\n");
+}
+
+
+/*******************************************************************************
+ ********************** FLOOR Tokens *******************************************
+ *******************************************************************************/
+
+
+void tmplput_FLOOR_ID(StrBuf *Target, WCTemplputParams *TP) 
+{
+       Floor *myFloor = (Floor *)CTX(CTX_FLOORS);
+
+       StrBufAppendPrintf(Target, "%d", myFloor->ID);
+}
+
+
+void tmplput_ROOM_FLOORID(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       StrBufAppendPrintf(Target, "%d", Folder->floorid);
+}
+
+
+void tmplput_ROOM_FLOOR_ID(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       const Floor *pFloor = Folder->Floor;
+
+       if (pFloor == NULL)
+               return;
+
+       StrBufAppendPrintf(Target, "%d", pFloor->ID);
+}
+
+
+void tmplput_ROOM_FLOOR_NAME(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       const Floor *pFloor = Folder->Floor;
+
+       if (pFloor == NULL)
+               return;
+
+       StrBufAppendTemplate(Target, TP, pFloor->Name, 0);
+}
+
+
+void tmplput_ThisRoomFloorName(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+       folder *Folder = &WCC->CurRoom;
+       const Floor *pFloor;
+
+       if (Folder == NULL)
+               return;
+
+       pFloor = Folder->Floor;
+       if (pFloor == NULL)
+               return;
+
+       StrBufAppendTemplate(Target, TP, pFloor->Name, 0);
+}
+
+
+void tmplput_FLOOR_NAME(StrBuf *Target, WCTemplputParams *TP) 
+{
+       Floor *myFloor = (Floor *)CTX(CTX_FLOORS);
+
+       StrBufAppendTemplate(Target, TP, myFloor->Name, 0);
+}
+
+
+void tmplput_FLOOR_NROOMS(StrBuf *Target, WCTemplputParams *TP) 
+{
+       Floor *myFloor = (Floor *)CTX(CTX_FLOORS);
+
+       StrBufAppendPrintf(Target, "%d", myFloor->NRooms);
+}
+
+
+void tmplput_ROOM_FLOOR_NROOMS(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       const Floor *pFloor = Folder->Floor;
+
+       if (pFloor == NULL)
+               return;
+       StrBufAppendPrintf(Target, "%d", pFloor->NRooms);
+}
+
+
+int ConditionalFloorHaveNRooms(StrBuf *Target, WCTemplputParams *TP)
+{
+       Floor *MyFloor = (Floor *)CTX(CTX_FLOORS);
+       int HaveN;
+
+       HaveN = GetTemplateTokenNumber(Target, TP, 0, 0);
+
+       return HaveN == MyFloor->NRooms;
+}
+
+
+int ConditionalFloorIsRESTSubFloor(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession  *WCC = WC;
+       Floor *MyFloor = (Floor *)CTX(CTX_FLOORS);
+       /** if we have dav_depth the client just wants the subfloors */
+       if ((WCC->Hdr->HR.dav_depth == 1) && 
+           (GetCount(WCC->Directory) == 0))
+               return 1;
+       return WCC->CurrentFloor == MyFloor;
+}
+
+
+int ConditionalFloorIsSUBROOM(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession  *WCC = WC;
+       Floor *MyFloor = (Floor *)CTX(CTX_FLOORS);
+
+       return WCC->CurRoom.floorid == MyFloor->ID;
+}
+
+
+int ConditionalFloorIsVirtual(StrBuf *Target, WCTemplputParams *TP)
+{
+       Floor *MyFloor = (Floor *)CTX(CTX_FLOORS);
+
+       return MyFloor->ID == VIRTUAL_MY_FLOOR;
+}
+
+
+/*******************************************************************************
+ ********************** ROOM Tokens ********************************************
+ *******************************************************************************/
+/**** Name ******/
+
+void tmplput_ThisRoom(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+
+       if (WCC != NULL) {
+               StrBufAppendTemplate(Target, TP, 
+                    WCC->CurRoom.name, 
+                    0
+               );
+       }
+}
+
+
+void tmplput_ROOM_NAME(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+
+       StrBufAppendTemplate(Target, TP, Folder->name, 0);
+}
+
+
+void tmplput_ROOM_BASENAME(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *room = (folder *)CTX(CTX_ROOMS);
+
+       if (room->nRoomNameParts > 1)
+               StrBufAppendTemplate(Target, TP, 
+                                     room->RoomNameParts[room->nRoomNameParts - 1], 0);
+       else 
+               StrBufAppendTemplate(Target, TP, room->name, 0);
+}
+
+
+void tmplput_ROOM_LEVEL_N_TIMES(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *room = (folder *)CTX(CTX_ROOMS);
+       int i;
+        const char *AppendMe;
+        long AppendMeLen;
+
+
+       if (room->nRoomNameParts > 1)
+       {
+               GetTemplateTokenString(Target, TP, 0, &AppendMe, &AppendMeLen);
+               for (i = 0; i < room->nRoomNameParts; i++)
+                       StrBufAppendBufPlain(Target, AppendMe, AppendMeLen, 0);
+       }
+}
+
+
+int ConditionalRoomIsInbox(StrBuf *Target, WCTemplputParams *TP)
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       return Folder->is_inbox;
+}
+
+int ConditionalRoomIsType(StrBuf *Target, WCTemplputParams *TP)
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+
+       if (Folder == NULL)
+               return 0;
+
+       if ((TP->Tokens->nParameters < 3))
+       {
+               return ((Folder->view < VIEW_BBS) || 
+                       (Folder->view > VIEW_MAX));
+       }
+
+       return Folder->view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS);
+}
+
+
+
+/****** Properties ******/
+int ConditionalRoom_MayEdit(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+
+       LoadRoomXA ();
+
+       return WCC->CurRoom.XALoaded == 1;
+}
+
+int ConditionalThisRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
+{
+       long QR_CheckFlag;
+       wcsession *WCC = WC;
+       
+       QR_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if (QR_CheckFlag == 0)
+               LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+                                "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
+       
+       if (WCC == NULL)
+               return 0;
+
+       if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
+           (TP->Tokens->Params[2]->MaskBy == eNO))
+               return (WCC->CurRoom.QRFlags & QR_CheckFlag) != 0;
+       else
+               return (WCC->CurRoom.QRFlags & QR_CheckFlag) == QR_CheckFlag;
+}
+
+
+int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
+{
+       long QR_CheckFlag;
+       folder *Folder = (folder *)(TP->Context);
+
+       QR_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if (QR_CheckFlag == 0)
+               LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+                                "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
+
+       if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
+           (TP->Tokens->Params[2]->MaskBy == eNO))
+               return (Folder->QRFlags & QR_CheckFlag) != 0;
+       else
+               return (Folder->QRFlags & QR_CheckFlag) == QR_CheckFlag;
+}
+
+
+void tmplput_ROOM_QRFLAGS(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       StrBufAppendPrintf(Target, "%d", Folder->QRFlags);
+}
+
+
+int ConditionalThisRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
+{
+       long QR2_CheckFlag;
+       wcsession *WCC = WC;
+       
+       QR2_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if (QR2_CheckFlag == 0)
+               LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+                                "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
+
+       
+       if (WCC == NULL)
+               return 0;
+
+       if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
+           (TP->Tokens->Params[2]->MaskBy == eNO))
+               return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) != 0;
+       else
+               return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) == QR2_CheckFlag;
+}
+
+
+int ConditionalRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
+{
+       long QR2_CheckFlag;
+       folder *Folder = (folder *)(TP->Context);
+
+       QR2_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if (QR2_CheckFlag == 0)
+               LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+                                "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
+       return ((Folder->QRFlags2 & QR2_CheckFlag) != 0);
+}
+
+
+int ConditionalRoomHas_UAFlag(StrBuf *Target, WCTemplputParams *TP)
+{
+       folder *Folder = (folder *)(TP->Context);
+       long UA_CheckFlag;
+               
+       UA_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if (UA_CheckFlag == 0)
+               LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+                                "requires one of the #\"UA_*\"- defines or an integer flag 0 is invalid!");
+
+       return ((Folder->RAFlags & UA_CheckFlag) != 0);
+}
+
+
+void tmplput_ROOM_ACL(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+
+       StrBufAppendPrintf(Target, "%ld", Folder->RAFlags, 0);
+}
+
+
+void tmplput_ROOM_RAFLAGS(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)(TP->Context);
+       StrBufAppendPrintf(Target, "%d", Folder->RAFlags);
+}
+
+
+void tmplput_ThisRoomAide(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       LoadRoomAide();
+
+       StrBufAppendTemplate(Target, TP, WCC->CurRoom.RoomAide, 0);
+}
+
+
+int ConditionalRoomAide(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       return (WCC != NULL)? 
+               ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) : 0;
+}
+
+
+int ConditionalRoomAcessDelete(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       return (WCC == NULL)? 0 : 
+               ( ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ||
+                  (WCC->CurRoom.is_inbox) || 
+                  (WCC->CurRoom.QRFlags2 & QR2_COLLABDEL) );
+}
+
+
+int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+
+       return (        (WCC != NULL)
+                       && (WCC->logged_in)
+                       && (
+                               (WCC->axlevel >= 6)
+                               || ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0)
+                               || (WCC->CurRoom.is_inbox)
+                       )
+               );
+}
+
+
+void tmplput_ThisRoomPass(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       LoadRoomXA();
+       StrBufAppendTemplate(Target, TP, WCC->CurRoom.XAPass, 0);
+}
+
+
+void tmplput_ThisRoom_nNewMessages(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nNewMessages);
+}
+
+
+void tmplput_ThisRoom_nTotalMessages(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nTotalMessages);
+}
+
+
+void tmplput_ThisRoomOrder(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       LoadRoomXA();
+
+       StrBufAppendPrintf(Target, "%d", WCC->CurRoom.Order);
+}
+
+
+int ConditionalThisRoomOrder(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       long CheckThis;
+
+       if (WCC == NULL)
+               return 0;
+
+       LoadRoomXA();
+
+       CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+       return CheckThis == WCC->CurRoom.Order;
+}
+
+
+void tmplput_ROOM_LISTORDER(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       StrBufAppendPrintf(Target, "%d", Folder->Order);
+}
+
+
+int ConditionalThisRoomXHavePic(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       
+       if (WCC == NULL)
+               return 0;
+
+       LoadXRoomPic();
+       return WCC->CurRoom.XHaveRoomPic == 1;
+}
+
+int ConditionalThisRoomIsEdit(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+
+       if (WCC == NULL)
+               return 0;
+       return ((WCC->CurRoom.nRoomNameParts > 1) && 
+               (strcmp(ChrPtr(WCC->CurRoom.RoomNameParts[WCC->CurRoom.nRoomNameParts]), "edit") == 0));
+}
+
+int ConditionalThisRoomXHaveInfoText(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       
+       if (WCC == NULL)
+               return 0;
+
+       LoadXRoomInfoText();
+       return (StrLength(WCC->CurRoom.XInfoText)>0);
+}
+
+
+void tmplput_ThisRoomInfoText(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+       long nchars = 0;
+
+       LoadXRoomInfoText();
+
+       nchars = GetTemplateTokenNumber(Target, TP, 0, 0);
+       if (!nchars) {
+               /* the whole thing */
+               StrBufAppendTemplate(Target, TP, WCC->CurRoom.XInfoText, 1);
+       }
+       else {
+               /* only a certain number of characters */
+               StrBuf *SubBuf;
+               SubBuf = NewStrBufDup(WCC->CurRoom.XInfoText);
+               if (StrLength(SubBuf) > nchars) {
+                       StrBuf_Utf8StrCut(SubBuf, nchars);
+                       StrBufAppendBufPlain(SubBuf, HKEY("..."), 0);
+               }
+               StrBufAppendTemplate(Target, TP, SubBuf, 1);
+               FreeStrBuf(&SubBuf);
+       }
+}
+
+
+void tmplput_ROOM_LASTCHANGE(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       StrBufAppendPrintf(Target, "%d", Folder->lastchange);
+}
+
+
+void tmplput_ThisRoomDirectory(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       LoadRoomXA();
+
+       StrBufAppendTemplate(Target, TP, WCC->CurRoom.Directory, 0);
+}
+
+
+void tmplput_ThisRoomXNFiles(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       LoadXRoomXCountFiles();
+
+       StrBufAppendPrintf(Target, "%d", WCC->CurRoom.XDownloadCount);
+}
+
+
+void tmplput_ThisRoomX_FileString(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       LoadXRoomXCountFiles();
+
+       if (WCC->CurRoom.XDownloadCount == 1)
+               StrBufAppendBufPlain(Target, _("file"), -1, 0);
+       else
+               StrBufAppendBufPlain(Target, _("files"), -1, 0);
+}
+
+
+int ConditionalIsThisThatRoom(StrBuf *Target, WCTemplputParams *TP)
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       wcsession *WCC = WC;
+
+       if (WCC == NULL)
+               return 0;
+
+       return Folder == WCC->ThisRoom;
+}
+
+int ConditionalRoomIsName(StrBuf *Target, WCTemplputParams *TP)
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+        const char *CheckRoomName = NULL;
+        long CheckRoomNameLen;
+
+       GetTemplateTokenString(Target, TP, 3, &CheckRoomName, &CheckRoomNameLen);
+       if (CheckRoomName == NULL)
+               return 0;
+       return strcmp(ChrPtr(Folder->name), CheckRoomName) == 0;
+}
+
+
+void 
+InitModule_ROOMTOKENS
+(void)
+{
+       /* we duplicate this, just to be shure its already done. */
+       RegisterCTX(CTX_ROOMS);
+       RegisterCTX(CTX_FLOORS);
+
+       RegisterNamespace("ROOMBANNER", 0, 1, tmplput_roombanner, NULL, CTX_NONE);
+
+       RegisterNamespace("FLOOR:ID", 0, 0, tmplput_FLOOR_ID, NULL, CTX_FLOORS);
+       RegisterNamespace("ROOM:INFO:FLOORID", 0, 1, tmplput_ROOM_FLOORID, NULL, CTX_ROOMS);
+       RegisterNamespace("ROOM:INFO:FLOOR:ID", 0, 0, tmplput_ROOM_FLOOR_ID, NULL, CTX_ROOMS);
+
+       RegisterNamespace("FLOOR:NAME", 0, 1, tmplput_FLOOR_NAME, NULL, CTX_FLOORS);
+       RegisterNamespace("ROOM:INFO:FLOOR:NAME", 0, 1, tmplput_ROOM_FLOOR_NAME, NULL, CTX_ROOMS);
+       RegisterNamespace("THISROOM:FLOOR:NAME", 0, 1, tmplput_ThisRoomFloorName, NULL, CTX_NONE);
+
+       RegisterNamespace("FLOOR:NROOMS", 0, 0, tmplput_FLOOR_NROOMS, NULL, CTX_FLOORS);
+       RegisterNamespace("ROOM:INFO:FLOOR:NROOMS", 0, 0, tmplput_ROOM_FLOOR_NROOMS, NULL, CTX_ROOMS);
+
+       RegisterConditional("COND:FLOOR:ISSUBROOM", 0, ConditionalFloorIsSUBROOM, CTX_FLOORS);
+       RegisterConditional("COND:FLOOR:NROOMS", 1, ConditionalFloorHaveNRooms, CTX_FLOORS);
+       RegisterConditional("COND:ROOM:REST:ISSUBFLOOR", 0, ConditionalFloorIsRESTSubFloor, CTX_FLOORS);
+       RegisterConditional("COND:FLOOR:ISVIRTUAL", 0, ConditionalFloorIsVirtual, CTX_FLOORS);
+
+       /**** Room... ******/
+        /**** Name ******/
+       RegisterNamespace("THISROOM:NAME", 0, 1, tmplput_ThisRoom, NULL, CTX_NONE);
+
+       RegisterNamespace("ROOM:INFO:NAME", 0, 1, tmplput_ROOM_NAME, NULL, CTX_ROOMS);
+       RegisterNamespace("ROOM:INFO:BASENAME", 0, 1, tmplput_ROOM_BASENAME, NULL, CTX_ROOMS);
+       RegisterNamespace("ROOM:INFO:LEVELNTIMES", 1, 2, tmplput_ROOM_LEVEL_N_TIMES, NULL, CTX_ROOMS);
+       RegisterConditional("COND:ROOM:INFO:IS_INBOX", 0, ConditionalRoomIsInbox, CTX_ROOMS);
+       RegisterConditional("COND:ROOM:INFO:TYPE_IS", 0, ConditionalRoomIsType, CTX_ROOMS);
+       RegisterConditional("COND:ROOM:INFO:NAME_IS", 1, ConditionalRoomIsName, CTX_ROOMS);
+
+       /****** Properties ******/
+       RegisterNamespace("ROOM:INFO:QRFLAGS", 0, 1, tmplput_ROOM_QRFLAGS, NULL, CTX_ROOMS);
+       RegisterConditional("COND:THISROOM:FLAG:QR", 0, ConditionalThisRoomHas_QRFlag, CTX_NONE);
+       RegisterConditional("COND:THISROOM:EDIT", 0, ConditionalRoom_MayEdit, CTX_NONE);
+       RegisterConditional("COND:ROOM:FLAG:QR", 0, ConditionalRoomHas_QRFlag, CTX_ROOMS);
+
+       RegisterConditional("COND:THISROOM:FLAG:QR2", 0, ConditionalThisRoomHas_QRFlag2, CTX_NONE);
+       RegisterConditional("COND:ROOM:FLAG:QR2", 0, ConditionalRoomHas_QRFlag2, CTX_ROOMS);
+
+       RegisterConditional("COND:ROOM:FLAG:UA", 0, ConditionalRoomHas_UAFlag, CTX_ROOMS);
+       RegisterNamespace("ROOM:INFO:RAFLAGS", 0, 1, tmplput_ROOM_RAFLAGS, NULL, CTX_ROOMS);
+
+
+       RegisterNamespace("ROOM:INFO:LISTORDER", 0, 1, tmplput_ROOM_LISTORDER, NULL, CTX_ROOMS);
+       RegisterNamespace("THISROOM:ORDER", 0, 0, tmplput_ThisRoomOrder, NULL, CTX_NONE);
+       RegisterConditional("COND:THISROOM:ORDER", 0, ConditionalThisRoomOrder, CTX_NONE);
+
+       RegisterNamespace("ROOM:INFO:LASTCHANGE", 0, 1, tmplput_ROOM_LASTCHANGE, NULL, CTX_ROOMS);
+
+       RegisterNamespace("THISROOM:MSGS:NEW", 0, 0, tmplput_ThisRoom_nNewMessages, NULL, CTX_NONE);
+       RegisterNamespace("THISROOM:MSGS:TOTAL", 0, 0, tmplput_ThisRoom_nTotalMessages, NULL, CTX_NONE);
+
+       RegisterNamespace("THISROOM:PASS", 0, 1, tmplput_ThisRoomPass, NULL, CTX_NONE);
+       RegisterNamespace("THISROOM:AIDE", 0, 1, tmplput_ThisRoomAide, NULL, CTX_NONE);
+       RegisterConditional("COND:ROOMAIDE", 2, ConditionalRoomAide, CTX_NONE);
+       RegisterConditional("COND:ACCESS:DELETE", 2, ConditionalRoomAcessDelete, CTX_NONE);
+       RegisterConditional("COND:ROOM:EDITACCESS", 0, ConditionalHaveRoomeditRights, CTX_NONE);
+
+       RegisterConditional("COND:THISROOM:HAVE_PIC", 0, ConditionalThisRoomXHavePic, CTX_NONE);
+       RegisterConditional("COND:THISROOM:IS_EDIT", 0, ConditionalThisRoomIsEdit, CTX_NONE);
+
+       RegisterNamespace("THISROOM:INFOTEXT", 1, 2, tmplput_ThisRoomInfoText, NULL, CTX_NONE);
+       RegisterConditional("COND:THISROOM:HAVE_INFOTEXT", 0, ConditionalThisRoomXHaveInfoText, CTX_NONE);
+
+       RegisterNamespace("THISROOM:FILES:N", 0, 1, tmplput_ThisRoomXNFiles, NULL, CTX_NONE);
+       RegisterNamespace("THISROOM:FILES:STR", 0, 1, tmplput_ThisRoomX_FileString, NULL, CTX_NONE);
+       RegisterNamespace("THISROOM:DIRECTORY", 0, 1, tmplput_ThisRoomDirectory, NULL, CTX_NONE);
+
+       RegisterNamespace("ROOM:INFO:ACL", 0, 1, tmplput_ROOM_ACL, NULL, CTX_ROOMS);
+       RegisterConditional("COND:THIS:THAT:ROOM", 0, ConditionalIsThisThatRoom, CTX_ROOMS);
+}
diff --git a/webcit/roomviews.c b/webcit/roomviews.c
new file mode 100644 (file)
index 0000000..1856300
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * Lots of different room-related operations.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+char *viewdefs[VIEW_MAX];
+
+/*
+ * This table defines which views may be selected as the
+ * default view for a room at the time of its creation.
+ */
+int allowed_default_views[VIEW_MAX] = {
+       1, /* VIEW_BBS          Bulletin board */
+       1, /* VIEW_MAILBOX      Mailbox summary */
+       1, /* VIEW_ADDRESSBOOK  Address book */
+       1, /* VIEW_CALENDAR     Calendar */
+       1, /* VIEW_TASKS        Tasks */
+       1, /* VIEW_NOTES        Notes */
+       1, /* VIEW_WIKI         Wiki */
+       0, /* VIEW_CALBRIEF     Brief Calendar */
+       0, /* VIEW_JOURNAL      Journal */
+       0, /* VIEW_DRAFTS       Drafts */
+       1, /* VIEW_BLOG         Blog */
+       0  /* VIEW_QUEUE        Mail Queue */
+};
+
+/*
+ * Given the default view for a room, this table defines
+ * which alternate views may be selected by the user.
+ */
+ROOM_VIEWS exchangeable_views[VIEW_MAX][VIEW_MAX] = {
+       { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, /* bulletin board */
+       { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, /* mailbox summary */
+       { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* address book */
+       { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, /* calendar */
+       { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, /* tasks */
+       { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, /* notes */
+       { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, /* wiki */
+       { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, /* brief calendar */
+       { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, /* journal */
+       { 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, /* drafts */
+       { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, /* blog */
+};
+
+/*
+ * Initialize the viewdefs with localized strings
+ */
+void initialize_viewdefs(void) {
+       viewdefs[VIEW_BBS]              = _("Bulletin Board");
+       viewdefs[VIEW_MAILBOX]          = _("Mail Folder");
+       viewdefs[VIEW_ADDRESSBOOK]      = _("Address Book");
+       viewdefs[VIEW_CALENDAR]         = _("Calendar");
+       viewdefs[VIEW_TASKS]            = _("Task List");
+       viewdefs[VIEW_NOTES]            = _("Notes List");
+       viewdefs[VIEW_WIKI]             = _("Wiki");
+       viewdefs[VIEW_CALBRIEF]         = _("Calendar List");
+       viewdefs[VIEW_JOURNAL]          = _("Journal");
+       viewdefs[VIEW_DRAFTS]           = _("Drafts");
+       viewdefs[VIEW_BLOG]             = _("Blog");
+}
+
+
+void tmplput_ROOM_COLLECTIONTYPE(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       
+       switch(Folder->view) {
+       case VIEW_CALENDAR:
+               StrBufAppendBufPlain(Target, HKEY("vevent"), 0);
+               break;
+       case VIEW_TASKS:
+               StrBufAppendBufPlain(Target, HKEY("vtodo"), 0);
+               break;
+       case VIEW_ADDRESSBOOK:
+               StrBufAppendBufPlain(Target, HKEY("vcard"), 0);
+               break;
+       case VIEW_NOTES:
+               StrBufAppendBufPlain(Target, HKEY("vnotes"), 0);
+               break;
+       case VIEW_JOURNAL:
+               StrBufAppendBufPlain(Target, HKEY("vjournal"), 0);
+               break;
+       case VIEW_WIKI:
+               StrBufAppendBufPlain(Target, HKEY("wiki"), 0);
+               break;
+       }
+}
+
+
+
+int ConditionalRoomHasGroupdavContent(StrBuf *Target, WCTemplputParams *TP)
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+
+       syslog(LOG_DEBUG, "-> %s: %d\n", ChrPtr(Folder->name), Folder->view);
+
+       return ((Folder->view == VIEW_CALENDAR) || 
+               (Folder->view == VIEW_TASKS) || 
+               (Folder->view == VIEW_ADDRESSBOOK) ||
+               (Folder->view == VIEW_NOTES) ||
+               (Folder->view == VIEW_JOURNAL) );
+}
+
+
+
+
+int ConditionalIsRoomtype(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+
+       if ((WCC == NULL) ||
+           (TP->Tokens->nParameters < 3))
+       {
+               return ((WCC->CurRoom.view < VIEW_BBS) || 
+                       (WCC->CurRoom.view > VIEW_MAX));
+       }
+
+       return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS);
+}
+
+
+void tmplput_CurrentRoomViewString(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+       StrBuf *Buf;
+
+       if ((WCC == NULL) ||
+           (WCC->CurRoom.defview >= VIEW_MAX) || 
+           (WCC->CurRoom.defview < VIEW_BBS))
+       {
+               LogTemplateError(Target, "Token", ERR_PARM2, TP,
+                                "Roomview [%ld] not valid\n", 
+                                (WCC != NULL)? 
+                                WCC->CurRoom.defview : -1);
+               return;
+       }
+
+       Buf = NewStrBufPlain(_(viewdefs[WCC->CurRoom.defview]), -1);
+       StrBufAppendTemplate(Target, TP, Buf, 0);
+       FreeStrBuf(&Buf);
+}
+
+void tmplput_RoomViewString(StrBuf *Target, WCTemplputParams *TP) 
+{
+       long CheckThis;
+       StrBuf *Buf;
+
+       CheckThis = GetTemplateTokenNumber(Target, TP, 0, 0);
+       if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
+       {
+               LogTemplateError(Target, "Token", ERR_PARM2, TP,
+                                "Roomview [%ld] not valid\n", 
+                                CheckThis);
+               return;
+       }
+
+       Buf = NewStrBufPlain(_(viewdefs[CheckThis]), -1);
+       StrBufAppendTemplate(Target, TP, Buf, 0);
+       FreeStrBuf(&Buf);
+}
+
+
+
+int ConditionalIsAllowedDefaultView(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       long CheckThis;
+       
+       if (WCC == NULL)
+               return 0;
+
+       CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
+       {
+               LogTemplateError(Target, "Conditional", ERR_PARM2, TP,
+                                "Roomview [%ld] not valid\n", 
+                                CheckThis);
+               return 0;
+       }
+
+       return allowed_default_views[CheckThis] != 0;
+}
+
+int ConditionalThisRoomDefView(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       long CheckThis;
+
+       if (WCC == NULL)
+               return 0;
+
+       CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+       return CheckThis == WCC->CurRoom.defview;
+}
+
+int ConditionalThisRoomCurrView(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       long CheckThis;
+
+       if (WCC == NULL)
+               return 0;
+
+       CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+       return CheckThis == WCC->CurRoom.view;
+}
+
+int ConditionalThisRoomHaveView(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       long CheckThis;
+       
+       if (WCC == NULL)
+               return 0;
+
+       CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
+       {
+               LogTemplateError(Target, "Conditional", ERR_PARM2, TP,
+                                "Roomview [%ld] not valid\n", 
+                                CheckThis);
+               return 0;
+       }
+
+       return exchangeable_views [WCC->CurRoom.defview][CheckThis] ;
+}
+
+void tmplput_ROOM_VIEW(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       StrBufAppendPrintf(Target, "%d", Folder->view);
+}
+void tmplput_ROOM_DEFVIEW(StrBuf *Target, WCTemplputParams *TP) 
+{
+       folder *Folder = (folder *)CTX(CTX_ROOMS);
+       StrBufAppendPrintf(Target, "%d", Folder->defview);
+}
+
+
+void tmplput_CurrentRoomDefView(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       StrBufAppendPrintf(Target, "%d", WCC->CurRoom.defview);
+}
+
+void 
+InitModule_ROOMVIEWS
+(void)
+{
+       /* we duplicate this, just to be shure its already done. */
+       RegisterCTX(CTX_ROOMS);
+       RegisterCTX(CTX_FLOORS);
+
+       initialize_viewdefs();
+
+       RegisterNamespace("THISROOM:VIEW_STRING", 0, 1, tmplput_CurrentRoomViewString, NULL, CTX_NONE);
+       RegisterNamespace("ROOM:VIEW_STRING", 1, 2, tmplput_RoomViewString, NULL, CTX_NONE);
+
+       RegisterConditional("COND:ALLOWED_DEFAULT_VIEW", 0, ConditionalIsAllowedDefaultView, CTX_NONE);
+       RegisterConditional("COND:THISROOM:DEFAULT_VIEW", 0, ConditionalThisRoomDefView, CTX_NONE);
+       RegisterNamespace("THISROOM:DEFAULT_VIEW", 0, 0, tmplput_CurrentRoomDefView, NULL, CTX_NONE);
+       RegisterNamespace("ROOM:INFO:DEFVIEW", 0, 1, tmplput_ROOM_DEFVIEW, NULL, CTX_ROOMS);
+
+       RegisterConditional("COND:ROOM:TYPE_IS", 0, ConditionalIsRoomtype, CTX_NONE);
+
+       RegisterConditional("COND:THISROOM:HAVE_VIEW", 0, ConditionalThisRoomHaveView, CTX_NONE);
+       RegisterConditional("COND:ROOM:DAV_CONTENT", 0, ConditionalRoomHasGroupdavContent, CTX_ROOMS);
+
+       RegisterConditional("COND:THISROOM:CURR_VIEW", 0, ConditionalThisRoomCurrView, CTX_NONE);
+       RegisterNamespace("ROOM:INFO:VIEW", 0, 1, tmplput_ROOM_VIEW, NULL, CTX_ROOMS);
+
+       RegisterNamespace("ROOM:INFO:COLLECTIONTYPE", 0, 1, tmplput_ROOM_COLLECTIONTYPE, NULL, CTX_ROOMS);
+
+
+
+}
diff --git a/webcit/scripts/get_ical_data.sh b/webcit/scripts/get_ical_data.sh
new file mode 100755 (executable)
index 0000000..da7cbac
--- /dev/null
@@ -0,0 +1,112 @@
+#!/bin/sh
+
+echo Running $0
+
+# Find our copy of sed , it might be called "gsed" on FreeBSD
+if gsed --version >/dev/null 2>&1 ; then
+       SED=`which gsed`
+elif sed --version >/dev/null 2>&1 ; then
+       SED=`which sed`
+else
+       sed: not found
+       exit 1
+fi
+
+echo sed is ${SED}
+
+
+ICAL=/usr/local/ctdlsupport/include/libical/ical.h
+if test -f /usr/include/libical/ical.h; then 
+    ICAL=/usr/include/libical/ical.h
+elif test -f /usr/local/include/libical/ical.h; then
+       ICAL=/usr/local/include/libical/ical.h
+fi
+
+if test ! -f ${ICAL}; then 
+    echo "failed to locate libical headers - please install the libical development packages or heardes"
+    exit 500
+fi
+
+ICALTYPES="icalproperty_kind"\
+" icalcomponent_kind"\
+" icalrequeststatus"\
+" ical_unknown_token_handling"\
+" icalrecurrencetype_frequency"\
+" icalrecurrencetype_weekday"\
+" icalvalue_kind"\
+" icalproperty_action"\
+" icalproperty_carlevel"\
+" icalproperty_class"\
+" icalproperty_cmd"\
+" icalproperty_method"\
+" icalproperty_querylevel"\
+" icalproperty_status"\
+" icalproperty_transp"\
+" icalproperty_xlicclass"\
+" icalparameter_kind"\
+" icalparameter_action"\
+" icalparameter_cutype"\
+" icalparameter_enable"\
+" icalparameter_encoding"\
+" icalparameter_fbtype"\
+" icalparameter_local"\
+" icalparameter_partstat"\
+" icalparameter_range"\
+" icalparameter_related"\
+" icalparameter_reltype"\
+" icalparameter_role"\
+" icalparameter_rsvp"\
+" icalparameter_value"\
+" icalparameter_xliccomparetype"\
+" icalparameter_xlicerrortype"\
+" icalparser_state"\
+" icalerrorenum"\
+" icalerrorstate"\
+" icalrestriction_kind"
+
+(
+    printf '#include "webcit.h"\n\n\n'
+
+    for icaltype in $ICALTYPES; do 
+       printf "typedef struct _Ical_${icaltype} {\n"\
+"      const char *Name;\n"\
+"      long NameLen;\n"\
+"      ${icaltype} map;\n"\
+"} Ical_${icaltype};\n\n\n"
+
+    done
+
+    for icaltype in $ICALTYPES; do 
+       cat ./scripts/get_ical_data__template.sed | \
+           ${SED} -e "s;__ICALTYPE__;$icaltype;g" > \
+           /tmp/get_ical_data.sed
+    
+       printf "Ical_${icaltype} ${icaltype}_map[] = {\n"
+       cat ${ICAL} |\
+${SED} -e 's;/\*.*\*/;;' -e 's;\t;;g' |\
+${SED} -nf /tmp/get_ical_data.sed |\
+${SED} -e "s;.*typedef *enum *${icaltype} *{\(.*\)} ${icaltype} *\;.*;\1,;" \
+           -e 's;/\*.*\*/;;' \
+           -e 's;/;\n/\n;g' \
+           -e 's;,;,\n;g' \
+           -e 's; *;;g' \
+           -e 's;^t*;;g' \
+           -e 's;\=[0-9]*;;g'|\
+${SED} -e 's;\(.*\),;{HKEY("\1"), \1},;'
+       printf '{"", 0, 0}\n};\n\n\n' 
+       
+    done
+
+
+    printf "void \nInitModule_ICAL_MAPS\n(void)\n{\n\tint i;\n"
+    for icaltype in $ICALTYPES; do 
+       printf "\tfor (i=0; ${icaltype}_map[i].NameLen > 0; i++)\n"\
+"              RegisterTokenParamDefine (\n"\
+"                      ${icaltype}_map[i].Name,\n"\
+"                      ${icaltype}_map[i].NameLen,\n"\
+"                      ${icaltype}_map[i].map);\n"\
+
+    done
+    printf "\n}\n\n"
+
+) > ical_maps.c
diff --git a/webcit/scripts/get_ical_data__template.sed b/webcit/scripts/get_ical_data__template.sed
new file mode 100644 (file)
index 0000000..da73cc8
--- /dev/null
@@ -0,0 +1,11 @@
+#! /bin/sed -nf
+
+H
+$ {
+  x
+  s/\n//g
+  p
+}
+$ { 
+  s/.*typedef *enum *__ICALTYPE__ *{\(.*\)} *__ICALTYPE__ *;.*/\1/
+ }
diff --git a/webcit/scripts/mk_module_init.sh b/webcit/scripts/mk_module_init.sh
new file mode 100755 (executable)
index 0000000..5ff26e7
--- /dev/null
@@ -0,0 +1,503 @@
+#!/bin/sh
+#
+# Script to generate $C_FILE
+#
+
+ECHO=/usr/bin/printf
+
+#MINUS_e=X`$ECHO -n -e`
+#if [ $MINUS_e != "X" ] ; then
+#      MINUS_e=""
+#else
+#      MINUS_e="-e"
+#fi
+
+#MINUS_E=X`$ECHO -n -E`
+#if [ $MINUS_E != "X" ] ; then
+#      MINUS_E=""
+#else
+#      MINUS_E="-E"
+#fi
+
+
+CUR_DIR=`pwd`
+C_FILE="$CUR_DIR/modules_init.c"
+H_FILE="$CUR_DIR/modules_init.h"
+MOD_FILE="$CUR_DIR/Make_modules"
+SRC_FILE="$CUR_DIR/Make_sources"
+U_FILE="$CUR_DIR/modules_upgrade.c"
+
+/usr/bin/printf "Scanning extension modules for entry points.\n"
+
+rm -f $C_FILE $H_FILE
+
+# server lifetime:
+START_FUNCS=`grep -a ServerStartModule_ *.c |sed "s;.*:;;" |sort -u`
+INIT_FUNCS=`grep -a InitModule_ *.c |sed "s;.*:;;" |sort -u`
+INIT2_FUNCS=`grep -a InitModule2_ *.c |sed "s;.*:;;" |sort -u`
+FINALIZE_FUNCS=`grep -a FinalizeModule_ *.c |sed "s;.*:;;" |sort -u`
+SHUTDOWN_FUNCS=`grep -a ServerShutdownModule_ *.c |sed "s;.*:;;" |sort -u`
+
+# session hooks:
+SESS_NEW_FUNCS=`grep -a SessionNewModule_ *.c |sed "s;.*:;;" |sort -u`
+SESS_ATTACH_FUNCS=`grep -a SessionAttachModule_ *.c |sed "s;.*:;;" |sort -u`
+SESS_DETACH_FUNCS=`grep -a SessionDetachModule_ *.c |sed "s;.*:;;" |sort -u`
+SESS_DESTROY_FUNCS=`grep -a SessionDestroyModule_ *.c |sed "s;.*:;;" |sort -u`
+
+HTTP_NEW_FUNCS=`grep -a HttpNewModule_ *.c |sed "s;.*:;;" |sort -u`
+HTTP_DETACH_FUNCS=`grep -a HttpDetachModule_ *.c |sed "s;.*:;;" |sort -u`
+HTTP_DESTROY_FUNCS=`grep -a HttpDestroyModule_ *.c |sed "s;.*:;;" |sort -u`
+
+
+#SESS_NEW_FUNCS=`grep -a SessionNewModule_ *.c |sed "s;.*:;;" |sort -u`
+
+
+#start the header file
+cat <<EOF > $H_FILE
+/* 
+ * $H_FILE
+ * Auto generated by mk_modules_init.sh DO NOT EDIT THIS FILE
+ */
+
+
+#ifndef MODULES_INIT_H
+#define MODULES_INIT_H
+extern size_t nSizErrmsg;
+
+
+/* 
+ * server lifetime: 
+ */
+void initialise_modules (void);
+void initialise2_modules (void);
+void start_modules (void);
+void shutdown_modules (void);
+
+
+/*
+ * Session lifetime:
+ */
+void session_new_modules (wcsession *sess);
+void session_attach_modules (wcsession *sess);
+void session_detach_modules (wcsession *sess);
+void session_destroy_modules (wcsession **sess);
+
+void http_new_modules (ParsedHttpHdrs *httpreq);
+void http_detach_modules (ParsedHttpHdrs *httpreq);
+void http_destroy_modules (ParsedHttpHdrs *httpreq);
+
+
+
+/*
+ * forwards...
+ */
+
+EOF
+
+
+#start of the files which inturn removes any existing file
+#
+
+# start the Makefile included file for $SERV_MODULES
+cat <<EOF  >$MOD_FILE
+#
+# Make_modules
+# This file is to be included by Makefile to dynamically add modules to the build process
+# THIS FILE WAS AUTO GENERATED BY mk_modules_init.sh DO NOT EDIT THIS FILE
+#
+
+EOF
+
+# start the Makefile included file for $SOURCES
+cat <<EOF  >$SRC_FILE
+#
+# Make_sources
+# This file is to be included by Makefile to dynamically add modules to the build process
+# THIS FILE WAS AUTO GENERATED BY mk_modules_init.sh DO NOT EDIT THIS FILE
+#
+
+EOF
+
+# start the c file
+cat <<EOF  >$C_FILE
+/*
+ * $C_FILE
+ * Auto generated by mk_modules_init.sh DO NOT EDIT THIS FILE
+ */
+
+
+
+#include "sysdep.h"
+#include <stdlib.h>
+#include <time.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <libcitadel.h>
+#include "webcit.h"
+#include "modules_init.h"
+#include "webserver.h"
+
+void LogPrintMessages(long err);
+extern long DetailErrorFlags;
+
+void start_modules (void)
+{
+EOF
+#********************************************************************************
+# server  ******** start ********  module logic.
+#********************************************************************************
+cat <<EOF >> $H_FILE
+
+/* Server Start Hooks: */
+EOF
+for HOOK in $START_FUNCS; do
+HOOKNAME=`echo $HOOK |sed "s;ServerStartModule_;;"`
+# Add this entry point to the .c file
+cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Starting $HOOKNAME\n");
+#endif
+       $HOOK();
+EOF
+# Add this entry point to the .h file
+cat <<EOF >> $H_FILE
+extern void $HOOK(void);
+EOF
+done
+
+
+#********************************************************************************
+# server module  ******** initialisation ********  logic.
+#********************************************************************************
+cat <<EOF >> $H_FILE
+
+/* Server Init Hooks: */
+EOF
+
+cat <<EOF  >>$C_FILE
+}
+
+
+void initialise_modules (void)
+{
+
+EOF
+for HOOK in $INIT_FUNCS; do
+    HOOKNAME=`echo $HOOK |sed "s;InitModule_;;"`
+# Add this entry point to the .c file
+    cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Initializing $HOOKNAME\n");
+#endif
+       $HOOK();
+EOF
+# Add this entry point to the .h file
+    cat <<EOF >> $H_FILE
+extern void $HOOK(void);
+EOF
+done
+
+#********************************************************************************
+# server module  ******** initialisation ********  second stage.
+#********************************************************************************
+cat <<EOF >> $H_FILE
+
+/* Server Init Hooks: */
+EOF
+
+cat <<EOF  >>$C_FILE
+}
+
+
+void initialise2_modules (void)
+{
+
+EOF
+for HOOK in $INIT2_FUNCS; do
+    HOOKNAME=`echo $HOOK |sed "s;InitModule2_;;"`
+# Add this entry point to the .c file
+    cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Initializing $HOOKNAME\n");
+#endif
+       $HOOK();
+EOF
+# Add this entry point to the .h file
+    cat <<EOF >> $H_FILE
+extern void $HOOK(void);
+EOF
+done
+
+
+
+#********************************************************************************
+# server module    ***** shutdown *****  logic.
+#********************************************************************************
+cat <<EOF >> $H_FILE
+
+/* Server shutdown Hooks: */
+EOF
+cat <<EOF  >>$C_FILE
+}
+
+
+void shutdown_modules (void)
+{
+
+EOF
+for HOOK in $SHUTDOWN_FUNCS; do
+HOOKNAME=`echo $HOOK |sed "s;ServerShutdownModule_;;"`
+# Add this entry point to the .c file
+cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Shutting down $HOOKNAME\n");
+#endif
+       $HOOK();
+EOF
+# Add this entry point to the .h file
+cat <<EOF >> $H_FILE
+extern void $HOOK(void);
+EOF
+done
+
+
+
+
+#********************************************************************************
+# NEW-session module logic.
+#********************************************************************************
+cat <<EOF >> $H_FILE
+
+/* Session New Hooks: */
+EOF
+cat <<EOF  >>$C_FILE
+}
+
+
+void session_new_modules (wcsession *sess)
+{
+
+EOF
+for HOOK in $SESS_NEW_FUNCS; do
+HOOKNAME=`echo $HOOK |sed "s;SessionNewModule_;;"`
+# Add this entry point to the .c file
+cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Initializing $HOOKNAME\n");
+#endif
+       $HOOK(sess);
+EOF
+# Add this entry point to the .h file
+cat <<EOF >> $H_FILE
+extern void $HOOK(wcsession *sess);
+EOF
+done
+
+
+
+#********************************************************************************
+# ATTACH-Session module logic.
+#********************************************************************************
+cat <<EOF >> $H_FILE
+
+/* Session Attach Hooks: */
+EOF
+cat <<EOF  >>$C_FILE
+}
+
+
+void session_attach_modules (wcsession *sess)
+{
+
+EOF
+for HOOK in $SESS_ATTACH_FUNCS; do
+HOOKNAME=`echo $HOOK |sed "s;SessionAttachModule_;;"`
+# Add this entry point to the .c file
+cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Attaching Session; $HOOKNAME\n");
+#endif
+       $HOOK(sess);
+EOF
+# Add this entry point to the .h file
+cat <<EOF >> $H_FILE
+extern void $HOOK(wcsession *sess);
+EOF
+done
+
+
+
+#********************************************************************************
+# DETACH-Session module logic.
+#********************************************************************************
+cat <<EOF >> $H_FILE
+
+/* Session detach Hooks: */
+EOF
+cat <<EOF  >>$C_FILE
+}
+
+
+void session_detach_modules (wcsession *sess)
+{
+
+EOF
+for HOOK in $SESS_DETACH_FUNCS; do
+HOOKNAME=`echo $HOOK |sed "s;SessionDetachModule_;;"`
+# Add this entry point to the .c file
+cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Initializing $HOOKNAME\n");
+#endif
+       $HOOK(sess);
+EOF
+# Add this entry point to the .h file
+cat <<EOF >> $H_FILE
+extern void $HOOK(wcsession *sess);
+EOF
+done
+
+
+
+
+#********************************************************************************
+# DESTROY-Session module logic.
+#********************************************************************************
+cat <<EOF >> $H_FILE
+
+/* Session destroy Hooks: */
+EOF
+cat <<EOF  >>$C_FILE
+}
+
+
+void session_destroy_modules (wcsession **sess)
+{
+
+EOF
+for HOOK in $SESS_DESTROY_FUNCS; do
+HOOKNAME=`echo $HOOK |sed "s;SessionDestroyModule_;;"`
+# Add this entry point to the .c file
+cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Initializing $HOOKNAME\n");
+#endif
+       $HOOK(*sess);
+EOF
+# Add this entry point to the .h file
+cat <<EOF >> $H_FILE
+extern void $HOOK(wcsession *sess);
+EOF
+done
+
+
+cat <<EOF  >>$C_FILE
+       free((*sess));
+       (*sess) = NULL;
+}
+
+
+EOF
+
+
+
+
+
+#********************************************************************************
+# NEW-Httprequest module logic.
+#********************************************************************************
+cat <<EOF >> $C_FILE
+
+void http_new_modules (ParsedHttpHdrs *httpreq)
+{
+EOF
+
+for HOOK in $HTTP_NEW_FUNCS; do
+HOOKNAME=`echo $HOOK |sed "s;HttpNewModule_;;"`
+# Add this entry point to the .c file
+cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "NEW $HOOKNAME\n");
+#endif
+       $HOOK(httpreq);
+EOF
+# Add this entry point to the .h file
+cat <<EOF >> $H_FILE
+extern void $HOOK(ParsedHttpHdrs *httpreq);
+EOF
+done
+
+cat <<EOF  >>$C_FILE
+}
+EOF
+
+#********************************************************************************
+# DETACH-Httprequest module logic.
+#********************************************************************************
+cat <<EOF >> $C_FILE
+
+void http_detach_modules (ParsedHttpHdrs *httpreq)
+{
+EOF
+
+for HOOK in $HTTP_DETACH_FUNCS; do
+HOOKNAME=`echo $HOOK |sed "s;HttpDetachModule_;;"`
+# Add this entry point to the .c file
+cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Detaching $HOOKNAME\n");
+#endif
+       $HOOK(httpreq);
+EOF
+# Add this entry point to the .h file
+cat <<EOF >> $H_FILE
+extern void $HOOK(ParsedHttpHdrs *httpreq);
+EOF
+done
+
+cat <<EOF  >>$C_FILE
+}
+EOF
+
+
+#********************************************************************************
+# DESTROY-Httprequest module logic.
+#********************************************************************************
+cat <<EOF >> $C_FILE
+
+void http_destroy_modules (ParsedHttpHdrs *httpreq)
+{
+EOF
+
+for HOOK in $HTTP_DESTROY_FUNCS; do
+HOOKNAME=`echo $HOOK |sed "s;HttpDestroyModule_;;"`
+# Add this entry point to the .c file
+cat <<EOF >> $C_FILE
+#ifdef DBG_PRINNT_HOOKS_AT_START
+       syslog(LOG_DEBUG, "Destructing $HOOKNAME\n");
+#endif
+       $HOOK(httpreq);
+EOF
+# Add this entry point to the .h file
+cat <<EOF >> $H_FILE
+extern void $HOOK(ParsedHttpHdrs *httpreq);
+EOF
+done
+
+cat <<EOF  >>$C_FILE
+}
+EOF
+
+
+
+
+
+
+
+cat <<EOF  >> $H_FILE
+
+#endif /* MODULES_INIT_H */
+
+EOF
diff --git a/webcit/serv_func.c b/webcit/serv_func.c
new file mode 100644 (file)
index 0000000..88af202
--- /dev/null
@@ -0,0 +1,640 @@
+// Functions which handle communication with the Citadel server.
+//
+// Copyright (c) 1996-2021 by the citadel.org team
+//
+// This program is open source software.  You can redistribute it and/or
+// modify it under the terms of the GNU General Public License, version 3.
+
+#include "webcit.h"
+#include "webserver.h"
+
+HashList *EmbeddableMimes = NULL;
+StrBuf *EmbeddableMimeStrs = NULL;
+
+void SetInlinMimeRenderers(void) {
+       StrBuf *Buf;
+
+       Buf = NewStrBuf();
+
+       /* Tell the server what kind of richtext we prefer */
+       serv_putbuf(EmbeddableMimeStrs);
+       StrBuf_ServGetln(Buf);
+
+       FreeStrBuf(&Buf);
+}
+
+
+void DeleteServInfo(ServInfo **FreeMe) {
+       if (*FreeMe == NULL)
+               return;
+       FreeStrBuf(&(*FreeMe)->serv_nodename);
+       FreeStrBuf(&(*FreeMe)->serv_humannode);
+       FreeStrBuf(&(*FreeMe)->serv_fqdn);
+       FreeStrBuf(&(*FreeMe)->serv_software);
+       FreeStrBuf(&(*FreeMe)->serv_bbs_city);
+       FreeStrBuf(&(*FreeMe)->serv_sysadm);
+       FreeStrBuf(&(*FreeMe)->serv_default_cal_zone);
+       FreeStrBuf(&(*FreeMe)->serv_svn_revision);
+       free(*FreeMe);
+       *FreeMe = NULL;
+}
+
+/*
+ * get info about the server we've connected to
+ *
+ * browser_host                the citadel we want to connect to
+ * user_agent          which browser uses our client?
+ */
+ServInfo *get_serv_info(StrBuf *browser_host, StrBuf *user_agent) {
+       ServInfo *info;
+       StrBuf *Buf;
+       int a;
+       int rc;
+
+       Buf = NewStrBuf();
+
+       /* Tell the server what kind of client is connecting */
+       serv_printf("IDEN %d|%d|%d|%s|%s",
+                   DEVELOPER_ID,
+                   CLIENT_ID,
+                   CLIENT_VERSION,
+                   ChrPtr(user_agent),
+                   ChrPtr(browser_host)
+       );
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 2) {
+               syslog(LOG_WARNING, "get_serv_info(IDEN): unexpected answer [%s]\n",
+                       ChrPtr(Buf));
+               FreeStrBuf(&Buf);
+               return NULL;
+       }
+
+       /*
+        * Tell the server that when we save a calendar event, we
+        * want invitations to be generated by the Citadel server
+        * instead of by the client.
+        */
+       serv_puts("ICAL sgi|1");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 2) {
+               syslog(LOG_WARNING, "get_serv_info(ICAL sgi|1): unexpected answer [%s]\n",
+                       ChrPtr(Buf));
+               FreeStrBuf(&Buf);
+               return NULL;
+       }
+
+       /* Now ask the server to tell us a little bit about itself... */
+       serv_puts("INFO");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 1) {
+               syslog(LOG_WARNING, "get_serv_info(INFO sgi|1): unexpected answer [%s]\n",
+                       ChrPtr(Buf));
+               FreeStrBuf(&Buf);
+               return NULL;
+       }
+
+       info = (ServInfo*)malloc(sizeof(ServInfo));
+       memset(info, 0, sizeof(ServInfo));
+       a = 0;
+       while (rc = StrBuf_ServGetln(Buf),
+              (rc >= 0) &&
+              ((rc != 3) || 
+               strcmp(ChrPtr(Buf), "000")))
+       {
+               switch (a) {
+               case 0:
+                       info->serv_pid = StrToi(Buf);
+                       WC->ctdl_pid = info->serv_pid;
+                       break;
+               case 1:
+                       info->serv_nodename = NewStrBufDup(Buf);
+                       break;
+               case 2:
+                       info->serv_humannode = NewStrBufDup(Buf);
+                       break;
+               case 3:
+                       info->serv_fqdn = NewStrBufDup(Buf);
+                       break;
+               case 4:
+                       info->serv_software = NewStrBufDup(Buf);
+                       break;
+               case 5:
+                       info->serv_rev_level = StrToi(Buf);
+                       break;
+               case 6:
+                       info->serv_bbs_city = NewStrBufDup(Buf);
+                       break;
+               case 7:
+                       info->serv_sysadm = NewStrBufDup(Buf);
+                       break;
+               case 14:
+                       info->serv_supports_ldap = StrToi(Buf);
+                       break;
+               case 15:
+                       info->serv_newuser_disabled = StrToi(Buf);
+                       break;
+               case 16:
+                       info->serv_default_cal_zone = NewStrBufDup(Buf);
+                       break;
+               case 20:
+                       info->serv_supports_sieve = StrToi(Buf);
+                       break;
+               case 21:
+                       info->serv_fulltext_enabled = StrToi(Buf);
+                       break;
+               case 22:
+                       info->serv_svn_revision = NewStrBufDup(Buf);
+                       break;
+               case 23:
+                       info->serv_supports_openid = StrToi(Buf);
+                       break;
+               case 24:
+                       info->serv_supports_guest = StrToi(Buf);
+                       break;
+               }
+               ++a;
+       }
+       FreeStrBuf(&Buf);
+       return info;
+}
+
+int GetConnected (void) {
+       StrBuf *Buf;
+
+       if (WC->ReadBuf == NULL) {
+               WC->ReadBuf = NewStrBufPlain(NULL, SIZ * 4);
+       }
+
+       static char serv_sock_name[PATH_MAX] = "";
+       if (IsEmptyStr(serv_sock_name)) {
+               snprintf(serv_sock_name, sizeof serv_sock_name, "%s/citadel.socket", ctdl_dir);
+       }
+       WC->serv_sock = connect_to_citadel(serv_sock_name);
+       
+       if (WC->serv_sock < 0) {
+               WC->connected = 0;
+               FreeStrBuf(&WC->ReadBuf);
+               return 1;
+       }
+       else {
+               long Status;
+               int short_status;
+               Buf = NewStrBuf();
+               WC->connected = 1;
+               StrBuf_ServGetln(Buf);  /* get the server greeting */
+               short_status = GetServerStatus(Buf, &Status);
+               FreeStrBuf(&Buf);
+
+               /* Server isn't ready for us? */
+               if (short_status != 2) {
+                       if (Status == 551) {
+                               hprintf("HTTP/1.1 503 Service Unavailable\r\n");
+                               hprintf("Content-type: text/plain; charset=utf-8\r\n");
+                               wc_printf(_("This server is already serving its maximum number of users and cannot accept any additional logins at this time.  Please try again later or contact your system administrator."));
+                       }
+                       else {
+                               wc_printf("%ld %s\n",
+                                       Status,
+                                       _("Received unexpected answer from Citadel server; bailing out.")
+                               );
+                               hprintf("HTTP/1.1 502 Bad Gateway\r\n");
+                               hprintf("Content-type: text/plain; charset=utf-8\r\n");
+                       }
+                       end_burst();
+                       end_webcit_session();
+                       return 1;
+               }
+
+               /*
+                * From what host is our user connecting?  Go with
+                * the host at the other end of the HTTP socket,
+                * unless we are following X-Forwarded-For: headers
+                * and such a header has already turned up something.
+                */
+               if ( (!follow_xff) || (StrLength(WC->Hdr->HR.browser_host) == 0) ) {
+                       if (WC->Hdr->HR.browser_host == NULL) {
+                               WC->Hdr->HR.browser_host = NewStrBuf();
+                               Put(WC->Hdr->HTTPHeaders, HKEY("FreeMeWithTheOtherHeaders"), 
+                                   WC->Hdr->HR.browser_host, HFreeStrBuf);
+                       }
+                       locate_host(WC->Hdr->HR.browser_host, WC->Hdr->http_sock);
+               }
+               if (WC->serv_info == NULL) {
+                       WC->serv_info = get_serv_info(WC->Hdr->HR.browser_host, WC->Hdr->HR.user_agent);
+               }
+               if (WC->serv_info == NULL){
+                       begin_burst();
+                       wc_printf(_("Received unexpected answer from Citadel server; bailing out."));
+                       hprintf("HTTP/1.1 502 Bad Gateway\r\n");
+                       hprintf("Content-type: text/plain; charset=utf-8\r\n");
+                       end_burst();
+                       end_webcit_session();
+                       return 1;
+               }
+               if (WC->serv_info->serv_rev_level < MINIMUM_CIT_VERSION) {
+                       begin_burst();
+                       wc_printf(_("You are connected to a Citadel "
+                                 "server running Citadel %d.%02d. \n"
+                                 "In order to run this version of WebCit "
+                                 "you must also have Citadel %d.%02d or"
+                                 " newer.\n\n\n"),
+                               WC->serv_info->serv_rev_level,
+                               0,
+                               MINIMUM_CIT_VERSION,
+                               0
+                               );
+                       hprintf("HTTP/1.1 200 OK\r\n");
+                       hprintf("Content-type: text/plain; charset=utf-8\r\n");
+                       end_burst();
+                       end_webcit_session();
+                       return 1;
+               }
+               SetInlinMimeRenderers();
+       }
+       return 0;
+}
+
+
+void FmOut(StrBuf *Target, const char *align, const StrBuf *Source) {
+       const char *ptr, *pte;
+       const char *BufPtr = NULL;
+       StrBuf *Line = NewStrBufPlain(NULL, SIZ);
+       StrBuf *Line1 = NewStrBufPlain(NULL, SIZ);
+       StrBuf *Line2 = NewStrBufPlain(NULL, SIZ);
+       int bn = 0;
+       int bq = 0;
+       int i;
+       long len;
+       int intext = 0;
+
+       StrBufAppendPrintf(Target, "<div class=\"fmout-%s\">\n", align);
+
+       if (StrLength(Source) > 0) 
+               do 
+               {
+                       StrBufSipLine(Line, Source, &BufPtr);
+                       bq = 0;
+                       i = 0;
+                       ptr = ChrPtr(Line);
+                       len = StrLength(Line);
+                       pte = ptr + len;
+
+                       if ((intext == 1) && (isspace(*ptr))) {
+                               StrBufAppendBufPlain(Target, HKEY("<br>"), 0);
+                       }
+                       intext = 1;
+                       if (isspace(*ptr)) while ((ptr < pte) &&
+                                                 ((*ptr == '>') ||
+                                                  isspace(*ptr)))
+                                          {
+                                                  if (*ptr == '>')
+                                                          bq++;
+                                                  ptr ++;
+                                                  i++;
+                                          }
+
+                       /*
+                        * Quoted text should be displayed in italics and in a
+                        * different colour.  This code understands Citadel-style
+                        * " >" quotes and will convert to <BLOCKQUOTE> tags.
+                        */
+                       if (i > 0) StrBufCutLeft(Line, i);
+               
+
+                       for (i = bn; i < bq; i++)                               
+                               StrBufAppendBufPlain(Target, HKEY("<blockquote>"), 0);
+                       for (i = bq; i < bn; i++)                               
+                               StrBufAppendBufPlain(Target, HKEY("</blockquote>"), 0);
+                       bn = bq;
+
+                       if (StrLength(Line) == 0)
+                               continue;
+
+                       /* Activate embedded URL's */
+                       UrlizeText(Line1, Line, Line2);
+
+                       StrEscAppend(Target, Line1, NULL, 0, 0);
+
+                       StrBufAppendBufPlain(Target, HKEY("\n"), 0);
+               }
+               while ((BufPtr != StrBufNOTNULL) &&
+                      (BufPtr != NULL));
+
+       for (i = 0; i < bn; i++) {
+               StrBufAppendBufPlain(Target, HKEY("</blockquote>"), 0);
+       }
+       StrBufAppendBufPlain(Target, HKEY("</div><br>\n"), 0);
+       FreeStrBuf(&Line);
+       FreeStrBuf(&Line1);
+       FreeStrBuf(&Line2);
+}
+
+
+
+/*
+ *  Transmit message text (in memory) to the server.
+ */
+void text_to_server(char *ptr) {
+       char buf[256];
+       int ch, a, pos, len;
+
+       pos = 0;
+       buf[0] = 0;
+
+       while (ptr[pos] != 0) {
+               ch = ptr[pos++];
+               if (ch == 13) {
+                       // ignore CR characters
+               }
+               else if (ch == 10) {
+                       len = strlen(buf);
+                       while ( (isspace(buf[len - 1]))
+                               && (buf[0] !=  '\0') 
+                               && (buf[1] !=  '\0') )
+                               buf[--len] = 0;
+                       serv_puts(buf);
+                       buf[0] = 0;
+                       if (ptr[pos] != 0) strcat(buf, " ");
+               } else {
+                       a = strlen(buf);
+                       buf[a + 1] = 0;
+                       buf[a] = ch;
+                       if ((ch == 32) && (strlen(buf) > 200)) {
+                               buf[a] = 0;
+                               serv_puts(buf);
+                               buf[0] = 0;
+                       }
+                       if (strlen(buf) > 250) {
+                               serv_puts(buf);
+                               buf[0] = 0;
+                       }
+               }
+       }
+       serv_puts(buf);
+}
+
+
+/*
+ * Transmit message text (in memory) to the server, converting to Quoted-Printable encoding as we go.
+ */
+void text_to_server_qp(const StrBuf *SendMeEncoded) {
+       StrBuf *ServBuf;
+
+       ServBuf = StrBufRFC2047encodeMessage(SendMeEncoded);
+       serv_putbuf(ServBuf);
+       FreeStrBuf(&ServBuf);
+}
+
+
+
+
+/*
+ * translate server message output to text (used for editing room info files and such)
+ */
+void server_to_text() {
+       char buf[SIZ];
+
+       int count = 0;
+
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               if ((buf[0] == 32) && (count > 0)) {
+                       wc_printf("\n");
+               }
+               wc_printf("%s", buf);
+               ++count;
+       }
+}
+
+
+
+
+/*
+ * Read text from server, appending to a string buffer until the
+ * usual 000 terminator is found.  Caller is responsible for freeing
+ * the returned pointer.
+ */
+int read_server_text(StrBuf *Buf, long *nLines) {
+       StrBuf *ReadBuf;
+       long nRead;
+       long nTotal = 0;
+       long nlines;
+       
+       nlines = 0;
+       ReadBuf = NewStrBuf();
+       while ((WC->serv_sock!=-1) &&
+              (nRead = StrBuf_ServGetln(ReadBuf), (nRead >= 0) &&
+               ((nRead != 3)||(strcmp(ChrPtr(ReadBuf), "000") != 0))))
+       {
+               StrBufAppendBuf(Buf, ReadBuf, 0);
+               StrBufAppendBufPlain(Buf, HKEY("\n"), 0);
+               nTotal += nRead;
+               nlines ++;
+       }
+       FreeStrBuf(&ReadBuf);
+       *nLines = nlines;
+       return nTotal;
+}
+
+
+int GetServerStatusMsg(StrBuf *Line, long* FullState, int PutImportantMessage, int MajorOK) {
+       int rc;
+       if (FullState != NULL)
+               *FullState = StrTol(Line);
+       rc = ChrPtr(Line)[0] - 48;
+       if ((!PutImportantMessage) || 
+           (MajorOK == rc)||
+           (StrLength(Line) <= 4))
+               return rc;
+
+       AppendImportantMessage(ChrPtr(Line) + 4, StrLength(Line) - 4);
+       return rc;
+}
+
+
+void tmplput_serv_ip(StrBuf *Target, WCTemplputParams *TP) {
+       StrBufAppendPrintf(Target, "%d", WC->ctdl_pid);
+}
+
+void tmplput_serv_admin(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return;
+       StrBufAppendTemplate(Target, TP, WC->serv_info->serv_sysadm, 0);
+}
+
+void tmplput_serv_nodename(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return;
+       StrBufAppendTemplate(Target, TP, WC->serv_info->serv_nodename, 0);
+}
+
+void tmplput_serv_humannode(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return;
+       StrBufAppendTemplate(Target, TP, WC->serv_info->serv_humannode, 0);
+}
+
+void tmplput_serv_fqdn(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return;
+       StrBufAppendTemplate(Target, TP, WC->serv_info->serv_fqdn, 0);
+}
+
+void tmplput_serv_software(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return;
+       StrBufAppendTemplate(Target, TP, WC->serv_info->serv_software, 0);
+}
+
+void tmplput_serv_rev_level(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL) return;
+       StrBufAppendPrintf(Target, "%d", WC->serv_info->serv_rev_level);
+}
+int conditional_serv_newuser_disabled(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return 0;
+       return WC->serv_info->serv_newuser_disabled != 0;
+}
+
+int conditional_serv_supports_guest(StrBuf *Target, WCTemplputParams *TP) {
+        if (WC->serv_info == NULL)
+               return 0;
+        return WC->serv_info->serv_supports_guest != 0;
+}
+
+int conditional_serv_supports_openid(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return 0;
+       return WC->serv_info->serv_supports_openid != 0;
+}
+
+int conditional_serv_fulltext_enabled(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return 0;
+       return WC->serv_info->serv_fulltext_enabled != 0;
+}
+
+int conditional_serv_ldap_enabled(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return 0;
+       return WC->serv_info->serv_supports_ldap != 0;
+}
+
+void tmplput_serv_bbs_city(StrBuf *Target, WCTemplputParams *TP) {
+       if (WC->serv_info == NULL)
+               return;
+       StrBufAppendTemplate(Target, TP, WC->serv_info->serv_bbs_city, 0);
+}
+
+void tmplput_mesg(StrBuf *Target, WCTemplputParams *TP) {
+       int n = 0;
+       int Done = 0;
+       StrBuf *Line;
+       StrBuf *Buf;
+
+       Buf = NewStrBuf();
+       Line = NewStrBuf();
+       serv_printf("MESG %s", TP->Tokens->Params[0]->Start);
+
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, NULL) == 1) {
+               while (!Done &&  (StrBuf_ServGetln(Line)>=0)) {
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000")) 
+                               Done = 1;
+                       else
+                       {
+                               if (n > 0)
+                                       StrBufAppendBufPlain(Buf, "\n", 1, 0);
+                               StrBufAppendBuf(Buf, Line, 0);
+                       }
+                       n++;
+               }
+       
+               FlushStrBuf(Line);
+               FmOut(Line, "center", Buf);
+               StrBufAppendTemplate(Target, TP, Line, 1);
+       }
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&Line);
+}
+
+void tmplput_site_prefix(StrBuf *Target, WCTemplputParams *TP) {
+       if ((WC != NULL) && (WC->Hdr->HostHeader != NULL)) {
+               StrBufAppendTemplate(Target, TP, WC->Hdr->HostHeader, 0);
+       }
+}
+
+void RegisterEmbeddableMimeType(const char *MimeType, long MTLen, int Priority) {
+       StrBuf *MT;
+       MT = NewStrBufPlain(MimeType, MTLen);
+       Put(EmbeddableMimes, IKEY(Priority), MT, HFreeStrBuf);
+}
+
+void CreateMimeStr(void) {
+       HashPos  *it;
+       void *vMime;
+       long len = 0;
+       const char *Key;
+
+       it = GetNewHashPos(EmbeddableMimes, 0);
+       while (GetNextHashPos(EmbeddableMimes, it, &len, &Key, &vMime) &&
+               (vMime != NULL)) {
+               if (StrLength(EmbeddableMimeStrs) > 0)
+                       StrBufAppendBufPlain(EmbeddableMimeStrs, HKEY("|"), 0);
+               else 
+                       StrBufAppendBufPlain(EmbeddableMimeStrs, HKEY("MSGP "), 0);
+               StrBufAppendBuf(EmbeddableMimeStrs, (StrBuf*) vMime, 0);
+       }
+       DeleteHashPos(&it);
+}
+
+void
+ServerStartModule_SERV_FUNC
+(void)
+{
+       EmbeddableMimes = NewHash(1, Flathash);
+       EmbeddableMimeStrs = NewStrBuf();
+}
+
+
+void
+ServerShutdownModule_SERV_FUNC
+(void)
+{
+       FreeStrBuf(&EmbeddableMimeStrs);
+       DeleteHash(&EmbeddableMimes);
+}
+
+void 
+InitModule_SERVFUNC
+(void)
+{
+       RegisterConditional("COND:SERV:OPENID", 2, conditional_serv_supports_openid, CTX_NONE);
+       RegisterConditional("COND:SERV:NEWU", 2, conditional_serv_newuser_disabled, CTX_NONE);
+       RegisterConditional("COND:SERV:FULLTEXT_ENABLED", 2, conditional_serv_fulltext_enabled, CTX_NONE);
+       RegisterConditional("COND:SERV:LDAP_ENABLED", 2, conditional_serv_ldap_enabled, CTX_NONE);
+        RegisterConditional("COND:SERV:SUPPORTS_GUEST", 2, conditional_serv_supports_guest, CTX_NONE);
+       RegisterNamespace("SERV:PID", 0, 0, tmplput_serv_ip, NULL, CTX_NONE);
+       RegisterNamespace("SERV:NODENAME", 0, 1, tmplput_serv_nodename, NULL, CTX_NONE);
+       RegisterNamespace("SERV:HUMANNODE", 0, 1, tmplput_serv_humannode, NULL, CTX_NONE);
+       RegisterNamespace("SERV:FQDN", 0, 1, tmplput_serv_fqdn, NULL, CTX_NONE);
+       
+       RegisterNamespace("SERV:SOFTWARE", 0, 1, tmplput_serv_software, NULL, CTX_NONE);
+       RegisterNamespace("SERV:REV_LEVEL", 0, 0, tmplput_serv_rev_level, NULL, CTX_NONE);
+       RegisterNamespace("SERV:BBS_CITY", 0, 1, tmplput_serv_bbs_city, NULL, CTX_NONE);
+       RegisterNamespace("SERV:MESG", 1, 2, tmplput_mesg, NULL, CTX_NONE);
+       RegisterNamespace("SERV:ADMIN", 0, 1, tmplput_serv_admin, NULL, CTX_NONE);
+
+       RegisterNamespace("SERV:SITE:PREFIX", 0, 1, tmplput_site_prefix, NULL, CTX_NONE);
+
+
+}
+
+
+
+void 
+SessionDestroyModule_SERVFUNC
+(wcsession *sess)
+{
+       DeleteServInfo(&sess->serv_info);
+}
diff --git a/webcit/sieve.c b/webcit/sieve.c
new file mode 100644 (file)
index 0000000..2e3d615
--- /dev/null
@@ -0,0 +1,644 @@
+/*
+ * Copyright (c) 1996-2020 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 3.
+ *
+ * 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.
+ *
+ * 
+ * Implementation note: this was kind of hacked up when we switched from Sieve to custom rules.
+ * As a result there's probably some cruft in here...
+ * ajc 2020jul12
+ *
+ */
+
+#include "webcit.h"
+
+CtxType CTX_SIEVELIST = CTX_NONE;
+CtxType CTX_SIEVESCRIPT = CTX_NONE;
+
+#define MAX_SCRIPTS    100
+#define MAX_RULES      50
+#define RULES_SCRIPT   "__WebCit_Generated_Script__"
+
+
+/*
+ * Translate the fields from the rule editor into something we can save...
+ */
+void parse_fields_from_rule_editor(void) {
+
+       int active;
+       char hfield[256];
+       char compare[32];
+       char htext[256];
+       char sizecomp[32];
+       int sizeval;
+       char action[32];
+       char fileinto[128];
+       char redirect[256];
+       char automsg[1024];
+       char final[32];
+       int i;
+       char buf[256];
+       char fname[256];
+       char rule[2048];
+       char encoded_rule[4096];
+       char my_addresses[4096];
+       
+       /* Enumerate my email addresses in case they are needed for a vacation rule */
+       my_addresses[0] = 0;
+       serv_puts("GVEA");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               if (!IsEmptyStr(my_addresses)) {
+                       strcat(my_addresses, ",\n");
+               }
+               strcat(my_addresses, "\"");
+               strcat(my_addresses, buf);
+               strcat(my_addresses, "\"");
+       }
+
+       /* Now generate the script and write it to the Citadel server */
+       serv_printf("PIBR");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '4') {
+               return;
+       }
+
+       for (i=0; i<MAX_RULES; ++i) {
+               
+               strcpy(rule, "");
+
+               sprintf(fname, "active%d", i);
+               active = !strcasecmp(BSTR(fname), "on") ;
+
+               if (active) {
+
+                       sprintf(fname, "hfield%d", i);
+                       safestrncpy(hfield, BSTR(fname), sizeof hfield);
+       
+                       sprintf(fname, "compare%d", i);
+                       safestrncpy(compare, BSTR(fname), sizeof compare);
+       
+                       sprintf(fname, "htext%d", i);
+                       safestrncpy(htext, BSTR(fname), sizeof htext);
+       
+                       sprintf(fname, "sizecomp%d", i);
+                       safestrncpy(sizecomp, BSTR(fname), sizeof sizecomp);
+       
+                       sprintf(fname, "sizeval%d", i);
+                       sizeval = IBSTR(fname);
+       
+                       sprintf(fname, "action%d", i);
+                       safestrncpy(action, BSTR(fname), sizeof action);
+       
+                       sprintf(fname, "fileinto%d", i);
+                       safestrncpy(fileinto, BSTR(fname), sizeof fileinto);
+       
+                       sprintf(fname, "redirect%d", i);
+                       safestrncpy(redirect, BSTR(fname), sizeof redirect);
+       
+                       sprintf(fname, "automsg%d", i);
+                       safestrncpy(automsg, BSTR(fname), sizeof automsg);
+       
+                       sprintf(fname, "final%d", i);
+                       safestrncpy(final, BSTR(fname), sizeof final);
+       
+                       snprintf(rule, sizeof rule, "%d|%s|%s|%s|%s|%d|%s|%s|%s|%s|%s",
+                               active, hfield, compare, htext, sizecomp, sizeval, action, fileinto,
+                               redirect, automsg, final
+                       );
+       
+                       size_t len = CtdlEncodeBase64(encoded_rule, rule, strlen(rule)+1, BASE64_NO_LINEBREAKS);
+                       if (encoded_rule[len - 1] == '\n') {
+                               encoded_rule[len - 1] = '\0';
+                       }
+                       serv_printf("rule|%d|%s|", i, encoded_rule);
+                       serv_puts("");
+               }
+       }
+
+       serv_puts("000");
+}
+
+
+/*
+ * save sieve config
+ */
+void save_sieve(void) {
+
+       if (!havebstr("save_button")) {
+               AppendImportantMessage(_("Cancelled.  Changes were not saved."), -1);
+               display_main_menu();
+               return;
+       }
+
+       parse_fields_from_rule_editor();
+
+       AppendImportantMessage(_("Your changes have been saved."), -1);
+       display_main_menu();
+       return;
+}
+
+
+void display_sieve_add_or_delete(void) {
+       output_headers(1, 1, 2, 0, 0, 0);
+       do_template("sieve_add");
+       wDumpContent(1);
+}
+
+
+
+/*
+ * dummy panel indicating to the user that the server doesn't support Sieve
+ */
+void display_no_sieve(void) {
+
+       output_headers(1, 1, 1, 0, 0, 0);
+       do_template("sieve_none");
+       wDumpContent(1);
+}
+
+
+typedef struct __SieveListing {
+       int IsActive;
+       int IsRulesScript;
+       StrBuf *Name;
+       StrBuf *Content;
+} SieveListing;
+
+int ConditionalSieveScriptIsActive(StrBuf *Target, WCTemplputParams *TP)
+{
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
+       return SieveList->IsActive;
+}
+int ConditionalSieveScriptIsRulesScript(StrBuf *Target, WCTemplputParams *TP)
+{
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
+       return SieveList->IsActive;
+}
+void tmplput_SieveScriptName(StrBuf *Target, WCTemplputParams *TP) 
+{
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
+       StrBufAppendTemplate(Target, TP, SieveList->Name, 0);
+}
+void tmplput_SieveScriptContent(StrBuf *Target, WCTemplputParams *TP) 
+{
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
+       StrBufAppendTemplate(Target, TP, SieveList->Content, 0);
+}
+void FreeSieveListing(void *vSieveListing)
+{
+       SieveListing *List = (SieveListing*) vSieveListing;
+
+       FreeStrBuf(&List->Name);
+       free(List);
+}
+
+HashList *GetSieveScriptListing(StrBuf *Target, WCTemplputParams *TP)
+{
+        wcsession *WCC = WC;
+       StrBuf *Line;
+       int num_scripts = 0;
+       int rules_script_active = 0;
+       int have_rules_script = 0;
+       const char *pch;
+       HashPos  *it;
+       int Done = 0;
+       SieveListing *Ruleset;
+
+       if (WCC->KnownSieveScripts != NULL) {
+               return WCC->KnownSieveScripts;
+       }
+
+       serv_puts("MSIV listscripts");
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, NULL) == 1) 
+       {
+               WCC->KnownSieveScripts = NewHash(1, Flathash);
+
+               while(!Done && (StrBuf_ServGetln(Line) >= 0) )
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {
+                               pch = NULL;
+                               Ruleset = (SieveListing *) malloc(sizeof(SieveListing));
+                               Ruleset->Name = NewStrBufPlain(NULL, StrLength(Line));
+                               StrBufExtract_NextToken(Ruleset->Name, Line, &pch, '|');
+                               Ruleset->IsActive = StrBufExtractNext_int(Line, &pch, '|'); 
+                               Ruleset->Content = NULL;
+
+                               if (!strcasecmp(ChrPtr(Ruleset->Name), RULES_SCRIPT))
+                               {
+                                       Ruleset->IsRulesScript = 1;
+                                       have_rules_script = 1;
+                                       if (Ruleset->IsActive)
+                                       {
+                                               rules_script_active = 1;
+                                               PutBstr(HKEY("__SIEVE:RULESSCRIPT"), NewStrBufPlain(HKEY("1")));
+                                       }
+                               }
+                               Put(WCC->KnownSieveScripts, IKEY(num_scripts), Ruleset, FreeSieveListing);
+
+                               ++num_scripts;
+                       }
+       }
+
+       if ((num_scripts > 0) && (rules_script_active == 0)) {
+               PutBstr(HKEY("__SIEVE:EXTERNAL_SCRIPT"), NewStrBufPlain(HKEY("1")));
+       }
+
+       if (num_scripts > have_rules_script)
+       {
+               long rc = 0;
+               long len;
+               const char *Key;
+               void *vRuleset;
+
+               /* 
+                * ok; we have custom scripts, expose that via bstr, and load the payload.
+                */
+               PutBstr(HKEY("__SIEVE:HAVE_EXTERNAL_SCRIPT"), NewStrBufPlain(HKEY("1")));
+
+               it = GetNewHashPos(WCC->KnownSieveScripts, 0);
+               while (GetNextHashPos(WCC->KnownSieveScripts, it, &len, &Key, &vRuleset) && 
+                      (vRuleset != NULL))
+               {
+                       Ruleset = (SieveListing *) vRuleset;
+                       serv_printf("MSIV getscript|%s", ChrPtr(Ruleset->Name));
+                       StrBuf_ServGetln(Line);
+                       if (GetServerStatus(Line, NULL) == 1) 
+                       {
+                               Ruleset->Content = NewStrBuf();
+                               Done = 0;
+                               while(!Done && (rc = StrBuf_ServGetln(Line), rc >= 0) )
+                                       if ( (StrLength(Line)==3) && 
+                                            !strcmp(ChrPtr(Line), "000")) 
+                                       {
+                                               Done = 1;
+                                       }
+                                       else
+                                       {
+                                               if (StrLength(Ruleset->Content)>0)
+                                                       StrBufAppendBufPlain(Ruleset->Content, HKEY("\n"), 0);
+                                               StrBufAppendBuf(Ruleset->Content, Line, 0);
+                                       }
+                               if (rc < 0) break;
+                       }
+               }
+       }
+       FreeStrBuf(&Line);
+       return WCC->KnownSieveScripts;
+}
+
+
+typedef enum __eSieveHfield 
+{
+       from,           
+       tocc,           
+       subject,        
+       replyto,        
+       sender, 
+       resentfrom,     
+       resentto,       
+       envfrom,        
+       envto,  
+       xmailer,        
+       xspamflag,      
+       xspamstatus,    
+       listid, 
+       size,           
+       all
+} eSieveHfield;
+
+typedef enum __eSieveCompare {
+       contains,
+       notcontains,
+       is,
+       isnot,
+       matches,
+       notmatches
+} eSieveCompare;
+
+typedef enum __eSieveAction {
+       keep,
+       discard,
+       reject,
+       fileinto,
+       redirect,
+       vacation
+} eSieveAction;
+
+
+typedef enum __eSieveSizeComp {
+       larger,
+       smaller
+} eSieveSizeComp;
+
+typedef enum __eSieveFinal {
+       econtinue,
+       estop
+} eSieveFinal;
+
+
+typedef struct __SieveRule {
+       int active;
+       int sizeval;
+       eSieveHfield hfield;
+       eSieveCompare compare;
+       StrBuf *htext;
+       eSieveSizeComp sizecomp;
+       eSieveAction Action;
+       StrBuf *fileinto;
+       StrBuf *redirect;
+       StrBuf *automsg;
+       eSieveFinal final;
+}SieveRule;
+
+
+
+int ConditionalSieveRule_hfield(StrBuf *Target, WCTemplputParams *TP)
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+       
+        return GetTemplateTokenNumber(Target, 
+                                      TP, 
+                                      3, 
+                                      from)
+                ==
+                Rule->hfield;
+}
+int ConditionalSieveRule_compare(StrBuf *Target, WCTemplputParams *TP)
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+        return GetTemplateTokenNumber(Target, 
+                                      TP, 
+                                      3, 
+                                      contains)
+                ==
+               Rule->compare;
+}
+int ConditionalSieveRule_action(StrBuf *Target, WCTemplputParams *TP)
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+        return GetTemplateTokenNumber(Target, 
+                                      TP, 
+                                      3, 
+                                      keep)
+                ==
+               Rule->Action; 
+}
+int ConditionalSieveRule_sizecomp(StrBuf *Target, WCTemplputParams *TP)
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+        return GetTemplateTokenNumber(Target, 
+                                      TP, 
+                                      3, 
+                                      larger)
+                ==
+               Rule->sizecomp;
+}
+int ConditionalSieveRule_final(StrBuf *Target, WCTemplputParams *TP)
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+        return GetTemplateTokenNumber(Target, 
+                                      TP, 
+                                      3, 
+                                      econtinue)
+                ==
+               Rule->final;
+}
+int ConditionalSieveRule_ThisRoom(StrBuf *Target, WCTemplputParams *TP)
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+        return GetTemplateTokenNumber(Target, 
+                                      TP, 
+                                      3, 
+                                      econtinue)
+                ==
+               Rule->final;
+}
+int ConditionalSieveRule_Active(StrBuf *Target, WCTemplputParams *TP)
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+        return Rule->active;
+}
+void tmplput_SieveRule_htext(StrBuf *Target, WCTemplputParams *TP) 
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+       StrBufAppendTemplate(Target, TP, Rule->htext, 0);
+}
+void tmplput_SieveRule_fileinto(StrBuf *Target, WCTemplputParams *TP) 
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+       StrBufAppendTemplate(Target, TP, Rule->fileinto, 0);
+}
+void tmplput_SieveRule_redirect(StrBuf *Target, WCTemplputParams *TP) 
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+       StrBufAppendTemplate(Target, TP, Rule->redirect, 0);
+}
+void tmplput_SieveRule_automsg(StrBuf *Target, WCTemplputParams *TP) 
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+       StrBufAppendTemplate(Target, TP, Rule->automsg, 0);
+}
+void tmplput_SieveRule_sizeval(StrBuf *Target, WCTemplputParams *TP) 
+{
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+       StrBufAppendPrintf(Target, "%d", Rule->sizeval);
+}
+
+void tmplput_SieveRule_lookup_FileIntoRoom(StrBuf *Target, WCTemplputParams *TP) 
+{
+       void *vRoom;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
+        wcsession *WCC = WC;
+       HashList *Rooms = GetRoomListHashLKRA(Target, TP);
+
+       GetHash(Rooms, SKEY(Rule->fileinto), &vRoom);
+       WCC->ThisRoom = (folder*) vRoom;
+}
+
+void FreeSieveRule(void *vRule)
+{
+       SieveRule *Rule = (SieveRule*) vRule;
+
+       FreeStrBuf(&Rule->htext);
+       FreeStrBuf(&Rule->fileinto);
+       FreeStrBuf(&Rule->redirect);
+       FreeStrBuf(&Rule->automsg);
+       
+       free(Rule);
+}
+
+#define WC_RULE_HEADER "rule|"
+HashList *GetSieveRules(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Line = NULL;
+       StrBuf *EncodedRule = NULL;
+       int n = 0;
+       const char *pch = NULL;
+       HashList *SieveRules = NULL;
+       int Done = 0;
+       SieveRule *Rule = NULL;
+
+       SieveRules = NewHash(1, Flathash);
+       serv_printf("GIBR");
+       Line = NewStrBuf();
+       EncodedRule = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, NULL) == 1) 
+       {
+               while(!Done && (StrBuf_ServGetln(Line) >= 0) )
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {
+                               pch = NULL;
+                               /* We just care for our encoded header and skip everything else */
+                               if ((StrLength(Line) > sizeof(WC_RULE_HEADER) - 1) && (!strncasecmp(ChrPtr(Line), HKEY(WC_RULE_HEADER))))
+                               {
+                                       StrBufSkip_NTokenS(Line, &pch, '|', 1);
+                                       n = StrBufExtractNext_int(Line, &pch, '|'); 
+                                       StrBufExtract_NextToken(EncodedRule, Line, &pch, '|');
+                                       StrBufDecodeBase64(EncodedRule);
+
+                                       Rule = (SieveRule*) malloc(sizeof(SieveRule));
+
+                                       Rule->htext = NewStrBufPlain (NULL, StrLength(EncodedRule));
+
+                                       Rule->fileinto = NewStrBufPlain (NULL, StrLength(EncodedRule));
+                                       Rule->redirect = NewStrBufPlain (NULL, StrLength(EncodedRule));
+                                       Rule->automsg = NewStrBufPlain (NULL, StrLength(EncodedRule));
+
+                                       /* Grab our existing values to populate */
+                                       pch = NULL;
+                                       Rule->active = StrBufExtractNext_int(EncodedRule, &pch, '|');
+                                       StrBufExtract_NextToken(Line, EncodedRule, &pch, '|');
+                                       
+                                       Rule->hfield = (eSieveHfield) GetTokenDefine(SKEY(Line), tocc);
+                                       StrBufExtract_NextToken(Line, EncodedRule, &pch, '|');
+                                       Rule->compare = (eSieveCompare) GetTokenDefine(SKEY(Line), contains);
+                                       StrBufExtract_NextToken(Rule->htext, EncodedRule, &pch, '|');
+                                       StrBufExtract_NextToken(Line, EncodedRule, &pch, '|');
+                                       Rule->sizecomp = (eSieveSizeComp) GetTokenDefine(SKEY(Line), larger);
+                                       Rule->sizeval = StrBufExtractNext_int(EncodedRule, &pch, '|');
+                                       StrBufExtract_NextToken(Line, EncodedRule, &pch, '|');
+                                       Rule->Action = (eSieveAction) GetTokenDefine(SKEY(Line), keep);
+                                       StrBufExtract_NextToken(Rule->fileinto, EncodedRule, &pch, '|');
+                                       StrBufExtract_NextToken(Rule->redirect, EncodedRule, &pch, '|');
+                                       StrBufExtract_NextToken(Rule->automsg, EncodedRule, &pch, '|');
+                                       StrBufExtract_NextToken(Line, EncodedRule, &pch, '|');
+                                       Rule->final = (eSieveFinal) GetTokenDefine(SKEY(Line), econtinue);
+                                       Put(SieveRules, IKEY(n), Rule, FreeSieveRule);
+                                       n++;
+                               }
+                       }
+       }
+
+       while (n < MAX_RULES) {
+               Rule = (SieveRule*) malloc(sizeof(SieveRule));
+               memset(Rule, 0, sizeof(SieveRule));
+               Put(SieveRules, IKEY(n), Rule, FreeSieveRule);
+           
+               n++;
+       }
+
+
+       FreeStrBuf(&EncodedRule);
+       FreeStrBuf(&Line);
+       return SieveRules;
+}
+
+void
+SessionDetachModule_SIEVE
+(wcsession *sess)
+{
+       DeleteHash(&sess->KnownSieveScripts);
+}
+
+void 
+InitModule_SIEVE
+(void)
+{
+       RegisterCTX(CTX_SIEVELIST);
+       RegisterCTX(CTX_SIEVESCRIPT);
+       REGISTERTokenParamDefine(from);         
+       REGISTERTokenParamDefine(tocc);         
+       REGISTERTokenParamDefine(subject);      
+       REGISTERTokenParamDefine(replyto);      
+       REGISTERTokenParamDefine(sender);       
+       REGISTERTokenParamDefine(resentfrom);   
+       REGISTERTokenParamDefine(resentto);     
+       REGISTERTokenParamDefine(envfrom);      
+       REGISTERTokenParamDefine(envto);        
+       REGISTERTokenParamDefine(xmailer);      
+       REGISTERTokenParamDefine(xspamflag);    
+       REGISTERTokenParamDefine(xspamstatus);  
+       REGISTERTokenParamDefine(listid);       
+       REGISTERTokenParamDefine(size);         
+       REGISTERTokenParamDefine(all);
+
+       REGISTERTokenParamDefine(contains);
+       REGISTERTokenParamDefine(notcontains);
+       REGISTERTokenParamDefine(is);
+       REGISTERTokenParamDefine(isnot);
+       REGISTERTokenParamDefine(matches);
+       REGISTERTokenParamDefine(notmatches);
+
+       REGISTERTokenParamDefine(keep);
+       REGISTERTokenParamDefine(discard);
+       REGISTERTokenParamDefine(reject);
+       REGISTERTokenParamDefine(fileinto);
+       REGISTERTokenParamDefine(redirect);
+       REGISTERTokenParamDefine(vacation);
+
+       REGISTERTokenParamDefine(larger);
+       REGISTERTokenParamDefine(smaller);
+
+       /* these are c-keyworads, so do it by hand. */
+       RegisterTokenParamDefine(HKEY("continue"), econtinue);
+       RegisterTokenParamDefine(HKEY("stop"), estop);
+
+       RegisterIterator("SIEVE:SCRIPTS", 0, NULL, GetSieveScriptListing, NULL, NULL, CTX_SIEVELIST, CTX_NONE, IT_NOFLAG);
+
+       RegisterConditional("COND:SIEVE:SCRIPT:ACTIVE", 0, ConditionalSieveScriptIsActive, CTX_SIEVELIST);
+       RegisterConditional("COND:SIEVE:SCRIPT:ISRULES", 0, ConditionalSieveScriptIsRulesScript, CTX_SIEVELIST);
+       RegisterNamespace("SIEVE:SCRIPT:NAME", 0, 1, tmplput_SieveScriptName, NULL, CTX_SIEVELIST);
+       RegisterNamespace("SIEVE:SCRIPT:CONTENT", 0, 1, tmplput_SieveScriptContent, NULL, CTX_SIEVELIST);
+
+       RegisterIterator("SIEVE:RULES", 0, NULL, GetSieveRules, NULL, DeleteHash, CTX_SIEVESCRIPT, CTX_NONE, IT_NOFLAG);
+
+       RegisterConditional("COND:SIEVE:ACTIVE", 1, ConditionalSieveRule_Active, CTX_SIEVESCRIPT);
+       RegisterConditional("COND:SIEVE:HFIELD", 1, ConditionalSieveRule_hfield, CTX_SIEVESCRIPT);
+       RegisterConditional("COND:SIEVE:COMPARE", 1, ConditionalSieveRule_compare, CTX_SIEVESCRIPT);
+       RegisterConditional("COND:SIEVE:ACTION", 1, ConditionalSieveRule_action, CTX_SIEVESCRIPT);
+       RegisterConditional("COND:SIEVE:SIZECOMP", 1, ConditionalSieveRule_sizecomp, CTX_SIEVESCRIPT);
+       RegisterConditional("COND:SIEVE:FINAL", 1, ConditionalSieveRule_final, CTX_SIEVESCRIPT);
+       RegisterConditional("COND:SIEVE:THISROOM", 1, ConditionalSieveRule_ThisRoom, CTX_SIEVESCRIPT);
+
+       RegisterNamespace("SIEVE:SCRIPT:HTEXT", 0, 1, tmplput_SieveRule_htext, NULL, CTX_SIEVESCRIPT);
+       RegisterNamespace("SIEVE:SCRIPT:SIZE", 0, 1, tmplput_SieveRule_sizeval, NULL, CTX_SIEVESCRIPT);
+       RegisterNamespace("SIEVE:SCRIPT:FILEINTO", 0, 1, tmplput_SieveRule_fileinto, NULL, CTX_SIEVESCRIPT);
+       RegisterNamespace("SIEVE:SCRIPT:REDIRECT", 0, 1, tmplput_SieveRule_redirect, NULL, CTX_SIEVESCRIPT);
+       RegisterNamespace("SIEVE:SCRIPT:AUTOMSG", 0, 1, tmplput_SieveRule_automsg, NULL, CTX_SIEVESCRIPT);
+
+       /* fetch our room into WCC->ThisRoom, to evaluate while iterating over rooms with COND:THIS:THAT:ROOM */
+       RegisterNamespace("SIEVE:SCRIPT:LOOKUP_FILEINTO", 0, 1, tmplput_SieveRule_lookup_FileIntoRoom, NULL, CTX_SIEVESCRIPT);
+       WebcitAddUrlHandler(HKEY("save_sieve"), "", 0, save_sieve, 0);
+       WebcitAddUrlHandler(HKEY("display_sieve_add_or_delete"), "", 0, display_sieve_add_or_delete, 0);
+}
diff --git a/webcit/siteconfig.c b/webcit/siteconfig.c
new file mode 100644 (file)
index 0000000..b82b0d2
--- /dev/null
@@ -0,0 +1,527 @@
+/*
+ * Administrative screen for site-wide configuration
+ *
+ * Copyright (c) 1996-2021 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+/*
+ * Expiry policy for the autopurger
+ */
+#define EXPIRE_NEXTLEVEL        0       /* Inherit expiration policy    */
+#define EXPIRE_MANUAL           1       /* Don't expire messages at all */
+#define EXPIRE_NUMMSGS          2       /* Keep only latest n messages  */
+#define EXPIRE_AGE              3       /* Expire messages after n days */
+
+CtxType CTX_SRVLOG = CTX_NONE;
+
+HashList *ZoneHash = NULL;
+
+ConstStr ExpirePolicyString = {CStrOf(roompolicy)     };
+
+ConstStr ExpirePolicyStrings[][2] = {
+       { { CStrOf(roompolicy)     } , { strof(roompolicy)     "_value", sizeof(strof(roompolicy)     "_value") - 1 } },
+       { { CStrOf(floorpolicy)    } , { strof(floorpolicy)    "_value", sizeof(strof(floorpolicy)    "_value") - 1 } },
+       { { CStrOf(sitepolicy)     } , { strof(sitepolicy)     "_value", sizeof(strof(sitepolicy)     "_value") - 1 } },
+       { { CStrOf(mailboxespolicy)} , { strof(mailboxespolicy)"_value", sizeof(strof(mailboxespolicy)"_value") - 1 } }
+};
+
+
+void LoadExpirePolicy(GPEXWhichPolicy which) {
+       StrBuf *Buf;
+       long State;
+       const char *Pos = NULL;
+
+       serv_printf("GPEX %s", ExpirePolicyStrings[which][0].Key);
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, &State) == 2) {
+               Pos = ChrPtr(Buf) + 4;
+               WC->Policy[which].expire_mode = StrBufExtractNext_long(Buf, &Pos, '|');
+               WC->Policy[which].expire_value = StrBufExtractNext_long(Buf, &Pos, '|');
+       }
+       else if (State == 550)
+               AppendImportantMessage(_("Higher access is required to access this function."), -1);
+       FreeStrBuf(&Buf);
+}
+
+
+void SaveExpirePolicyFromHTTP(GPEXWhichPolicy which) {
+       StrBuf *Buf;
+       long State;
+
+       serv_printf("SPEX %s|%d|%d", 
+                           ExpirePolicyStrings[which][0].Key,
+                   ibcstr( ExpirePolicyStrings[which][1] ),
+                   ibcstr( ExpirePolicyStrings[which][1] )  );
+
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+       GetServerStatus(Buf, &State);
+       if (State == 550)
+               AppendImportantMessage(_("Higher access is required to access this function."), -1);
+       FreeStrBuf(&Buf);
+}
+
+
+int ConditionalExpire(StrBuf *Target, WCTemplputParams *TP) {
+       GPEXWhichPolicy which;
+       int CompareWith;
+
+       which = GetTemplateTokenNumber(Target, TP, 2, 0);
+       CompareWith = GetTemplateTokenNumber(Target, TP, 3, 0);
+
+       LoadExpirePolicy(which);
+       
+       return WC->Policy[which].expire_mode == CompareWith;
+}
+
+
+void tmplput_ExpireValue(StrBuf *Target, WCTemplputParams *TP) {
+       GPEXWhichPolicy which;
+               
+       which = GetTemplateTokenNumber(Target, TP, 0, 0);
+       LoadExpirePolicy(which);
+       StrBufAppendPrintf(Target, "%d", WC->Policy[which].expire_value);
+}
+
+
+void tmplput_ExpireMode(StrBuf *Target, WCTemplputParams *TP) {
+       GPEXWhichPolicy which;
+               
+       which = GetTemplateTokenNumber(Target, TP, 2, 0);
+       LoadExpirePolicy(which);
+       StrBufAppendPrintf(Target, "%d", WC->Policy[which].expire_mode);
+}
+
+
+void LoadZoneFiles(void) {
+       icalarray *zones;
+       int z;
+       long len;
+       const char *this_zone;
+       StrBuf *ZName;
+       
+       ZoneHash = NewHash(1, NULL);
+       ZName = NewStrBufPlain(HKEY("UTC"));
+       Put(ZoneHash, HKEY("UTC"), ZName, HFreeStrBuf);
+       zones = icaltimezone_get_builtin_timezones();
+       for (z = 0; z < zones->num_elements; ++z) {
+               /* syslog(LOG_DEBUG, "Location: %-40s tzid: %s\n",
+                       icaltimezone_get_location(icalarray_element_at(zones, z)),
+                       icaltimezone_get_tzid(icalarray_element_at(zones, z))
+               ); */
+               this_zone = icaltimezone_get_location(icalarray_element_at(zones, z));
+               len = strlen(this_zone);
+               ZName = NewStrBufPlain(this_zone, len);
+               Put(ZoneHash, this_zone, len, ZName, HFreeStrBuf);
+       }
+       SortByHashKey(ZoneHash, 0);
+}
+
+
+typedef struct _CfgMapping {
+       int type;
+       int min;
+       int max;
+       const char *defval;
+       const char *Key;
+       long len;
+} CfgMapping;
+
+#define CFG_STR 1
+#define CFG_YES 2
+#define CFG_NO 3
+#define CFG_INT 4
+
+CfgMapping ServerConfig[] = {
+       {CFG_STR, 0, 0, "", HKEY("c_nodename")},
+       {CFG_STR, 0, 0, "", HKEY("c_fqdn")},
+       {CFG_STR, 0, 0, "", HKEY("c_humannode")},
+       {CFG_STR, 0, 0, "", HKEY("c_phonenum")},
+       {CFG_YES, 0, 0, "", HKEY("c_creataide")},
+       {CFG_STR, 0, 0, "", HKEY("c_sleeping")},
+       {CFG_STR, 0, 0, "", HKEY("c_initax")},
+       {CFG_YES, 0, 0, "", HKEY("c_regiscall")},
+       {CFG_YES, 0, 0, "", HKEY("c_twitdetect")},
+       {CFG_STR, 0, 0, "", HKEY("c_twitroom")},
+       {CFG_STR, 0, 0, "", HKEY("c_moreprompt")},
+       {CFG_YES, 0, 0, "", HKEY("c_restrict")},
+       {CFG_STR, 0, 0, "", HKEY("c_bbs_city")},
+       {CFG_STR, 0, 0, "", HKEY("c_sysadm")},
+       {CFG_STR, 0, 0, "", HKEY("c_maxsessions")},
+       {CFG_STR, 0, 0, "", HKEY("reserved1")},
+       {CFG_STR, 0, 0, "", HKEY("c_userpurge")},
+       {CFG_STR, 0, 0, "", HKEY("c_roompurge")},
+       {CFG_STR, 0, 0, "", HKEY("c_logpages")},
+       {CFG_STR, 0, 0, "", HKEY("c_createax")},
+       {CFG_STR, 0, 0, "", HKEY("c_maxmsglen")},
+       {CFG_STR, 0, 0, "", HKEY("c_min_workers")},
+       {CFG_STR, 0, 0, "", HKEY("c_max_workers")},
+       {CFG_STR, 0, 0, "", HKEY("c_pop3_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_smtp_port")},
+       {CFG_INT, CFG_SMTP_FROM_FILTERALL, CFG_SMTP_FROM_REJECT, "0", HKEY("c_rfc822_strict_from")},    
+       {CFG_YES, 0, 0, "", HKEY("c_aide_zap")},
+       {CFG_STR, 0, 0, "", HKEY("c_imap_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_net_freq")},
+       {CFG_YES, 0, 0, "", HKEY("c_disable_newu")},
+       {CFG_STR, 0, 0, "", HKEY("reserved2")},
+       {CFG_STR, 0, 0, "", HKEY("c_purge_hour")},
+       {CFG_STR, 0, 0, "", HKEY("c_ldap_host")},
+       {CFG_STR, 0, 0, "", HKEY("c_ldap_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_ldap_base_dn")},
+       {CFG_STR, 0, 0, "", HKEY("c_ldap_bind_dn")},
+       {CFG_STR, 0, 0, "", HKEY("c_ldap_bind_pw")},
+       {CFG_STR, 0, 0, "", HKEY("c_ip_addr")},
+       {CFG_STR, 0, 0, "", HKEY("c_msa_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_imaps_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_pop3s_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_smtps_port")},
+       {CFG_YES, 0, 0, "", HKEY("c_enable_fulltext")},
+       {CFG_YES, 0, 0, "", HKEY("c_auto_cull")},
+       {CFG_YES, 0, 0, "", HKEY("reserved3")},
+       {CFG_YES, 0, 0, "", HKEY("c_allow_spoofing")},
+       {CFG_YES, 0, 0, "", HKEY("c_journal_email")},
+       {CFG_YES, 0, 0, "", HKEY("c_journal_pubmsgs")},
+       {CFG_STR, 0, 0, "", HKEY("c_journal_dest")},
+       {CFG_STR, 0, 0, "", HKEY("c_default_cal_zone")},
+       {CFG_STR, 0, 0, "", HKEY("c_pftcpdict_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_mgesve_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_auth_mode")},
+       {CFG_STR, 0, 0, "", HKEY("c_funambol_host")},
+       {CFG_STR, 0, 0, "", HKEY("c_funambol_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_funambol_source")},
+       {CFG_STR, 0, 0, "", HKEY("c_funambol_auth")},
+       {CFG_YES, 0, 0, "", HKEY("c_rbl_at_greeting")},
+       {CFG_STR, 0, 0, "", HKEY("c_master_user")},
+       {CFG_STR, 0, 0, "", HKEY("c_master_pass")},
+       {CFG_STR, 0, 0, "", HKEY("c_pager_program")},
+       {CFG_YES, 0, 0, "", HKEY("c_imap_keep_from")},
+       {CFG_STR, 0, 0, "", HKEY("c_xmpp_c2s_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_xmpp_s2s_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_pop3_fetch")},
+       {CFG_STR, 0, 0, "", HKEY("c_pop3_fastest")},
+       {CFG_YES, 0, 0, "", HKEY("c_spam_flag_only")},
+       {CFG_YES, 0, 0, "", HKEY("c_guest_logins")},
+       {CFG_STR, 0, 0, "", HKEY("c_port_number")},
+       {CFG_STR, 0, 0, "", HKEY("c_ctdluid")},
+       {CFG_STR, 0, 0, "", HKEY("c_nntp_port")},
+       {CFG_STR, 0, 0, "", HKEY("c_nntps_port")}
+};
+
+
+/*
+ *  display all configuration items
+ */
+void load_siteconfig(void) {
+       StrBuf *Buf;
+       HashList *Cfg;
+       long len;
+       int i, j;
+       
+       if (WC->ServCfg == NULL)
+               WC->ServCfg = NewHash(1, NULL);
+       Cfg = WC->ServCfg;
+
+       Buf = NewStrBuf();
+
+       serv_printf("CONF get");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 1) {
+               StrBufCutLeft(Buf, 4);
+               AppendImportantMessage(SKEY(Buf));
+               FreeStrBuf(&Buf);
+               return;
+               
+       }
+       j = i = 0;
+       while (len = StrBuf_ServGetln(Buf),
+              (len >= 0) && 
+              ((len != 3) || strcmp(ChrPtr(Buf), "000")))
+       {
+               if (i < (sizeof(ServerConfig) / sizeof(CfgMapping)))
+               {
+                       Put(Cfg,
+                           ServerConfig[i].Key, 
+                           ServerConfig[i].len, 
+                           Buf, 
+                           HFreeStrBuf);
+                       i++;
+                       Buf = NewStrBuf();
+               }
+               else {
+                       if (j == 0) {
+                               syslog(LOG_WARNING, "The server sent more configuration data than this version of webcit is capable of changing.  Unknown configuration values will remain unchanged.");
+                       }
+                       j++;
+               }
+       }
+       FreeStrBuf(&Buf);
+
+       LoadExpirePolicy(roompolicy);
+       LoadExpirePolicy(floorpolicy);
+       LoadExpirePolicy(mailboxespolicy);
+       LoadExpirePolicy(sitepolicy);
+}
+
+
+/*
+ * parse siteconfig changes 
+ */
+void siteconfig(void) {
+       int i, value;
+       StrBuf *Line;
+
+       if (strlen(bstr("ok_button")) == 0) {
+               display_aide_menu();
+               return;
+       }
+       Line = NewStrBuf();
+       serv_printf("CONF set");
+       StrBuf_ServGetln(Line);
+       if (GetServerStatusMsg(Line, NULL, 1, 4) != 4) {
+               display_aide_menu();
+               FreeStrBuf(&Line);
+               return;
+       }
+
+       FreeStrBuf(&Line);
+
+       for (i=0; i < (sizeof(ServerConfig) / sizeof(CfgMapping)); i ++)
+       {
+               switch (ServerConfig[i].type) {
+               default:
+               case CFG_STR:
+                       serv_putbuf(SBstr(ServerConfig[i].Key, ServerConfig[i].len));
+                       break;
+               case CFG_YES:
+                       serv_puts(YesBstr(ServerConfig[i].Key, 
+                                         ServerConfig[i].len) ?
+                                 "1" : "0");
+                       break;
+               case CFG_NO:
+                       serv_puts(YesBstr(ServerConfig[i].Key, 
+                                         ServerConfig[i].len) ?
+                                 "0" : "1");
+                       break;
+               case CFG_INT:
+                       value = IBstr(ServerConfig[i].Key, 
+                                     ServerConfig[i].len);
+                       if ((value < ServerConfig[i].min) ||
+                           (value > ServerConfig[i].max))
+                               value = atol(ServerConfig[i].defval);
+                       serv_printf("%d", value);
+                       break;
+               }
+       }
+        serv_puts("000");
+
+       SaveExpirePolicyFromHTTP(sitepolicy);
+       SaveExpirePolicyFromHTTP(mailboxespolicy);
+
+       FreeStrBuf(&WC->serv_info->serv_default_cal_zone);
+       WC->serv_info->serv_default_cal_zone = NewStrBufDup(sbstr("c_default_cal_zone"));
+
+       AppendImportantMessage(_("Your system configuration has been updated."), -1);
+       DeleteHash(&WC->ServCfg);
+       display_aide_menu();
+}
+
+
+// if WebCit Classic wasn't obsolete we would replace this with a "CONF GETVAL" type of thing
+void tmplput_servcfg(StrBuf *Target, WCTemplputParams *TP) {
+       void *vBuf;
+       StrBuf *Buf;
+
+       if (WC->is_aide) {
+               if (WC->ServCfg == NULL)
+                       load_siteconfig();
+               GetHash(WC->ServCfg, TKEY(0), &vBuf);
+               Buf = (StrBuf*) vBuf;
+               StrBufAppendTemplate(Target, TP, Buf, 1);
+       }
+}
+
+
+int ConditionalServCfg(StrBuf *Target, WCTemplputParams *TP) {
+       void *vBuf;
+       StrBuf *Buf;
+
+       if (WC->is_aide) {
+               if (WC->ServCfg == NULL)
+                       load_siteconfig();
+               GetHash(WC->ServCfg, TKEY(2), &vBuf);
+               if (vBuf == NULL) return 0;
+               Buf = (StrBuf*) vBuf;
+               if (TP->Tokens->nParameters == 3) {
+                       return 1;
+               }
+               else if (IS_NUMBER(TP->Tokens->Params[3]->Type))
+                       return (StrTol(Buf) == GetTemplateTokenNumber (Target, TP, 3, 0));
+               else
+               {
+                       const char *pch;
+                       long len;
+                       
+                       GetTemplateTokenString(Target, TP, 3, &pch, &len);
+               
+                       return ((len == StrLength(Buf)) &&
+                               (strcmp(pch, ChrPtr(Buf)) == 0));
+               }
+
+       }
+       else return 0;
+}
+
+int ConditionalServCfgCTXStrBuf(StrBuf *Target, WCTemplputParams *TP) {
+       void *vBuf;
+       StrBuf *Buf;
+       StrBuf *ZoneToCheck = (StrBuf*) CTX(CTX_STRBUF);
+
+       if ((WC->is_aide) || (ZoneToCheck == NULL)) {
+               if (WC->ServCfg == NULL)
+                       load_siteconfig();
+               GetHash(WC->ServCfg, TKEY(2), &vBuf);
+               if (vBuf == NULL) return 0;
+               Buf = (StrBuf*) vBuf;
+
+               return strcmp(ChrPtr(Buf), ChrPtr(ZoneToCheck)) == 0;
+       }
+       else return 0;
+}
+
+/*----------------------------------------------------------------------------*
+ *              Displaying Logging                                            *
+ *----------------------------------------------------------------------------*/
+typedef struct __LogStatusStruct {
+       int Enable;
+       StrBuf *Name;
+}LogStatusStruct;
+
+void DeleteLogStatusStruct(void *v)
+{
+       LogStatusStruct *Stat = (LogStatusStruct*)v;
+
+       FreeStrBuf(&Stat->Name);
+       free(Stat);
+}
+
+void tmplput_servcfg_LogName(StrBuf *Target, WCTemplputParams *TP)
+{
+        LogStatusStruct *Stat = (LogStatusStruct*) CTX(CTX_SRVLOG);
+       StrBufAppendTemplate(Target, TP, Stat->Name, 1);
+}
+
+
+
+int ConditionalServCfgThisLogEnabled(StrBuf *Target, WCTemplputParams *TP)
+{
+        LogStatusStruct *Stat = (LogStatusStruct*) CTX(CTX_SRVLOG);
+       return Stat->Enable;
+}
+
+HashList *iterate_GetSrvLogEnable(StrBuf *Target, WCTemplputParams *TP)
+{
+        HashList *Hash = NULL;
+       StrBuf *Buf;
+       LogStatusStruct *Stat;
+       const char *Pos;
+       int Done = 0;
+       long len;
+       int num_logs = 0;
+
+        serv_puts("LOGP");
+        Buf = NewStrBuf();
+        StrBuf_ServGetln(Buf);
+        if (GetServerStatus(Buf, NULL) == 1) {
+                Hash = NewHash(1, Flathash);
+                while (!Done) {
+                        len = StrBuf_ServGetln(Buf);
+                        if ((len <0) || 
+                            ((len == 3) &&
+                             !strcmp(ChrPtr(Buf), "000")))
+                        {
+                                Done = 1;
+                                break;
+                        }
+                       Stat = (LogStatusStruct*) malloc (sizeof(LogStatusStruct));
+                       Pos = NULL;
+                       Stat->Name = NewStrBufPlain(NULL, len);
+                        StrBufExtract_NextToken(Stat->Name, Buf, &Pos, '|');
+                        Stat->Enable = StrBufExtractNext_int(Buf, &Pos, '|');
+
+                        Put(Hash, IKEY(num_logs), Stat, DeleteLogStatusStruct); 
+                       num_logs++;
+                }
+       }
+       FreeStrBuf(&Buf);
+       return Hash;
+}
+
+
+void 
+InitModule_SITECONFIG
+(void)
+{
+       RegisterCTX(CTX_SRVLOG);
+       WebcitAddUrlHandler(HKEY("siteconfig"), "", 0, siteconfig, CTX_NONE);
+
+       RegisterNamespace("SERV:CFG", 1, 2, tmplput_servcfg, NULL, CTX_NONE);
+       RegisterConditional("COND:SERVCFG", 3, ConditionalServCfg, CTX_NONE);
+       RegisterConditional("COND:SERVCFG:CTXSTRBUF", 4, ConditionalServCfgCTXStrBuf, CTX_STRBUF);
+       RegisterIterator("PREF:ZONE", 0, ZoneHash, NULL, NULL, NULL, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+
+       REGISTERTokenParamDefine(roompolicy);
+       REGISTERTokenParamDefine(floorpolicy);
+       REGISTERTokenParamDefine(sitepolicy);
+       REGISTERTokenParamDefine(mailboxespolicy);
+
+       REGISTERTokenParamDefine(EXPIRE_NEXTLEVEL);
+       REGISTERTokenParamDefine(EXPIRE_MANUAL);
+       REGISTERTokenParamDefine(EXPIRE_NUMMSGS);
+       REGISTERTokenParamDefine(EXPIRE_AGE);
+
+       REGISTERTokenParamDefine(CFG_SMTP_FROM_FILTERALL);
+       REGISTERTokenParamDefine(CFG_SMTP_FROM_NOFILTER);
+       REGISTERTokenParamDefine(CFG_SMTP_FROM_CORRECT);
+       REGISTERTokenParamDefine(CFG_SMTP_FROM_REJECT);
+
+       RegisterConditional("COND:EXPIRE:MODE", 2, ConditionalExpire, CTX_NONE);
+       RegisterNamespace("EXPIRE:VALUE", 1, 2, tmplput_ExpireValue, NULL, CTX_NONE);
+       RegisterNamespace("EXPIRE:MODE", 1, 2, tmplput_ExpireMode, NULL, CTX_NONE);
+       RegisterConditional("COND:SERVCFG:THISLOGENABLE", 4, ConditionalServCfgThisLogEnabled, CTX_SRVLOG);
+       RegisterIterator("SERVCFG:LOGENABLE", 0, NULL, iterate_GetSrvLogEnable, NULL, DeleteHash, CTX_SRVLOG, CTX_NONE, IT_NOFLAG);
+       RegisterNamespace("SERVCFG:LOGNAME", 0, 1, tmplput_servcfg_LogName, NULL, CTX_SRVLOG);
+}
+
+void 
+ServerStartModule_SITECONFIG
+(void)
+{
+       LoadZoneFiles();
+}
+
+void 
+ServerShutdownModule_SITECONFIG
+(void)
+{
+       DeleteHash(&ZoneHash);
+}
+
+
+void 
+SessionDestroyModule_SITECONFIG
+(wcsession *sess)
+{
+       DeleteHash(&sess->ServCfg);
+}
diff --git a/webcit/sitemap.c b/webcit/sitemap.c
new file mode 100644 (file)
index 0000000..50618e6
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * XML sitemap generator
+ *
+ * Copyright (c) 2010-2021 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+
+/*
+ * XML sitemap generator -- go through the message list for a BBS room
+ */
+void sitemap_do_bbs(void) {
+       int num_msgs = 0;
+       int i;
+       SharedMessageStatus Stat;
+       message_summary *Msg = NULL;
+
+       memset(&Stat, 0, sizeof Stat);
+       Stat.maxload = INT_MAX;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0);
+       if (num_msgs < 1) return;
+
+       for (i=0; i<num_msgs; i+=20) {
+               Msg = GetMessagePtrAt(i, WC->summ);
+               if (Msg != NULL) {
+                       wc_printf("<url><loc>%s/readfwd", ChrPtr(site_prefix));
+                       wc_printf("?go=");
+                       urlescputs(ChrPtr(WC->CurRoom.name));
+                       wc_printf("?start_reading_at=%ld", Msg->msgnum);
+                       wc_printf("</loc></url>\r\n");
+               }
+       }
+}
+
+
+/*
+ * XML sitemap generator -- go through the message list for a wiki room
+ */
+void sitemap_do_wiki(void) {
+       int num_msgs = 0;
+       int i;
+       SharedMessageStatus Stat;
+       message_summary *Msg = NULL;
+       char buf[256];
+
+       memset(&Stat, 0, sizeof Stat);
+       Stat.maxload = INT_MAX;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0);
+       if (num_msgs < 1) return;
+
+       for (i=0; i<num_msgs; ++i) {
+               Msg = GetMessagePtrAt(i, WC->summ);
+               if (Msg != NULL) {
+
+                       serv_printf("MSG0 %ld|3", Msg->msgnum);
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               if (    (!strncasecmp(buf, "exti=", 5))
+                                       && (!bmstrcasestr(buf, "_HISTORY_"))
+                               ) {
+                                       wc_printf("<url><loc>%s/wiki", ChrPtr(site_prefix));
+                                       wc_printf("?go=");
+                                       urlescputs(ChrPtr(WC->CurRoom.name));
+                                       wc_printf("?page=%s", &buf[5]);
+                                       wc_printf("</loc></url>\r\n");
+                               }
+                       }
+               }
+       }
+}
+
+
+struct sitemap_room_list {
+       struct sitemap_room_list *next;
+       StrBuf *roomname;
+       int defview;
+};
+
+
+/*
+ * Load the room list for the sitemap
+ */
+struct sitemap_room_list *sitemap_load_roomlist(void) {
+       char buf[SIZ];
+       char roomname_plain[SIZ];
+       struct sitemap_room_list *roomlist = NULL;
+
+       serv_puts("LKRA");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') while(serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               struct sitemap_room_list *ptr = malloc(sizeof(struct sitemap_room_list));
+               extract_token(roomname_plain, buf, 0, '|', sizeof roomname_plain);
+               ptr->roomname = NewStrBufPlain(roomname_plain, -1);
+               ptr->defview = extract_int(buf, 6);
+               ptr->next = roomlist;
+               roomlist = ptr;
+       }
+
+       return(roomlist);
+}
+
+extern void sitemap_do_blog(void);
+
+/*
+ * Entry point for RSS feed generator
+ */
+void sitemap(void) {
+       struct sitemap_room_list *roomlist = NULL;
+       output_headers(0, 0, 0, 0, 1, 0);
+       hprintf("Content-type: text/xml\r\n");
+       hprintf(
+               "Server: %s / %s\r\n"
+               "Connection: close\r\n"
+       ,
+               PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software)
+       );
+       begin_burst();
+
+       wc_printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
+       wc_printf("<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n");
+
+       roomlist = sitemap_load_roomlist();
+
+       while (roomlist != NULL)
+       {
+               struct sitemap_room_list *ptr;
+
+               gotoroom(roomlist->roomname);
+
+               /* Output the messages in this room only if it's a room type we can make sense of */
+               switch(roomlist->defview) {
+               case VIEW_BBS:
+                       sitemap_do_bbs();
+                       break;
+               case VIEW_WIKI:
+                       sitemap_do_wiki();
+                       break;
+               case VIEW_BLOG:
+                       sitemap_do_blog();
+                       break;
+               default:
+                       break;
+               }
+
+               ptr = roomlist;
+               roomlist = roomlist->next;
+               FreeStrBuf(&ptr->roomname);
+               free(ptr);
+       }
+
+       wc_printf("</urlset>\r\n");
+       wDumpContent(0);
+}
+
+
+void 
+InitModule_SITEMAP
+(void)
+{
+       WebcitAddUrlHandler(HKEY("sitemap"), "", 0, sitemap, ANONYMOUS|COOKIEUNNEEDED);
+       WebcitAddUrlHandler(HKEY("sitemap.xml"), "", 0, sitemap, ANONYMOUS|COOKIEUNNEEDED);
+}
diff --git a/webcit/smtpqueue.c b/webcit/smtpqueue.c
new file mode 100644 (file)
index 0000000..b5c750a
--- /dev/null
@@ -0,0 +1,454 @@
+/* 
+ * Display the outbound SMTP queue
+ */
+
+#include "webcit.h"
+CtxType CTX_MAILQITEM = CTX_NONE;
+CtxType CTX_MAILQ_RCPT = CTX_NONE;
+HashList *QItemHandlers = NULL;
+
+
+
+typedef struct _mailq_entry {
+       StrBuf *Recipient;
+       StrBuf *StatusMessage;
+       int Status;
+       /**<
+        * 0 = No delivery has yet been attempted
+        * 2 = Delivery was successful
+        * 3 = Transient error like connection problem. Try next remote if available.
+        * 4 = A transient error was experienced ... try again later
+        * 5 = Delivery to this address failed permanently.  The error message
+        *     should be placed in the fourth field so that a bounce message may
+        *     be generated.
+        */
+
+       int n;
+       int Active;
+}MailQEntry;
+
+typedef struct queueitem {
+       long MessageID;
+       long QueMsgID;
+       long Submitted;
+       int FailNow;
+       HashList *MailQEntries;
+/* copy of the currently parsed item in the MailQEntries list;
+ * if null add a new one.
+ */
+       MailQEntry *Current;
+       time_t ReattemptWhen;
+       time_t Retry;
+
+       long ActiveDeliveries;
+       StrBuf *EnvelopeFrom;
+       StrBuf *BounceTo;
+       StrBuf *SenderRoom;
+       ParsedURL *URL;
+       ParsedURL *FallBackHost;
+} OneQueItem;
+
+
+typedef void (*QItemHandler)(OneQueItem *Item, StrBuf *Line, const char **Pos);
+
+typedef struct __QItemHandlerStruct {
+       QItemHandler H;
+} QItemHandlerStruct;
+
+void RegisterQItemHandler(const char *Key, long Len, QItemHandler H)
+{
+       QItemHandlerStruct *HS = (QItemHandlerStruct*)malloc(sizeof(QItemHandlerStruct));
+       HS->H = H;
+       Put(QItemHandlers, Key, Len, HS, NULL);
+}
+
+void FreeMailQEntry(void *qv)
+{
+       MailQEntry *Q = qv;
+       FreeStrBuf(&Q->Recipient);
+       FreeStrBuf(&Q->StatusMessage);
+       free(Q);
+}
+void FreeQueItem(OneQueItem **Item)
+{
+       DeleteHash(&(*Item)->MailQEntries);
+       FreeStrBuf(&(*Item)->EnvelopeFrom);
+       FreeStrBuf(&(*Item)->BounceTo);
+       FreeStrBuf(&(*Item)->SenderRoom);
+       FreeURL(&(*Item)->URL);
+       free(*Item);
+       Item = NULL;
+}
+void HFreeQueItem(void *Item)
+{
+       FreeQueItem((OneQueItem**)&Item);
+}
+
+
+OneQueItem *DeserializeQueueItem(StrBuf *RawQItem, long QueMsgID)
+{
+       OneQueItem *Item;
+       const char *pLine = NULL;
+       StrBuf *Line;
+       StrBuf *Token;
+       
+       Item = (OneQueItem*)malloc(sizeof(OneQueItem));
+       memset(Item, 0, sizeof(OneQueItem));
+       Item->Retry = 0;
+       Item->MessageID = -1;
+       Item->QueMsgID = QueMsgID;
+
+       Token = NewStrBuf();
+       Line = NewStrBufPlain(NULL, 128);
+       while (pLine != StrBufNOTNULL) {
+               const char *pItemPart = NULL;
+               void *vHandler;
+
+               StrBufExtract_NextToken(Line, RawQItem, &pLine, '\n');
+               if (StrLength(Line) == 0) continue;
+               StrBufExtract_NextToken(Token, Line, &pItemPart, '|');
+               if (GetHash(QItemHandlers, SKEY(Token), &vHandler))
+               {
+                       QItemHandlerStruct *HS;
+                       HS = (QItemHandlerStruct*) vHandler;
+                       HS->H(Item, Line, &pItemPart);
+               }
+       }
+       FreeStrBuf(&Line);
+       FreeStrBuf(&Token);
+/*
+       Put(ActiveQItems,
+           LKEY(Item->MessageID),
+           Item,
+           HFreeQueItem);
+*/     
+
+       return Item;
+}
+
+void tmplput_MailQID(StrBuf *Target, WCTemplputParams *TP)
+{
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+       StrBufAppendPrintf(Target, "%ld", Item->QueMsgID);;
+}
+void tmplput_MailQPayloadID(StrBuf *Target, WCTemplputParams *TP)
+{
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+       StrBufAppendPrintf(Target, "%ld", Item->MessageID);
+}
+void tmplput_MailQBounceTo(StrBuf *Target, WCTemplputParams *TP)
+{
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+       StrBufAppendTemplate(Target, TP, Item->BounceTo, 0);
+}
+void tmplput_MailQAttempted(StrBuf *Target, WCTemplputParams *TP)
+{
+        char datebuf[64];
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+        webcit_fmt_date(datebuf, 64, Item->ReattemptWhen, DATEFMT_BRIEF);
+        StrBufAppendBufPlain(Target, datebuf, -1, 0);
+}
+void tmplput_MailQSubmitted(StrBuf *Target, WCTemplputParams *TP)
+{
+        char datebuf[64];
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+        webcit_fmt_date(datebuf, 64, Item->Submitted, DATEFMT_BRIEF);
+        StrBufAppendBufPlain(Target, datebuf, -1, 0);
+}
+void tmplput_MailQEnvelopeFrom(StrBuf *Target, WCTemplputParams *TP)
+{
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+       StrBufAppendTemplate(Target, TP, Item->EnvelopeFrom, 0);
+}
+void tmplput_MailQSourceRoom(StrBuf *Target, WCTemplputParams *TP)
+{
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+       StrBufAppendTemplate(Target, TP, Item->SenderRoom, 0);
+}
+
+int Conditional_MailQ_HaveSourceRoom(StrBuf *Target, WCTemplputParams *TP)
+{
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+       return StrLength(Item->SenderRoom) > 0;
+}
+
+void tmplput_MailQRetry(StrBuf *Target, WCTemplputParams *TP)
+{
+        char datebuf[64];
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+
+       if (Item->Retry == 0) {
+               StrBufAppendBufPlain(Target, _("First Attempt pending"), -1, 0);
+       }
+       else {
+               webcit_fmt_date(datebuf, sizeof(datebuf), Item->Retry, DATEFMT_BRIEF);
+               StrBufAppendBufPlain(Target, datebuf, -1, 0);
+       }
+}
+
+void tmplput_MailQRCPT(StrBuf *Target, WCTemplputParams *TP)
+{
+       MailQEntry *Entry = (MailQEntry*) CTX(CTX_MAILQ_RCPT);
+       StrBufAppendTemplate(Target, TP, Entry->Recipient, 0);
+}
+void tmplput_MailQRCPTStatus(StrBuf *Target, WCTemplputParams *TP)
+{
+       MailQEntry *Entry = (MailQEntry*) CTX(CTX_MAILQ_RCPT);
+       StrBufAppendPrintf(Target, "%ld", Entry->Status);
+}
+void tmplput_MailQStatusMsg(StrBuf *Target, WCTemplputParams *TP)
+{
+       MailQEntry *Entry = (MailQEntry*) CTX(CTX_MAILQ_RCPT);
+       StrBufAppendTemplate(Target, TP, Entry->StatusMessage, 0);
+}
+
+HashList *iterate_get_Recipients(StrBuf *Target, WCTemplputParams *TP)
+{
+       OneQueItem *Item = (OneQueItem*) CTX(CTX_MAILQITEM);
+       return Item->MailQEntries;
+}
+
+
+void NewMailQEntry(OneQueItem *Item)
+{
+       Item->Current = (MailQEntry*) malloc(sizeof(MailQEntry));
+       memset(Item->Current, 0, sizeof(MailQEntry));
+
+       if (Item->MailQEntries == NULL)
+               Item->MailQEntries = NewHash(1, Flathash);
+       Item->Current->StatusMessage = NewStrBuf();
+       Item->Current->n = GetCount(Item->MailQEntries);
+       Put(Item->MailQEntries,
+           IKEY(Item->Current->n),
+           Item->Current,
+           FreeMailQEntry);
+}
+
+void QItem_Handle_MsgID(OneQueItem *Item, StrBuf *Line, const char **Pos)
+{
+       Item->MessageID = StrBufExtractNext_long(Line, Pos, '|');
+}
+
+void QItem_Handle_EnvelopeFrom(OneQueItem *Item, StrBuf *Line, const char **Pos)
+{
+       if (Item->EnvelopeFrom == NULL)
+               Item->EnvelopeFrom = NewStrBufPlain(NULL, StrLength(Line));
+       StrBufExtract_NextToken(Item->EnvelopeFrom, Line, Pos, '|');
+}
+
+void QItem_Handle_BounceTo(OneQueItem *Item, StrBuf *Line, const char **Pos)
+{
+       if (Item->BounceTo == NULL)
+               Item->BounceTo = NewStrBufPlain(NULL, StrLength(Line));
+       StrBufExtract_NextToken(Item->BounceTo, Line, Pos, '|');
+}
+
+void QItem_Handle_SenderRoom(OneQueItem *Item, StrBuf *Line, const char **Pos)
+{
+       if (Item->SenderRoom == NULL)
+               Item->SenderRoom = NewStrBufPlain(NULL, StrLength(Line));
+       StrBufExtract_NextToken(Item->SenderRoom, Line, Pos, '|');
+}
+
+void QItem_Handle_Recipient(OneQueItem *Item, StrBuf *Line, const char **Pos)
+{
+       const char *pch;
+       if (Item->Current == NULL)
+               NewMailQEntry(Item);
+       if (Item->Current->Recipient == NULL)
+               Item->Current->Recipient=NewStrBufPlain(NULL, StrLength(Line));
+       StrBufExtract_NextToken(Item->Current->Recipient, Line, Pos, '|');
+       Item->Current->Status = StrBufExtractNext_int(Line, Pos, '|');
+       StrBufExtract_NextToken(Item->Current->StatusMessage, Line, Pos, '|');
+
+       pch = ChrPtr(Item->Current->StatusMessage);
+       while ((pch != NULL) && (*pch != '\0')) {
+               pch = strchr(pch, ';');
+               if (pch != NULL) {
+                       pch ++;
+                       if (*pch == ' ') {
+                               StrBufPeek(Item->Current->StatusMessage,
+                                          pch, -1, '\n');
+                       }
+               }
+       }
+       Item->Current = NULL; // TODO: is this always right?
+}
+
+
+void QItem_Handle_retry(OneQueItem *Item, StrBuf *Line, const char **Pos)
+{
+       Item->Retry = StrBufExtractNext_int(Line, Pos, '|');
+}
+
+
+void QItem_Handle_Submitted(OneQueItem *Item, StrBuf *Line, const char **Pos)
+{
+       Item->Submitted = atol(*Pos);
+
+}
+
+void QItem_Handle_Attempted(OneQueItem *Item, StrBuf *Line, const char **Pos)
+{
+       Item->ReattemptWhen = StrBufExtractNext_int(Line, Pos, '|');
+}
+
+
+
+
+void render_QUEUE(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       wc_mime_attachment *Mime = CTX(CTX_MIME_ATACH);
+       WCTemplputParams SubTP;
+       OneQueItem* Context;
+
+       Context = DeserializeQueueItem(Mime->Data, Mime->msgnum);
+       StackContext(TP, &SubTP, Context, CTX_MAILQITEM, 0, TP->Tokens);
+       {
+               DoTemplate(HKEY("view_mailq_message"), NULL, &SubTP);
+       }
+       UnStackContext(&SubTP);
+
+       FreeQueItem (&Context);
+}
+
+void
+ServerShutdownModule_SMTP_QUEUE
+(void)
+{
+       DeleteHash(&QItemHandlers);
+}
+void
+ServerStartModule_SMTP_QUEUE
+(void)
+{
+       QItemHandlers = NewHash(0, NULL);
+}
+
+int qview_PrintPageHeader(SharedMessageStatus *Stat, void **ViewSpecific)
+{
+       if (yesbstr("ListOnly"))
+               output_headers(1, 0, 0, 0, 0, 0);
+       else
+               output_headers(1, 1, 1, 0, 0, 0);
+       return 0;
+}
+
+int qview_GetParamsGetServerCall(SharedMessageStatus *Stat,
+                                void **ViewSpecific,
+                                long oper,
+                                char *cmd,
+                                long len,
+                                char *filter,
+                                long flen)
+{
+       if (!WC->is_aide)
+       {
+               DoTemplate(HKEY("aide_required"), NULL, NULL);
+               end_burst();
+
+               return 300;
+       }
+       else {
+               snprintf(cmd, len, "MSGS ALL|0|1");
+               snprintf(filter, flen, "SUBJ|QMSG");
+               if (yesbstr("ListOnly"))
+                       DoTemplate(HKEY("view_mailq_table"), NULL, NULL);
+               else
+                       DoTemplate(HKEY("view_mailq_header"), NULL, NULL);
+               return 200;
+       }
+}
+
+/*
+ * Display task view
+ */
+int qview_LoadMsgFromServer(SharedMessageStatus *Stat, 
+                            void **ViewSpecific, 
+                            message_summary* Msg, 
+                            int is_new, 
+                            int i)
+{
+       wcsession *WCC = WC;
+       const StrBuf *Mime;
+
+        /* Not (yet?) needed here? calview *c = (calview *) *ViewSpecific; */
+       read_message(WCC->WBuf, HKEY("view_mailq_message_bearer"), Msg->msgnum, NULL, &Mime, NULL);
+
+        return 0;
+}
+
+
+int qview_RenderView_or_Tail(SharedMessageStatus *Stat, 
+                            void **ViewSpecific, 
+                            long oper)
+{
+       wcsession *WCC = WC;
+       WCTemplputParams SubTP;
+
+       memset(&SubTP, 0, sizeof(WCTemplputParams));
+       if (yesbstr("ListOnly"))
+               DoTemplate(HKEY("view_mailq_footer_listonly"),NULL, &SubTP);
+       else
+       {
+               if (GetCount(WCC->summ) == 0)
+                       DoTemplate(HKEY("view_mailq_footer_empty"),NULL, &SubTP);
+               else
+                       DoTemplate(HKEY("view_mailq_footer"),NULL, &SubTP);
+       }
+
+       return 0;
+}
+int qview_Cleanup(void **ViewSpecific)
+{
+       
+       wDumpContent(yesbstr("ListOnly")?0:1);
+       return 0;
+}
+
+void 
+InitModule_SMTP_QUEUE
+(void)
+{
+       RegisterCTX(CTX_MAILQITEM);
+       RegisterCTX(CTX_MAILQ_RCPT);
+
+       RegisterQItemHandler(HKEY("msgid"),             QItem_Handle_MsgID);
+       RegisterQItemHandler(HKEY("envelope_from"),     QItem_Handle_EnvelopeFrom);
+       RegisterQItemHandler(HKEY("retry"),             QItem_Handle_retry);
+       RegisterQItemHandler(HKEY("attempted"),         QItem_Handle_Attempted);
+       RegisterQItemHandler(HKEY("remote"),            QItem_Handle_Recipient);
+       RegisterQItemHandler(HKEY("bounceto"),          QItem_Handle_BounceTo);
+       RegisterQItemHandler(HKEY("source_room"),       QItem_Handle_SenderRoom);
+       RegisterQItemHandler(HKEY("submitted"),         QItem_Handle_Submitted);
+       RegisterMimeRenderer(HKEY("application/x-citadel-delivery-list"), render_QUEUE, 1, 9000);
+       RegisterNamespace("MAILQ:ID", 0, 0, tmplput_MailQID, NULL, CTX_MAILQITEM);
+       RegisterNamespace("MAILQ:PAYLOAD:ID", 0, 0, tmplput_MailQPayloadID, NULL, CTX_MAILQITEM);
+       RegisterNamespace("MAILQ:BOUNCETO", 0, 1, tmplput_MailQBounceTo, NULL, CTX_MAILQITEM);
+       RegisterNamespace("MAILQ:ATTEMPTED", 0, 0, tmplput_MailQAttempted, NULL, CTX_MAILQITEM);
+       RegisterNamespace("MAILQ:SUBMITTED", 0, 0, tmplput_MailQSubmitted, NULL, CTX_MAILQITEM);
+       RegisterNamespace("MAILQ:ENVELOPEFROM", 0, 1, tmplput_MailQEnvelopeFrom, NULL, CTX_MAILQITEM);
+       RegisterNamespace("MAILQ:SRCROOM", 0, 1, tmplput_MailQSourceRoom, NULL, CTX_MAILQITEM);
+       RegisterConditional("COND:MAILQ:HAVESRCROOM", 0, Conditional_MailQ_HaveSourceRoom,  CTX_MAILQITEM);
+       RegisterNamespace("MAILQ:RETRY", 0, 0, tmplput_MailQRetry, NULL, CTX_MAILQITEM);
+
+       RegisterNamespace("MAILQ:RCPT:ADDR", 0, 1, tmplput_MailQRCPT, NULL, CTX_MAILQ_RCPT);
+       RegisterNamespace("MAILQ:RCPT:STATUS", 0, 0, tmplput_MailQRCPTStatus, NULL, CTX_MAILQ_RCPT);
+       RegisterNamespace("MAILQ:RCPT:STATUSMSG", 0, 1, tmplput_MailQStatusMsg, NULL, CTX_MAILQ_RCPT);
+
+       RegisterIterator("MAILQ:RCPT", 0, NULL, iterate_get_Recipients, 
+                        NULL, NULL, CTX_MAILQ_RCPT, CTX_MAILQITEM, IT_NOFLAG);
+
+
+       RegisterReadLoopHandlerset(
+               VIEW_QUEUE,
+               qview_GetParamsGetServerCall,
+               qview_PrintPageHeader,
+               NULL, /* TODO: is this right? */
+               NULL,
+               qview_LoadMsgFromServer,
+               qview_RenderView_or_Tail,
+               qview_Cleanup,
+               NULL);
+
+}
diff --git a/webcit/sockets.c b/webcit/sockets.c
new file mode 100644 (file)
index 0000000..57ca654
--- /dev/null
@@ -0,0 +1,1069 @@
+/*
+ * Copyright (c) 1987-2021 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ * 
+ * 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.
+ */
+
+/*
+ * Uncomment this to log all communications with the Citadel server
+#define SERV_TRACE 1
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+long MaxRead = -1; /* should we do READ scattered or all at once? */
+
+/*
+ * register the timeout
+ */
+RETSIGTYPE timeout(int signum) {
+       syslog(LOG_WARNING, "Connection timed out; unable to reach citserver\n");
+       /* no exit here, since we need to server the connection unreachable thing. exit(3); */
+}
+
+
+/*
+ * Client side - connect to a unix domain socket
+ */
+int connect_to_citadel(char *sockpath) {
+       struct sockaddr_un addr;
+       int s;
+
+       memset(&addr, 0, sizeof(addr));
+       addr.sun_family = AF_UNIX;
+       strncpy(addr.sun_path, sockpath, sizeof addr.sun_path);
+
+       s = socket(AF_UNIX, SOCK_STREAM, 0);
+       if (s < 0) {
+               syslog(LOG_WARNING, "Can't create socket [%s]: %s\n", sockpath, strerror(errno));
+               return(-1);
+       }
+
+       if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+               syslog(LOG_WARNING, "Can't connect [%s]: %s\n", sockpath, strerror(errno));
+               close(s);
+               return(-1);
+       }
+       return s;
+}
+
+
+/*
+ *  input string from pipe
+ */
+int serv_getln(char *strbuf, int bufsize) {
+       int len;
+
+       *strbuf = '\0';
+       StrBuf_ServGetln(WC->MigrateReadLineBuf);
+       len = StrLength(WC->MigrateReadLineBuf);
+       if (len > bufsize)
+               len = bufsize - 1;
+       memcpy(strbuf, ChrPtr(WC->MigrateReadLineBuf), len);
+       FlushStrBuf(WC->MigrateReadLineBuf);
+       strbuf[len] = '\0';
+#ifdef SERV_TRACE
+       syslog(LOG_DEBUG, "%3d<<<%s\n", WC->serv_sock, strbuf);
+#endif
+       return len;
+}
+
+
+int StrBuf_ServGetln(StrBuf *buf) {
+       const char *ErrStr = NULL;
+       int rc;
+       
+       if (!WC->connected)
+               return -1;
+
+       FlushStrBuf(buf);
+       rc = StrBufTCP_read_buffered_line_fast(buf, 
+                                              WC->ReadBuf, 
+                                              &WC->ReadPos, 
+                                              &WC->serv_sock, 
+                                              5, 1, 
+                                              &ErrStr);
+       if (rc < 0)
+       {
+               syslog(LOG_INFO, "StrBuf_ServGetln(): Server connection broken: %s\n",
+                       (ErrStr)?ErrStr:"");
+               wc_backtrace(LOG_INFO);
+               if (WC->serv_sock > 0) close(WC->serv_sock);
+               WC->serv_sock = (-1);
+               WC->connected = 0;
+               WC->logged_in = 0;
+       }
+#ifdef SERV_TRACE
+       else 
+       {
+               long pos = 0;
+               if (WC->ReadPos != NULL)
+                       pos = WC->ReadPos - ChrPtr(WC->ReadBuf);
+               syslog(LOG_DEBUG, "%3d<<<[%ld]%s\n", WC->serv_sock, pos, ChrPtr(buf));
+       }
+#endif
+       return rc;
+}
+
+int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize) {
+       const char *ErrStr;
+       int rc;
+       
+       rc = StrBufReadBLOBBuffered(buf, 
+                                   WC->ReadBuf, 
+                                   &WC->ReadPos,
+                                   &WC->serv_sock, 
+                                   1, 
+                                   BlobSize, 
+                                   NNN_TERM,
+                                   &ErrStr);
+       if (rc < 0) {
+               syslog(LOG_INFO, "StrBuf_ServGetBLOBBuffered(): Server connection broken: %s\n",
+                       (ErrStr)?ErrStr:"");
+               wc_backtrace(LOG_INFO);
+               if (WC->serv_sock > 0) close(WC->serv_sock);
+               WC->serv_sock = (-1);
+               WC->connected = 0;
+               WC->logged_in = 0;
+       }
+#ifdef SERV_TRACE
+        else
+                syslog(LOG_DEBUG, "%3d<<<BLOB: %d bytes\n", WC->serv_sock, StrLength(buf));
+#endif
+
+       return rc;
+}
+
+int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize) {
+       const char *ErrStr;
+       int rc;
+       
+       WC->ReadPos = NULL;
+       rc = StrBufReadBLOB(buf, &WC->serv_sock, 1, BlobSize, &ErrStr);
+       if (rc < 0) {
+               syslog(LOG_INFO, "StrBuf_ServGetBLOB(): Server connection broken: %s\n",
+                       (ErrStr)?ErrStr:"");
+               wc_backtrace(LOG_INFO);
+               if (WC->serv_sock > 0) close(WC->serv_sock);
+               WC->serv_sock = (-1);
+               WC->connected = 0;
+               WC->logged_in = 0;
+       }
+#ifdef SERV_TRACE
+        else
+                syslog(LOG_DEBUG, "%3d<<<BLOB: %d bytes\n", WC->serv_sock, StrLength(buf));
+#endif
+
+       return rc;
+}
+
+
+void FlushReadBuf (void) {
+       long len;
+       const char *pch;
+       const char *pche;
+
+       len = StrLength(WC->ReadBuf);
+       if ((len > 0) && (WC->ReadPos != NULL) && (WC->ReadPos != StrBufNOTNULL)) {
+               pch = ChrPtr(WC->ReadBuf);
+               pche = pch + len;
+               if (WC->ReadPos != pche) {
+                       syslog(LOG_ERR,
+                               "ERROR: somebody didn't eat his soup! Remaing Chars: %ld [%s]\n", 
+                               (long)(pche - WC->ReadPos),
+                               pche
+                       );
+                       syslog(LOG_ERR, 
+                               "--------------------------------------------------------------------------------\n"
+                               "Whole buf: [%s]\n"
+                               "--------------------------------------------------------------------------------\n", 
+                               pch);
+                       AppendImportantMessage(HKEY("Suppenkasper alert! watch your webcit logfile and get connected to your favourite opensource Crew."));
+               }
+       }
+
+       FlushStrBuf(WC->ReadBuf);
+       WC->ReadPos = NULL;
+
+
+}
+
+
+/*
+ *  send binary to server
+ *  buf the buffer to write to citadel server
+ *  nbytes how many bytes to send to citadel server
+ */
+int serv_write(const char *buf, int nbytes) {
+       int bytes_written = 0;
+       int retval;
+
+       FlushReadBuf();
+       while (bytes_written < nbytes) {
+               retval = write(WC->serv_sock, &buf[bytes_written], nbytes - bytes_written);
+               if (retval < 1) {
+                       const char *ErrStr = strerror(errno);
+                       syslog(LOG_INFO, "serv_write(): Server connection broken: %s\n", (ErrStr)?ErrStr:"");
+                       if (WC->serv_sock > 0) close(WC->serv_sock);
+                       WC->serv_sock = (-1);
+                       WC->connected = 0;
+                       WC->logged_in = 0;
+                       return 0;
+               }
+               bytes_written = bytes_written + retval;
+       }
+       return 1;
+}
+
+
+/*
+ *  send line to server
+ *  string the line to send to the citadel server
+ */
+int serv_puts(const char *string) {
+#ifdef SERV_TRACE
+       syslog(LOG_DEBUG, "%3d>>>%s\n", WC->serv_sock, string);
+#endif
+       FlushReadBuf();
+
+       if (!serv_write(string, strlen(string)))
+               return 0;
+       return serv_write("\n", 1);
+}
+
+/*
+ *  send line to server
+ *  string the line to send to the citadel server
+ */
+int serv_putbuf(const StrBuf *string) {
+#ifdef SERV_TRACE
+       syslog(LOG_DEBUG, "%3d>>>%s\n", WC->serv_sock, ChrPtr(string));
+#endif
+       FlushReadBuf();
+
+       if (!serv_write(ChrPtr(string), StrLength(string)))
+               return 0;
+       return serv_write("\n", 1);
+}
+
+
+/*
+ *  convenience function to send stuff to the server
+ *  format the formatstring
+ *  ... the entities to insert into format 
+ */
+int serv_printf(const char *format,...) {
+       va_list arg_ptr;
+       char buf[SIZ];
+       size_t len;
+       int rc;
+
+       FlushReadBuf();
+
+       va_start(arg_ptr, format);
+       vsnprintf(buf, sizeof buf, format, arg_ptr);
+       va_end(arg_ptr);
+
+       len = strlen(buf);
+       buf[len++] = '\n';
+       buf[len] = '\0';
+       rc = serv_write(buf, len);
+#ifdef SERV_TRACE
+       syslog(LOG_DEBUG, ">>>%s", buf);
+#endif
+       return rc;
+}
+
+
+/*
+ * Read binary data from server into memory using a series of server READ commands.
+ * returns the read content as StrBuf
+ */
+int serv_read_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf) {
+       size_t bytes_read = 0;
+       size_t this_block = 0;
+       int rc = 6;
+       int ServerRc = 6;
+
+       if (Ret == NULL) {
+               return -1;
+       }
+
+       while ((bytes_read < total_len) && (ServerRc == 6)) {
+
+               if (WC->serv_sock==-1) {
+                       FlushStrBuf(Ret); 
+                       return -1; 
+               }
+
+               serv_printf("READ "SIZE_T_FMT"|"SIZE_T_FMT, bytes_read, total_len-bytes_read);
+               if ( (rc = StrBuf_ServGetln(Buf) > 0) && (ServerRc = GetServerStatus(Buf, NULL), ServerRc == 6) ) {
+                       if (rc < 0)
+                               return rc;
+                       StrBufCutLeft(Buf, 4);
+                       this_block = StrTol(Buf);
+                       rc = StrBuf_ServGetBLOBBuffered(Ret, this_block);
+                       if (rc < 0) {
+                               syslog(LOG_INFO, "Server connection broken during download\n");
+                               wc_backtrace(LOG_INFO);
+                               if (WC->serv_sock > 0) close(WC->serv_sock);
+                               WC->serv_sock = (-1);
+                               WC->connected = 0;
+                               WC->logged_in = 0;
+                               return rc;
+                       }
+                       bytes_read += rc;
+               }
+       }
+
+       return StrLength(Ret);
+}
+
+
+int client_write(StrBuf *ThisBuf) {
+        const char *ptr, *eptr;
+        long count;
+       ssize_t res = 0;
+        fd_set wset;
+        int fdflags;
+
+       ptr = ChrPtr(ThisBuf);
+       count = StrLength(ThisBuf);
+       eptr = ptr + count;
+
+       fdflags = fcntl(WC->Hdr->http_sock, F_GETFL);
+
+        while ((ptr < eptr) && (WC->Hdr->http_sock != -1)) {
+                if ((fdflags & O_NONBLOCK) == O_NONBLOCK) {
+                        FD_ZERO(&wset);
+                        FD_SET(WC->Hdr->http_sock, &wset);
+                        if (select(WC->Hdr->http_sock + 1, NULL, &wset, NULL, NULL) == -1) {
+                                syslog(LOG_INFO, "client_write: Socket select failed (%s)\n", strerror(errno));
+                                return -1;
+                        }
+                }
+
+                if ((WC->Hdr->http_sock == -1) || ((res = write(WC->Hdr->http_sock, ptr, count)), (res == -1))) {
+                        syslog(LOG_INFO, "client_write: Socket write failed (%s)\n", strerror(errno));
+                       wc_backtrace(LOG_INFO);
+                        return -1;
+                }
+                count -= res;
+               ptr += res;
+        }
+       return 0;
+}
+
+
+int read_serv_chunk( StrBuf *Buf, size_t total_len, size_t *bytes_read) {
+       int rc;
+       int ServerRc;
+
+       serv_printf("READ "SIZE_T_FMT"|"SIZE_T_FMT, *bytes_read, total_len-(*bytes_read));
+       if ( (rc = StrBuf_ServGetln(Buf) > 0) && (ServerRc = GetServerStatus(Buf, NULL), ServerRc == 6) ) {
+               size_t this_block = 0;
+
+               if (rc < 0)
+                       return rc;
+
+               StrBufCutLeft(Buf, 4);
+               this_block = StrTol(Buf);
+               rc = StrBuf_ServGetBLOBBuffered(WC->WBuf, this_block);
+               if (rc < 0) {
+                       syslog(LOG_INFO, "Server connection broken during download\n");
+                       wc_backtrace(LOG_INFO);
+                       if (WC->serv_sock > 0) close(WC->serv_sock);
+                       WC->serv_sock = (-1);
+                       WC->connected = 0;
+                       WC->logged_in = 0;
+                       return rc;
+               }
+               *bytes_read += rc;
+       }
+       return 6;
+}
+
+static inline int send_http(StrBuf *Buf) {
+#ifdef HAVE_OPENSSL
+       if (is_https)
+               return client_write_ssl(Buf);
+       else
+#endif
+               return client_write(Buf);
+}
+/*
+ * Read binary data from server into memory using a series of server READ commands.
+ * returns the read content as StrBuf
+ */
+void serv_read_binary_to_http(StrBuf *MimeType, size_t total_len, int is_static, int detect_mime) {
+       int ServerRc = 6;
+       size_t bytes_read = 0;
+       int first = 1;
+       int client_con_state = 0;
+       int chunked = 0;
+       int is_gzip = 0;
+       const char *Err = NULL;
+       StrBuf *BufHeader = NULL;
+       StrBuf *Buf;
+       StrBuf *pBuf = NULL;
+       vStreamT *SC = NULL;
+       IOBuffer ReadBuffer;
+       IOBuffer WriteBuffer;
+       
+
+       Buf = NewStrBuf();
+
+       if (WC->Hdr->HaveRange) {
+               WC->Hdr->HaveRange++;
+               WC->Hdr->TotalBytes = total_len;
+               /* open range? or beyound file border? correct the numbers. */
+               if ((WC->Hdr->RangeTil == -1) || (WC->Hdr->RangeTil>= total_len))
+                       WC->Hdr->RangeTil = total_len - 1;
+               bytes_read = WC->Hdr->RangeStart;
+               total_len = WC->Hdr->RangeTil;
+       }
+       else
+               chunked = total_len > SIZ * 10; /* TODO: disallow for HTTP / 1.0 */
+
+       if (chunked) {
+               BufHeader = NewStrBuf();
+       }
+
+       if ((detect_mime != 0) && (bytes_read != 0)) {
+               /* need to read first chunk to detect mime, though the client doesn't care */
+               size_t bytes_read = 0;
+               const char *CT;
+
+               ServerRc = read_serv_chunk(
+                       Buf,
+                       total_len,
+                       &bytes_read);
+
+               if (ServerRc != 6)
+               {
+                       FreeStrBuf(&BufHeader);
+                       FreeStrBuf(&Buf);
+                       return;
+               }
+               CT = GuessMimeType(SKEY(WC->WBuf));
+               FlushStrBuf(WC->WBuf);
+               StrBufPlain(MimeType, CT, -1);
+               CheckGZipCompressionAllowed(SKEY(MimeType));
+               detect_mime = 0;
+               FreeStrBuf(&Buf);
+       }
+
+       memset(&WriteBuffer, 0, sizeof(IOBuffer));
+       if (chunked && !DisableGzip && WC->Hdr->HR.gzip_ok) {
+               is_gzip = 1;
+               SC = StrBufNewStreamContext (eZLibEncode, &Err);
+               if (SC == NULL) {
+                       syslog(LOG_ERR, "Error while initializing stream context: %s", Err);
+                       FreeStrBuf(&Buf);
+                       return;
+               }
+
+               memset(&ReadBuffer, 0, sizeof(IOBuffer));
+               ReadBuffer.Buf = WC->WBuf;
+
+               WriteBuffer.Buf = NewStrBufPlain(NULL, SIZ*2);;
+               pBuf = WriteBuffer.Buf;
+       }
+       else {
+               pBuf = WC->WBuf;
+       }
+
+       if (!detect_mime) {
+               http_transmit_headers(ChrPtr(MimeType), is_static, chunked, is_gzip);
+               
+               if (send_http(WC->HBuf) < 0) {
+                       FreeStrBuf(&Buf);
+                       FreeStrBuf(&WriteBuffer.Buf);
+                       FreeStrBuf(&BufHeader);
+                       if (StrBufDestroyStreamContext(eZLibEncode, &SC, &Err) && Err) {
+                               syslog(LOG_ERR, "Error while destroying stream context: %s", Err);
+                       }
+                       return;
+               }
+       }
+
+       while ((bytes_read < total_len) && (ServerRc == 6) && (client_con_state == 0)) {
+
+               if (WC->serv_sock==-1) {
+                       FlushStrBuf(WC->WBuf); 
+                       FreeStrBuf(&Buf);
+                       FreeStrBuf(&WriteBuffer.Buf);
+                       FreeStrBuf(&BufHeader);
+                       StrBufDestroyStreamContext(eZLibEncode, &SC, &Err);
+                       if (StrBufDestroyStreamContext(eZLibEncode, &SC, &Err) && Err) {
+                               syslog(LOG_ERR, "Error while destroying stream context: %s", Err);
+                       }
+                       return;
+               }
+
+               ServerRc = read_serv_chunk(
+                       Buf,
+                       total_len,
+                       &bytes_read);
+               if (ServerRc != 6)
+                       break;
+
+               if (detect_mime) {
+                       const char *CT;
+                       detect_mime = 0;
+                       
+                       CT = GuessMimeType(SKEY(WC->WBuf));
+                       StrBufPlain(MimeType, CT, -1);
+                       if (is_gzip) {
+                               CheckGZipCompressionAllowed(SKEY(MimeType));
+                               is_gzip = WC->Hdr->HR.gzip_ok;
+                       }
+                       http_transmit_headers(ChrPtr(MimeType), is_static, chunked, is_gzip);
+                       
+                       client_con_state = send_http(WC->HBuf);
+               }
+
+               if (is_gzip) {
+                       int done = (bytes_read == total_len);
+                       while ((IOBufferStrLength(&ReadBuffer) > 0) && (client_con_state == 0)) {
+                               int rc;
+
+                               do {
+                                       rc = StrBufStreamTranscode(eZLibEncode, &WriteBuffer, &ReadBuffer, NULL, -1, SC, done, &Err);
+
+                                       if (StrLength (pBuf) > 0) {
+                                               StrBufPrintf(BufHeader, "%s%x\r\n", 
+                                                    (first)?"":"\r\n",
+                                                            StrLength (pBuf));
+                                               first = 0;
+                                               client_con_state = send_http(BufHeader);
+                                               if (client_con_state == 0) {
+                                                       client_con_state = send_http(pBuf);
+                                               }
+                                               FlushStrBuf(pBuf);
+                                       }
+                               } while ((rc == 1) && (StrLength(pBuf) > 0));
+                       }
+                       FlushStrBuf(WC->WBuf);
+               }
+               else {
+                       if ((chunked) && (client_con_state == 0)) {
+                               StrBufPrintf(BufHeader, "%s%x\r\n", 
+                                            (first)?"":"\r\n",
+                                            StrLength (pBuf));
+                               first = 0;
+                               client_con_state = send_http(BufHeader);
+                       }
+
+                       if (client_con_state == 0)
+                               client_con_state = send_http(pBuf);
+
+                       FlushStrBuf(pBuf);
+               }
+       }
+
+       if (SC && StrBufDestroyStreamContext(eZLibEncode, &SC, &Err) && Err) {
+               syslog(LOG_ERR, "Error while destroying stream context: %s", Err);
+       }
+       FreeStrBuf(&WriteBuffer.Buf);
+       if ((chunked) && (client_con_state == 0)) {
+               StrBufPlain(BufHeader, HKEY("\r\n0\r\n\r\n"));
+               if (send_http(BufHeader) < 0) {
+                       FreeStrBuf(&Buf);
+                       FreeStrBuf(&BufHeader);
+                       return;
+               }
+       }
+       FreeStrBuf(&BufHeader);
+       FreeStrBuf(&Buf);
+}
+
+int ClientGetLine(ParsedHttpHdrs *Hdr, StrBuf *Target) {
+       const char *Error;
+#ifdef HAVE_OPENSSL
+       const char *pch, *pchs;
+       int rlen, len, retval = 0;
+
+       if (is_https) {
+               int ntries = 0;
+               if (StrLength(Hdr->ReadBuf) > 0) {
+                       pchs = ChrPtr(Hdr->ReadBuf);
+                       pch = strchr(pchs, '\n');
+                       if (pch != NULL) {
+                               rlen = 0;
+                               len = pch - pchs;
+                               if (len > 0 && (*(pch - 1) == '\r') )
+                                       rlen ++;
+                               StrBufSub(Target, Hdr->ReadBuf, 0, len - rlen);
+                               StrBufCutLeft(Hdr->ReadBuf, len + 1);
+                               return len - rlen;
+                       }
+               }
+
+               while (retval == 0) { 
+                       pch = NULL;
+                       pchs = ChrPtr(Hdr->ReadBuf);
+                       if (*pchs != '\0')
+                               pch = strchr(pchs, '\n');
+                       if (pch == NULL) {
+                               retval = client_read_sslbuffer(Hdr->ReadBuf, SLEEPING);
+                               pchs = ChrPtr(Hdr->ReadBuf);
+                               pch = strchr(pchs, '\n');
+                               if (pch == NULL)
+                                       retval = 0;
+                       }
+                       if (retval == 0) {
+                               sleeeeeeeeeep(1);
+                               ntries ++;
+                       }
+                       if (ntries > 10)
+                               return 0;
+               }
+               if ((retval > 0) && (pch != NULL)) {
+                       rlen = 0;
+                       len = pch - pchs;
+                       if (len > 0 && (*(pch - 1) == '\r') )
+                               rlen ++;
+                       StrBufSub(Target, Hdr->ReadBuf, 0, len - rlen);
+                       StrBufCutLeft(Hdr->ReadBuf, len + 1);
+                       return len - rlen;
+
+               }
+               else 
+                       return -1;
+       }
+       else 
+#endif
+               return StrBufTCP_read_buffered_line_fast(Target, 
+                                                        Hdr->ReadBuf,
+                                                        &Hdr->Pos,
+                                                        &Hdr->http_sock,
+                                                        5,
+                                                        1,
+                                                        &Error);
+}
+
+
+/* 
+ * This is a generic function to set up a master socket for listening on
+ * a TCP port.  The server shuts down if the bind fails.  (IPv4/IPv6 version)
+ *
+ * ip_addr     IP address to bind
+ * port_number port number to bind
+ * queue_len   number of incoming connections to allow in the queue
+ */
+int webcit_tcp_server(const char *ip_addr, int port_number, int queue_len) {
+       const char *ipv4broadcast = "0.0.0.0";
+       int IsDefault = 0;
+       struct protoent *p;
+       struct sockaddr_in6 sin6;
+       struct sockaddr_in sin4;
+       int s, i, b;
+       int ip_version = 6;
+
+retry:
+       memset(&sin6, 0, sizeof(sin6));
+       memset(&sin4, 0, sizeof(sin4));
+       sin6.sin6_family = AF_INET6;
+       sin4.sin_family = AF_INET;
+
+       if (    (ip_addr == NULL)                                                       /* any IPv6 */
+               || (IsEmptyStr(ip_addr))
+               || (!strcmp(ip_addr, "*"))
+       ) {
+               IsDefault = 1;
+               ip_version = 6;
+               sin6.sin6_addr = in6addr_any;
+       }
+       else if (!strcmp(ip_addr, "0.0.0.0"))                                           /* any IPv4 */
+       {
+               ip_version = 4;
+               sin4.sin_addr.s_addr = INADDR_ANY;
+       }
+       else if ((strchr(ip_addr, '.')) && (!strchr(ip_addr, ':')))                     /* specific IPv4 */
+       {
+               ip_version = 4;
+               if (inet_pton(AF_INET, ip_addr, &sin4.sin_addr) <= 0) {
+                       syslog(LOG_WARNING, "Error binding to [%s] : %s\n", ip_addr, strerror(errno));
+                       return (-WC_EXIT_BIND);
+               }
+       }
+       else                                                                            /* specific IPv6 */
+       {
+               ip_version = 6;
+               if (inet_pton(AF_INET6, ip_addr, &sin6.sin6_addr) <= 0) {
+                       syslog(LOG_WARNING, "Error binding to [%s] : %s\n", ip_addr, strerror(errno));
+                       return (-WC_EXIT_BIND);
+               }
+       }
+
+       if (port_number == 0) {
+               syslog(LOG_WARNING, "Cannot start: no port number specified.\n");
+               return (-WC_EXIT_BIND);
+       }
+       sin6.sin6_port = htons((u_short) port_number);
+       sin4.sin_port = htons((u_short) port_number);
+
+       p = getprotobyname("tcp");
+
+       s = socket( ((ip_version == 6) ? PF_INET6 : PF_INET), SOCK_STREAM, (p->p_proto));
+       if (s < 0) {
+               if (IsDefault && (errno == EAFNOSUPPORT))
+               {
+                       s = 0;
+                       ip_addr = ipv4broadcast;
+                       goto retry;
+               }
+               syslog(LOG_WARNING, "Can't create a listening socket: %s\n", strerror(errno));
+               return (-WC_EXIT_BIND);
+       }
+       /* Set some socket options that make sense. */
+       i = 1;
+       setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
+
+       if (ip_version == 6) {
+               b = bind(s, (struct sockaddr *) &sin6, sizeof(sin6));
+       }
+       else {
+               b = bind(s, (struct sockaddr *) &sin4, sizeof(sin4));
+       }
+
+       if (b < 0) {
+               syslog(LOG_ERR, "Can't bind: %s\n", strerror(errno));
+               close(s);
+               return (-WC_EXIT_BIND);
+       }
+
+       if (listen(s, queue_len) < 0) {
+               syslog(LOG_ERR, "Can't listen: %s\n", strerror(errno));
+               close(s);
+               return (-WC_EXIT_BIND);
+       }
+       return (s);
+}
+
+
+/*
+ * Create a Unix domain socket and listen on it
+ * sockpath - file name of the unix domain socket
+ * queue_len - Number of incoming connections to allow in the queue
+ */
+int webcit_uds_server(char *sockpath, int queue_len) {
+       struct sockaddr_un addr;
+       int s;
+       int i;
+       int actual_queue_len;
+
+       actual_queue_len = queue_len;
+       if (actual_queue_len < 5) actual_queue_len = 5;
+
+       i = unlink(sockpath);
+       if ((i != 0) && (errno != ENOENT)) {
+               syslog(LOG_WARNING, "webcit: can't unlink %s: %s\n",
+                       sockpath, strerror(errno));
+               return (-WC_EXIT_BIND);
+       }
+
+       memset(&addr, 0, sizeof(addr));
+       addr.sun_family = AF_UNIX;
+       safestrncpy(addr.sun_path, sockpath, sizeof addr.sun_path);
+
+       s = socket(AF_UNIX, SOCK_STREAM, 0);
+       if (s < 0) {
+               syslog(LOG_WARNING, "webcit: Can't create a unix domain socket: %s\n", strerror(errno));
+               return (-WC_EXIT_BIND);
+       }
+
+       if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+               syslog(LOG_WARNING, "webcit: Can't bind: %s\n", strerror(errno));
+               close(s);
+               return (-WC_EXIT_BIND);
+       }
+
+       if (listen(s, actual_queue_len) < 0) {
+               syslog(LOG_WARNING, "webcit: Can't listen: %s\n", strerror(errno));
+               close(s);
+               return (-WC_EXIT_BIND);
+       }
+
+       chmod(sockpath, 0777);
+       return(s);
+}
+
+
+/*
+ * Read data from the client socket.
+ *
+ * sock                socket fd to read from
+ * buf         buffer to read into 
+ * bytes       number of bytes to read
+ * timeout     Number of seconds to wait before timing out
+ *
+ * Possible return values:
+ *      1       Requested number of bytes has been read.
+ *      0       Request timed out.
+ *     -1      Connection is broken, or other error.
+ */
+int client_read_to(ParsedHttpHdrs *Hdr, StrBuf *Target, int bytes, int timeout) {
+       const char *Error;
+       int retval = 0;
+
+#ifdef HAVE_OPENSSL
+       if (is_https) {
+               long bufremain = 0;
+               long baselen;
+
+               baselen = StrLength(Target);
+
+               if (Hdr->Pos == NULL) {
+                       Hdr->Pos = ChrPtr(Hdr->ReadBuf);
+               }
+
+               if (StrLength(Hdr->ReadBuf) > 0) {
+                       bufremain = StrLength(Hdr->ReadBuf) - (Hdr->Pos - ChrPtr(Hdr->ReadBuf));
+                       
+                       if (bytes < bufremain)
+                               bufremain = bytes;
+                       StrBufAppendBufPlain(Target, Hdr->Pos, bufremain, 0);
+                       StrBufCutLeft(Hdr->ReadBuf, bufremain);
+               }
+
+               if (bytes > bufremain) {
+                       while ((StrLength(Hdr->ReadBuf) + StrLength(Target) < bytes + baselen) &&
+                              (retval >= 0))
+                               retval = client_read_sslbuffer(Hdr->ReadBuf, timeout);
+                       if (retval >= 0) {
+                               StrBufAppendBuf(Target, Hdr->ReadBuf, 0); /* todo: Buf > bytes? */
+                               return 1;
+                       }
+                       else {
+                               syslog(LOG_INFO, "client_read_ssl() failed\n");
+                               return -1;
+                       }
+               }
+               else 
+                       return 1;
+       }
+#endif
+       retval = StrBufReadBLOBBuffered(Target, 
+                                       Hdr->ReadBuf, 
+                                       &Hdr->Pos, 
+                                       &Hdr->http_sock, 
+                                       1, 
+                                       bytes,
+                                       O_TERM,
+                                       &Error);
+       if (retval < 0) {
+               syslog(LOG_INFO, "client_read() failed: %s\n", Error);
+               wc_backtrace(LOG_DEBUG);
+               return retval;
+       }
+
+       return 1;
+}
+
+
+/*
+ * Begin buffering HTTP output so we can transmit it all in one write operation later.
+ */
+void begin_burst(void)
+{
+       if (WC->WBuf == NULL) {
+               WC->WBuf = NewStrBufPlain(NULL, 32768);
+       }
+}
+
+
+/*
+ * Finish buffering HTTP output.  [Compress using zlib and] output with a Content-Length: header.
+ */
+long end_burst(void)
+{
+        const char *ptr, *eptr;
+        long count;
+       ssize_t res = 0;
+        fd_set wset;
+        int fdflags;
+
+       if (!DisableGzip && (WC->Hdr->HR.gzip_ok))
+       {
+               if (CompressBuffer(WC->WBuf) > 0)
+                       hprintf("Content-encoding: gzip\r\n");
+               else {
+                       syslog(LOG_ALERT, "Compression failed: %d [%s] sending uncompressed\n", errno, strerror(errno));
+                       wc_backtrace(LOG_INFO);
+               }
+       }
+
+       if (WC->WFBuf != NULL) {
+               WildFireSerializePayload(WC->WFBuf, WC->HBuf, &WC->Hdr->nWildfireHeaders, NULL);
+               FreeStrBuf(&WC->WFBuf);
+       }
+
+       if (WC->Hdr->HR.prohibit_caching)
+               hprintf("Pragma: no-cache\r\nCache-Control: no-store\r\nExpires:-1\r\n");
+       hprintf("Content-length: %d\r\n\r\n", StrLength(WC->WBuf));
+
+       ptr = ChrPtr(WC->HBuf);
+       count = StrLength(WC->HBuf);
+       eptr = ptr + count;
+
+#ifdef HAVE_OPENSSL
+       if (is_https) {
+               client_write_ssl(WC->HBuf);
+               client_write_ssl(WC->WBuf);
+               return (count);
+       }
+#endif
+
+       if (WC->Hdr->http_sock == -1) {
+               return -1;
+       }
+       fdflags = fcntl(WC->Hdr->http_sock, F_GETFL);
+
+       while ((ptr < eptr) && (WC->Hdr->http_sock != -1)) {
+                if ((fdflags & O_NONBLOCK) == O_NONBLOCK) {
+                        FD_ZERO(&wset);
+                        FD_SET(WC->Hdr->http_sock, &wset);
+                        if (select(WC->Hdr->http_sock + 1, NULL, &wset, NULL, NULL) == -1) {
+                                syslog(LOG_DEBUG, "client_write: Socket select failed (%s)\n", strerror(errno));
+                                return -1;
+                        }
+                }
+
+                if ((WC->Hdr->http_sock == -1) || 
+                   (res = write(WC->Hdr->http_sock, 
+                                ptr,
+                                count)) == -1) {
+                        syslog(LOG_DEBUG, "client_write: Socket write failed (%s)\n", strerror(errno));
+                       wc_backtrace(LOG_INFO);
+                        return res;
+                }
+                count -= res;
+               ptr += res;
+        }
+
+       ptr = ChrPtr(WC->WBuf);
+       count = StrLength(WC->WBuf);
+       eptr = ptr + count;
+
+        while ((ptr < eptr) && (WC->Hdr->http_sock != -1)) {
+                if ((fdflags & O_NONBLOCK) == O_NONBLOCK) {
+                        FD_ZERO(&wset);
+                        FD_SET(WC->Hdr->http_sock, &wset);
+                        if (select(WC->Hdr->http_sock + 1, NULL, &wset, NULL, NULL) == -1) {
+                                syslog(LOG_INFO, "client_write: Socket select failed (%s)\n", strerror(errno));
+                                return -1;
+                        }
+                }
+
+                if ((WC->Hdr->http_sock == -1) || 
+                   (res = write(WC->Hdr->http_sock, 
+                                ptr,
+                                count)) == -1) {
+                        syslog(LOG_INFO, "client_write: Socket write failed (%s)\n", strerror(errno));
+                       wc_backtrace(LOG_INFO);
+                        return res;
+                }
+                count -= res;
+               ptr += res;
+        }
+
+       return StrLength(WC->WBuf);
+}
+
+
+/*
+ * lingering_close() a`la Apache. see
+ * http://httpd.apache.org/docs/2.0/misc/fin_wait_2.html for rationale
+ */
+int lingering_close(int fd)
+{
+       char buf[SIZ];
+       int i;
+       fd_set set;
+       struct timeval tv, start;
+
+       gettimeofday(&start, NULL);
+       if (fd == -1)
+               return -1;
+       shutdown(fd, 1);
+       do {
+               do {
+                       gettimeofday(&tv, NULL);
+                       tv.tv_sec = SLEEPING - (tv.tv_sec - start.tv_sec);
+                       tv.tv_usec = start.tv_usec - tv.tv_usec;
+                       if (tv.tv_usec < 0) {
+                               tv.tv_sec--;
+                               tv.tv_usec += 1000000;
+                       }
+                       FD_ZERO(&set);
+                       FD_SET(fd, &set);
+                       i = select(fd + 1, &set, NULL, NULL, &tv);
+               } while (i == -1 && errno == EINTR);
+
+               if (i <= 0)
+                       break;
+
+               i = read(fd, buf, sizeof buf);
+       } while (i != 0 && (i != -1 || errno == EINTR));
+
+       return close(fd);
+}
+
+void
+HttpNewModule_TCPSOCKETS
+(ParsedHttpHdrs *httpreq)
+{
+
+       httpreq->ReadBuf = NewStrBufPlain(NULL, SIZ * 4);
+}
+
+void
+HttpDetachModule_TCPSOCKETS
+(ParsedHttpHdrs *httpreq)
+{
+
+       FlushStrBuf(httpreq->ReadBuf);
+       ReAdjustEmptyBuf(httpreq->ReadBuf, 4 * SIZ, SIZ);
+}
+
+void
+HttpDestroyModule_TCPSOCKETS
+(ParsedHttpHdrs *httpreq)
+{
+
+       FreeStrBuf(&httpreq->ReadBuf);
+}
+
+
+void
+SessionNewModule_TCPSOCKETS
+(wcsession *sess)
+{
+       sess->CLineBuf = NewStrBuf();
+       sess->MigrateReadLineBuf = NewStrBuf();
+}
+
+void 
+SessionDestroyModule_TCPSOCKETS
+(wcsession *sess)
+{
+       FreeStrBuf(&sess->CLineBuf);
+       FreeStrBuf(&sess->ReadBuf);
+       sess->connected = 0;
+       sess->ReadPos = NULL;
+       FreeStrBuf(&sess->MigrateReadLineBuf);
+       if (sess->serv_sock > 0) {
+               syslog(LOG_DEBUG, "Closing socket %d", sess->serv_sock);
+               close(sess->serv_sock);
+       }
+       sess->serv_sock = -1;
+}
diff --git a/webcit/sockets.h b/webcit/sockets.h
new file mode 100644 (file)
index 0000000..340e71e
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+int connect_to_citadel(char *);
+int connectsock(char *, char *);
+int serv_getln(char *strbuf, int bufsize);
+int StrBuf_ServGetln(StrBuf *buf);
+
+/*
+ * parse & check the server reply 
+ *
+ * Line                the line containing the server reply
+ * FullState   if you need more than just the major number, this is returns it. Ignored if NULL.
+ * PutImportantMessage if you want to forward the text part of the server reply to the user, specify 1; 
+ *             the result will be put into the 'Important Message' framework.
+ * MajorOK     in case of which major number not to put the ImportantMessage? 0 for all.
+ *
+ * returns the most significant digit of the server status
+ */
+
+int GetServerStatusMsg(StrBuf *Line, long* FullState, int PutImportantMessage, int MajorOK);
+
+/*
+ * to migrate old calls.... 
+ */
+#define GetServerStatus(a, b) GetServerStatusMsg(a, b, 0, 0)
+
+int serv_puts(const char *string);
+
+int serv_write(const char *buf, int nbytes);
+int serv_putbuf(const StrBuf *string);
+int serv_printf(const char *format,...)__attribute__((__format__(__printf__,1,2)));
+int serv_read_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf);
+void serv_read_binary_to_http(StrBuf *MimeType, size_t total_len, int is_static, int detect_mime);
+int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize);
+int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize);
+int read_server_text(StrBuf *Buf, long *nLines);
+
+void text_to_server(char *ptr);
+void text_to_server_qp(const StrBuf *SendMeEncoded);
+void server_to_text(void);
+int lingering_close(int fd);
diff --git a/webcit/static.c b/webcit/static.c
new file mode 100644 (file)
index 0000000..ccae7d2
--- /dev/null
@@ -0,0 +1,167 @@
+// The functions in this file handle static pages and objects -- a basic web server.
+//
+// Copyright (c) 1996-2021 by the citadel.org team
+//
+// This program is open source software.  You can redistribute it and/or
+// modify it under the terms of the GNU General Public License, version 3.
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include "webcit.h"
+#include "webserver.h"
+
+unsigned char OnePixelGif[37] = {
+               0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x01, 0x00,
+               0x01, 0x00, 0x80, 0x00, 0x00, 0xff, 0xff, 0xff,
+               0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00,
+               0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44,
+               0x01, 0x00, 0x3b 
+};
+
+
+void output_error_pic(const char *ErrMsg1, const char *ErrMsg2) {
+       hprintf("HTTP/1.1 200 %s\r\n", ErrMsg1);
+       hprintf("Content-Type: image/gif\r\n");
+       hprintf("x-webcit-errormessage: %s\r\n", ErrMsg2);
+       begin_burst();
+       StrBufPlain(WC->WBuf, (const char *)OnePixelGif, sizeof(OnePixelGif));
+       end_burst();
+}
+
+/*
+ * dump out static pages from disk
+ */
+void output_static(char *prefix) {
+       int fd;
+       struct stat statbuf;
+       off_t bytes;
+       const char *content_type;
+       int len;
+       const char *Err;
+       char what[SIZ];
+       snprintf(what, sizeof what, "./%s/%s", prefix, (char *)ChrPtr(WC->Hdr->HR.ReqLine));
+
+       syslog(LOG_DEBUG, "output_static(%s)", what);
+       len = strlen (what);
+       content_type = GuessMimeByFilename(what, len);
+       fd = open(what, O_RDONLY);
+       if (fd <= 0) {
+               syslog(LOG_INFO, "output_static('%s') [%s] : %s", what, ChrPtr(WC->Hdr->this_page), strerror(errno));
+               if (strstr(content_type, "image/") != NULL) {
+                       output_error_pic("the file you requsted is gone.", strerror(errno));
+               }
+               else {
+                       hprintf("HTTP/1.1 404 %s\r\n", strerror(errno));
+                       hprintf("Content-Type: text/plain\r\n");
+                       begin_burst();
+                       wc_printf("Cannot open %s: %s\r\n", what, strerror(errno));
+                       end_burst();
+               }
+       }
+       else {
+               if (fstat(fd, &statbuf) == -1) {
+                       syslog(LOG_INFO, "output_static('%s') : %s", what, strerror(errno));
+                       if (strstr(content_type, "image/") != NULL) {
+                               output_error_pic("Stat failed!", strerror(errno));
+                       }
+                       else {
+                               hprintf("HTTP/1.1 404 %s\r\n", strerror(errno));
+                               hprintf("Content-Type: text/plain\r\n");
+                               begin_burst();
+                               wc_printf("Cannot fstat %s: %s\n", what, strerror(errno));
+                               end_burst();
+                       }
+                       if (fd > 0) close(fd);
+                       return;
+               }
+
+               bytes = statbuf.st_size;
+
+               if (StrBufReadBLOB(WC->WBuf, &fd, 1, bytes, &Err) < 0) {
+                       if (fd > 0) close(fd);
+                       syslog(LOG_INFO, "output_static('%s')  -- FREAD FAILED (%s) --\n", what, strerror(errno));
+                               hprintf("HTTP/1.1 500 internal server error \r\n");
+                               hprintf("Content-Type: text/plain\r\n");
+                               end_burst();
+                               return;
+               }
+
+               close(fd);
+               http_transmit_thing(content_type, 2);
+       }
+       if (yesbstr("force_close_session")) {
+               end_webcit_session();
+       }
+}
+
+
+/*
+ * robots.txt
+ */
+void robots_txt(void) {
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       hprintf("Content-type: text/plain\r\n"
+               "Server: %s\r\n"
+               "Connection: close\r\n",
+               PACKAGE_STRING);
+       begin_burst();
+
+       wc_printf("User-agent: *\r\n"
+               "Disallow: /printmsg\r\n"
+               "Disallow: /msgheaders\r\n"
+               "Disallow: /groupdav\r\n"
+               "Disallow: /do_template\r\n"
+               "Disallow: /static\r\n"
+               "Disallow: /display_page\r\n"
+               "Disallow: /readnew\r\n"
+               "Disallow: /display_enter\r\n"
+               "Disallow: /skip\r\n"
+               "Disallow: /ungoto\r\n"
+               "Sitemap: %s/sitemap.xml\r\n"
+               "\r\n"
+               ,
+               ChrPtr(site_prefix)
+       );
+
+       wDumpContent(0);
+}
+
+
+// These are the various prefixes we can use to fetch static pages.
+void output_static_root(void)          {       output_static(".");             }
+void output_static_static(void)                {       output_static("static");        }
+void output_static_tinymce(void)       {       output_static("tiny_mce");      }
+void output_static_acme(void)          {       output_static(".well-known");   }
+
+
+void 
+ServerStartModule_STATIC
+(void)
+{
+}
+
+
+void 
+ServerShutdownModule_STATIC
+(void)
+{
+}
+
+void 
+InitModule_STATIC
+(void)
+{
+       WebcitAddUrlHandler(HKEY("robots.txt"), "", 0, robots_txt, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY);
+       WebcitAddUrlHandler(HKEY("favicon.ico"), "", 0, output_static_root, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY);
+       WebcitAddUrlHandler(HKEY("static"), "", 0, output_static_static, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY);
+       WebcitAddUrlHandler(HKEY("tinymce"), "", 0, output_static_tinymce, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY);
+       WebcitAddUrlHandler(HKEY("tiny_mce"), "", 0, output_static_tinymce, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY);
+       WebcitAddUrlHandler(HKEY(".well-known"), "", 0, output_static_acme, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY);
+}
diff --git a/webcit/static/.gitignore b/webcit/static/.gitignore
new file mode 100755 (executable)
index 0000000..30af5fe
--- /dev/null
@@ -0,0 +1 @@
+icons
diff --git a/webcit/static/authmethods.js b/webcit/static/authmethods.js
new file mode 100644 (file)
index 0000000..fa17b73
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ * Copyright 2010-2017, the Citadel Team
+ * Licensed under the GPL V3
+ *
+ * JavaScript functions which handle various authentication methods.
+ */
+
+
+
+/****************** COMMON CODE ***********************/
+
+
+/*
+ * Are we logged in right now?
+ */
+function IsLoggedIn() {
+       if ($('is_logged_in').innerHTML == "yes") {
+               return 1;
+       }
+       else {
+               return 0;
+       }
+}
+
+
+/*
+ * Wrapper script to require logging in before completing an action
+ */
+function GetLoggedInFirst(destination_url) {
+
+       /* If logged in already, go directly to the destination. */
+       if (IsLoggedIn()) {
+               window.location = decodeURIComponent(destination_url);
+               return;
+       }
+
+       p = 'push?url=' + destination_url;
+       new Ajax.Request(p, { method: 'get' } );
+
+       /* If not logged in, go modal and ask the user to log in first. */
+        toggleModal(1);
+}
+
+
+/*
+ * tab handler for the login box
+ */
+function authtoggle(show_which_div) {
+       $('authbox_userpass').style.display = 'none';
+       $('authbox_newuser').style.display = 'none';
+       $('authbox_openid').style.display = 'none';
+       $('authbox_google').style.display = 'none';
+       $('authbox_yahoo').style.display = 'none';
+       $('authbox_aol').style.display = 'none';
+       $('authbox_success').style.display = 'none';
+       $(show_which_div).style.display = 'block';
+}
+
+
+/*
+ * Pop out a window for external auth methods
+ * (most of them don't handle inline auth very well)
+ */
+function do_auth_popout(popout_url) {
+       window.open(popout_url, "authpopout", "status=1,toolbar=0,width=600,height=400");
+}
+
+
+
+
+/****************** USERNAME AND PASSWORD ***********************/
+
+/*
+ * Attempt login with username/password, called from modal dialog
+ */
+function ajax_try_username_and_password() {
+
+       $('login_errmsg').innerHTML = "";
+       authtoggle('authbox_success');
+        $('ajax_username_password_form').request({
+               onSuccess: function(ctdlresult) {
+                       if (ctdlresult.responseText.substr(0,1) == '2') {
+                               window.location = 'pop';
+                       }
+                       else {
+                               $('login_errmsg').innerHTML = ctdlresult.responseText.substr(4) ;
+                               authtoggle('authbox_userpass');
+                       }
+               }
+       });
+}
+
+
+/*
+ * The user pressed a key while in the username or password box.
+ * Is it the enter/return key?  Submit the form.
+ */
+function username_and_password_onkeypress(e) {
+       if (window.event) {             /* IE */
+               keynum = e.keyCode
+       }
+       else if (e.which) {             /* real browsers */
+               keynum = e.which
+       }
+       if (keynum == 13) {             /* enter/return key */
+               ajax_try_username_and_password();
+       }
+}
+
+
+/****************** REGISTER NEW USER ***********************/
+
+/*
+ * Attempt to create a new local username/password, called from modal dialog
+ */
+function ajax_try_newuser() {
+
+       $('login_errmsg').innerHTML = "";
+        $('ajax_newuser_form').request({
+               onSuccess: function(ctdlresult) {
+                       if (ctdlresult.responseText.substr(0,1) == '2') {
+                               authtoggle('authbox_success');
+                               window.location = 'pop';
+                       }
+                       else {
+                               $('login_errmsg').innerHTML = ctdlresult.responseText.substr(4) ;
+                       }
+               }
+       });
+}
+
+
+/*
+ * The user pressed a key while in the newuser or newpassword box.
+ * Is it the enter/return key?  Submit the form.
+ */
+function newuser_onkeypress(e) {
+       if (window.event) {             /* IE */
+               keynum = e.keyCode;
+       }
+       else if (e.which) {             /* real browsers */
+               keynum = e.which;
+       }
+       if (keynum == 13) {             /* enter/return key */
+               ajax_try_newuser();
+       }
+}
+
+
+
+
+/****************** OPENID ***********************/
+
+/*
+ * Attempt login with OpenID, called from modal dialog
+ */
+function ajax_try_openid() {
+       $('login_errmsg').innerHTML = "";
+       openid_url = encodeURI($('ajax_openid_form').elements["openid_url"].value);
+       do_auth_popout("openid_login?openid_url=" + openid_url);
+}
+
+
+/*
+ * The user pressed a key while in the openid login box.
+ * Is it the enter/return key?  Submit the form.
+ */
+function openid_onkeypress(e) {
+       if (window.event) {             /* IE */
+               keynum = e.keyCode;
+       }
+       else if (e.which) {             /* real browsers */
+               keynum = e.which;
+       }
+       if (keynum == 13) {             /* enter/return key */
+               ajax_try_openid();
+               return false;
+       }
+       return true;
+}
+
+
+/****************** GOOGLE ***********************/
+
+/*
+ * Attempt login with Google, called from modal dialog
+ */
+function ajax_try_google() {
+       $('login_errmsg').innerHTML = "";
+       openid_url = encodeURI("https://www.google.com/accounts/o8/id");
+       do_auth_popout("openid_login?openid_url=" + openid_url);
+}
+
+
+/****************** YAHOO ***********************/
+
+/*
+ * Attempt login with Yahoo, called from modal dialog
+ */
+function ajax_try_yahoo() {
+       $('login_errmsg').innerHTML = "";
+       openid_url = encodeURI("http://yahoo.com");
+       do_auth_popout("openid_login?openid_url=" + openid_url);
+}
+
+
+/****************** AOL ***********************/
+
+/*
+ * Attempt login with AOL, called from modal dialog
+ */
+function ajax_try_aol() {
+       $('login_errmsg').innerHTML = "";
+       openid_url = encodeURI($('ajax_aol_form').elements["aol_screenname"].value);
+       do_auth_popout("openid_login?openid_url=http://openid.aol.com/" + openid_url);
+}
+
+
+/*
+ * The user pressed a key while in the AOL login box.
+ * Is it the enter/return key?  Submit the form.
+ */
+function aol_onkeypress(e) {
+       if (window.event) {             /* IE */
+               keynum = e.keyCode;
+       }
+       else if (e.which) {             /* real browsers */
+               keynum = e.which;
+       }
+       if (keynum == 13) {             /* enter/return key */
+               ajax_try_aol();
+               return false;
+       }
+       return true;
+}
+
+
diff --git a/webcit/static/builder.js b/webcit/static/builder.js
new file mode 100644 (file)
index 0000000..7325038
--- /dev/null
@@ -0,0 +1,136 @@
+// script.aculo.us builder.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Builder = {
+  NODEMAP: {
+    AREA: 'map',
+    CAPTION: 'table',
+    COL: 'table',
+    COLGROUP: 'table',
+    LEGEND: 'fieldset',
+    OPTGROUP: 'select',
+    OPTION: 'select',
+    PARAM: 'object',
+    TBODY: 'table',
+    TD: 'table',
+    TFOOT: 'table',
+    TH: 'table',
+    THEAD: 'table',
+    TR: 'table'
+  },
+  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
+  //       due to a Firefox bug
+  node: function(elementName) {
+    elementName = elementName.toUpperCase();
+
+    // try innerHTML approach
+    var parentTag = this.NODEMAP[elementName] || 'div';
+    var parentElement = document.createElement(parentTag);
+    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
+    } catch(e) {}
+    var element = parentElement.firstChild || null;
+
+    // see if browser added wrapping tags
+    if(element && (element.tagName.toUpperCase() != elementName))
+      element = element.getElementsByTagName(elementName)[0];
+
+    // fallback to createElement approach
+    if(!element) element = document.createElement(elementName);
+
+    // abort if nothing could be created
+    if(!element) return;
+
+    // attributes (or text)
+    if(arguments[1])
+      if(this._isStringOrNumber(arguments[1]) ||
+        (arguments[1] instanceof Array) ||
+        arguments[1].tagName) {
+          this._children(element, arguments[1]);
+        } else {
+          var attrs = this._attributes(arguments[1]);
+          if(attrs.length) {
+            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+              parentElement.innerHTML = "<" +elementName + " " +
+                attrs + "></" + elementName + ">";
+            } catch(e) {}
+            element = parentElement.firstChild || null;
+            // workaround firefox 1.0.X bug
+            if(!element) {
+              element = document.createElement(elementName);
+              for(attr in arguments[1])
+                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
+            }
+            if(element.tagName.toUpperCase() != elementName)
+              element = parentElement.getElementsByTagName(elementName)[0];
+          }
+        }
+
+    // text, or array of children
+    if(arguments[2])
+      this._children(element, arguments[2]);
+
+     return $(element);
+  },
+  _text: function(text) {
+     return document.createTextNode(text);
+  },
+
+  ATTR_MAP: {
+    'className': 'class',
+    'htmlFor': 'for'
+  },
+
+  _attributes: function(attributes) {
+    var attrs = [];
+    for(attribute in attributes)
+      attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
+          '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
+    return attrs.join(" ");
+  },
+  _children: function(element, children) {
+    if(children.tagName) {
+      element.appendChild(children);
+      return;
+    }
+    if(typeof children=='object') { // array can hold nodes and text
+      children.flatten().each( function(e) {
+        if(typeof e=='object')
+          element.appendChild(e);
+        else
+          if(Builder._isStringOrNumber(e))
+            element.appendChild(Builder._text(e));
+      });
+    } else
+      if(Builder._isStringOrNumber(children))
+        element.appendChild(Builder._text(children));
+  },
+  _isStringOrNumber: function(param) {
+    return(typeof param=='string' || typeof param=='number');
+  },
+  build: function(html) {
+    var element = this.node('div');
+    $(element).update(html.strip());
+    return element.down();
+  },
+  dump: function(scope) {
+    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
+
+    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
+      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
+      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
+      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
+      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
+      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
+
+    tags.each( function(tag){
+      scope[tag] = function() {
+        return Builder.node.apply(Builder, [tag].concat($A(arguments)));
+      };
+    });
+  }
+};
\ No newline at end of file
diff --git a/webcit/static/citadel-logo.gif b/webcit/static/citadel-logo.gif
new file mode 100644 (file)
index 0000000..58611e8
Binary files /dev/null and b/webcit/static/citadel-logo.gif differ
diff --git a/webcit/static/controls.js b/webcit/static/controls.js
new file mode 100644 (file)
index 0000000..5137ab5
--- /dev/null
@@ -0,0 +1,965 @@
+// script.aculo.us controls.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005-2010 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+//           (c) 2005-2010 Jon Tirsen (http://www.tirsen.com)
+// Contributors:
+//  Richard Livsey
+//  Rahul Bhargava
+//  Rob Wills
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// Autocompleter.Base handles all the autocompletion functionality
+// that's independent of the data source for autocompletion. This
+// includes drawing the autocompletion menu, observing keyboard
+// and mouse events, and similar.
+//
+// Specific autocompleters need to provide, at the very least,
+// a getUpdatedChoices function that will be invoked every time
+// the text inside the monitored textbox changes. This method
+// should get the text for which to provide autocompletion by
+// invoking this.getToken(), NOT by directly accessing
+// this.element.value. This is to allow incremental tokenized
+// autocompletion. Specific auto-completion logic (AJAX, etc)
+// belongs in getUpdatedChoices.
+//
+// Tokenized incremental autocompletion is enabled automatically
+// when an autocompleter is instantiated with the 'tokens' option
+// in the options parameter, e.g.:
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
+// will incrementally autocomplete with a comma as the token.
+// Additionally, ',' in the above example can be replaced with
+// a token array, e.g. { tokens: [',', '\n'] } which
+// enables autocompletion on multiple tokens. This is most
+// useful when one of the tokens is \n (a newline), as it
+// allows smart autocompletion after linebreaks.
+
+if(typeof Effect == 'undefined')
+  throw("controls.js requires including script.aculo.us' effects.js library");
+
+var Autocompleter = { };
+Autocompleter.Base = Class.create({
+  baseInitialize: function(element, update, options) {
+    element          = $(element);
+    this.element     = element;
+    this.update      = $(update);
+    this.hasFocus    = false;
+    this.changed     = false;
+    this.active      = false;
+    this.index       = 0;
+    this.entryCount  = 0;
+    this.oldElementValue = this.element.value;
+
+    if(this.setOptions)
+      this.setOptions(options);
+    else
+      this.options = options || { };
+
+    this.options.paramName    = this.options.paramName || this.element.name;
+    this.options.tokens       = this.options.tokens || [];
+    this.options.frequency    = this.options.frequency || 0.4;
+    this.options.minChars     = this.options.minChars || 1;
+    this.options.onShow       = this.options.onShow ||
+      function(element, update){
+        if(!update.style.position || update.style.position=='absolute') {
+          update.style.position = 'absolute';
+          Position.clone(element, update, {
+            setHeight: false,
+            offsetTop: element.offsetHeight
+          });
+        }
+        Effect.Appear(update,{duration:0.15});
+      };
+    this.options.onHide = this.options.onHide ||
+      function(element, update){ new Effect.Fade(update,{duration:0.15}) };
+
+    if(typeof(this.options.tokens) == 'string')
+      this.options.tokens = new Array(this.options.tokens);
+    // Force carriage returns as token delimiters anyway
+    if (!this.options.tokens.include('\n'))
+      this.options.tokens.push('\n');
+
+    this.observer = null;
+
+    this.element.setAttribute('autocomplete','off');
+
+    Element.hide(this.update);
+
+    Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
+    Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
+  },
+
+  show: function() {
+    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+    if(!this.iefix &&
+      (Prototype.Browser.IE) &&
+      (Element.getStyle(this.update, 'position')=='absolute')) {
+      new Insertion.After(this.update,
+       '<iframe id="' + this.update.id + '_iefix" '+
+       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
+       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
+      this.iefix = $(this.update.id+'_iefix');
+    }
+    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
+  },
+
+  fixIEOverlapping: function() {
+    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
+    this.iefix.style.zIndex = 1;
+    this.update.style.zIndex = 2;
+    Element.show(this.iefix);
+  },
+
+  hide: function() {
+    this.stopIndicator();
+    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
+    if(this.iefix) Element.hide(this.iefix);
+  },
+
+  startIndicator: function() {
+    if(this.options.indicator) Element.show(this.options.indicator);
+  },
+
+  stopIndicator: function() {
+    if(this.options.indicator) Element.hide(this.options.indicator);
+  },
+
+  onKeyPress: function(event) {
+    if(this.active)
+      switch(event.keyCode) {
+       case Event.KEY_TAB:
+       case Event.KEY_RETURN:
+         this.selectEntry();
+         Event.stop(event);
+       case Event.KEY_ESC:
+         this.hide();
+         this.active = false;
+         Event.stop(event);
+         return;
+       case Event.KEY_LEFT:
+       case Event.KEY_RIGHT:
+         return;
+       case Event.KEY_UP:
+         this.markPrevious();
+         this.render();
+         Event.stop(event);
+         return;
+       case Event.KEY_DOWN:
+         this.markNext();
+         this.render();
+         Event.stop(event);
+         return;
+      }
+     else
+       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
+         (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;
+
+    this.changed = true;
+    this.hasFocus = true;
+
+    if(this.observer) clearTimeout(this.observer);
+      this.observer =
+        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+  },
+
+  activate: function() {
+    this.changed = false;
+    this.hasFocus = true;
+    this.getUpdatedChoices();
+  },
+
+  onHover: function(event) {
+    var element = Event.findElement(event, 'LI');
+    if(this.index != element.autocompleteIndex)
+    {
+        this.index = element.autocompleteIndex;
+        this.render();
+    }
+    Event.stop(event);
+  },
+
+  onClick: function(event) {
+    var element = Event.findElement(event, 'LI');
+    this.index = element.autocompleteIndex;
+    this.selectEntry();
+    this.hide();
+  },
+
+  onBlur: function(event) {
+    // needed to make click events working
+    setTimeout(this.hide.bind(this), 250);
+    this.hasFocus = false;
+    this.active = false;
+  },
+
+  render: function() {
+    if(this.entryCount > 0) {
+      for (var i = 0; i < this.entryCount; i++)
+        this.index==i ?
+          Element.addClassName(this.getEntry(i),"selected") :
+          Element.removeClassName(this.getEntry(i),"selected");
+      if(this.hasFocus) {
+        this.show();
+        this.active = true;
+      }
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+
+  markPrevious: function() {
+    if(this.index > 0) this.index--;
+      else this.index = this.entryCount-1;
+    this.getEntry(this.index).scrollIntoView(true);
+  },
+
+  markNext: function() {
+    if(this.index < this.entryCount-1) this.index++;
+      else this.index = 0;
+    this.getEntry(this.index).scrollIntoView(false);
+  },
+
+  getEntry: function(index) {
+    return this.update.firstChild.childNodes[index];
+  },
+
+  getCurrentEntry: function() {
+    return this.getEntry(this.index);
+  },
+
+  selectEntry: function() {
+    this.active = false;
+    this.updateElement(this.getCurrentEntry());
+  },
+
+  updateElement: function(selectedElement) {
+    if (this.options.updateElement) {
+      this.options.updateElement(selectedElement);
+      return;
+    }
+    var value = '';
+    if (this.options.select) {
+      var nodes = $(selectedElement).select('.' + this.options.select) || [];
+      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
+    } else
+      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+
+    var bounds = this.getTokenBounds();
+    if (bounds[0] != -1) {
+      var newValue = this.element.value.substr(0, bounds[0]);
+      var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
+      if (whitespace)
+        newValue += whitespace[0];
+      this.element.value = newValue + value + this.element.value.substr(bounds[1]);
+    } else {
+      this.element.value = value;
+    }
+    this.oldElementValue = this.element.value;
+    this.element.focus();
+
+    if (this.options.afterUpdateElement)
+      this.options.afterUpdateElement(this.element, selectedElement);
+  },
+
+  updateChoices: function(choices) {
+    if(!this.changed && this.hasFocus) {
+      this.update.innerHTML = choices;
+      Element.cleanWhitespace(this.update);
+      Element.cleanWhitespace(this.update.down());
+
+      if(this.update.firstChild && this.update.down().childNodes) {
+        this.entryCount =
+          this.update.down().childNodes.length;
+        for (var i = 0; i < this.entryCount; i++) {
+          var entry = this.getEntry(i);
+          entry.autocompleteIndex = i;
+          this.addObservers(entry);
+        }
+      } else {
+        this.entryCount = 0;
+      }
+
+      this.stopIndicator();
+      this.index = 0;
+
+      if(this.entryCount==1 && this.options.autoSelect) {
+        this.selectEntry();
+        this.hide();
+      } else {
+        this.render();
+      }
+    }
+  },
+
+  addObservers: function(element) {
+    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
+    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
+  },
+
+  onObserverEvent: function() {
+    this.changed = false;
+    this.tokenBounds = null;
+    if(this.getToken().length>=this.options.minChars) {
+      this.getUpdatedChoices();
+    } else {
+      this.active = false;
+      this.hide();
+    }
+    this.oldElementValue = this.element.value;
+  },
+
+  getToken: function() {
+    var bounds = this.getTokenBounds();
+    return this.element.value.substring(bounds[0], bounds[1]).strip();
+  },
+
+  getTokenBounds: function() {
+    if (null != this.tokenBounds) return this.tokenBounds;
+    var value = this.element.value;
+    if (value.strip().empty()) return [-1, 0];
+    var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
+    var offset = (diff == this.oldElementValue.length ? 1 : 0);
+    var prevTokenPos = -1, nextTokenPos = value.length;
+    var tp;
+    for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
+      tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
+      if (tp > prevTokenPos) prevTokenPos = tp;
+      tp = value.indexOf(this.options.tokens[index], diff + offset);
+      if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
+    }
+    return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
+  }
+});
+
+Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
+  var boundary = Math.min(newS.length, oldS.length);
+  for (var index = 0; index < boundary; ++index)
+    if (newS[index] != oldS[index])
+      return index;
+  return boundary;
+};
+
+Ajax.Autocompleter = Class.create(Autocompleter.Base, {
+  initialize: function(element, update, url, options) {
+    this.baseInitialize(element, update, options);
+    this.options.asynchronous  = true;
+    this.options.onComplete    = this.onComplete.bind(this);
+    this.options.defaultParams = this.options.parameters || null;
+    this.url                   = url;
+  },
+
+  getUpdatedChoices: function() {
+    this.startIndicator();
+
+    var entry = encodeURIComponent(this.options.paramName) + '=' +
+      encodeURIComponent(this.getToken());
+
+    this.options.parameters = this.options.callback ?
+      this.options.callback(this.element, entry) : entry;
+
+    if(this.options.defaultParams)
+      this.options.parameters += '&' + this.options.defaultParams;
+
+    new Ajax.Request(this.url, this.options);
+  },
+
+  onComplete: function(request) {
+    this.updateChoices(request.responseText);
+  }
+});
+
+// The local array autocompleter. Used when you'd prefer to
+// inject an array of autocompletion options into the page, rather
+// than sending out Ajax queries, which can be quite slow sometimes.
+//
+// The constructor takes four parameters. The first two are, as usual,
+// the id of the monitored textbox, and id of the autocompletion menu.
+// The third is the array you want to autocomplete from, and the fourth
+// is the options block.
+//
+// Extra local autocompletion options:
+// - choices - How many autocompletion choices to offer
+//
+// - partialSearch - If false, the autocompleter will match entered
+//                    text only at the beginning of strings in the
+//                    autocomplete array. Defaults to true, which will
+//                    match text at the beginning of any *word* in the
+//                    strings in the autocomplete array. If you want to
+//                    search anywhere in the string, additionally set
+//                    the option fullSearch to true (default: off).
+//
+// - fullSsearch - Search anywhere in autocomplete array strings.
+//
+// - partialChars - How many characters to enter before triggering
+//                   a partial match (unlike minChars, which defines
+//                   how many characters are required to do any match
+//                   at all). Defaults to 2.
+//
+// - ignoreCase - Whether to ignore case when autocompleting.
+//                 Defaults to true.
+//
+// It's possible to pass in a custom function as the 'selector'
+// option, if you prefer to write your own autocompletion logic.
+// In that case, the other options above will not apply unless
+// you support them.
+
+Autocompleter.Local = Class.create(Autocompleter.Base, {
+  initialize: function(element, update, array, options) {
+    this.baseInitialize(element, update, options);
+    this.options.array = array;
+  },
+
+  getUpdatedChoices: function() {
+    this.updateChoices(this.options.selector(this));
+  },
+
+  setOptions: function(options) {
+    this.options = Object.extend({
+      choices: 10,
+      partialSearch: true,
+      partialChars: 2,
+      ignoreCase: true,
+      fullSearch: false,
+      selector: function(instance) {
+        var ret       = []; // Beginning matches
+        var partial   = []; // Inside matches
+        var entry     = instance.getToken();
+        var count     = 0;
+
+        for (var i = 0; i < instance.options.array.length &&
+          ret.length < instance.options.choices ; i++) {
+
+          var elem = instance.options.array[i];
+          var foundPos = instance.options.ignoreCase ?
+            elem.toLowerCase().indexOf(entry.toLowerCase()) :
+            elem.indexOf(entry);
+
+          while (foundPos != -1) {
+            if (foundPos == 0 && elem.length != entry.length) {
+              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
+                elem.substr(entry.length) + "</li>");
+              break;
+            } else if (entry.length >= instance.options.partialChars &&
+              instance.options.partialSearch && foundPos != -1) {
+              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
+                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
+                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
+                  foundPos + entry.length) + "</li>");
+                break;
+              }
+            }
+
+            foundPos = instance.options.ignoreCase ?
+              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
+              elem.indexOf(entry, foundPos + 1);
+
+          }
+        }
+        if (partial.length)
+          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
+        return "<ul>" + ret.join('') + "</ul>";
+      }
+    }, options || { });
+  }
+});
+
+// AJAX in-place editor and collection editor
+// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007).
+
+// Use this if you notice weird scrolling problems on some browsers,
+// the DOM might be a bit confused when this gets called so do this
+// waits 1 ms (with setTimeout) until it does the activation
+Field.scrollFreeActivate = function(field) {
+  setTimeout(function() {
+    Field.activate(field);
+  }, 1);
+};
+
+Ajax.InPlaceEditor = Class.create({
+  initialize: function(element, url, options) {
+    this.url = url;
+    this.element = element = $(element);
+    this.prepareOptions();
+    this._controls = { };
+    arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
+    Object.extend(this.options, options || { });
+    if (!this.options.formId && this.element.id) {
+      this.options.formId = this.element.id + '-inplaceeditor';
+      if ($(this.options.formId))
+        this.options.formId = '';
+    }
+    if (this.options.externalControl)
+      this.options.externalControl = $(this.options.externalControl);
+    if (!this.options.externalControl)
+      this.options.externalControlOnly = false;
+    this._originalBackground = this.element.getStyle('background-color') || 'transparent';
+    this.element.title = this.options.clickToEditText;
+    this._boundCancelHandler = this.handleFormCancellation.bind(this);
+    this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
+    this._boundFailureHandler = this.handleAJAXFailure.bind(this);
+    this._boundSubmitHandler = this.handleFormSubmission.bind(this);
+    this._boundWrapperHandler = this.wrapUp.bind(this);
+    this.registerListeners();
+  },
+  checkForEscapeOrReturn: function(e) {
+    if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
+    if (Event.KEY_ESC == e.keyCode)
+      this.handleFormCancellation(e);
+    else if (Event.KEY_RETURN == e.keyCode)
+      this.handleFormSubmission(e);
+  },
+  createControl: function(mode, handler, extraClasses) {
+    var control = this.options[mode + 'Control'];
+    var text = this.options[mode + 'Text'];
+    if ('button' == control) {
+      var btn = document.createElement('input');
+      btn.type = 'submit';
+      btn.value = text;
+      btn.className = 'editor_' + mode + '_button';
+      if ('cancel' == mode)
+        btn.onclick = this._boundCancelHandler;
+      this._form.appendChild(btn);
+      this._controls[mode] = btn;
+    } else if ('link' == control) {
+      var link = document.createElement('a');
+      link.href = '#';
+      link.appendChild(document.createTextNode(text));
+      link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
+      link.className = 'editor_' + mode + '_link';
+      if (extraClasses)
+        link.className += ' ' + extraClasses;
+      this._form.appendChild(link);
+      this._controls[mode] = link;
+    }
+  },
+  createEditField: function() {
+    var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
+    var fld;
+    if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
+      fld = document.createElement('input');
+      fld.type = 'text';
+      var size = this.options.size || this.options.cols || 0;
+      if (0 < size) fld.size = size;
+    } else {
+      fld = document.createElement('textarea');
+      fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
+      fld.cols = this.options.cols || 40;
+    }
+    fld.name = this.options.paramName;
+    fld.value = text; // No HTML breaks conversion anymore
+    fld.className = 'editor_field';
+    if (this.options.submitOnBlur)
+      fld.onblur = this._boundSubmitHandler;
+    this._controls.editor = fld;
+    if (this.options.loadTextURL)
+      this.loadExternalText();
+    this._form.appendChild(this._controls.editor);
+  },
+  createForm: function() {
+    var ipe = this;
+    function addText(mode, condition) {
+      var text = ipe.options['text' + mode + 'Controls'];
+      if (!text || condition === false) return;
+      ipe._form.appendChild(document.createTextNode(text));
+    };
+    this._form = $(document.createElement('form'));
+    this._form.id = this.options.formId;
+    this._form.addClassName(this.options.formClassName);
+    this._form.onsubmit = this._boundSubmitHandler;
+    this.createEditField();
+    if ('textarea' == this._controls.editor.tagName.toLowerCase())
+      this._form.appendChild(document.createElement('br'));
+    if (this.options.onFormCustomization)
+      this.options.onFormCustomization(this, this._form);
+    addText('Before', this.options.okControl || this.options.cancelControl);
+    this.createControl('ok', this._boundSubmitHandler);
+    addText('Between', this.options.okControl && this.options.cancelControl);
+    this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
+    addText('After', this.options.okControl || this.options.cancelControl);
+  },
+  destroy: function() {
+    if (this._oldInnerHTML)
+      this.element.innerHTML = this._oldInnerHTML;
+    this.leaveEditMode();
+    this.unregisterListeners();
+  },
+  enterEditMode: function(e) {
+    if (this._saving || this._editing) return;
+    this._editing = true;
+    this.triggerCallback('onEnterEditMode');
+    if (this.options.externalControl)
+      this.options.externalControl.hide();
+    this.element.hide();
+    this.createForm();
+    this.element.parentNode.insertBefore(this._form, this.element);
+    if (!this.options.loadTextURL)
+      this.postProcessEditField();
+    if (e) Event.stop(e);
+  },
+  enterHover: function(e) {
+    if (this.options.hoverClassName)
+      this.element.addClassName(this.options.hoverClassName);
+    if (this._saving) return;
+    this.triggerCallback('onEnterHover');
+  },
+  getText: function() {
+    return this.element.innerHTML.unescapeHTML();
+  },
+  handleAJAXFailure: function(transport) {
+    this.triggerCallback('onFailure', transport);
+    if (this._oldInnerHTML) {
+      this.element.innerHTML = this._oldInnerHTML;
+      this._oldInnerHTML = null;
+    }
+  },
+  handleFormCancellation: function(e) {
+    this.wrapUp();
+    if (e) Event.stop(e);
+  },
+  handleFormSubmission: function(e) {
+    var form = this._form;
+    var value = $F(this._controls.editor);
+    this.prepareSubmission();
+    var params = this.options.callback(form, value) || '';
+    if (Object.isString(params))
+      params = params.toQueryParams();
+    params.editorId = this.element.id;
+    if (this.options.htmlResponse) {
+      var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
+      Object.extend(options, {
+        parameters: params,
+        onComplete: this._boundWrapperHandler,
+        onFailure: this._boundFailureHandler
+      });
+      new Ajax.Updater({ success: this.element }, this.url, options);
+    } else {
+      var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+      Object.extend(options, {
+        parameters: params,
+        onComplete: this._boundWrapperHandler,
+        onFailure: this._boundFailureHandler
+      });
+      new Ajax.Request(this.url, options);
+    }
+    if (e) Event.stop(e);
+  },
+  leaveEditMode: function() {
+    this.element.removeClassName(this.options.savingClassName);
+    this.removeForm();
+    this.leaveHover();
+    this.element.style.backgroundColor = this._originalBackground;
+    this.element.show();
+    if (this.options.externalControl)
+      this.options.externalControl.show();
+    this._saving = false;
+    this._editing = false;
+    this._oldInnerHTML = null;
+    this.triggerCallback('onLeaveEditMode');
+  },
+  leaveHover: function(e) {
+    if (this.options.hoverClassName)
+      this.element.removeClassName(this.options.hoverClassName);
+    if (this._saving) return;
+    this.triggerCallback('onLeaveHover');
+  },
+  loadExternalText: function() {
+    this._form.addClassName(this.options.loadingClassName);
+    this._controls.editor.disabled = true;
+    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+    Object.extend(options, {
+      parameters: 'editorId=' + encodeURIComponent(this.element.id),
+      onComplete: Prototype.emptyFunction,
+      onSuccess: function(transport) {
+        this._form.removeClassName(this.options.loadingClassName);
+        var text = transport.responseText;
+        if (this.options.stripLoadedTextTags)
+          text = text.stripTags();
+        this._controls.editor.value = text;
+        this._controls.editor.disabled = false;
+        this.postProcessEditField();
+      }.bind(this),
+      onFailure: this._boundFailureHandler
+    });
+    new Ajax.Request(this.options.loadTextURL, options);
+  },
+  postProcessEditField: function() {
+    var fpc = this.options.fieldPostCreation;
+    if (fpc)
+      $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
+  },
+  prepareOptions: function() {
+    this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
+    Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
+    [this._extraDefaultOptions].flatten().compact().each(function(defs) {
+      Object.extend(this.options, defs);
+    }.bind(this));
+  },
+  prepareSubmission: function() {
+    this._saving = true;
+    this.removeForm();
+    this.leaveHover();
+    this.showSaving();
+  },
+  registerListeners: function() {
+    this._listeners = { };
+    var listener;
+    $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
+      listener = this[pair.value].bind(this);
+      this._listeners[pair.key] = listener;
+      if (!this.options.externalControlOnly)
+        this.element.observe(pair.key, listener);
+      if (this.options.externalControl)
+        this.options.externalControl.observe(pair.key, listener);
+    }.bind(this));
+  },
+  removeForm: function() {
+    if (!this._form) return;
+    this._form.remove();
+    this._form = null;
+    this._controls = { };
+  },
+  showSaving: function() {
+    this._oldInnerHTML = this.element.innerHTML;
+    this.element.innerHTML = this.options.savingText;
+    this.element.addClassName(this.options.savingClassName);
+    this.element.style.backgroundColor = this._originalBackground;
+    this.element.show();
+  },
+  triggerCallback: function(cbName, arg) {
+    if ('function' == typeof this.options[cbName]) {
+      this.options[cbName](this, arg);
+    }
+  },
+  unregisterListeners: function() {
+    $H(this._listeners).each(function(pair) {
+      if (!this.options.externalControlOnly)
+        this.element.stopObserving(pair.key, pair.value);
+      if (this.options.externalControl)
+        this.options.externalControl.stopObserving(pair.key, pair.value);
+    }.bind(this));
+  },
+  wrapUp: function(transport) {
+    this.leaveEditMode();
+    // Can't use triggerCallback due to backward compatibility: requires
+    // binding + direct element
+    this._boundComplete(transport, this.element);
+  }
+});
+
+Object.extend(Ajax.InPlaceEditor.prototype, {
+  dispose: Ajax.InPlaceEditor.prototype.destroy
+});
+
+Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
+  initialize: function($super, element, url, options) {
+    this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
+    $super(element, url, options);
+  },
+
+  createEditField: function() {
+    var list = document.createElement('select');
+    list.name = this.options.paramName;
+    list.size = 1;
+    this._controls.editor = list;
+    this._collection = this.options.collection || [];
+    if (this.options.loadCollectionURL)
+      this.loadCollection();
+    else
+      this.checkForExternalText();
+    this._form.appendChild(this._controls.editor);
+  },
+
+  loadCollection: function() {
+    this._form.addClassName(this.options.loadingClassName);
+    this.showLoadingText(this.options.loadingCollectionText);
+    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+    Object.extend(options, {
+      parameters: 'editorId=' + encodeURIComponent(this.element.id),
+      onComplete: Prototype.emptyFunction,
+      onSuccess: function(transport) {
+        var js = transport.responseText.strip();
+        if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
+          throw('Server returned an invalid collection representation.');
+        this._collection = eval(js);
+        this.checkForExternalText();
+      }.bind(this),
+      onFailure: this.onFailure
+    });
+    new Ajax.Request(this.options.loadCollectionURL, options);
+  },
+
+  showLoadingText: function(text) {
+    this._controls.editor.disabled = true;
+    var tempOption = this._controls.editor.firstChild;
+    if (!tempOption) {
+      tempOption = document.createElement('option');
+      tempOption.value = '';
+      this._controls.editor.appendChild(tempOption);
+      tempOption.selected = true;
+    }
+    tempOption.update((text || '').stripScripts().stripTags());
+  },
+
+  checkForExternalText: function() {
+    this._text = this.getText();
+    if (this.options.loadTextURL)
+      this.loadExternalText();
+    else
+      this.buildOptionList();
+  },
+
+  loadExternalText: function() {
+    this.showLoadingText(this.options.loadingText);
+    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+    Object.extend(options, {
+      parameters: 'editorId=' + encodeURIComponent(this.element.id),
+      onComplete: Prototype.emptyFunction,
+      onSuccess: function(transport) {
+        this._text = transport.responseText.strip();
+        this.buildOptionList();
+      }.bind(this),
+      onFailure: this.onFailure
+    });
+    new Ajax.Request(this.options.loadTextURL, options);
+  },
+
+  buildOptionList: function() {
+    this._form.removeClassName(this.options.loadingClassName);
+    this._collection = this._collection.map(function(entry) {
+      return 2 === entry.length ? entry : [entry, entry].flatten();
+    });
+    var marker = ('value' in this.options) ? this.options.value : this._text;
+    var textFound = this._collection.any(function(entry) {
+      return entry[0] == marker;
+    }.bind(this));
+    this._controls.editor.update('');
+    var option;
+    this._collection.each(function(entry, index) {
+      option = document.createElement('option');
+      option.value = entry[0];
+      option.selected = textFound ? entry[0] == marker : 0 == index;
+      option.appendChild(document.createTextNode(entry[1]));
+      this._controls.editor.appendChild(option);
+    }.bind(this));
+    this._controls.editor.disabled = false;
+    Field.scrollFreeActivate(this._controls.editor);
+  }
+});
+
+//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****
+//**** This only  exists for a while,  in order to  let ****
+//**** users adapt to  the new API.  Read up on the new ****
+//**** API and convert your code to it ASAP!            ****
+
+Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
+  if (!options) return;
+  function fallback(name, expr) {
+    if (name in options || expr === undefined) return;
+    options[name] = expr;
+  };
+  fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
+    options.cancelLink == options.cancelButton == false ? false : undefined)));
+  fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
+    options.okLink == options.okButton == false ? false : undefined)));
+  fallback('highlightColor', options.highlightcolor);
+  fallback('highlightEndColor', options.highlightendcolor);
+};
+
+Object.extend(Ajax.InPlaceEditor, {
+  DefaultOptions: {
+    ajaxOptions: { },
+    autoRows: 3,                                // Use when multi-line w/ rows == 1
+    cancelControl: 'link',                      // 'link'|'button'|false
+    cancelText: 'cancel',
+    clickToEditText: 'Click to edit',
+    externalControl: null,                      // id|elt
+    externalControlOnly: false,
+    fieldPostCreation: 'activate',              // 'activate'|'focus'|false
+    formClassName: 'inplaceeditor-form',
+    formId: null,                               // id|elt
+    highlightColor: '#ffff99',
+    highlightEndColor: '#ffffff',
+    hoverClassName: '',
+    htmlResponse: true,
+    loadingClassName: 'inplaceeditor-loading',
+    loadingText: 'Loading...',
+    okControl: 'button',                        // 'link'|'button'|false
+    okText: 'ok',
+    paramName: 'value',
+    rows: 1,                                    // If 1 and multi-line, uses autoRows
+    savingClassName: 'inplaceeditor-saving',
+    savingText: 'Saving...',
+    size: 0,
+    stripLoadedTextTags: false,
+    submitOnBlur: false,
+    textAfterControls: '',
+    textBeforeControls: '',
+    textBetweenControls: ''
+  },
+  DefaultCallbacks: {
+    callback: function(form) {
+      return Form.serialize(form);
+    },
+    onComplete: function(transport, element) {
+      // For backward compatibility, this one is bound to the IPE, and passes
+      // the element directly.  It was too often customized, so we don't break it.
+      new Effect.Highlight(element, {
+        startcolor: this.options.highlightColor, keepBackgroundImage: true });
+    },
+    onEnterEditMode: null,
+    onEnterHover: function(ipe) {
+      ipe.element.style.backgroundColor = ipe.options.highlightColor;
+      if (ipe._effect)
+        ipe._effect.cancel();
+    },
+    onFailure: function(transport, ipe) {
+      alert('Error communication with the server: ' + transport.responseText.stripTags());
+    },
+    onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
+    onLeaveEditMode: null,
+    onLeaveHover: function(ipe) {
+      ipe._effect = new Effect.Highlight(ipe.element, {
+        startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
+        restorecolor: ipe._originalBackground, keepBackgroundImage: true
+      });
+    }
+  },
+  Listeners: {
+    click: 'enterEditMode',
+    keydown: 'checkForEscapeOrReturn',
+    mouseover: 'enterHover',
+    mouseout: 'leaveHover'
+  }
+});
+
+Ajax.InPlaceCollectionEditor.DefaultOptions = {
+  loadingCollectionText: 'Loading options...'
+};
+
+// Delayed observer, like Form.Element.Observer,
+// but waits for delay after last key input
+// Ideal for live-search fields
+
+Form.Element.DelayedObserver = Class.create({
+  initialize: function(element, delay, callback) {
+    this.delay     = delay || 0.5;
+    this.element   = $(element);
+    this.callback  = callback;
+    this.timer     = null;
+    this.lastValue = $F(this.element);
+    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
+  },
+  delayedListener: function(event) {
+    if(this.lastValue == $F(this.element)) return;
+    if(this.timer) clearTimeout(this.timer);
+    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
+    this.lastValue = $F(this.element);
+  },
+  onTimerEvent: function() {
+    this.timer = null;
+    this.callback(this.element, $F(this.element));
+  }
+});
\ No newline at end of file
diff --git a/webcit/static/ctdldragdrop.js b/webcit/static/ctdldragdrop.js
new file mode 100644 (file)
index 0000000..aefd398
--- /dev/null
@@ -0,0 +1,83 @@
+/** 
+ * Because scriptaculous DnD sucks..
+ * Written by Mathew McBride <matt@mcbridematt.dhs.org> / <matt@comalies>
+ * 
+ * Copyright 2009 The Citadel Team
+ * Licensed under the GPL V3
+ */
+var draggedElement = null;
+var currentDropTargets = null;
+var dropTarget = null;
+var dragAndDropElement = null;
+var oldSelectHandler = null;
+function mouseDownHandler(event) {
+  var target = event.target;
+  var actualTarget = target;
+  if (target.nodeName.toLowerCase() == "td") {
+    actualTarget = target.parentNode;
+  }
+  if (!actualTarget.dropEnabled && actualTarget.getAttribute("citadel:dropenabled") == null) {
+    return;
+  }
+  turnOffTextSelect();
+  draggedElement = actualTarget;
+  return false;
+}
+function mouseUpHandler(event) {
+  var target = event.target;
+  var dropped = dropTarget;
+  if (dragAndDropElement != null) {
+  if (dropped != null && dropped.dropHandler) {
+    dropped.dropHandler(dropped,draggedElement);
+  }
+  document.body.removeChild(dragAndDropElement);
+  }
+  dragAndDropElement = null;
+  draggedElement = null;
+  dropTarget = null;
+  turnOnTextSelect();
+  return true;
+}
+function mouseMoveHandler(event) {
+  if (draggedElement != null) {
+    if (dragAndDropElement == null) {
+      var dragAndDropElementFunction = (draggedElement.ctdlDnDElement) ? draggedElement.ctdlDndElement : eval(draggedElement.getAttribute("citadel:dndelement"));
+      dragAndDropElement = dragAndDropElementFunction.call();
+    dragAndDropElement.className = "draganddrop";
+    document.body.appendChild(dragAndDropElement);
+    }
+    var clientX = event.clientX+5;
+    var clientY = event.clientY+5;
+    dragAndDropElement.style.top = clientY + "px";
+    dragAndDropElement.style.left = clientX + "px";
+  }
+  return false;
+}
+function mouseMoveOver(event) {
+  if (event.target.dropTarget) {
+    dropTarget = event.target;
+  }
+}
+function mouseMoveOut(event) {
+  if (dropTarget) {
+    dropTarget = null;
+  }
+}
+function setupDragDrop() {
+  $(document.body).observe('mousedown', mouseDownHandler);
+    $(document.body).observe('mouseup',mouseUpHandler);
+    $(document.body).observe('mousemove',mouseMoveHandler);
+    $(document.body).observe('mouseover', mouseMoveOver);
+    $(document.body).observe('mouseout', mouseMoveOut); 
+}
+function turnOffTextSelect() {
+  document.onmousedown = new Function("return false");
+  document.onmouseup = new Function("return true");
+ oldSelectHandler = document.onselectstart;
+ document.onselectstart = function() { return false; };
+}
+function turnOnTextSelect() {
+  document.onmousedown = null;
+  document.onmouseup = null;
+  document.onselectstart = oldSelectHandler;
+}
diff --git a/webcit/static/datepicker-dev.js b/webcit/static/datepicker-dev.js
new file mode 100644 (file)
index 0000000..da7918a
--- /dev/null
@@ -0,0 +1,788 @@
+/**
+ * DatePicker widget using Prototype and Scriptaculous.
+ * (c) 2007 Mathieu Jondet <mathieu@eulerian.com>
+ * Eulerian Technologies
+ *
+ * DatePicker is freely distributable under the same terms as Prototype.
+ *
+ */
+
+/**
+ * DatePickerFormatter class for matching and stringifying dates.
+ *
+ * By Arturas Slajus <x11@arturaz.net>.
+ */
+var DatePickerFormatter = Class.create();
+DatePickerFormatter.prototype = {
+    /**
+     * Create a DatePickerFormatter.
+     *
+     * format: specify a format by passing 3 value array consisting of
+     *   "yyyy", "mm", "dd". Default: ["yyyy", "mm", "dd"].
+     *
+     * separator: string for splitting the values. Default: "-".
+     *
+     * Use it like this:
+     *   var df = new DatePickerFormatter(["dd", "mm", "yyyy"], "/");
+     *   df.current_date();
+     *   df.match("7/7/2007");
+     */
+    initialize: function(format, separator) {
+        if (Object.isUndefined(format))
+        format = ["yyyy", "mm", "dd"];
+        if (Object.isUndefined(separator))
+        separator = "-";
+
+        this._format   = format;
+        this.separator = separator;
+                
+        this._format_year_index        = format.indexOf("yyyy");
+        this._format_month_index= format.indexOf("mm");
+        this._format_day_index = format.indexOf("dd");
+                
+        this._year_regexp      = /^\d{4}$/;
+        this._month_regexp     = /^0\d|1[012]|\d$/;
+        this._day_regexp       = /^0\d|[12]\d|3[01]|\d$/;
+    },
+    
+    /**
+     * Match a string against date format.
+     * Returns: [year, month, day]
+     */
+    match: function(str) {
+        var d = str.split(this.separator);
+        
+        if (d.length < 3)
+        return false;
+        
+        var year = d[this._format_year_index].match(this._year_regexp);
+        if (year) { year = year[0] } else { return false }
+        var month = d[this._format_month_index].match(this._month_regexp);
+        if (month) { month = month[0] } else { return false }
+        var day = d[this._format_day_index].match(this._day_regexp);
+        if (day) { day = day[0] } else { return false }
+        
+        return [year, month, day];
+    },
+    
+    /**
+     * Return current date according to format.
+     */
+    current_date: function() {
+        var d = new Date;
+        return this.date_to_string(
+            d.getFullYear(),
+            d.getMonth() + 1,
+            d.getDate()
+       );
+    },
+    
+    /**
+     * Return a stringified date accordint to format.
+     */
+    date_to_string: function(year, month, day, separator) {
+        if (Object.isUndefined(separator))
+        separator = this.separator;
+
+        var a = [0, 0, 0];
+        a[this._format_year_index]     = year;
+        a[this._format_month_index]    = month.toPaddedString(2);
+        a[this._format_day_index]      = day.toPaddedString(2);
+        
+        return a.join(separator);
+    }
+}; 
+
+
+/**
+ * DatePicker
+ */
+
+var DatePicker = Class.create();
+
+DatePicker.prototype   = {
+ Version       : '0.9.4',
+ _relative     : null,
+ _div          : null,
+ _zindex       : 1,
+ _keepFieldEmpty: false,
+ _daysInMonth  : [31,28,31,30,31,30,31,31,30,31,30,31],
+ _dateFormat   : [ ["dd", "mm", "yyyy"], "/" ],
+ /* language */
+ _language     : 'fr',
+ _language_month       : $H({
+  'fr' : [ 'Janvier', 'F&#233;vrier', 'Mars', 'Avril', 'Mai', 'Juin', 
+   'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'D&#233;cembre' ],
+  'en' : [ 'January', 'February', 'March', 'April', 'May',
+   'June', 'July', 'August', 'September', 'October', 'November', 'December' ],
+  'sp' : [ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 
+   'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' ],
+  'it' : [ 'Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno',
+   'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre' ],
+  'de' : [ 'Januar', 'Februar', 'M&#228;rz', 'April', 'Mai', 'Juni',
+   'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember' ],
+  'pt' : [ 'Janeiro', 'Fevereiro', 'Mar&#231;o', 'Abril', 'Maio', 'Junho',
+   'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro' ],
+  'hu' : [ 'Janu&#225;r', 'Febru&#225;r', 'M&#225;rcius', '&#193;prilis', 
+   'M&#225;jus', 'J&#250;nius', 'J&#250;lius', 'Augusztus', 'Szeptember', 
+   'Okt&#243;ber', 'November', 'December' ],
+  'lt'  : [ 'Sausis', 'Vasaris', 'Kovas', 'Balandis', 'Gegu&#382;&#279;',
+   'Bir&#382;elis', 'Liepa', 'Rugj&#363;tis', 'Rus&#279;jis', 'Spalis', 
+   'Lapkritis', 'Gruodis' ],
+  'nl' : [ 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
+   'juli', 'augustus', 'september', 'oktober', 'november', 'december' ],
+  'dk' : [ 'Januar', 'Februar', 'Marts', 'April', 'Maj',
+   'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December' ],
+  'no' : [ 'Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni',
+   'Juli', 'August', 'September', 'Oktober', 'November', 'Desember' ],
+  'lv' : [ 'Janv&#257;ris', 'Febru&#257;ris', 'Marts', 'Apr&#299;lis', 'Maijs',
+   'J&#363;nijs', 'J&#363;lijs', 'Augusts', 'Septembris', 'Oktobris', 
+   'Novembris', 'Decemberis' ],
+  'ja' : [ '1&#26376;', '2&#26376;', '3&#26376;', '4&#26376;', '5&#26376;',
+   '6&#26376;', '7&#26376;', '8&#26376;', '9&#26376;', '10&#26376;', 
+   '11&#26376;', '12&#26376;' ],
+  'fi' : [ 'Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu', 'Toukokuu',
+   'Kes&#228;kuu', 'Hein&#228;kuu', 'Elokuu', 'Syyskuu', 'Lokakuu', 
+   'Marraskuu', 'Joulukuu' ],
+  'ro' : [ 'Ianuarie', 'Februarie', 'Martie', 'Aprilie', 'Mai', 'Junie',
+   'Julie', 'August', 'Septembrie', 'Octombrie', 'Noiembrie', 'Decembrie' ],
+  'zh' : [ '1&#32;&#26376;', '2&#32;&#26376;', '3&#32;&#26376;', 
+   '4&#32;&#26376;', '5&#32;&#26376;', '6&#32;&#26376;', '7&#32;&#26376;', 
+   '8&#32;&#26376;', '9&#32;&#26376;', '10&#26376;', '11&#26376;', '12&#26376;'],
+  'sv' : [ 'Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni',
+   'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December' ]
+ }),
+ _language_day : $H({
+  'fr' : [ 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim' ],
+  'en' : [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ],
+  'sp' : [ 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'S&#225;b', 'Dom' ],
+  'it' : [ 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom' ],
+  'de' : [ 'Mon', 'Die', 'Mit', 'Don', 'Fre', 'Sam', 'Son' ],
+  'pt' : [ 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'S&#225;b', 'Dom' ],
+  'hu' : [ 'H&#233;', 'Ke', 'Sze', 'Cs&#252;', 'P&#233;', 'Szo', 'Vas' ],
+  'lt'  : [ 'Pir', 'Ant', 'Tre', 'Ket', 'Pen', '&Scaron;e&scaron;', 'Sek' ],
+  'nl' : [ 'ma', 'di', 'wo', 'do', 'vr', 'za', 'zo' ],
+  'dk' : [ 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'L&#248;r', 'S&#248;n' ],
+  'no' : [ 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'L&#248;r', 'Sun' ],
+  'lv' : [ 'P', 'O', 'T', 'C', 'Pk', 'S', 'Sv' ],
+  'ja' : [ '&#26376;', '&#28779;', '&#27700;', '&#26408;', '&#37329;', 
+   '&#22303;', '&#26085;' ],
+  'fi' : [ 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La', 'Su' ],
+  'ro' : [ 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sam', 'Dum' ],
+  'zh' : [ '&#21608;&#19968;', '&#21608;&#20108;', '&#21608;&#19977;', 
+   '&#21608;&#22235;', '&#21608;&#20116;', '&#21608;&#20845;', 
+   '&#21608;&#26085;' ],
+  'sv' : [ 'M&#229;n', 'Tis', 'Ons', 'Tor', 'Fre', 'L&#246;r', 
+   'S&#246;n' ]
+ }),
+ _language_close       : $H({
+  'fr' : 'fermer',
+  'en' : 'close',
+  'sp' : 'cerrar',
+  'it' : 'fine',
+  'de' : 'schliessen',
+  'pt' : 'fim',
+  'hu' : 'bez&#225;r',
+  'lt'  : 'udaryti',
+  'nl' : 'sluiten',
+  'dk' : 'luk',
+  'no' : 'lukk',
+  'lv' : 'aizv&#275;rt',
+  'ja' : '&#38281;&#12376;&#12427;',
+  'fi' : 'sulje',
+  'ro' : 'inchide',
+  'zh' : '&#20851;&#32;&#38381',
+  'sv' : 'st&#228;ng'
+ }),
+ _language_reset       : $H({ // FILL ME IN
+                'en'   : 'reset'
+ }),
+ /* date manipulation */
+ _todayDate            : new Date(),
+ _current_date         : null,
+ _clickCallback                : Prototype.emptyFunction,
+ _cellCallback         : Prototype.emptyFunction,
+ _id_datepicker                : null,
+ _disablePastDate      : false,
+ _disableFutureDate    : true,
+ _enableYearBrowse     : false,
+ _oneDayInMs           : 24 * 3600 * 1000,
+ /* positionning */
+ _topOffset            : 30,
+ _leftOffset           : 0,
+ _isPositionned                : false,
+ _relativePosition     : true,
+ _setPositionTop       : 0,
+ _setPositionLeft      : 0,
+ _bodyAppend           : false,
+ _contentAppend                : '',
+ _showEvent            : 'click',
+ /* Effects Adjustment */
+ _showEffect           : "appear", 
+ _showDuration         : 1,
+ _enableShowEffect     : true,
+ _closeEffect          : "fade", 
+ _closeEffectDuration  : 0.3,
+ _enableCloseEffect    : true,
+ _closeTimer           : null,
+ _enableCloseOnBlur    : false,
+ /* afterClose : called when the close function is executed */
+ _afterClose   : Prototype.emptyFunction,
+ /* return the name of current month in appropriate language */
+ getMonthLocale        : function ( month ) {
+  return       this._language_month.get(this._language)[month];
+ },
+ getLocaleClose        : function () {
+  return       this._language_close.get(this._language);
+ },
+ getLocaleReset : function() {
+        return this._language_reset.get(this._language);
+ },
+ _initCurrentDate : function () {
+  /* Create the DateFormatter */
+  this._df = new DatePickerFormatter(this._dateFormat[0], this._dateFormat[1]);
+  /* check if value in field is proper, if not set to today */
+  this._current_date = $F(this._relative);
+  if (! this._df.match(this._current_date)) {
+    this._current_date = this._df.current_date();
+   /* set the field value ? */
+   if (!this._keepFieldEmpty)
+    $(this._relative).value = this._current_date;
+  }
+  var a_date = this._df.match(this._current_date);
+  this._current_year   = Number(a_date[0]);
+  this._current_mon    = Number(a_date[1]) - 1;
+  this._current_day    = Number(a_date[2]);
+ },
+ /* init */
+ initialize    : function ( h_p ) {
+  /* arguments */
+  this._relative= h_p["relative"];
+  if (h_p["language"])
+   this._language = h_p["language"];
+  this._zindex = ( h_p["zindex"] ) ? parseInt(Number(h_p["zindex"])) : 1;
+  if (!Object.isUndefined(h_p["keepFieldEmpty"]))
+   this._keepFieldEmpty        = h_p["keepFieldEmpty"];
+  if (Object.isFunction(h_p["clickCallback"])) 
+   this._clickCallback = h_p["clickCallback"];
+  if (!Object.isUndefined(h_p["leftOffset"]))
+   this._leftOffset    = parseInt(h_p["leftOffset"]);
+  if (!Object.isUndefined(h_p["topOffset"]))
+   this._topOffset     = parseInt(h_p["topOffset"]);
+  if (!Object.isUndefined(h_p["relativePosition"]))
+   this._relativePosition = h_p["relativePosition"];
+  if (!Object.isUndefined(h_p["showEvent"]))
+   this._showEvent     = h_p["showEvent"];
+  if (!Object.isUndefined(h_p["showEffect"]))
+   this._showEffect    = h_p["showEffect"];
+  if (!Object.isUndefined(h_p["contentAppend"]))
+   this._contentAppend = h_p["contentAppend"];
+  if (!Object.isUndefined(h_p["enableShowEffect"]))
+   this._enableShowEffect      = h_p["enableShowEffect"];
+  if (!Object.isUndefined(h_p["showDuration"]))
+   this._showDuration  = h_p["showDuration"];
+  if (!Object.isUndefined(h_p["closeEffect"]))
+   this._closeEffect   = h_p["closeEffect"];
+  if (!Object.isUndefined(h_p["enableCloseEffect"]))
+   this._enableCloseEffect     = h_p["enableCloseEffect"];
+  if (!Object.isUndefined(h_p["closeEffectDuration"]))
+   this._closeEffectDuration = h_p["closeEffectDuration"];
+  if (Object.isFunction(h_p["afterClose"]))
+   this._afterClose    = h_p["afterClose"];
+  if (!Object.isUndefined(h_p["externalControl"]))
+   this._externalControl= h_p["externalControl"];
+  if (!Object.isUndefined(h_p["dateFormat"])) 
+   this._dateFormat    = h_p["dateFormat"];
+  if (Object.isFunction(h_p["cellCallback"]))
+   this._cellCallback  = h_p["cellCallback"];
+  this._setPositionTop = ( h_p["setPositionTop"] ) ? 
+   parseInt(Number(h_p["setPositionTop"])) : 0;
+  this._setPositionLeft        = ( h_p["setPositionLeft"] ) ? 
+   parseInt(Number(h_p["setPositionLeft"])) : 0;
+  if (!Object.isUndefined(h_p["enableCloseOnBlur"]) && h_p["enableCloseOnBlur"])
+   this._enableCloseOnBlur     = true;
+  if (!Object.isUndefined(h_p["disablePastDate"]) && h_p["disablePastDate"])
+   this._disablePastDate       = true;
+  if (!Object.isUndefined(h_p["disableFutureDate"]) && 
+   !h_p["disableFutureDate"])
+   this._disableFutureDate     = false;
+  if (!Object.isUndefined(h_p["enableYearBrowse"]))
+   this._enableYearBrowse      = true;
+  this._id_datepicker          = 'datepicker-'+this._relative;
+  this._id_datepicker_prev     = this._id_datepicker+'-prev';
+  this._id_datepicker_next     = this._id_datepicker+'-next';
+  this._id_datepicker_prev_year        = this._id_datepicker_prev+'-year';
+  this._id_datepicker_next_year        = this._id_datepicker_next+'-year';
+  this._id_datepicker_hdr      = this._id_datepicker+'-header';
+  this._id_datepicker_ftr      = this._id_datepicker+'-footer';
+  this._id_datepicker_rst      = this._id_datepicker+'-reset';
+
+  /* build up calendar skel */
+  this._div = new Element('div', { 
+   id : this._id_datepicker,
+   className : 'datepicker',
+   style : 'display: none;' });
+  this._div.innerHTML = '<table><thead><tr>'+((this._enableYearBrowse) ? '<th width="10px" id="'+this._id_datepicker_prev_year+'" style="cursor: pointer;">&nbsp;&lt;&nbsp;</th>' : '')+'<th width="10px" id="'+this._id_datepicker_prev+'" style="cursor: pointer;">&nbsp;&lt;&lt;&nbsp;</th><th id="'+this._id_datepicker_hdr+'" colspan="'+((this._enableYearBrowse) ? 3 : 5 )+'"></th><th width="10px" id="'+this._id_datepicker_next+'" style="cursor: pointer;">&nbsp;&gt;&gt;&nbsp;</th>'+((this._enableYearBrowse) ? '<th width="10px" id="'+this._id_datepicker_next_year+'" style="cursor: pointer;">&nbsp;&gt;&nbsp;</th>' : '')+'</tr></thead><tbody id="'+this._id_datepicker+'-tbody"></tbody><tfoot><tr><td colspan="7" id="'+this._id_datepicker_ftr+'"></td></tr><tr><td colspan="7" id="'+this._id_datepicker_rst+'"></td></tr></tfoot></table>';
+  /* finally declare the event listener on input field */
+  Event.observe(this._relative, 
+    this._showEvent, this.click.bindAsEventListener(this), false);
+  /* need to append on body when doc is loaded for IE */
+  document.observe('dom:loaded', this.load.bindAsEventListener(this), false);
+  /* automatically close when blur event is triggered */
+  if ( this._enableCloseOnBlur ) {
+   Event.observe(this._relative, 'blur', function (e) { 
+    this._closeTimer = this.close.bind(this).delay(2); 
+   }.bindAsEventListener(this));
+   Event.observe(this._div, 'click', function (e) { 
+    if (this._closeTimer) { 
+     window.clearTimeout(this._closeTimer); 
+     this._closeTimer = null; 
+    } 
+   });
+  }
+ },
+ /**
+  * load       : called when document is fully-loaded to append datepicker
+  *              to main object.
+  */
+ load          : function () {
+  /* if externalControl defined set the observer on it */
+  if (this._externalControl) 
+   Event.observe(this._externalControl, 'click',
+    this.click.bindAsEventListener(this), false);
+  /* append to page */
+  if (this._relativeAppend) {
+   /* append to parent node */
+   if ($(this._relative).parentNode) {
+    this._div.innerHTML = this._wrap_in_iframe(this._div.innerHTML);
+    $(this._relative).parentNode.appendChild( this._div );
+   }
+  } else {
+   /* append to body tag or to provided contentAppend id */
+   var body    = ( this._contentAppend ) ?
+    $(this._contentAppend) : document.getElementsByTagName("body").item(0);
+   if (body) {
+    this._div.innerHTML = this._wrap_in_iframe(this._div.innerHTML);
+    body.appendChild(this._div);
+   }
+   if ( this._relativePosition ) {
+     var a_pos = Element.cumulativeOffset($(this._relative));
+     this.setPosition(a_pos[1], a_pos[0]);
+   } else {
+    if (this._setPositionTop || this._setPositionLeft)
+     this.setPosition(this._setPositionTop, this._setPositionLeft);
+   }
+  }
+  /* init the date in field if needed */
+  this._initCurrentDate();
+  /* set the close locale content */
+  $(this._id_datepicker_ftr).innerHTML = this.getLocaleClose();
+  $(this._id_datepicker_rst).innerHTML = this.getLocaleReset();
+  /* declare the observers for UI control */
+  Event.observe($(this._id_datepicker_prev), 
+    'click', this.prevMonth.bindAsEventListener(this), false);
+  Event.observe($(this._id_datepicker_next), 
+    'click', this.nextMonth.bindAsEventListener(this), false);
+  if ( this._enableYearBrowse ) {
+   Event.observe($(this._id_datepicker_prev_year), 
+     'click', this.prevYear.bindAsEventListener(this), false);
+   Event.observe($(this._id_datepicker_next_year), 
+     'click', this.nextYear.bindAsEventListener(this), false);
+  }
+  Event.observe($(this._id_datepicker_ftr), 
+    'click', this.close.bindAsEventListener(this), false);
+  Event.observe($(this._id_datepicker_rst),
+         'click', this.reset.bindAsEventListener(this), false);
+ },
+ /* hack for buggy form elements layering in IE */
+ _wrap_in_iframe       : function ( content ) {
+  var _iframe_src      = 'javascript:false';
+  return       ( Prototype.Browser.IE ) ?
+   "<div style='height:167px;width:185px;background-color:white;align:left'><iframe width='100%' height='100%' marginwidth='0' marginheight='0' frameborder='0' src='"+ _iframe_src +"' style='filter:alpha(Opacity=50);'></iframe><div style='position:absolute;background-color:white;top:2px;left:2px;width:180px'>" + content + "</div></div>" : content;
+ },
+ /**
+  * visible    : return the visibility status of the datepicker.
+  */
+ visible       : function () {
+  return       ( $(this._id_datepicker) ) ? 
+   $(this._id_datepicker).visible() : false;
+ },
+ /**
+  * click      : called when input element is clicked
+  */
+ click         : function () {
+  /* init the datepicker if it doesn't exists */
+  if ( $(this._id_datepicker) == null ) this.load();
+  if (!this._isPositionned && this._relativePosition) {
+   /* position the datepicker relatively to element */
+   var a_lt = Element.positionedOffset($(this._relative));
+   $(this._id_datepicker).setStyle({
+    'left'     : Number(a_lt[0]+this._leftOffset)+'px',
+    'top'      : Number(a_lt[1]+this._topOffset)+'px'
+   });
+   this._isPositionned = true;
+  }
+  if (!this.visible()) {
+   this._initCurrentDate();
+   this._redrawCalendar();
+  }
+  /* eval the clickCallback function */
+  eval(this._clickCallback());
+  /* Effect toggle to fade-in / fade-out the datepicker */
+  if ( this._enableShowEffect ) {
+   new Effect.toggle(this._id_datepicker, 
+     this._showEffect, { duration: this._showDuration });
+  } else {
+   $(this._id_datepicker).show();
+  }
+  /* clean timer */
+  if (this._closeTimer) { 
+   window.clearTimeout(this._closeTimer); 
+   this._closeTimer = null; 
+  } 
+ },
+ /**
+  * close      : called when the datepicker is closed
+  */
+ close         : function () {
+  if ( this._enableCloseEffect ) {
+   switch(this._closeEffect) {
+    case 'puff': 
+     new Effect.Puff(this._id_datepicker, { 
+      duration : this._closeEffectDuration });
+     break;
+    case 'blindUp': 
+     new Effect.BlindUp(this._id_datepicker, { 
+      duration : this._closeEffectDuration });
+     break;
+    case 'dropOut': 
+     new Effect.DropOut(this._id_datepicker, { 
+      duration : this._closeEffectDuration }); 
+     break;
+    case 'switchOff': 
+     new Effect.SwitchOff(this._id_datepicker, { 
+      duration : this._closeEffectDuration }); 
+     break;
+    case 'squish': 
+     new Effect.Squish(this._id_datepicker, { 
+      duration : this._closeEffectDuration });
+     break;
+    case 'fold': 
+     new Effect.Fold(this._id_datepicker, { 
+      duration : this._closeEffectDuration });
+     break;
+    case 'shrink': 
+     new Effect.Shrink(this._id_datepicker, { 
+      duration : this._closeEffectDuration });
+     break;
+    default: 
+     new Effect.Fade(this._id_datepicker, { 
+      duration : this._closeEffectDuration });
+     break;
+   };
+  } else {
+   $(this._id_datepicker).hide();
+  }
+  eval(this._afterClose());
+ },
+ // Reset function
+ reset: function() {
+        $(this._relative).value = "";
+        this._initCurrentDate();
+ },
+ /**
+  * setDateFormat
+  */
+ setDateFormat : function ( format, separator ) {
+  if (Object.isUndefined(format))
+   format      = this._dateFormat[0];
+  if (Object.isUndefined(separator))
+   separator   = this._dateFormat[1];
+  this._dateFormat     = [ format, separator ];
+ },
+ /**
+  * setPosition        : set the position of the datepicker.
+  *  param : t=top | l=left
+  */
+ setPosition   : function ( t, l ) {
+  var h_pos    = { 'top' : '0px', 'left' : '0px' };
+  if (!Object.isUndefined(t))
+   h_pos['top']        = Number(t)+this._topOffset+'px';
+  if (!Object.isUndefined(l))
+   h_pos['left']= Number(l)+this._leftOffset+'px';
+  $(this._id_datepicker).setStyle(h_pos);
+  this._isPositionned  = true;
+ },
+ /**
+  * _getMonthDays : given the year and month find the number of days.
+  */
+ _getMonthDays : function ( year, month ) {
+  if (((0 == (year%4)) && 
+   ( (0 != (year%100)) || (0 == (year%400)))) && (month == 1))
+   return 29;
+  return this._daysInMonth[month];
+ },
+ /**
+  * _buildCalendar     : draw the days array for current date
+  */
+ _buildCalendar                : function () {
+  var _self    = this;
+  var tbody    = $(this._id_datepicker+'-tbody');
+  try {
+   while ( tbody.hasChildNodes() )
+    tbody.removeChild(tbody.childNodes[0]);
+  } catch ( e ) {};
+  /* generate day headers */
+  var trDay    = new Element('tr');
+  this._language_day.get(this._language).each( function ( item ) {
+   var td      = new Element('td');
+   td.innerHTML        = item;
+   td.className        = 'wday';
+   trDay.appendChild( td );
+  });
+  tbody.appendChild( trDay );
+  /* generate the content of days */
+  
+  /* build-up days matrix */
+  var a_d      = [ [ 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, 0 ], [ 0, 0, 0, 0, 0, 0, 0 ]
+   ,[ 0, 0, 0, 0, 0, 0, 0 ]
+  ];
+  /* set date at beginning of month to display */
+  var d                = new Date(this._current_year, this._current_mon, 1, 12);
+  /* start the day list on monday */
+  var startIndex       = ( !d.getDay() ) ? 6 : d.getDay() - 1;
+  var nbDaysInMonth    = this._getMonthDays(
+    this._current_year, this._current_mon);
+  var daysIndex                = 1;
+  for ( var j = startIndex; j < 7; j++ ) {
+   a_d[0][j]   = { 
+     d : daysIndex
+    ,m : this._current_mon
+    ,y : this._current_year 
+   };
+   daysIndex++;
+  }
+  var a_prevMY = this._prevMonthYear();
+  var nbDaysInMonthPrev        = this._getMonthDays(a_prevMY[1], a_prevMY[0]);
+  for ( var j = 0; j < startIndex; j++ ) {
+   a_d[0][j]   = { 
+     d : Number(nbDaysInMonthPrev - startIndex + j + 1) 
+    ,m : Number(a_prevMY[0])
+    ,y : a_prevMY[1]
+    ,c : 'outbound'
+   };
+  }
+  var switchNextMonth  = false;
+  var currentMonth     = this._current_mon;
+  var currentYear      = this._current_year;
+  for ( var i = 1; i < 6; i++ ) {
+   for ( var j = 0; j < 7; j++ ) {
+    a_d[i][j]  = { 
+      d : daysIndex
+     ,m : currentMonth
+     ,y : currentYear
+     ,c : ( switchNextMonth ) ? 'outbound' : ( 
+      ((daysIndex == this._todayDate.getDate()) &&
+        (this._current_mon  == this._todayDate.getMonth()) &&
+        (this._current_year == this._todayDate.getFullYear())) ? 'today' : null)
+    };
+    daysIndex++;
+    /* if at the end of the month : reset counter */
+    if (daysIndex > nbDaysInMonth ) {
+     daysIndex = 1;
+     switchNextMonth = true;
+     if (this._current_mon + 1 > 11 ) {
+      currentMonth = 0;
+      currentYear += 1;
+     } else {
+      currentMonth += 1;
+     }
+    }
+   }
+  }
+  /* generate days for current date */
+  for ( var i = 0; i < 6; i++ ) {
+   var tr      = new Element('tr');
+   for ( var j = 0; j < 7; j++ ) {
+    var h_ij   = a_d[i][j];
+    var td     = new Element('td');
+    /* id is : datepicker-day-mon-year or depending on language other way */
+    /* don't forget to add 1 on month for proper formmatting */
+    var id     = $A([
+     this._relative,
+     this._df.date_to_string(h_ij["y"], h_ij["m"]+1, h_ij["d"], '-')
+    ]).join('-');
+    /* set id and classname for cell if exists */
+    td.setAttribute('id', id);
+    if (h_ij["c"])
+     td.className      = h_ij["c"];
+    /* on onclick : rebuild date value from id of current cell */
+    var _curDate       = new Date();
+    _curDate.setFullYear(h_ij["y"], h_ij["m"], h_ij["d"]);
+    if ( this._disablePastDate || this._disableFutureDate ) {
+     if ( this._disablePastDate ) {
+      var _res = ( _curDate >= this._todayDate ) ? true : false;
+      this._bindCellOnClick( td, true, _res, h_ij["c"] );
+     }
+     if ( this._disableFutureDate ) {
+      var _res = ( this._todayDate.getTime() + this._oneDayInMs > _curDate.getTime() ) ? true : false;
+      this._bindCellOnClick( td, true, _res,  h_ij["c"] );
+     }
+    } else {
+     this._bindCellOnClick( td, false );
+    }
+    td.innerHTML= h_ij["d"];
+    tr.appendChild( td );
+   }
+   tbody.appendChild( tr );
+  }
+  return       tbody;
+ },
+ /**
+  * _bindCellOnClick   : bind the cell onclick depending on status.
+  */
+ _bindCellOnClick      : function ( td, wcompare, compareresult, h_ij_c ) {
+  var doBind   = false;
+  if ( wcompare ) {
+   if ( compareresult ) {
+    doBind     = true;
+   } else {
+    td.className= ( h_ij_c ) ? 'nclick_outbound' : 'nclick';
+   }
+  } else {
+   doBind      = true;
+  }
+  if ( doBind ) {
+   var _self   = this;
+   td.onclick  = function () { 
+    $(_self._relative).value = String($(this).readAttribute('id')
+      ).replace(_self._relative+'-','').replace(/-/g, _self._df.separator);
+    /* if we have a cellCallback defined call it and pass it the cell */
+    if (_self._cellCallback)
+     _self._cellCallback(this);
+    _self.close(); 
+   };
+  }
+ },
+ /**
+  * nextMonth  : redraw the calendar content for next month.
+  */
+ _nextMonthYear        : function () {
+  var c_mon    = this._current_mon;
+  var c_year   = this._current_year;
+  if (c_mon + 1 > 11) {
+   c_mon       = 0;
+   c_year      += 1;
+  } else {
+   c_mon       += 1;
+  }
+  return       [ c_mon, c_year ];
+ },
+ nextMonth     : function () {
+  var a_next   = this._nextMonthYear();
+  var _nextMon = a_next[0];
+  var _nextYear        = a_next[1];
+  var _curDate = new Date(); _curDate.setFullYear(_nextYear, _nextMon, 1);
+  var _res     = ( this._todayDate.getTime() + this._oneDayInMs > _curDate.getTime() ) ? true : false;
+  if ( this._disableFutureDate && !_res )
+   return;
+  this._current_mon    = _nextMon;
+  this._current_year   = _nextYear;
+  this._redrawCalendar();
+ },
+ /**
+  * prevMonth  : redraw the calendar content for previous month.
+  */
+ _prevMonthYear        : function () {
+  var c_mon    = this._current_mon;
+  var c_year   = this._current_year;
+  if (c_mon - 1 < 0) {
+   c_mon       = 11;
+   c_year      -= 1;
+  } else {
+   c_mon       -= 1;
+  }
+  return       [ c_mon, c_year ];
+ },
+ prevMonth     : function () {
+  var a_prev   = this._prevMonthYear();
+  var _prevMon = a_prev[0];
+  var _prevYear        = a_prev[1];
+  var _curDate = new Date(); _curDate.setFullYear(_prevYear, _prevMon, 1);
+  var _res     = ( _curDate >= this._todayDate ) ? true : false;
+  if ( this._disablePastDate && !_res && (_prevMon!=this._todayDate.getMonth()))
+   return;
+  this._current_mon    = _prevMon;
+  this._current_year   = _prevYear;
+  this._redrawCalendar();
+ },
+ /**
+  * prevYear   : redraw the calendar content for prev year.
+  */
+ _prevYear     : function () {
+  var c_mon    = this._current_mon;
+  var c_year   = (this._current_year - 1);
+  
+  return       [ c_mon, c_year ];
+ },
+ prevYear      : function () {
+  var a_next   = this._prevYear();
+  var _nextMon = a_next[0];
+  var _nextYear        = a_next[1];
+  var _curDate = new Date(); _curDate.setFullYear(_nextYear, _nextMon, 1);
+  var _res     = ( this._todayDate.getTime() + this._oneDayInMs > _curDate.getTime() ) ? true : false;
+  if ( this._disableFutureDate && !_res )
+   return;
+  this._current_mon    = _nextMon;
+  this._current_year   = _nextYear;
+  this._redrawCalendar();
+ },
+ /**
+  * nextYear   : redraw the calendar content for next year.
+  */
+ _nextYear     : function () {
+  var c_mon    = this._current_mon;
+  var c_year   = (this._current_year + 1);
+  
+  return       [ c_mon, c_year ];
+ },
+ nextYear      : function () {
+  var a_next   = this._nextYear();
+  var _nextMon = a_next[0];
+  var _nextYear        = a_next[1];
+  var _curDate = new Date(); _curDate.setFullYear(_nextYear, _nextMon, 1);
+  var _res     = ( this._todayDate.getTime() + this._oneDayInMs > _curDate.getTime() ) ? true : false;
+  if ( this._disableFutureDate && !_res )
+   return;
+  this._current_mon    = _nextMon;
+  this._current_year   = _nextYear;
+  this._redrawCalendar();
+ },
+
+ _redrawCalendar       : function () {
+  this._setLocaleHdr(); this._buildCalendar();
+ },
+ _setLocaleHdr : function () {
+  /* next link */
+  var a_next   = this._nextMonthYear();
+  $(this._id_datepicker_next).setAttribute('title',
+   this.getMonthLocale(a_next[0])+' '+a_next[1]);
+  /* prev link */
+  var a_prev   = this._prevMonthYear();
+  $(this._id_datepicker_prev).setAttribute('title',
+   this.getMonthLocale(a_prev[0])+' '+a_prev[1]);
+  /* year browse */
+  if ( this._enableYearBrowse ) {
+   var a_next_y        = this._nextYear();
+   $(this._id_datepicker_next_year).setAttribute('title',
+     this.getMonthLocale(a_next_y[0])+' '+a_next_y[1]);
+   var a_prev_y        = this._prevYear();
+   $(this._id_datepicker_prev_year).setAttribute('title',
+     this.getMonthLocale(a_prev_y[0])+' '+a_prev_y[1]);
+  }
+  /* header */
+  $(this._id_datepicker_hdr).update('&nbsp;&nbsp;&nbsp;'+this.getMonthLocale(this._current_mon)+'&nbsp;'+this._current_year+'&nbsp;&nbsp;&nbsp;');
+ }
+};
diff --git a/webcit/static/dragdrop.js b/webcit/static/dragdrop.js
new file mode 100644 (file)
index 0000000..9ebfe24
--- /dev/null
@@ -0,0 +1,974 @@
+// script.aculo.us dragdrop.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+if(Object.isUndefined(Effect))
+  throw("dragdrop.js requires including script.aculo.us' effects.js library");
+
+var Droppables = {
+  drops: [],
+
+  remove: function(element) {
+    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
+  },
+
+  add: function(element) {
+    element = $(element);
+    var options = Object.extend({
+      greedy:     true,
+      hoverclass: null,
+      tree:       false
+    }, arguments[1] || { });
+
+    // cache containers
+    if(options.containment) {
+      options._containers = [];
+      var containment = options.containment;
+      if(Object.isArray(containment)) {
+        containment.each( function(c) { options._containers.push($(c)) });
+      } else {
+        options._containers.push($(containment));
+      }
+    }
+
+    if(options.accept) options.accept = [options.accept].flatten();
+
+    Element.makePositioned(element); // fix IE
+    options.element = element;
+
+    this.drops.push(options);
+  },
+
+  findDeepestChild: function(drops) {
+    deepest = drops[0];
+
+    for (i = 1; i < drops.length; ++i)
+      if (Element.isParent(drops[i].element, deepest.element))
+        deepest = drops[i];
+
+    return deepest;
+  },
+
+  isContained: function(element, drop) {
+    var containmentNode;
+    if(drop.tree) {
+      containmentNode = element.treeNode;
+    } else {
+      containmentNode = element.parentNode;
+    }
+    return drop._containers.detect(function(c) { return containmentNode == c });
+  },
+
+  isAffected: function(point, element, drop) {
+    return (
+      (drop.element!=element) &&
+      ((!drop._containers) ||
+        this.isContained(element, drop)) &&
+      ((!drop.accept) ||
+        (Element.classNames(element).detect(
+          function(v) { return drop.accept.include(v) } ) )) &&
+      Position.within(drop.element, point[0], point[1]) );
+  },
+
+  deactivate: function(drop) {
+    if(drop.hoverclass)
+      Element.removeClassName(drop.element, drop.hoverclass);
+    this.last_active = null;
+  },
+
+  activate: function(drop) {
+    if(drop.hoverclass)
+      Element.addClassName(drop.element, drop.hoverclass);
+    this.last_active = drop;
+  },
+
+  show: function(point, element) {
+    if(!this.drops.length) return;
+    var drop, affected = [];
+
+    this.drops.each( function(drop) {
+      if(Droppables.isAffected(point, element, drop))
+        affected.push(drop);
+    });
+
+    if(affected.length>0)
+      drop = Droppables.findDeepestChild(affected);
+
+    if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
+    if (drop) {
+      Position.within(drop.element, point[0], point[1]);
+      if(drop.onHover)
+        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+
+      if (drop != this.last_active) Droppables.activate(drop);
+    }
+  },
+
+  fire: function(event, element) {
+    if(!this.last_active) return;
+    Position.prepare();
+
+    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
+      if (this.last_active.onDrop) {
+        this.last_active.onDrop(element, this.last_active.element, event);
+        return true;
+      }
+  },
+
+  reset: function() {
+    if(this.last_active)
+      this.deactivate(this.last_active);
+  }
+};
+
+var Draggables = {
+  drags: [],
+  observers: [],
+
+  register: function(draggable) {
+    if(this.drags.length == 0) {
+      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
+      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
+      this.eventKeypress  = this.keyPress.bindAsEventListener(this);
+
+      Event.observe(document, "mouseup", this.eventMouseUp);
+      Event.observe(document, "mousemove", this.eventMouseMove);
+      Event.observe(document, "keypress", this.eventKeypress);
+    }
+    this.drags.push(draggable);
+  },
+
+  unregister: function(draggable) {
+    this.drags = this.drags.reject(function(d) { return d==draggable });
+    if(this.drags.length == 0) {
+      Event.stopObserving(document, "mouseup", this.eventMouseUp);
+      Event.stopObserving(document, "mousemove", this.eventMouseMove);
+      Event.stopObserving(document, "keypress", this.eventKeypress);
+    }
+  },
+
+  activate: function(draggable) {
+    if(draggable.options.delay) {
+      this._timeout = setTimeout(function() {
+        Draggables._timeout = null;
+        window.focus();
+        Draggables.activeDraggable = draggable;
+      }.bind(this), draggable.options.delay);
+    } else {
+      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
+      this.activeDraggable = draggable;
+    }
+  },
+
+  deactivate: function() {
+    this.activeDraggable = null;
+  },
+
+  updateDrag: function(event) {
+    if(!this.activeDraggable) return;
+    var pointer = [Event.pointerX(event), Event.pointerY(event)];
+    // Mozilla-based browsers fire successive mousemove events with
+    // the same coordinates, prevent needless redrawing (moz bug?)
+    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
+    this._lastPointer = pointer;
+
+    this.activeDraggable.updateDrag(event, pointer);
+  },
+
+  endDrag: function(event) {
+    if(this._timeout) {
+      clearTimeout(this._timeout);
+      this._timeout = null;
+    }
+    if(!this.activeDraggable) return;
+    this._lastPointer = null;
+    this.activeDraggable.endDrag(event);
+    this.activeDraggable = null;
+  },
+
+  keyPress: function(event) {
+    if(this.activeDraggable)
+      this.activeDraggable.keyPress(event);
+  },
+
+  addObserver: function(observer) {
+    this.observers.push(observer);
+    this._cacheObserverCallbacks();
+  },
+
+  removeObserver: function(element) {  // element instead of observer fixes mem leaks
+    this.observers = this.observers.reject( function(o) { return o.element==element });
+    this._cacheObserverCallbacks();
+  },
+
+  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
+    if(this[eventName+'Count'] > 0)
+      this.observers.each( function(o) {
+        if(o[eventName]) o[eventName](eventName, draggable, event);
+      });
+    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
+  },
+
+  _cacheObserverCallbacks: function() {
+    ['onStart','onEnd','onDrag'].each( function(eventName) {
+      Draggables[eventName+'Count'] = Draggables.observers.select(
+        function(o) { return o[eventName]; }
+      ).length;
+    });
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Draggable = Class.create({
+  initialize: function(element) {
+    var defaults = {
+      handle: false,
+      reverteffect: function(element, top_offset, left_offset) {
+        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
+        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
+          queue: {scope:'_draggable', position:'end'}
+        });
+      },
+      endeffect: function(element) {
+        var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
+        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
+          queue: {scope:'_draggable', position:'end'},
+          afterFinish: function(){
+            Draggable._dragging[element] = false
+          }
+        });
+      },
+      zindex: 1000,
+      revert: false,
+      quiet: false,
+      scroll: false,
+      scrollSensitivity: 20,
+      scrollSpeed: 15,
+      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
+      delay: 0
+    };
+
+    if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
+      Object.extend(defaults, {
+        starteffect: function(element) {
+          element._opacity = Element.getOpacity(element);
+          Draggable._dragging[element] = true;
+          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
+        }
+      });
+
+    var options = Object.extend(defaults, arguments[1] || { });
+
+    this.element = $(element);
+
+    if(options.handle && Object.isString(options.handle))
+      this.handle = this.element.down('.'+options.handle, 0);
+
+    if(!this.handle) this.handle = $(options.handle);
+    if(!this.handle) this.handle = this.element;
+
+    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
+      options.scroll = $(options.scroll);
+      this._isScrollChild = Element.childOf(this.element, options.scroll);
+    }
+
+    Element.makePositioned(this.element); // fix IE
+
+    this.options  = options;
+    this.dragging = false;
+
+    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
+    Event.observe(this.handle, "mousedown", this.eventMouseDown);
+
+    Draggables.register(this);
+  },
+
+  destroy: function() {
+    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
+    Draggables.unregister(this);
+  },
+
+  currentDelta: function() {
+    return([
+      parseInt(Element.getStyle(this.element,'left') || '0'),
+      parseInt(Element.getStyle(this.element,'top') || '0')]);
+  },
+
+  initDrag: function(event) {
+    if(!Object.isUndefined(Draggable._dragging[this.element]) &&
+      Draggable._dragging[this.element]) return;
+    if(Event.isLeftClick(event)) {
+      // abort on form elements, fixes a Firefox issue
+      var src = Event.element(event);
+      if((tag_name = src.tagName.toUpperCase()) && (
+        tag_name=='INPUT' ||
+        tag_name=='SELECT' ||
+        tag_name=='OPTION' ||
+        tag_name=='BUTTON' ||
+        tag_name=='TEXTAREA')) return;
+
+      var pointer = [Event.pointerX(event), Event.pointerY(event)];
+      var pos     = this.element.cumulativeOffset();
+      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
+
+      Draggables.activate(this);
+      Event.stop(event);
+    }
+  },
+
+  startDrag: function(event) {
+    this.dragging = true;
+    if(!this.delta)
+      this.delta = this.currentDelta();
+
+    if(this.options.zindex) {
+      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
+      this.element.style.zIndex = this.options.zindex;
+    }
+
+    if(this.options.ghosting) {
+      this._clone = this.element.cloneNode(true);
+      this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
+      if (!this._originallyAbsolute)
+        Position.absolutize(this.element);
+      this.element.parentNode.insertBefore(this._clone, this.element);
+    }
+
+    if(this.options.scroll) {
+      if (this.options.scroll == window) {
+        var where = this._getWindowScroll(this.options.scroll);
+        this.originalScrollLeft = where.left;
+        this.originalScrollTop = where.top;
+      } else {
+        this.originalScrollLeft = this.options.scroll.scrollLeft;
+        this.originalScrollTop = this.options.scroll.scrollTop;
+      }
+    }
+
+    Draggables.notify('onStart', this, event);
+
+    if(this.options.starteffect) this.options.starteffect(this.element);
+  },
+
+  updateDrag: function(event, pointer) {
+    if(!this.dragging) this.startDrag(event);
+
+    if(!this.options.quiet){
+      Position.prepare();
+      Droppables.show(pointer, this.element);
+    }
+
+    Draggables.notify('onDrag', this, event);
+
+    this.draw(pointer);
+    if(this.options.change) this.options.change(this);
+
+    if(this.options.scroll) {
+      this.stopScrolling();
+
+      var p;
+      if (this.options.scroll == window) {
+        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
+      } else {
+        p = Position.page(this.options.scroll).toArray();
+        p[0] += this.options.scroll.scrollLeft + Position.deltaX;
+        p[1] += this.options.scroll.scrollTop + Position.deltaY;
+        p.push(p[0]+this.options.scroll.offsetWidth);
+        p.push(p[1]+this.options.scroll.offsetHeight);
+      }
+      var speed = [0,0];
+      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
+      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
+      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
+      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
+      this.startScrolling(speed);
+    }
+
+    // fix AppleWebKit rendering
+    if(Prototype.Browser.WebKit) window.scrollBy(0,0);
+
+    Event.stop(event);
+  },
+
+  finishDrag: function(event, success) {
+    this.dragging = false;
+
+    if(this.options.quiet){
+      Position.prepare();
+      var pointer = [Event.pointerX(event), Event.pointerY(event)];
+      Droppables.show(pointer, this.element);
+    }
+
+    if(this.options.ghosting) {
+      if (!this._originallyAbsolute)
+        Position.relativize(this.element);
+      delete this._originallyAbsolute;
+      Element.remove(this._clone);
+      this._clone = null;
+    }
+
+    var dropped = false;
+    if(success) {
+      dropped = Droppables.fire(event, this.element);
+      if (!dropped) dropped = false;
+    }
+    if(dropped && this.options.onDropped) this.options.onDropped(this.element);
+    Draggables.notify('onEnd', this, event);
+
+    var revert = this.options.revert;
+    if(revert && Object.isFunction(revert)) revert = revert(this.element);
+
+    var d = this.currentDelta();
+    if(revert && this.options.reverteffect) {
+      if (dropped == 0 || revert != 'failure')
+        this.options.reverteffect(this.element,
+          d[1]-this.delta[1], d[0]-this.delta[0]);
+    } else {
+      this.delta = d;
+    }
+
+    if(this.options.zindex)
+      this.element.style.zIndex = this.originalZ;
+
+    if(this.options.endeffect)
+      this.options.endeffect(this.element);
+
+    Draggables.deactivate(this);
+    Droppables.reset();
+  },
+
+  keyPress: function(event) {
+    if(event.keyCode!=Event.KEY_ESC) return;
+    this.finishDrag(event, false);
+    Event.stop(event);
+  },
+
+  endDrag: function(event) {
+    if(!this.dragging) return;
+    this.stopScrolling();
+    this.finishDrag(event, true);
+    Event.stop(event);
+  },
+
+  draw: function(point) {
+    var pos = this.element.cumulativeOffset();
+    if(this.options.ghosting) {
+      var r   = Position.realOffset(this.element);
+      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
+    }
+
+    var d = this.currentDelta();
+    pos[0] -= d[0]; pos[1] -= d[1];
+
+    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
+      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
+      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
+    }
+
+    var p = [0,1].map(function(i){
+      return (point[i]-pos[i]-this.offset[i])
+    }.bind(this));
+
+    if(this.options.snap) {
+      if(Object.isFunction(this.options.snap)) {
+        p = this.options.snap(p[0],p[1],this);
+      } else {
+      if(Object.isArray(this.options.snap)) {
+        p = p.map( function(v, i) {
+          return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this));
+      } else {
+        p = p.map( function(v) {
+          return (v/this.options.snap).round()*this.options.snap }.bind(this));
+      }
+    }}
+
+    var style = this.element.style;
+    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
+      style.left = p[0] + "px";
+    if((!this.options.constraint) || (this.options.constraint=='vertical'))
+      style.top  = p[1] + "px";
+
+    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
+  },
+
+  stopScrolling: function() {
+    if(this.scrollInterval) {
+      clearInterval(this.scrollInterval);
+      this.scrollInterval = null;
+      Draggables._lastScrollPointer = null;
+    }
+  },
+
+  startScrolling: function(speed) {
+    if(!(speed[0] || speed[1])) return;
+    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
+    this.lastScrolled = new Date();
+    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
+  },
+
+  scroll: function() {
+    var current = new Date();
+    var delta = current - this.lastScrolled;
+    this.lastScrolled = current;
+    if(this.options.scroll == window) {
+      with (this._getWindowScroll(this.options.scroll)) {
+        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
+          var d = delta / 1000;
+          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
+        }
+      }
+    } else {
+      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
+      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
+    }
+
+    Position.prepare();
+    Droppables.show(Draggables._lastPointer, this.element);
+    Draggables.notify('onDrag', this);
+    if (this._isScrollChild) {
+      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
+      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
+      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
+      if (Draggables._lastScrollPointer[0] < 0)
+        Draggables._lastScrollPointer[0] = 0;
+      if (Draggables._lastScrollPointer[1] < 0)
+        Draggables._lastScrollPointer[1] = 0;
+      this.draw(Draggables._lastScrollPointer);
+    }
+
+    if(this.options.change) this.options.change(this);
+  },
+
+  _getWindowScroll: function(w) {
+    var T, L, W, H;
+    with (w.document) {
+      if (w.document.documentElement && documentElement.scrollTop) {
+        T = documentElement.scrollTop;
+        L = documentElement.scrollLeft;
+      } else if (w.document.body) {
+        T = body.scrollTop;
+        L = body.scrollLeft;
+      }
+      if (w.innerWidth) {
+        W = w.innerWidth;
+        H = w.innerHeight;
+      } else if (w.document.documentElement && documentElement.clientWidth) {
+        W = documentElement.clientWidth;
+        H = documentElement.clientHeight;
+      } else {
+        W = body.offsetWidth;
+        H = body.offsetHeight;
+      }
+    }
+    return { top: T, left: L, width: W, height: H };
+  }
+});
+
+Draggable._dragging = { };
+
+/*--------------------------------------------------------------------------*/
+
+var SortableObserver = Class.create({
+  initialize: function(element, observer) {
+    this.element   = $(element);
+    this.observer  = observer;
+    this.lastValue = Sortable.serialize(this.element);
+  },
+
+  onStart: function() {
+    this.lastValue = Sortable.serialize(this.element);
+  },
+
+  onEnd: function() {
+    Sortable.unmark();
+    if(this.lastValue != Sortable.serialize(this.element))
+      this.observer(this.element)
+  }
+});
+
+var Sortable = {
+  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
+
+  sortables: { },
+
+  _findRootElement: function(element) {
+    while (element.tagName.toUpperCase() != "BODY") {
+      if(element.id && Sortable.sortables[element.id]) return element;
+      element = element.parentNode;
+    }
+  },
+
+  options: function(element) {
+    element = Sortable._findRootElement($(element));
+    if(!element) return;
+    return Sortable.sortables[element.id];
+  },
+
+  destroy: function(element){
+    element = $(element);
+    var s = Sortable.sortables[element.id];
+
+    if(s) {
+      Draggables.removeObserver(s.element);
+      s.droppables.each(function(d){ Droppables.remove(d) });
+      s.draggables.invoke('destroy');
+
+      delete Sortable.sortables[s.element.id];
+    }
+  },
+
+  create: function(element) {
+    element = $(element);
+    var options = Object.extend({
+      element:     element,
+      tag:         'li',       // assumes li children, override with tag: 'tagname'
+      dropOnEmpty: false,
+      tree:        false,
+      treeTag:     'ul',
+      overlap:     'vertical', // one of 'vertical', 'horizontal'
+      constraint:  'vertical', // one of 'vertical', 'horizontal', false
+      containment: element,    // also takes array of elements (or id's); or false
+      handle:      false,      // or a CSS class
+      only:        false,
+      delay:       0,
+      hoverclass:  null,
+      ghosting:    false,
+      quiet:       false,
+      scroll:      false,
+      scrollSensitivity: 20,
+      scrollSpeed: 15,
+      format:      this.SERIALIZE_RULE,
+
+      // these take arrays of elements or ids and can be
+      // used for better initialization performance
+      elements:    false,
+      handles:     false,
+
+      onChange:    Prototype.emptyFunction,
+      onUpdate:    Prototype.emptyFunction
+    }, arguments[1] || { });
+
+    // clear any old sortable with same element
+    this.destroy(element);
+
+    // build options for the draggables
+    var options_for_draggable = {
+      revert:      true,
+      quiet:       options.quiet,
+      scroll:      options.scroll,
+      scrollSpeed: options.scrollSpeed,
+      scrollSensitivity: options.scrollSensitivity,
+      delay:       options.delay,
+      ghosting:    options.ghosting,
+      constraint:  options.constraint,
+      handle:      options.handle };
+
+    if(options.starteffect)
+      options_for_draggable.starteffect = options.starteffect;
+
+    if(options.reverteffect)
+      options_for_draggable.reverteffect = options.reverteffect;
+    else
+      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
+        element.style.top  = 0;
+        element.style.left = 0;
+      };
+
+    if(options.endeffect)
+      options_for_draggable.endeffect = options.endeffect;
+
+    if(options.zindex)
+      options_for_draggable.zindex = options.zindex;
+
+    // build options for the droppables
+    var options_for_droppable = {
+      overlap:     options.overlap,
+      containment: options.containment,
+      tree:        options.tree,
+      hoverclass:  options.hoverclass,
+      onHover:     Sortable.onHover
+    };
+
+    var options_for_tree = {
+      onHover:      Sortable.onEmptyHover,
+      overlap:      options.overlap,
+      containment:  options.containment,
+      hoverclass:   options.hoverclass
+    };
+
+    // fix for gecko engine
+    Element.cleanWhitespace(element);
+
+    options.draggables = [];
+    options.droppables = [];
+
+    // drop on empty handling
+    if(options.dropOnEmpty || options.tree) {
+      Droppables.add(element, options_for_tree);
+      options.droppables.push(element);
+    }
+
+    (options.elements || this.findElements(element, options) || []).each( function(e,i) {
+      var handle = options.handles ? $(options.handles[i]) :
+        (options.handle ? $(e).select('.' + options.handle)[0] : e);
+      options.draggables.push(
+        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
+      Droppables.add(e, options_for_droppable);
+      if(options.tree) e.treeNode = element;
+      options.droppables.push(e);
+    });
+
+    if(options.tree) {
+      (Sortable.findTreeElements(element, options) || []).each( function(e) {
+        Droppables.add(e, options_for_tree);
+        e.treeNode = element;
+        options.droppables.push(e);
+      });
+    }
+
+    // keep reference
+    this.sortables[element.identify()] = options;
+
+    // for onupdate
+    Draggables.addObserver(new SortableObserver(element, options.onUpdate));
+
+  },
+
+  // return all suitable-for-sortable elements in a guaranteed order
+  findElements: function(element, options) {
+    return Element.findChildren(
+      element, options.only, options.tree ? true : false, options.tag);
+  },
+
+  findTreeElements: function(element, options) {
+    return Element.findChildren(
+      element, options.only, options.tree ? true : false, options.treeTag);
+  },
+
+  onHover: function(element, dropon, overlap) {
+    if(Element.isParent(dropon, element)) return;
+
+    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
+      return;
+    } else if(overlap>0.5) {
+      Sortable.mark(dropon, 'before');
+      if(dropon.previousSibling != element) {
+        var oldParentNode = element.parentNode;
+        element.style.visibility = "hidden"; // fix gecko rendering
+        dropon.parentNode.insertBefore(element, dropon);
+        if(dropon.parentNode!=oldParentNode)
+          Sortable.options(oldParentNode).onChange(element);
+        Sortable.options(dropon.parentNode).onChange(element);
+      }
+    } else {
+      Sortable.mark(dropon, 'after');
+      var nextElement = dropon.nextSibling || null;
+      if(nextElement != element) {
+        var oldParentNode = element.parentNode;
+        element.style.visibility = "hidden"; // fix gecko rendering
+        dropon.parentNode.insertBefore(element, nextElement);
+        if(dropon.parentNode!=oldParentNode)
+          Sortable.options(oldParentNode).onChange(element);
+        Sortable.options(dropon.parentNode).onChange(element);
+      }
+    }
+  },
+
+  onEmptyHover: function(element, dropon, overlap) {
+    var oldParentNode = element.parentNode;
+    var droponOptions = Sortable.options(dropon);
+
+    if(!Element.isParent(dropon, element)) {
+      var index;
+
+      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
+      var child = null;
+
+      if(children) {
+        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
+
+        for (index = 0; index < children.length; index += 1) {
+          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
+            offset -= Element.offsetSize (children[index], droponOptions.overlap);
+          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
+            child = index + 1 < children.length ? children[index + 1] : null;
+            break;
+          } else {
+            child = children[index];
+            break;
+          }
+        }
+      }
+
+      dropon.insertBefore(element, child);
+
+      Sortable.options(oldParentNode).onChange(element);
+      droponOptions.onChange(element);
+    }
+  },
+
+  unmark: function() {
+    if(Sortable._marker) Sortable._marker.hide();
+  },
+
+  mark: function(dropon, position) {
+    // mark on ghosting only
+    var sortable = Sortable.options(dropon.parentNode);
+    if(sortable && !sortable.ghosting) return;
+
+    if(!Sortable._marker) {
+      Sortable._marker =
+        ($('dropmarker') || Element.extend(document.createElement('DIV'))).
+          hide().addClassName('dropmarker').setStyle({position:'absolute'});
+      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
+    }
+    var offsets = dropon.cumulativeOffset();
+    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
+
+    if(position=='after')
+      if(sortable.overlap == 'horizontal')
+        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
+      else
+        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
+
+    Sortable._marker.show();
+  },
+
+  _tree: function(element, options, parent) {
+    var children = Sortable.findElements(element, options) || [];
+
+    for (var i = 0; i < children.length; ++i) {
+      var match = children[i].id.match(options.format);
+
+      if (!match) continue;
+
+      var child = {
+        id: encodeURIComponent(match ? match[1] : null),
+        element: element,
+        parent: parent,
+        children: [],
+        position: parent.children.length,
+        container: $(children[i]).down(options.treeTag)
+      };
+
+      /* Get the element containing the children and recurse over it */
+      if (child.container)
+        this._tree(child.container, options, child);
+
+      parent.children.push (child);
+    }
+
+    return parent;
+  },
+
+  tree: function(element) {
+    element = $(element);
+    var sortableOptions = this.options(element);
+    var options = Object.extend({
+      tag: sortableOptions.tag,
+      treeTag: sortableOptions.treeTag,
+      only: sortableOptions.only,
+      name: element.id,
+      format: sortableOptions.format
+    }, arguments[1] || { });
+
+    var root = {
+      id: null,
+      parent: null,
+      children: [],
+      container: element,
+      position: 0
+    };
+
+    return Sortable._tree(element, options, root);
+  },
+
+  /* Construct a [i] index for a particular node */
+  _constructIndex: function(node) {
+    var index = '';
+    do {
+      if (node.id) index = '[' + node.position + ']' + index;
+    } while ((node = node.parent) != null);
+    return index;
+  },
+
+  sequence: function(element) {
+    element = $(element);
+    var options = Object.extend(this.options(element), arguments[1] || { });
+
+    return $(this.findElements(element, options) || []).map( function(item) {
+      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
+    });
+  },
+
+  setSequence: function(element, new_sequence) {
+    element = $(element);
+    var options = Object.extend(this.options(element), arguments[2] || { });
+
+    var nodeMap = { };
+    this.findElements(element, options).each( function(n) {
+        if (n.id.match(options.format))
+            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
+        n.parentNode.removeChild(n);
+    });
+
+    new_sequence.each(function(ident) {
+      var n = nodeMap[ident];
+      if (n) {
+        n[1].appendChild(n[0]);
+        delete nodeMap[ident];
+      }
+    });
+  },
+
+  serialize: function(element) {
+    element = $(element);
+    var options = Object.extend(Sortable.options(element), arguments[1] || { });
+    var name = encodeURIComponent(
+      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
+
+    if (options.tree) {
+      return Sortable.tree(element, arguments[1]).children.map( function (item) {
+        return [name + Sortable._constructIndex(item) + "[id]=" +
+                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
+      }).flatten().join('&');
+    } else {
+      return Sortable.sequence(element, arguments[1]).map( function(item) {
+        return name + "[]=" + encodeURIComponent(item);
+      }).join('&');
+    }
+  }
+};
+
+// Returns true if child is contained within element
+Element.isParent = function(child, element) {
+  if (!child.parentNode || child == element) return false;
+  if (child.parentNode == element) return true;
+  return Element.isParent(child.parentNode, element);
+};
+
+Element.findChildren = function(element, only, recursive, tagName) {
+  if(!element.hasChildNodes()) return null;
+  tagName = tagName.toUpperCase();
+  if(only) only = [only].flatten();
+  var elements = [];
+  $A(element.childNodes).each( function(e) {
+    if(e.tagName && e.tagName.toUpperCase()==tagName &&
+      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
+        elements.push(e);
+    if(recursive) {
+      var grandchildren = Element.findChildren(e, only, recursive, tagName);
+      if(grandchildren) elements.push(grandchildren);
+    }
+  });
+
+  return (elements.length>0 ? elements.flatten() : []);
+};
+
+Element.offsetSize = function (element, type) {
+  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
+};
\ No newline at end of file
diff --git a/webcit/static/edit.gif b/webcit/static/edit.gif
new file mode 100755 (executable)
index 0000000..13aa89a
Binary files /dev/null and b/webcit/static/edit.gif differ
diff --git a/webcit/static/effects.js b/webcit/static/effects.js
new file mode 100644 (file)
index 0000000..860ddc0
--- /dev/null
@@ -0,0 +1,1123 @@
+// script.aculo.us effects.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+//  Justin Palmer (http://encytemedia.com/)
+//  Mark Pilgrim (http://diveintomark.org/)
+//  Martin Bialasinki
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// converts rgb() and #xxx to #xxxxxx format,
+// returns self (or first argument) if not convertable
+String.prototype.parseColor = function() {
+  var color = '#';
+  if (this.slice(0,4) == 'rgb(') {
+    var cols = this.slice(4,this.length-1).split(',');
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
+  } else {
+    if (this.slice(0,1) == '#') {
+      if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
+      if (this.length==7) color = this.toLowerCase();
+    }
+  }
+  return (color.length==7 ? color : (arguments[0] || this));
+};
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue :
+      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+  }).flatten().join('');
+};
+
+Element.collectTextNodesIgnoreClass = function(element, className) {
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue :
+      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
+        Element.collectTextNodesIgnoreClass(node, className) : ''));
+  }).flatten().join('');
+};
+
+Element.setContentZoom = function(element, percent) {
+  element = $(element);
+  element.setStyle({fontSize: (percent/100) + 'em'});
+  if (Prototype.Browser.WebKit) window.scrollBy(0,0);
+  return element;
+};
+
+Element.getInlineOpacity = function(element){
+  return $(element).style.opacity || '';
+};
+
+Element.forceRerendering = function(element) {
+  try {
+    element = $(element);
+    var n = document.createTextNode(' ');
+    element.appendChild(n);
+    element.removeChild(n);
+  } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+  _elementDoesNotExistError: {
+    name: 'ElementDoesNotExistError',
+    message: 'The specified DOM element does not exist, but is required for this effect to operate'
+  },
+  Transitions: {
+    linear: Prototype.K,
+    sinoidal: function(pos) {
+      return (-Math.cos(pos*Math.PI)/2) + .5;
+    },
+    reverse: function(pos) {
+      return 1-pos;
+    },
+    flicker: function(pos) {
+      var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
+      return pos > 1 ? 1 : pos;
+    },
+    wobble: function(pos) {
+      return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
+    },
+    pulse: function(pos, pulses) {
+      return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
+    },
+    spring: function(pos) {
+      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
+    },
+    none: function(pos) {
+      return 0;
+    },
+    full: function(pos) {
+      return 1;
+    }
+  },
+  DefaultOptions: {
+    duration:   1.0,   // seconds
+    fps:        100,   // 100= assume 66fps max.
+    sync:       false, // true for combining
+    from:       0.0,
+    to:         1.0,
+    delay:      0.0,
+    queue:      'parallel'
+  },
+  tagifyText: function(element) {
+    var tagifyStyle = 'position:relative';
+    if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
+
+    element = $(element);
+    $A(element.childNodes).each( function(child) {
+      if (child.nodeType==3) {
+        child.nodeValue.toArray().each( function(character) {
+          element.insertBefore(
+            new Element('span', {style: tagifyStyle}).update(
+              character == ' ' ? String.fromCharCode(160) : character),
+              child);
+        });
+        Element.remove(child);
+      }
+    });
+  },
+  multiple: function(element, effect) {
+    var elements;
+    if (((typeof element == 'object') ||
+        Object.isFunction(element)) &&
+       (element.length))
+      elements = element;
+    else
+      elements = $(element).childNodes;
+
+    var options = Object.extend({
+      speed: 0.1,
+      delay: 0.0
+    }, arguments[2] || { });
+    var masterDelay = options.delay;
+
+    $A(elements).each( function(element, index) {
+      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+    });
+  },
+  PAIRS: {
+    'slide':  ['SlideDown','SlideUp'],
+    'blind':  ['BlindDown','BlindUp'],
+    'appear': ['Appear','Fade']
+  },
+  toggle: function(element, effect, options) {
+    element = $(element);
+    effect  = (effect || 'appear').toLowerCase();
+    
+    return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({
+      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+    }, options || {}));
+  }
+};
+
+Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create(Enumerable, {
+  initialize: function() {
+    this.effects  = [];
+    this.interval = null;
+  },
+  _each: function(iterator) {
+    this.effects._each(iterator);
+  },
+  add: function(effect) {
+    var timestamp = new Date().getTime();
+
+    var position = Object.isString(effect.options.queue) ?
+      effect.options.queue : effect.options.queue.position;
+
+    switch(position) {
+      case 'front':
+        // move unstarted effects after this effect
+        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+            e.startOn  += effect.finishOn;
+            e.finishOn += effect.finishOn;
+          });
+        break;
+      case 'with-last':
+        timestamp = this.effects.pluck('startOn').max() || timestamp;
+        break;
+      case 'end':
+        // start effect after last queued effect has finished
+        timestamp = this.effects.pluck('finishOn').max() || timestamp;
+        break;
+    }
+
+    effect.startOn  += timestamp;
+    effect.finishOn += timestamp;
+
+    if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+      this.effects.push(effect);
+
+    if (!this.interval)
+      this.interval = setInterval(this.loop.bind(this), 15);
+  },
+  remove: function(effect) {
+    this.effects = this.effects.reject(function(e) { return e==effect });
+    if (this.effects.length == 0) {
+      clearInterval(this.interval);
+      this.interval = null;
+    }
+  },
+  loop: function() {
+    var timePos = new Date().getTime();
+    for(var i=0, len=this.effects.length;i<len;i++)
+      this.effects[i] && this.effects[i].loop(timePos);
+  }
+});
+
+Effect.Queues = {
+  instances: $H(),
+  get: function(queueName) {
+    if (!Object.isString(queueName)) return queueName;
+
+    return this.instances.get(queueName) ||
+      this.instances.set(queueName, new Effect.ScopedQueue());
+  }
+};
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.Base = Class.create({
+  position: null,
+  start: function(options) {
+    if (options && options.transition === false) options.transition = Effect.Transitions.linear;
+    this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
+    this.currentFrame = 0;
+    this.state        = 'idle';
+    this.startOn      = this.options.delay*1000;
+    this.finishOn     = this.startOn+(this.options.duration*1000);
+    this.fromToDelta  = this.options.to-this.options.from;
+    this.totalTime    = this.finishOn-this.startOn;
+    this.totalFrames  = this.options.fps*this.options.duration;
+
+    this.render = (function() {
+      function dispatch(effect, eventName) {
+        if (effect.options[eventName + 'Internal'])
+          effect.options[eventName + 'Internal'](effect);
+        if (effect.options[eventName])
+          effect.options[eventName](effect);
+      }
+
+      return function(pos) {
+        if (this.state === "idle") {
+          this.state = "running";
+          dispatch(this, 'beforeSetup');
+          if (this.setup) this.setup();
+          dispatch(this, 'afterSetup');
+        }
+        if (this.state === "running") {
+          pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
+          this.position = pos;
+          dispatch(this, 'beforeUpdate');
+          if (this.update) this.update(pos);
+          dispatch(this, 'afterUpdate');
+        }
+      };
+    })();
+
+    this.event('beforeStart');
+    if (!this.options.sync)
+      Effect.Queues.get(Object.isString(this.options.queue) ?
+        'global' : this.options.queue.scope).add(this);
+  },
+  loop: function(timePos) {
+    if (timePos >= this.startOn) {
+      if (timePos >= this.finishOn) {
+        this.render(1.0);
+        this.cancel();
+        this.event('beforeFinish');
+        if (this.finish) this.finish();
+        this.event('afterFinish');
+        return;
+      }
+      var pos   = (timePos - this.startOn) / this.totalTime,
+          frame = (pos * this.totalFrames).round();
+      if (frame > this.currentFrame) {
+        this.render(pos);
+        this.currentFrame = frame;
+      }
+    }
+  },
+  cancel: function() {
+    if (!this.options.sync)
+      Effect.Queues.get(Object.isString(this.options.queue) ?
+        'global' : this.options.queue.scope).remove(this);
+    this.state = 'finished';
+  },
+  event: function(eventName) {
+    if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+    if (this.options[eventName]) this.options[eventName](this);
+  },
+  inspect: function() {
+    var data = $H();
+    for(property in this)
+      if (!Object.isFunction(this[property])) data.set(property, this[property]);
+    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
+  }
+});
+
+Effect.Parallel = Class.create(Effect.Base, {
+  initialize: function(effects) {
+    this.effects = effects || [];
+    this.start(arguments[1]);
+  },
+  update: function(position) {
+    this.effects.invoke('render', position);
+  },
+  finish: function(position) {
+    this.effects.each( function(effect) {
+      effect.render(1.0);
+      effect.cancel();
+      effect.event('beforeFinish');
+      if (effect.finish) effect.finish(position);
+      effect.event('afterFinish');
+    });
+  }
+});
+
+Effect.Tween = Class.create(Effect.Base, {
+  initialize: function(object, from, to) {
+    object = Object.isString(object) ? $(object) : object;
+    var args = $A(arguments), method = args.last(),
+      options = args.length == 5 ? args[3] : null;
+    this.method = Object.isFunction(method) ? method.bind(object) :
+      Object.isFunction(object[method]) ? object[method].bind(object) :
+      function(value) { object[method] = value };
+    this.start(Object.extend({ from: from, to: to }, options || { }));
+  },
+  update: function(position) {
+    this.method(position);
+  }
+});
+
+Effect.Event = Class.create(Effect.Base, {
+  initialize: function() {
+    this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
+  },
+  update: Prototype.emptyFunction
+});
+
+Effect.Opacity = Class.create(Effect.Base, {
+  initialize: function(element) {
+    this.element = $(element);
+    if (!this.element) throw(Effect._elementDoesNotExistError);
+    // make this work on IE on elements without 'layout'
+    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+      this.element.setStyle({zoom: 1});
+    var options = Object.extend({
+      from: this.element.getOpacity() || 0.0,
+      to:   1.0
+    }, arguments[1] || { });
+    this.start(options);
+  },
+  update: function(position) {
+    this.element.setOpacity(position);
+  }
+});
+
+Effect.Move = Class.create(Effect.Base, {
+  initialize: function(element) {
+    this.element = $(element);
+    if (!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      x:    0,
+      y:    0,
+      mode: 'relative'
+    }, arguments[1] || { });
+    this.start(options);
+  },
+  setup: function() {
+    this.element.makePositioned();
+    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
+    if (this.options.mode == 'absolute') {
+      this.options.x = this.options.x - this.originalLeft;
+      this.options.y = this.options.y - this.originalTop;
+    }
+  },
+  update: function(position) {
+    this.element.setStyle({
+      left: (this.options.x  * position + this.originalLeft).round() + 'px',
+      top:  (this.options.y  * position + this.originalTop).round()  + 'px'
+    });
+  }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+  return new Effect.Move(element,
+    Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
+};
+
+Effect.Scale = Class.create(Effect.Base, {
+  initialize: function(element, percent) {
+    this.element = $(element);
+    if (!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      scaleX: true,
+      scaleY: true,
+      scaleContent: true,
+      scaleFromCenter: false,
+      scaleMode: 'box',        // 'box' or 'contents' or { } with provided values
+      scaleFrom: 100.0,
+      scaleTo:   percent
+    }, arguments[2] || { });
+    this.start(options);
+  },
+  setup: function() {
+    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+    this.elementPositioning = this.element.getStyle('position');
+
+    this.originalStyle = { };
+    ['top','left','width','height','fontSize'].each( function(k) {
+      this.originalStyle[k] = this.element.style[k];
+    }.bind(this));
+
+    this.originalTop  = this.element.offsetTop;
+    this.originalLeft = this.element.offsetLeft;
+
+    var fontSize = this.element.getStyle('font-size') || '100%';
+    ['em','px','%','pt'].each( function(fontSizeType) {
+      if (fontSize.indexOf(fontSizeType)>0) {
+        this.fontSize     = parseFloat(fontSize);
+        this.fontSizeType = fontSizeType;
+      }
+    }.bind(this));
+
+    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+
+    this.dims = null;
+    if (this.options.scaleMode=='box')
+      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+    if (/^content/.test(this.options.scaleMode))
+      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+    if (!this.dims)
+      this.dims = [this.options.scaleMode.originalHeight,
+                   this.options.scaleMode.originalWidth];
+  },
+  update: function(position) {
+    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+    if (this.options.scaleContent && this.fontSize)
+      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+  },
+  finish: function(position) {
+    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+  },
+  setDimensions: function(height, width) {
+    var d = { };
+    if (this.options.scaleX) d.width = width.round() + 'px';
+    if (this.options.scaleY) d.height = height.round() + 'px';
+    if (this.options.scaleFromCenter) {
+      var topd  = (height - this.dims[0])/2;
+      var leftd = (width  - this.dims[1])/2;
+      if (this.elementPositioning == 'absolute') {
+        if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
+        if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+      } else {
+        if (this.options.scaleY) d.top = -topd + 'px';
+        if (this.options.scaleX) d.left = -leftd + 'px';
+      }
+    }
+    this.element.setStyle(d);
+  }
+});
+
+Effect.Highlight = Class.create(Effect.Base, {
+  initialize: function(element) {
+    this.element = $(element);
+    if (!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
+    this.start(options);
+  },
+  setup: function() {
+    // Prevent executing on elements not in the layout flow
+    if (this.element.getStyle('display')=='none') { this.cancel(); return; }
+    // Disable background image during the effect
+    this.oldStyle = { };
+    if (!this.options.keepBackgroundImage) {
+      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
+      this.element.setStyle({backgroundImage: 'none'});
+    }
+    if (!this.options.endcolor)
+      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+    if (!this.options.restorecolor)
+      this.options.restorecolor = this.element.getStyle('background-color');
+    // init color calculations
+    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+  },
+  update: function(position) {
+    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+      return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
+  },
+  finish: function() {
+    this.element.setStyle(Object.extend(this.oldStyle, {
+      backgroundColor: this.options.restorecolor
+    }));
+  }
+});
+
+Effect.ScrollTo = function(element) {
+  var options = arguments[1] || { },
+  scrollOffsets = document.viewport.getScrollOffsets(),
+  elementOffsets = $(element).cumulativeOffset();
+
+  if (options.offset) elementOffsets[1] += options.offset;
+
+  return new Effect.Tween(null,
+    scrollOffsets.top,
+    elementOffsets[1],
+    options,
+    function(p){ scrollTo(scrollOffsets.left, p.round()); }
+  );
+};
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  var options = Object.extend({
+    from: element.getOpacity() || 1.0,
+    to:   0.0,
+    afterFinishInternal: function(effect) {
+      if (effect.options.to!=0) return;
+      effect.element.hide().setStyle({opacity: oldOpacity});
+    }
+  }, arguments[1] || { });
+  return new Effect.Opacity(element,options);
+};
+
+Effect.Appear = function(element) {
+  element = $(element);
+  var options = Object.extend({
+  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+  to:   1.0,
+  // force Safari to render floated elements properly
+  afterFinishInternal: function(effect) {
+    effect.element.forceRerendering();
+  },
+  beforeSetup: function(effect) {
+    effect.element.setOpacity(effect.options.from).show();
+  }}, arguments[1] || { });
+  return new Effect.Opacity(element,options);
+};
+
+Effect.Puff = function(element) {
+  element = $(element);
+  var oldStyle = {
+    opacity: element.getInlineOpacity(),
+    position: element.getStyle('position'),
+    top:  element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height
+  };
+  return new Effect.Parallel(
+   [ new Effect.Scale(element, 200,
+      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
+     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
+     Object.extend({ duration: 1.0,
+      beforeSetupInternal: function(effect) {
+        Position.absolutize(effect.effects[0].element);
+      },
+      afterFinishInternal: function(effect) {
+         effect.effects[0].element.hide().setStyle(oldStyle); }
+     }, arguments[1] || { })
+   );
+};
+
+Effect.BlindUp = function(element) {
+  element = $(element);
+  element.makeClipping();
+  return new Effect.Scale(element, 0,
+    Object.extend({ scaleContent: false,
+      scaleX: false,
+      restoreAfterFinish: true,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping();
+      }
+    }, arguments[1] || { })
+  );
+};
+
+Effect.BlindDown = function(element) {
+  element = $(element);
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({
+    scaleContent: false,
+    scaleX: false,
+    scaleFrom: 0,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makeClipping().setStyle({height: '0px'}).show();
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping();
+    }
+  }, arguments[1] || { }));
+};
+
+Effect.SwitchOff = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  return new Effect.Appear(element, Object.extend({
+    duration: 0.4,
+    from: 0,
+    transition: Effect.Transitions.flicker,
+    afterFinishInternal: function(effect) {
+      new Effect.Scale(effect.element, 1, {
+        duration: 0.3, scaleFromCenter: true,
+        scaleX: false, scaleContent: false, restoreAfterFinish: true,
+        beforeSetup: function(effect) {
+          effect.element.makePositioned().makeClipping();
+        },
+        afterFinishInternal: function(effect) {
+          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
+        }
+      });
+    }
+  }, arguments[1] || { }));
+};
+
+Effect.DropOut = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left'),
+    opacity: element.getInlineOpacity() };
+  return new Effect.Parallel(
+    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
+      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+    Object.extend(
+      { duration: 0.5,
+        beforeSetup: function(effect) {
+          effect.effects[0].element.makePositioned();
+        },
+        afterFinishInternal: function(effect) {
+          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
+        }
+      }, arguments[1] || { }));
+};
+
+Effect.Shake = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    distance: 20,
+    duration: 0.5
+  }, arguments[1] || {});
+  var distance = parseFloat(options.distance);
+  var split = parseFloat(options.duration) / 10.0;
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left') };
+    return new Effect.Move(element,
+      { x:  distance, y: 0, duration: split, afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
+        effect.element.undoPositioned().setStyle(oldStyle);
+  }}); }}); }}); }}); }}); }});
+};
+
+Effect.SlideDown = function(element) {
+  element = $(element).cleanWhitespace();
+  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+  var oldInnerBottom = element.down().getStyle('bottom');
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({
+    scaleContent: false,
+    scaleX: false,
+    scaleFrom: window.opera ? 0 : 1,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if (window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().setStyle({height: '0px'}).show();
+    },
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping().undoPositioned();
+      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
+    }, arguments[1] || { })
+  );
+};
+
+Effect.SlideUp = function(element) {
+  element = $(element).cleanWhitespace();
+  var oldInnerBottom = element.down().getStyle('bottom');
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, window.opera ? 0 : 1,
+   Object.extend({ scaleContent: false,
+    scaleX: false,
+    scaleMode: 'box',
+    scaleFrom: 100,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if (window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().show();
+    },
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping().undoPositioned();
+      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
+    }
+   }, arguments[1] || { })
+  );
+};
+
+// Bug in opera makes the TD containing this element expand for a instance after finish
+Effect.Squish = function(element) {
+  return new Effect.Scale(element, window.opera ? 1 : 0, {
+    restoreAfterFinish: true,
+    beforeSetup: function(effect) {
+      effect.element.makeClipping();
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping();
+    }
+  });
+};
+
+Effect.Grow = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.full
+  }, arguments[1] || { });
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();
+  var initialMoveX, initialMoveY;
+  var moveX, moveY;
+
+  switch (options.direction) {
+    case 'top-left':
+      initialMoveX = initialMoveY = moveX = moveY = 0;
+      break;
+    case 'top-right':
+      initialMoveX = dims.width;
+      initialMoveY = moveY = 0;
+      moveX = -dims.width;
+      break;
+    case 'bottom-left':
+      initialMoveX = moveX = 0;
+      initialMoveY = dims.height;
+      moveY = -dims.height;
+      break;
+    case 'bottom-right':
+      initialMoveX = dims.width;
+      initialMoveY = dims.height;
+      moveX = -dims.width;
+      moveY = -dims.height;
+      break;
+    case 'center':
+      initialMoveX = dims.width / 2;
+      initialMoveY = dims.height / 2;
+      moveX = -dims.width / 2;
+      moveY = -dims.height / 2;
+      break;
+  }
+
+  return new Effect.Move(element, {
+    x: initialMoveX,
+    y: initialMoveY,
+    duration: 0.01,
+    beforeSetup: function(effect) {
+      effect.element.hide().makeClipping().makePositioned();
+    },
+    afterFinishInternal: function(effect) {
+      new Effect.Parallel(
+        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+          new Effect.Scale(effect.element, 100, {
+            scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
+            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+        ], Object.extend({
+             beforeSetup: function(effect) {
+               effect.effects[0].element.setStyle({height: '0px'}).show();
+             },
+             afterFinishInternal: function(effect) {
+               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
+             }
+           }, options)
+      );
+    }
+  });
+};
+
+Effect.Shrink = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.none
+  }, arguments[1] || { });
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();
+  var moveX, moveY;
+
+  switch (options.direction) {
+    case 'top-left':
+      moveX = moveY = 0;
+      break;
+    case 'top-right':
+      moveX = dims.width;
+      moveY = 0;
+      break;
+    case 'bottom-left':
+      moveX = 0;
+      moveY = dims.height;
+      break;
+    case 'bottom-right':
+      moveX = dims.width;
+      moveY = dims.height;
+      break;
+    case 'center':
+      moveX = dims.width / 2;
+      moveY = dims.height / 2;
+      break;
+  }
+
+  return new Effect.Parallel(
+    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+    ], Object.extend({
+         beforeStartInternal: function(effect) {
+           effect.effects[0].element.makePositioned().makeClipping();
+         },
+         afterFinishInternal: function(effect) {
+           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
+       }, options)
+  );
+};
+
+Effect.Pulsate = function(element) {
+  element = $(element);
+  var options    = arguments[1] || { },
+    oldOpacity = element.getInlineOpacity(),
+    transition = options.transition || Effect.Transitions.linear,
+    reverser   = function(pos){
+      return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
+    };
+
+  return new Effect.Opacity(element,
+    Object.extend(Object.extend({  duration: 2.0, from: 0,
+      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+    }, options), {transition: reverser}));
+};
+
+Effect.Fold = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height };
+  element.makeClipping();
+  return new Effect.Scale(element, 5, Object.extend({
+    scaleContent: false,
+    scaleX: false,
+    afterFinishInternal: function(effect) {
+    new Effect.Scale(element, 1, {
+      scaleContent: false,
+      scaleY: false,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping().setStyle(oldStyle);
+      } });
+  }}, arguments[1] || { }));
+};
+
+Effect.Morph = Class.create(Effect.Base, {
+  initialize: function(element) {
+    this.element = $(element);
+    if (!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      style: { }
+    }, arguments[1] || { });
+
+    if (!Object.isString(options.style)) this.style = $H(options.style);
+    else {
+      if (options.style.include(':'))
+        this.style = options.style.parseStyle();
+      else {
+        this.element.addClassName(options.style);
+        this.style = $H(this.element.getStyles());
+        this.element.removeClassName(options.style);
+        var css = this.element.getStyles();
+        this.style = this.style.reject(function(style) {
+          return style.value == css[style.key];
+        });
+        options.afterFinishInternal = function(effect) {
+          effect.element.addClassName(effect.options.style);
+          effect.transforms.each(function(transform) {
+            effect.element.style[transform.style] = '';
+          });
+        };
+      }
+    }
+    this.start(options);
+  },
+
+  setup: function(){
+    function parseColor(color){
+      if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+      color = color.parseColor();
+      return $R(0,2).map(function(i){
+        return parseInt( color.slice(i*2+1,i*2+3), 16 );
+      });
+    }
+    this.transforms = this.style.map(function(pair){
+      var property = pair[0], value = pair[1], unit = null;
+
+      if (value.parseColor('#zzzzzz') != '#zzzzzz') {
+        value = value.parseColor();
+        unit  = 'color';
+      } else if (property == 'opacity') {
+        value = parseFloat(value);
+        if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+          this.element.setStyle({zoom: 1});
+      } else if (Element.CSS_LENGTH.test(value)) {
+          var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
+          value = parseFloat(components[1]);
+          unit = (components.length == 3) ? components[2] : null;
+      }
+
+      var originalValue = this.element.getStyle(property);
+      return {
+        style: property.camelize(),
+        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
+        targetValue: unit=='color' ? parseColor(value) : value,
+        unit: unit
+      };
+    }.bind(this)).reject(function(transform){
+      return (
+        (transform.originalValue == transform.targetValue) ||
+        (
+          transform.unit != 'color' &&
+          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
+        )
+      );
+    });
+  },
+  update: function(position) {
+    var style = { }, transform, i = this.transforms.length;
+    while(i--)
+      style[(transform = this.transforms[i]).style] =
+        transform.unit=='color' ? '#'+
+          (Math.round(transform.originalValue[0]+
+            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
+          (Math.round(transform.originalValue[1]+
+            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
+          (Math.round(transform.originalValue[2]+
+            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
+        (transform.originalValue +
+          (transform.targetValue - transform.originalValue) * position).toFixed(3) +
+            (transform.unit === null ? '' : transform.unit);
+    this.element.setStyle(style, true);
+  }
+});
+
+Effect.Transform = Class.create({
+  initialize: function(tracks){
+    this.tracks  = [];
+    this.options = arguments[1] || { };
+    this.addTracks(tracks);
+  },
+  addTracks: function(tracks){
+    tracks.each(function(track){
+      track = $H(track);
+      var data = track.values().first();
+      this.tracks.push($H({
+        ids:     track.keys().first(),
+        effect:  Effect.Morph,
+        options: { style: data }
+      }));
+    }.bind(this));
+    return this;
+  },
+  play: function(){
+    return new Effect.Parallel(
+      this.tracks.map(function(track){
+        var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
+        var elements = [$(ids) || $$(ids)].flatten();
+        return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
+      }).flatten(),
+      this.options
+    );
+  }
+});
+
+Element.CSS_PROPERTIES = $w(
+  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
+  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
+  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
+  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
+  'fontSize fontWeight height left letterSpacing lineHeight ' +
+  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
+  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
+  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
+  'right textIndent top width wordSpacing zIndex');
+
+Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
+
+String.__parseStyleElement = document.createElement('div');
+String.prototype.parseStyle = function(){
+  var style, styleRules = $H();
+  if (Prototype.Browser.WebKit)
+    style = new Element('div',{style:this}).style;
+  else {
+    String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
+    style = String.__parseStyleElement.childNodes[0].style;
+  }
+
+  Element.CSS_PROPERTIES.each(function(property){
+    if (style[property]) styleRules.set(property, style[property]);
+  });
+
+  if (Prototype.Browser.IE && this.include('opacity'))
+    styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
+
+  return styleRules;
+};
+
+if (document.defaultView && document.defaultView.getComputedStyle) {
+  Element.getStyles = function(element) {
+    var css = document.defaultView.getComputedStyle($(element), null);
+    return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
+      styles[property] = css[property];
+      return styles;
+    });
+  };
+} else {
+  Element.getStyles = function(element) {
+    element = $(element);
+    var css = element.currentStyle, styles;
+    styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
+      results[property] = css[property];
+      return results;
+    });
+    if (!styles.opacity) styles.opacity = element.getOpacity();
+    return styles;
+  };
+}
+
+Effect.Methods = {
+  morph: function(element, style) {
+    element = $(element);
+    new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
+    return element;
+  },
+  visualEffect: function(element, effect, options) {
+    element = $(element);
+    var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
+    new Effect[klass](element, options);
+    return element;
+  },
+  highlight: function(element, options) {
+    element = $(element);
+    new Effect.Highlight(element, options);
+    return element;
+  }
+};
+
+$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
+  'pulsate shake puff squish switchOff dropOut').each(
+  function(effect) {
+    Effect.Methods[effect] = function(element, options){
+      element = $(element);
+      Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
+      return element;
+    };
+  }
+);
+
+$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
+  function(f) { Effect.Methods[f] = Element[f]; }
+);
+
+Element.addMethods(Effect.Methods);
\ No newline at end of file
diff --git a/webcit/static/favicon.ico b/webcit/static/favicon.ico
new file mode 100644 (file)
index 0000000..d8305d9
Binary files /dev/null and b/webcit/static/favicon.ico differ
diff --git a/webcit/static/fineuploader.js b/webcit/static/fineuploader.js
new file mode 100755 (executable)
index 0000000..0a4a072
--- /dev/null
@@ -0,0 +1,8540 @@
+/*!
+* Fine Uploader
+*
+* Copyright 2013, Widen Enterprises, Inc. info@fineuploader.com
+*
+* Version: 4.2.1
+*
+* Homepage: http://fineuploader.com
+*
+* Repository: git://github.com/Widen/fine-uploader.git
+*
+* Licensed under GNU GPL v3, see LICENSE
+*/ 
+
+
+/*globals window, navigator, document, FormData, File, HTMLInputElement, XMLHttpRequest, Blob, Storage, ActiveXObject */
+var qq = function(element) {
+    "use strict";
+
+    return {
+        hide: function() {
+            element.style.display = "none";
+            return this;
+        },
+
+        /** Returns the function which detaches attached event */
+        attach: function(type, fn) {
+            if (element.addEventListener){
+                element.addEventListener(type, fn, false);
+            } else if (element.attachEvent){
+                element.attachEvent("on" + type, fn);
+            }
+            return function() {
+                qq(element).detach(type, fn);
+            };
+        },
+
+        detach: function(type, fn) {
+            if (element.removeEventListener){
+                element.removeEventListener(type, fn, false);
+            } else if (element.attachEvent){
+                element.detachEvent("on" + type, fn);
+            }
+            return this;
+        },
+
+        contains: function(descendant) {
+            // The [W3C spec](http://www.w3.org/TR/domcore/#dom-node-contains)
+            // says a `null` (or ostensibly `undefined`) parameter
+            // passed into `Node.contains` should result in a false return value.
+            // IE7 throws an exception if the parameter is `undefined` though.
+            if (!descendant) {
+                return false;
+            }
+
+            // compareposition returns false in this case
+            if (element === descendant) {
+                return true;
+            }
+
+            if (element.contains){
+                return element.contains(descendant);
+            } else {
+                /*jslint bitwise: true*/
+                return !!(descendant.compareDocumentPosition(element) & 8);
+            }
+        },
+
+        /**
+         * Insert this element before elementB.
+         */
+        insertBefore: function(elementB) {
+            elementB.parentNode.insertBefore(element, elementB);
+            return this;
+        },
+
+        remove: function() {
+            element.parentNode.removeChild(element);
+            return this;
+        },
+
+        /**
+         * Sets styles for an element.
+         * Fixes opacity in IE6-8.
+         */
+        css: function(styles) {
+            /*jshint eqnull: true*/
+            if (element.style == null) {
+                throw new qq.Error("Can't apply style to node as it is not on the HTMLElement prototype chain!");
+            }
+
+            /*jshint -W116*/
+            if (styles.opacity != null){
+                if (typeof element.style.opacity !== "string" && typeof(element.filters) !== "undefined"){
+                    styles.filter = "alpha(opacity=" + Math.round(100 * styles.opacity) + ")";
+                }
+            }
+            qq.extend(element.style, styles);
+
+            return this;
+        },
+
+        hasClass: function(name) {
+            var re = new RegExp("(^| )" + name + "( |$)");
+            return re.test(element.className);
+        },
+
+        addClass: function(name) {
+            if (!qq(element).hasClass(name)){
+                element.className += " " + name;
+            }
+            return this;
+        },
+
+        removeClass: function(name) {
+            var re = new RegExp("(^| )" + name + "( |$)");
+            element.className = element.className.replace(re, " ").replace(/^\s+|\s+$/g, "");
+            return this;
+        },
+
+        getByClass: function(className) {
+            var candidates,
+                result = [];
+
+            if (element.querySelectorAll){
+                return element.querySelectorAll("." + className);
+            }
+
+            candidates = element.getElementsByTagName("*");
+
+            qq.each(candidates, function(idx, val) {
+                if (qq(val).hasClass(className)){
+                    result.push(val);
+                }
+            });
+            return result;
+        },
+
+        children: function() {
+            var children = [],
+                child = element.firstChild;
+
+            while (child){
+                if (child.nodeType === 1){
+                    children.push(child);
+                }
+                child = child.nextSibling;
+            }
+
+            return children;
+        },
+
+        setText: function(text) {
+            element.innerText = text;
+            element.textContent = text;
+            return this;
+        },
+
+        clearText: function() {
+            return qq(element).setText("");
+        },
+
+        // Returns true if the attribute exists on the element
+        // AND the value of the attribute is NOT "false" (case-insensitive)
+        hasAttribute: function(attrName) {
+            var attrVal;
+
+            if (element.hasAttribute) {
+
+                if (!element.hasAttribute(attrName)) {
+                    return false;
+                }
+
+                /*jshint -W116*/
+                return (/^false$/i).exec(element.getAttribute(attrName)) == null;
+            }
+            else {
+                attrVal = element[attrName];
+
+                if (attrVal === undefined) {
+                    return false;
+                }
+
+                /*jshint -W116*/
+                return (/^false$/i).exec(attrVal) == null;
+            }
+        }
+    };
+};
+
+(function(){
+    "use strict";
+
+    qq.log = function(message, level) {
+        if (window.console) {
+            if (!level || level === "info") {
+                window.console.log(message);
+            }
+            else
+            {
+                if (window.console[level]) {
+                    window.console[level](message);
+                }
+                else {
+                    window.console.log("<" + level + "> " + message);
+                }
+            }
+        }
+    };
+
+    qq.isObject = function(variable) {
+        return variable && !variable.nodeType && Object.prototype.toString.call(variable) === "[object Object]";
+    };
+
+    qq.isFunction = function(variable) {
+        return typeof(variable) === "function";
+    };
+
+    /**
+     * Check the type of a value.  Is it an "array"?
+     *
+     * @param value value to test.
+     * @returns true if the value is an array or associated with an `ArrayBuffer`
+     */
+    qq.isArray = function(value) {
+        return Object.prototype.toString.call(value) === "[object Array]" ||
+            (value && window.ArrayBuffer && value.buffer && value.buffer.constructor === ArrayBuffer);
+    };
+
+    // Looks for an object on a `DataTransfer` object that is associated with drop events when utilizing the Filesystem API.
+    qq.isItemList = function(maybeItemList) {
+        return Object.prototype.toString.call(maybeItemList) === "[object DataTransferItemList]";
+    };
+
+    // Looks for an object on a `NodeList` or an `HTMLCollection`|`HTMLFormElement`|`HTMLSelectElement`
+    // object that is associated with collections of Nodes.
+    qq.isNodeList = function(maybeNodeList) {
+        return Object.prototype.toString.call(maybeNodeList) === "[object NodeList]" ||
+            // If `HTMLCollection` is the actual type of the object, we must determine this
+            // by checking for expected properties/methods on the object
+            (maybeNodeList.item && maybeNodeList.namedItem);
+    };
+
+    qq.isString = function(maybeString) {
+        return Object.prototype.toString.call(maybeString) === "[object String]";
+    };
+
+    qq.trimStr = function(string) {
+        if (String.prototype.trim) {
+            return string.trim();
+        }
+
+        return string.replace(/^\s+|\s+$/g,"");
+    };
+
+
+    /**
+     * @param str String to format.
+     * @returns {string} A string, swapping argument values with the associated occurrence of {} in the passed string.
+     */
+    qq.format = function(str) {
+
+        var args =  Array.prototype.slice.call(arguments, 1),
+            newStr = str,
+            nextIdxToReplace = newStr.indexOf("{}");
+
+        qq.each(args, function(idx, val) {
+            var strBefore = newStr.substring(0, nextIdxToReplace),
+                strAfter = newStr.substring(nextIdxToReplace+2);
+
+            newStr = strBefore + val + strAfter;
+            nextIdxToReplace = newStr.indexOf("{}", nextIdxToReplace + val.length);
+
+            // End the loop if we have run out of tokens (when the arguments exceed the # of tokens)
+            if (nextIdxToReplace < 0) {
+                return false;
+            }
+        });
+
+        return newStr;
+    };
+
+    qq.isFile = function(maybeFile) {
+        return window.File && Object.prototype.toString.call(maybeFile) === "[object File]";
+    };
+
+    qq.isFileList = function(maybeFileList) {
+        return window.FileList && Object.prototype.toString.call(maybeFileList) === "[object FileList]";
+    };
+
+    qq.isFileOrInput = function(maybeFileOrInput) {
+        return qq.isFile(maybeFileOrInput) || qq.isInput(maybeFileOrInput);
+    };
+
+    qq.isInput = function(maybeInput) {
+        if (window.HTMLInputElement) {
+            if (Object.prototype.toString.call(maybeInput) === "[object HTMLInputElement]") {
+                if (maybeInput.type && maybeInput.type.toLowerCase() === "file") {
+                    return true;
+                }
+            }
+        }
+        if (maybeInput.tagName) {
+            if (maybeInput.tagName.toLowerCase() === "input") {
+                if (maybeInput.type && maybeInput.type.toLowerCase() === "file") {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    };
+
+    qq.isBlob = function(maybeBlob) {
+        return window.Blob && Object.prototype.toString.call(maybeBlob) === "[object Blob]";
+    };
+
+    qq.isXhrUploadSupported = function() {
+        var input = document.createElement("input");
+        input.type = "file";
+
+        return (
+            input.multiple !== undefined &&
+                typeof File !== "undefined" &&
+                typeof FormData !== "undefined" &&
+                typeof (qq.createXhrInstance()).upload !== "undefined" );
+    };
+
+    // Fall back to ActiveX is native XHR is disabled (possible in any version of IE).
+    qq.createXhrInstance = function() {
+        if (window.XMLHttpRequest) {
+            return new XMLHttpRequest();
+        }
+
+        try {
+            return new ActiveXObject("MSXML2.XMLHTTP.3.0");
+        }
+        catch(error) {
+            qq.log("Neither XHR or ActiveX are supported!", "error");
+            return null;
+        }
+    };
+
+    qq.isFolderDropSupported = function(dataTransfer) {
+        return (dataTransfer.items && dataTransfer.items[0].webkitGetAsEntry);
+    };
+
+    qq.isFileChunkingSupported = function() {
+        return !qq.android() && //android's impl of Blob.slice is broken
+            qq.isXhrUploadSupported() &&
+            (File.prototype.slice !== undefined || File.prototype.webkitSlice !== undefined || File.prototype.mozSlice !== undefined);
+    };
+
+    qq.sliceBlob = function(fileOrBlob, start, end) {
+        var slicer = fileOrBlob.slice || fileOrBlob.mozSlice || fileOrBlob.webkitSlice;
+
+        return slicer.call(fileOrBlob, start, end);
+    };
+
+    qq.arrayBufferToHex = function(buffer) {
+        var bytesAsHex = "",
+            bytes = new Uint8Array(buffer);
+
+
+        qq.each(bytes, function(idx, byte) {
+            var byteAsHexStr = byte.toString(16);
+
+            if (byteAsHexStr.length < 2) {
+                byteAsHexStr = "0" + byteAsHexStr;
+            }
+
+            bytesAsHex += byteAsHexStr;
+        });
+
+        return bytesAsHex;
+    };
+
+    qq.readBlobToHex = function(blob, startOffset, length) {
+        var initialBlob = qq.sliceBlob(blob, startOffset, startOffset + length),
+            fileReader = new FileReader(),
+            promise = new qq.Promise();
+
+        fileReader.onload = function() {
+            promise.success(qq.arrayBufferToHex(fileReader.result));
+        };
+
+        fileReader.readAsArrayBuffer(initialBlob);
+
+        return promise;
+    };
+
+    qq.extend = function(first, second, extendNested) {
+        qq.each(second, function(prop, val) {
+            if (extendNested && qq.isObject(val)) {
+                if (first[prop] === undefined) {
+                    first[prop] = {};
+                }
+                qq.extend(first[prop], val, true);
+            }
+            else {
+                first[prop] = val;
+            }
+        });
+
+        return first;
+    };
+
+    /**
+     * Allow properties in one object to override properties in another,
+     * keeping track of the original values from the target object.
+     *
+     * Note that the pre-overriden properties to be overriden by the source will be passed into the `sourceFn` when it is invoked.
+     *
+     * @param target Update properties in this object from some source
+     * @param sourceFn A function that, when invoked, will return properties that will replace properties with the same name in the target.
+     * @returns {object} The target object
+     */
+    qq.override = function(target, sourceFn) {
+        var super_ = {},
+            source = sourceFn(super_);
+
+        qq.each(source, function(srcPropName, srcPropVal) {
+            if (target[srcPropName] !== undefined) {
+                super_[srcPropName] = target[srcPropName];
+            }
+
+            target[srcPropName] = srcPropVal;
+        });
+
+        return target;
+    };
+
+    /**
+     * Searches for a given element in the array, returns -1 if it is not present.
+     * @param {Number} [from] The index at which to begin the search
+     */
+    qq.indexOf = function(arr, elt, from){
+        if (arr.indexOf) {
+            return arr.indexOf(elt, from);
+        }
+
+        from = from || 0;
+        var len = arr.length;
+
+        if (from < 0) {
+            from += len;
+        }
+
+        for (; from < len; from+=1){
+            if (arr.hasOwnProperty(from) && arr[from] === elt){
+                return from;
+            }
+        }
+        return -1;
+    };
+
+    //this is a version 4 UUID
+    qq.getUniqueId = function(){
+        return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
+            /*jslint eqeq: true, bitwise: true*/
+            var r = Math.random()*16|0, v = c == "x" ? r : (r&0x3|0x8);
+            return v.toString(16);
+        });
+    };
+
+    //
+    // Browsers and platforms detection
+
+    qq.ie       = function(){
+        return navigator.userAgent.indexOf("MSIE") !== -1;
+    };
+    qq.ie7      = function(){
+        return navigator.userAgent.indexOf("MSIE 7") !== -1;
+    };
+    qq.ie10     = function(){
+        return navigator.userAgent.indexOf("MSIE 10") !== -1;
+    };
+    qq.ie11     = function(){
+        return (navigator.userAgent.indexOf("Trident") !== -1 &&
+            navigator.userAgent.indexOf("rv:11") !== -1);
+    };
+    qq.safari   = function(){
+        return navigator.vendor !== undefined && navigator.vendor.indexOf("Apple") !== -1;
+    };
+    qq.chrome   = function(){
+        return navigator.vendor !== undefined && navigator.vendor.indexOf("Google") !== -1;
+    };
+    qq.opera   = function(){
+        return navigator.vendor !== undefined && navigator.vendor.indexOf("Opera") !== -1;
+    };
+    qq.firefox  = function(){
+        return (!qq.ie11() && navigator.userAgent.indexOf("Mozilla") !== -1 && navigator.vendor !== undefined && navigator.vendor === "");
+    };
+    qq.windows  = function(){
+        return navigator.platform === "Win32";
+    };
+    qq.android = function(){
+        return navigator.userAgent.toLowerCase().indexOf("android") !== -1;
+    };
+    qq.ios7 = function() {
+        return qq.ios() && navigator.userAgent.indexOf(" OS 7_") !== -1;
+    };
+    qq.ios = function() {
+        /*jshint -W014 */
+        return navigator.userAgent.indexOf("iPad") !== -1
+            || navigator.userAgent.indexOf("iPod") !== -1
+            || navigator.userAgent.indexOf("iPhone") !== -1;
+    };
+
+    //
+    // Events
+
+    qq.preventDefault = function(e){
+        if (e.preventDefault){
+            e.preventDefault();
+        } else{
+            e.returnValue = false;
+        }
+    };
+
+    /**
+     * Creates and returns element from html string
+     * Uses innerHTML to create an element
+     */
+    qq.toElement = (function(){
+        var div = document.createElement("div");
+        return function(html){
+            div.innerHTML = html;
+            var element = div.firstChild;
+            div.removeChild(element);
+            return element;
+        };
+    }());
+
+    //key and value are passed to callback for each entry in the iterable item
+    qq.each = function(iterableItem, callback) {
+        var keyOrIndex, retVal;
+
+        if (iterableItem) {
+            // Iterate through [`Storage`](http://www.w3.org/TR/webstorage/#the-storage-interface) items
+            if (window.Storage && iterableItem.constructor === window.Storage) {
+                for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {
+                    retVal = callback(iterableItem.key(keyOrIndex), iterableItem.getItem(iterableItem.key(keyOrIndex)));
+                    if (retVal === false) {
+                        break;
+                    }
+                }
+            }
+            // `DataTransferItemList` & `NodeList` objects are array-like and should be treated as arrays
+            // when iterating over items inside the object.
+            else if (qq.isArray(iterableItem) || qq.isItemList(iterableItem) || qq.isNodeList(iterableItem)) {
+                for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {
+                    retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);
+                    if (retVal === false) {
+                        break;
+                    }
+                }
+            }
+            else if (qq.isString(iterableItem)) {
+                for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {
+                    retVal = callback(keyOrIndex, iterableItem.charAt(keyOrIndex));
+                    if (retVal === false) {
+                        break;
+                    }
+                }
+            }
+            else {
+                for (keyOrIndex in iterableItem) {
+                    if (Object.prototype.hasOwnProperty.call(iterableItem, keyOrIndex)) {
+                        retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);
+                        if (retVal === false) {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    };
+
+    //include any args that should be passed to the new function after the context arg
+    qq.bind = function(oldFunc, context) {
+        if (qq.isFunction(oldFunc)) {
+            var args =  Array.prototype.slice.call(arguments, 2);
+
+            return function() {
+                var newArgs = qq.extend([], args);
+                if (arguments.length) {
+                    newArgs = newArgs.concat(Array.prototype.slice.call(arguments));
+                }
+                return oldFunc.apply(context, newArgs);
+            };
+        }
+
+        throw new Error("first parameter must be a function!");
+    };
+
+    /**
+     * obj2url() takes a json-object as argument and generates
+     * a querystring. pretty much like jQuery.param()
+     *
+     * how to use:
+     *
+     *    `qq.obj2url({a:'b',c:'d'},'http://any.url/upload?otherParam=value');`
+     *
+     * will result in:
+     *
+     *    `http://any.url/upload?otherParam=value&a=b&c=d`
+     *
+     * @param  Object JSON-Object
+     * @param  String current querystring-part
+     * @return String encoded querystring
+     */
+    qq.obj2url = function(obj, temp, prefixDone){
+        /*jshint laxbreak: true*/
+        var uristrings = [],
+            prefix = "&",
+            add = function(nextObj, i){
+                var nextTemp = temp
+                    ? (/\[\]$/.test(temp)) // prevent double-encoding
+                    ? temp
+                    : temp+"["+i+"]"
+                    : i;
+                if ((nextTemp !== "undefined") && (i !== "undefined")) {
+                    uristrings.push(
+                        (typeof nextObj === "object")
+                            ? qq.obj2url(nextObj, nextTemp, true)
+                            : (Object.prototype.toString.call(nextObj) === "[object Function]")
+                            ? encodeURIComponent(nextTemp) + "=" + encodeURIComponent(nextObj())
+                            : encodeURIComponent(nextTemp) + "=" + encodeURIComponent(nextObj)
+                    );
+                }
+            };
+
+        if (!prefixDone && temp) {
+            prefix = (/\?/.test(temp)) ? (/\?$/.test(temp)) ? "" : "&" : "?";
+            uristrings.push(temp);
+            uristrings.push(qq.obj2url(obj));
+        } else if ((Object.prototype.toString.call(obj) === "[object Array]") && (typeof obj !== "undefined") ) {
+            qq.each(obj, function(idx, val) {
+                add(val, idx);
+            });
+        } else if ((typeof obj !== "undefined") && (obj !== null) && (typeof obj === "object")){
+            qq.each(obj, function(prop, val) {
+                add(val, prop);
+            });
+        } else {
+            uristrings.push(encodeURIComponent(temp) + "=" + encodeURIComponent(obj));
+        }
+
+        if (temp) {
+            return uristrings.join(prefix);
+        } else {
+            return uristrings.join(prefix)
+                .replace(/^&/, "")
+                .replace(/%20/g, "+");
+        }
+    };
+
+    qq.obj2FormData = function(obj, formData, arrayKeyName) {
+        if (!formData) {
+            formData = new FormData();
+        }
+
+        qq.each(obj, function(key, val) {
+            key = arrayKeyName ? arrayKeyName + "[" + key + "]" : key;
+
+            if (qq.isObject(val)) {
+                qq.obj2FormData(val, formData, key);
+            }
+            else if (qq.isFunction(val)) {
+                formData.append(key, val());
+            }
+            else {
+                formData.append(key, val);
+            }
+        });
+
+        return formData;
+    };
+
+    qq.obj2Inputs = function(obj, form) {
+        var input;
+
+        if (!form) {
+            form = document.createElement("form");
+        }
+
+        qq.obj2FormData(obj, {
+            append: function(key, val) {
+                input = document.createElement("input");
+                input.setAttribute("name", key);
+                input.setAttribute("value", val);
+                form.appendChild(input);
+            }
+        });
+
+        return form;
+    };
+
+    qq.setCookie = function(name, value, days) {
+        var date = new Date(),
+            expires = "";
+
+        if (days) {
+            date.setTime(date.getTime()+(days*24*60*60*1000));
+            expires = "; expires="+date.toGMTString();
+        }
+
+        document.cookie = name+"="+value+expires+"; path=/";
+    };
+
+    qq.getCookie = function(name) {
+        var nameEQ = name + "=",
+            ca = document.cookie.split(";"),
+            cookie;
+
+        qq.each(ca, function(idx, part) {
+            /*jshint -W116 */
+            var cookiePart = part;
+            while (cookiePart.charAt(0) == " ") {
+                cookiePart = cookiePart.substring(1, cookiePart.length);
+            }
+
+            if (cookiePart.indexOf(nameEQ) === 0) {
+                cookie = cookiePart.substring(nameEQ.length, cookiePart.length);
+                return false;
+            }
+        });
+
+        return cookie;
+    };
+
+    qq.getCookieNames = function(regexp) {
+        var cookies = document.cookie.split(";"),
+            cookieNames = [];
+
+        qq.each(cookies, function(idx, cookie) {
+            cookie = qq.trimStr(cookie);
+
+            var equalsIdx = cookie.indexOf("=");
+
+            if (cookie.match(regexp)) {
+                cookieNames.push(cookie.substr(0, equalsIdx));
+            }
+        });
+
+        return cookieNames;
+    };
+
+    qq.deleteCookie = function(name) {
+        qq.setCookie(name, "", -1);
+    };
+
+    qq.areCookiesEnabled = function() {
+        var randNum = Math.random() * 100000,
+            name = "qqCookieTest:" + randNum;
+        qq.setCookie(name, 1);
+
+        if (qq.getCookie(name)) {
+            qq.deleteCookie(name);
+            return true;
+        }
+        return false;
+    };
+
+    /**
+     * Not recommended for use outside of Fine Uploader since this falls back to an unchecked eval if JSON.parse is not
+     * implemented.  For a more secure JSON.parse polyfill, use Douglas Crockford's json2.js.
+     */
+    qq.parseJson = function(json) {
+        /*jshint evil: true*/
+        if (window.JSON && qq.isFunction(JSON.parse)) {
+            return JSON.parse(json);
+        } else {
+            return eval("(" + json + ")");
+        }
+    };
+
+    /**
+     * Retrieve the extension of a file, if it exists.
+     *
+     * @param filename
+     * @returns {string || undefined}
+     */
+    qq.getExtension = function(filename) {
+        var extIdx = filename.lastIndexOf(".") + 1;
+
+        if (extIdx > 0) {
+            return filename.substr(extIdx, filename.length - extIdx);
+        }
+    };
+
+    qq.getFilename = function(blobOrFileInput) {
+        /*jslint regexp: true*/
+
+        if (qq.isInput(blobOrFileInput)) {
+            // get input value and remove path to normalize
+            return blobOrFileInput.value.replace(/.*(\/|\\)/, "");
+        }
+        else if (qq.isFile(blobOrFileInput)) {
+            if (blobOrFileInput.fileName !== null && blobOrFileInput.fileName !== undefined) {
+                return blobOrFileInput.fileName;
+            }
+        }
+
+        return blobOrFileInput.name;
+    };
+
+    /**
+     * A generic module which supports object disposing in dispose() method.
+     * */
+    qq.DisposeSupport = function() {
+        var disposers = [];
+
+        return {
+            /** Run all registered disposers */
+            dispose: function() {
+                var disposer;
+                do {
+                    disposer = disposers.shift();
+                    if (disposer) {
+                        disposer();
+                    }
+                }
+                while (disposer);
+            },
+
+            /** Attach event handler and register de-attacher as a disposer */
+            attach: function() {
+                var args = arguments;
+                /*jslint undef:true*/
+                this.addDisposer(qq(args[0]).attach.apply(this, Array.prototype.slice.call(arguments, 1)));
+            },
+
+            /** Add disposer to the collection */
+            addDisposer: function(disposeFunction) {
+                disposers.push(disposeFunction);
+            }
+        };
+    };
+}());
+
+/* globals qq */
+/**
+ * Fine Uploader top-level Error container.  Inherits from `Error`.
+ */
+(function() {
+    "use strict";
+
+    qq.Error = function(message) {
+        this.message = message;
+    };
+
+    qq.Error.prototype = new Error();
+}());
+
+/*global qq */
+qq.version="4.2.1";
+
+/* globals qq */
+qq.supportedFeatures = (function () {
+    "use strict";
+
+    var supportsUploading,
+        supportsAjaxFileUploading,
+        supportsFolderDrop,
+        supportsChunking,
+        supportsResume,
+        supportsUploadViaPaste,
+        supportsUploadCors,
+        supportsDeleteFileXdr,
+        supportsDeleteFileCorsXhr,
+        supportsDeleteFileCors,
+        supportsFolderSelection,
+        supportsImagePreviews;
+
+
+    function testSupportsFileInputElement() {
+        var supported = true,
+            tempInput;
+
+        try {
+            tempInput = document.createElement("input");
+            tempInput.type = "file";
+            qq(tempInput).hide();
+
+            if (tempInput.disabled) {
+                supported = false;
+            }
+        }
+        catch (ex) {
+            supported = false;
+        }
+
+        return supported;
+    }
+
+    //only way to test for Filesystem API support since webkit does not expose the DataTransfer interface
+    function isChrome21OrHigher() {
+        return (qq.chrome() || qq.opera()) &&
+            navigator.userAgent.match(/Chrome\/[2][1-9]|Chrome\/[3-9][0-9]/) !== undefined;
+    }
+
+    //only way to test for complete Clipboard API support at this time
+    function isChrome14OrHigher() {
+        return (qq.chrome() || qq.opera()) &&
+            navigator.userAgent.match(/Chrome\/[1][4-9]|Chrome\/[2-9][0-9]/) !== undefined;
+    }
+
+    //Ensure we can send cross-origin `XMLHttpRequest`s
+    function isCrossOriginXhrSupported() {
+        if (window.XMLHttpRequest) {
+            var xhr = qq.createXhrInstance();
+
+            //Commonly accepted test for XHR CORS support.
+            return xhr.withCredentials !== undefined;
+        }
+
+        return false;
+    }
+
+    //Test for (terrible) cross-origin ajax transport fallback for IE9 and IE8
+    function isXdrSupported() {
+        return window.XDomainRequest !== undefined;
+    }
+
+    // CORS Ajax requests are supported if it is either possible to send credentialed `XMLHttpRequest`s,
+    // or if `XDomainRequest` is an available alternative.
+    function isCrossOriginAjaxSupported() {
+        if (isCrossOriginXhrSupported()) {
+            return true;
+        }
+
+        return isXdrSupported();
+    }
+
+    function isFolderSelectionSupported() {
+        // We know that folder selection is only supported in Chrome via this proprietary attribute for now
+        return document.createElement("input").webkitdirectory !== undefined;
+    }
+
+
+    supportsUploading = testSupportsFileInputElement();
+
+    supportsAjaxFileUploading = supportsUploading && qq.isXhrUploadSupported();
+
+    supportsFolderDrop = supportsAjaxFileUploading && isChrome21OrHigher();
+
+    supportsChunking = supportsAjaxFileUploading && qq.isFileChunkingSupported();
+
+    supportsResume = supportsAjaxFileUploading && supportsChunking && qq.areCookiesEnabled();
+
+    supportsUploadViaPaste = supportsAjaxFileUploading && isChrome14OrHigher();
+
+    supportsUploadCors = supportsUploading && (window.postMessage !== undefined || supportsAjaxFileUploading);
+
+    supportsDeleteFileCorsXhr = isCrossOriginXhrSupported();
+
+    supportsDeleteFileXdr = isXdrSupported();
+
+    supportsDeleteFileCors = isCrossOriginAjaxSupported();
+
+    supportsFolderSelection = isFolderSelectionSupported();
+
+    supportsImagePreviews = supportsAjaxFileUploading && window.FileReader !== undefined;
+
+
+    return {
+        uploading: supportsUploading,
+        ajaxUploading: supportsAjaxFileUploading,
+        fileDrop: supportsAjaxFileUploading, //NOTE: will also return true for touch-only devices.  It's not currently possible to accurately test for touch-only devices
+        folderDrop: supportsFolderDrop,
+        chunking: supportsChunking,
+        resume: supportsResume,
+        uploadCustomHeaders: supportsAjaxFileUploading,
+        uploadNonMultipart: supportsAjaxFileUploading,
+        itemSizeValidation: supportsAjaxFileUploading,
+        uploadViaPaste: supportsUploadViaPaste,
+        progressBar: supportsAjaxFileUploading,
+        uploadCors: supportsUploadCors,
+        deleteFileCorsXhr: supportsDeleteFileCorsXhr,
+        deleteFileCorsXdr: supportsDeleteFileXdr, //NOTE: will also return true in IE10, where XDR is also supported
+        deleteFileCors: supportsDeleteFileCors,
+        canDetermineSize: supportsAjaxFileUploading,
+        folderSelection: supportsFolderSelection,
+        imagePreviews: supportsImagePreviews,
+        imageValidation: supportsImagePreviews,
+        pause: supportsChunking
+    };
+
+}());
+
+/*globals qq*/
+qq.Promise = function() {
+    "use strict";
+
+    var successArgs, failureArgs,
+        successCallbacks = [],
+        failureCallbacks = [],
+        doneCallbacks = [],
+        state = 0;
+
+    qq.extend(this, {
+        then: function(onSuccess, onFailure) {
+            if (state === 0) {
+                if (onSuccess) {
+                    successCallbacks.push(onSuccess);
+                }
+                if (onFailure) {
+                    failureCallbacks.push(onFailure);
+                }
+            }
+            else if (state === -1) {
+                onFailure && onFailure.apply(null, failureArgs);
+            }
+            else if (onSuccess) {
+                onSuccess.apply(null,successArgs);
+            }
+
+            return this;
+        },
+
+        done: function(callback) {
+            if (state === 0) {
+                doneCallbacks.push(callback);
+            }
+            else {
+                callback.apply(null, failureArgs === undefined ? successArgs : failureArgs);
+            }
+
+            return this;
+        },
+
+        success: function() {
+            state = 1;
+            successArgs = arguments;
+
+            if (successCallbacks.length) {
+                qq.each(successCallbacks, function(idx, callback) {
+                    callback.apply(null, successArgs);
+                });
+            }
+
+            if(doneCallbacks.length) {
+                qq.each(doneCallbacks, function(idx, callback) {
+                    callback.apply(null, successArgs);
+                });
+            }
+
+            return this;
+        },
+
+        failure: function() {
+            state = -1;
+            failureArgs = arguments;
+
+            if (failureCallbacks.length) {
+                qq.each(failureCallbacks, function(idx, callback) {
+                    callback.apply(null, failureArgs);
+                });
+            }
+
+            if(doneCallbacks.length) {
+                qq.each(doneCallbacks, function(idx, callback) {
+                    callback.apply(null, failureArgs);
+                });
+            }
+
+            return this;
+        }
+    });
+};
+
+/*globals qq*/
+
+/**
+ * This module represents an upload or "Select File(s)" button.  It's job is to embed an opaque `<input type="file">`
+ * element as a child of a provided "container" element.  This "container" element (`options.element`) is used to provide
+ * a custom style for the `<input type="file">` element.  The ability to change the style of the container element is also
+ * provided here by adding CSS classes to the container on hover/focus.
+ *
+ * TODO Eliminate the mouseover and mouseout event handlers since the :hover CSS pseudo-class should now be
+ * available on all supported browsers.
+ *
+ * @param o Options to override the default values
+ */
+qq.UploadButton = function(o) {
+    "use strict";
+
+
+    var disposeSupport = new qq.DisposeSupport(),
+
+        options = {
+            // "Container" element
+            element: null,
+
+            // If true adds `multiple` attribute to `<input type="file">`
+            multiple: false,
+
+            // Corresponds to the `accept` attribute on the associated `<input type="file">`
+            acceptFiles: null,
+
+            // A true value allows folders to be selected, if supported by the UA
+            folders: false,
+
+            // `name` attribute of `<input type="file">`
+            name: "qqfile",
+
+            // Called when the browser invokes the onchange handler on the `<input type="file">`
+            onChange: function(input) {},
+
+            // **This option will be removed** in the future as the :hover CSS pseudo-class is available on all supported browsers
+            hoverClass: "qq-upload-button-hover",
+
+            focusClass: "qq-upload-button-focus"
+        },
+        input, buttonId;
+
+    // Overrides any of the default option values with any option values passed in during construction.
+    qq.extend(options, o);
+
+    buttonId = qq.getUniqueId();
+
+    // Embed an opaque `<input type="file">` element as a child of `options.element`.
+    function createInput() {
+        var input = document.createElement("input");
+
+        input.setAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME, buttonId);
+
+        if (options.multiple) {
+            input.setAttribute("multiple", "");
+        }
+
+        if (options.folders && qq.supportedFeatures.folderSelection) {
+            // selecting directories is only possible in Chrome now, via a vendor-specific prefixed attribute
+            input.setAttribute("webkitdirectory", "");
+        }
+
+        if (options.acceptFiles) {
+            input.setAttribute("accept", options.acceptFiles);
+        }
+
+        input.setAttribute("type", "file");
+        input.setAttribute("name", options.name);
+
+        qq(input).css({
+            position: "absolute",
+            // in Opera only 'browse' button
+            // is clickable and it is located at
+            // the right side of the input
+            right: 0,
+            top: 0,
+            fontFamily: "Arial",
+            // 4 persons reported this, the max values that worked for them were 243, 236, 236, 118
+            fontSize: "118px",
+            margin: 0,
+            padding: 0,
+            cursor: "pointer",
+            opacity: 0
+        });
+
+        options.element.appendChild(input);
+
+        disposeSupport.attach(input, "change", function(){
+            options.onChange(input);
+        });
+
+        // **These event handlers will be removed** in the future as the :hover CSS pseudo-class is available on all supported browsers
+        disposeSupport.attach(input, "mouseover", function(){
+            qq(options.element).addClass(options.hoverClass);
+        });
+        disposeSupport.attach(input, "mouseout", function(){
+            qq(options.element).removeClass(options.hoverClass);
+        });
+
+        disposeSupport.attach(input, "focus", function(){
+            qq(options.element).addClass(options.focusClass);
+        });
+        disposeSupport.attach(input, "blur", function(){
+            qq(options.element).removeClass(options.focusClass);
+        });
+
+        // IE and Opera, unfortunately have 2 tab stops on file input
+        // which is unacceptable in our case, disable keyboard access
+        if (window.attachEvent) {
+            // it is IE or Opera
+            input.setAttribute("tabIndex", "-1");
+        }
+
+        return input;
+    }
+
+    // Make button suitable container for input
+    qq(options.element).css({
+        position: "relative",
+        overflow: "hidden",
+        // Make sure browse button is in the right side in Internet Explorer
+        direction: "ltr"
+    });
+
+    input = createInput();
+
+
+    // Exposed API
+    qq.extend(this, {
+        getInput: function() {
+            return input;
+        },
+
+        getButtonId: function() {
+            return buttonId;
+        },
+
+        setMultiple: function(isMultiple) {
+            if (isMultiple !== options.multiple) {
+                if (isMultiple) {
+                    input.setAttribute("multiple", "");
+                }
+                else {
+                    input.removeAttribute("multiple");
+                }
+            }
+        },
+
+        setAcceptFiles: function(acceptFiles) {
+            if (acceptFiles !== options.acceptFiles) {
+                input.setAttribute("accept", acceptFiles);
+            }
+        },
+
+        reset: function(){
+            if (input.parentNode){
+                qq(input).remove();
+            }
+
+            qq(options.element).removeClass(options.focusClass);
+            input = createInput();
+        }
+    });
+};
+
+qq.UploadButton.BUTTON_ID_ATTR_NAME = "qq-button-id";
+
+/*globals qq */
+qq.UploadData = function(uploaderProxy) {
+    "use strict";
+
+    var data = [],
+        byUuid = {},
+        byStatus = {};
+
+
+    function getDataByIds(idOrIds) {
+        if (qq.isArray(idOrIds)) {
+            var entries = [];
+
+            qq.each(idOrIds, function(idx, id) {
+                entries.push(data[id]);
+            });
+
+            return entries;
+        }
+
+        return data[idOrIds];
+    }
+
+    function getDataByUuids(uuids) {
+        if (qq.isArray(uuids)) {
+            var entries = [];
+
+            qq.each(uuids, function(idx, uuid) {
+                entries.push(data[byUuid[uuid]]);
+            });
+
+            return entries;
+        }
+
+        return data[byUuid[uuids]];
+    }
+
+    function getDataByStatus(status) {
+        var statusResults = [],
+            statuses = [].concat(status);
+
+        qq.each(statuses, function(index, statusEnum) {
+            var statusResultIndexes = byStatus[statusEnum];
+
+            if (statusResultIndexes !== undefined) {
+                qq.each(statusResultIndexes, function(i, dataIndex) {
+                    statusResults.push(data[dataIndex]);
+                });
+            }
+        });
+
+        return statusResults;
+    }
+
+    qq.extend(this, {
+        /**
+         * Adds a new file to the data cache for tracking purposes.
+         *
+         * @param uuid Initial UUID for this file.
+         * @param name Initial name of this file.
+         * @param size Size of this file, -1 if this cannot be determined
+         * @param status Initial `qq.status` for this file.  If null/undefined, `qq.status.SUBMITTING`.
+         * @returns {number} Internal ID for this file.
+         */
+        addFile: function(uuid, name, size, status) {
+            status = status || qq.status.SUBMITTING;
+
+            var id = data.push({
+                name: name,
+                originalName: name,
+                uuid: uuid,
+                size: size,
+                status: status
+            }) - 1;
+
+            data[id].id = id;
+            byUuid[uuid] = id;
+
+            if (byStatus[status] === undefined) {
+                byStatus[status] = [];
+            }
+            byStatus[status].push(id);
+
+            uploaderProxy.onStatusChange(id, null, status);
+
+            return id;
+        },
+
+        retrieve: function(optionalFilter) {
+            if (qq.isObject(optionalFilter) && data.length)  {
+                if (optionalFilter.id !== undefined) {
+                    return getDataByIds(optionalFilter.id);
+                }
+
+                else if (optionalFilter.uuid !== undefined) {
+                    return getDataByUuids(optionalFilter.uuid);
+                }
+
+                else if (optionalFilter.status) {
+                    return getDataByStatus(optionalFilter.status);
+                }
+            }
+            else {
+                return qq.extend([], data, true);
+            }
+        },
+
+        reset: function() {
+            data = [];
+            byUuid = {};
+            byStatus = {};
+        },
+
+        setStatus: function(id, newStatus) {
+            var oldStatus = data[id].status,
+                byStatusOldStatusIndex = qq.indexOf(byStatus[oldStatus], id);
+
+            byStatus[oldStatus].splice(byStatusOldStatusIndex, 1);
+
+            data[id].status = newStatus;
+
+            if (byStatus[newStatus] === undefined) {
+                byStatus[newStatus] = [];
+            }
+            byStatus[newStatus].push(id);
+
+            uploaderProxy.onStatusChange(id, oldStatus, newStatus);
+        },
+
+        uuidChanged: function(id, newUuid) {
+            var oldUuid = data[id].uuid;
+
+            data[id].uuid = newUuid;
+            byUuid[newUuid] = id;
+            delete byUuid[oldUuid];
+        },
+
+        updateName: function(id, newName) {
+            data[id].name = newName;
+        }
+    });
+};
+
+qq.status = {
+    SUBMITTING: "submitting",
+    SUBMITTED: "submitted",
+    REJECTED: "rejected",
+    QUEUED: "queued",
+    CANCELED: "canceled",
+    PAUSED: "paused",
+    UPLOADING: "uploading",
+    UPLOAD_RETRYING: "retrying upload",
+    UPLOAD_SUCCESSFUL: "upload successful",
+    UPLOAD_FAILED: "upload failed",
+    DELETE_FAILED: "delete failed",
+    DELETING: "deleting",
+    DELETED: "deleted"
+};
+
+/*globals qq*/
+/**
+ * Defines the public API for FineUploaderBasic mode.
+ */
+(function(){
+    "use strict";
+
+    qq.basePublicApi = {
+        log: function(str, level) {
+            if (this._options.debug && (!level || level === "info")) {
+                qq.log("[FineUploader " + qq.version + "] " + str);
+            }
+            else if (level && level !== "info") {
+                qq.log("[FineUploader " + qq.version + "] " + str, level);
+
+            }
+        },
+
+        setParams: function(params, id) {
+            /*jshint eqeqeq: true, eqnull: true*/
+            if (id == null) {
+                this._options.request.params = params;
+            }
+            else {
+                this._paramsStore.setParams(params, id);
+            }
+        },
+
+        setDeleteFileParams: function(params, id) {
+            /*jshint eqeqeq: true, eqnull: true*/
+            if (id == null) {
+                this._options.deleteFile.params = params;
+            }
+            else {
+                this._deleteFileParamsStore.setParams(params, id);
+            }
+        },
+
+        // Re-sets the default endpoint, an endpoint for a specific file, or an endpoint for a specific button
+        setEndpoint: function(endpoint, id) {
+            /*jshint eqeqeq: true, eqnull: true*/
+            if (id == null) {
+                this._options.request.endpoint = endpoint;
+            }
+            else {
+                this._endpointStore.setEndpoint(endpoint, id);
+            }
+        },
+
+        getInProgress: function() {
+            return this._uploadData.retrieve({
+                status: [
+                    qq.status.UPLOADING,
+                    qq.status.UPLOAD_RETRYING,
+                    qq.status.QUEUED
+                ]
+            }).length;
+        },
+
+        getNetUploads: function() {
+            return this._netUploaded;
+        },
+
+        uploadStoredFiles: function() {
+            var idToUpload;
+
+            if (this._storedIds.length === 0) {
+                this._itemError("noFilesError");
+            }
+            else {
+                while (this._storedIds.length) {
+                    idToUpload = this._storedIds.shift();
+                    this._handler.upload(idToUpload);
+                }
+            }
+        },
+
+        clearStoredFiles: function(){
+            this._storedIds = [];
+        },
+
+        retry: function(id) {
+            return this._manualRetry(id);
+        },
+
+        cancel: function(id) {
+            this._handler.cancel(id);
+        },
+
+        cancelAll: function() {
+            var storedIdsCopy = [],
+                self = this;
+
+            qq.extend(storedIdsCopy, this._storedIds);
+            qq.each(storedIdsCopy, function(idx, storedFileId) {
+                self.cancel(storedFileId);
+            });
+
+            this._handler.cancelAll();
+        },
+
+        reset: function() {
+            this.log("Resetting uploader...");
+
+            this._handler.reset();
+            this._storedIds = [];
+            this._autoRetries = [];
+            this._retryTimeouts = [];
+            this._preventRetries = [];
+            this._thumbnailUrls = [];
+
+            qq.each(this._buttons, function(idx, button) {
+                button.reset();
+            });
+
+            this._paramsStore.reset();
+            this._endpointStore.reset();
+            this._netUploadedOrQueued = 0;
+            this._netUploaded = 0;
+            this._uploadData.reset();
+            this._buttonIdsForFileIds = [];
+
+            this._pasteHandler && this._pasteHandler.reset();
+            this._options.session.refreshOnReset && this._refreshSessionData();
+        },
+
+        addFiles: function(filesOrInputs, params, endpoint) {
+            var verifiedFilesOrInputs = [],
+                fileOrInputIndex, fileOrInput, fileIndex;
+
+            if (filesOrInputs) {
+                if (!qq.isFileList(filesOrInputs)) {
+                    filesOrInputs = [].concat(filesOrInputs);
+                }
+
+                for (fileOrInputIndex = 0; fileOrInputIndex < filesOrInputs.length; fileOrInputIndex+=1) {
+                    fileOrInput = filesOrInputs[fileOrInputIndex];
+
+                    if (qq.isFileOrInput(fileOrInput)) {
+                        if (qq.isInput(fileOrInput) && qq.supportedFeatures.ajaxUploading) {
+                            for (fileIndex = 0; fileIndex < fileOrInput.files.length; fileIndex++) {
+                                this._handleNewFile(fileOrInput.files[fileIndex], verifiedFilesOrInputs);
+                            }
+                        }
+                        else {
+                            this._handleNewFile(fileOrInput, verifiedFilesOrInputs);
+                        }
+                    }
+                    else {
+                        this.log(fileOrInput + " is not a File or INPUT element!  Ignoring!", "warn");
+                    }
+                }
+
+                this.log("Received " + verifiedFilesOrInputs.length + " files or inputs.");
+                this._prepareItemsForUpload(verifiedFilesOrInputs, params, endpoint);
+            }
+        },
+
+        addBlobs: function(blobDataOrArray, params, endpoint) {
+            if (blobDataOrArray) {
+                var blobDataArray = [].concat(blobDataOrArray),
+                    verifiedBlobDataList = [],
+                    self = this;
+
+                qq.each(blobDataArray, function(idx, blobData) {
+                    var blobOrBlobData;
+
+                    if (qq.isBlob(blobData) && !qq.isFileOrInput(blobData)) {
+                        blobOrBlobData = {
+                            blob: blobData,
+                            name: self._options.blobs.defaultName
+                        };
+                    }
+                    else if (qq.isObject(blobData) && blobData.blob && blobData.name) {
+                        blobOrBlobData = blobData;
+                    }
+                    else {
+                        self.log("addBlobs: entry at index " + idx + " is not a Blob or a BlobData object", "error");
+                    }
+
+                    blobOrBlobData && self._handleNewFile(blobOrBlobData, verifiedBlobDataList);
+                });
+
+                this._prepareItemsForUpload(verifiedBlobDataList, params, endpoint);
+            }
+            else {
+                this.log("undefined or non-array parameter passed into addBlobs", "error");
+            }
+        },
+
+        getUuid: function(id) {
+            return this._uploadData.retrieve({id: id}).uuid;
+        },
+
+        setUuid: function(id, newUuid) {
+            return this._uploadData.uuidChanged(id, newUuid);
+        },
+
+        getResumableFilesData: function() {
+            return this._handler.getResumableFilesData();
+        },
+
+        getSize: function(id) {
+            return this._uploadData.retrieve({id: id}).size;
+        },
+
+        getName: function(id) {
+            return this._uploadData.retrieve({id: id}).name;
+        },
+
+        setName: function(id, newName) {
+            this._uploadData.updateName(id, newName);
+        },
+
+        getFile: function(fileOrBlobId) {
+            return this._handler.getFile(fileOrBlobId);
+        },
+
+        deleteFile: function(id) {
+            this._onSubmitDelete(id);
+        },
+
+        setDeleteFileEndpoint: function(endpoint, id) {
+            /*jshint eqeqeq: true, eqnull: true*/
+            if (id == null) {
+                this._options.deleteFile.endpoint = endpoint;
+            }
+            else {
+                this._deleteFileEndpointStore.setEndpoint(endpoint, id);
+            }
+        },
+
+        doesExist: function(fileOrBlobId) {
+            return this._handler.isValid(fileOrBlobId);
+        },
+
+        getUploads: function(optionalFilter) {
+            return this._uploadData.retrieve(optionalFilter);
+        },
+
+        getButton: function(fileId) {
+            return this._getButton(this._buttonIdsForFileIds[fileId]);
+        },
+
+        // Generate a variable size thumbnail on an img or canvas,
+        // returning a promise that is fulfilled when the attempt completes.
+        // Thumbnail can either be based off of a URL for an image returned
+        // by the server in the upload response, or the associated `Blob`.
+        drawThumbnail: function(fileId, imgOrCanvas, maxSize, fromServer) {
+            if (this._imageGenerator) {
+                var fileOrUrl = this._thumbnailUrls[fileId],
+                    options = {
+                        scale: maxSize > 0,
+                        maxSize: maxSize > 0 ? maxSize : null
+                    };
+
+                // If client-side preview generation is possible
+                // and we are not specifically looking for the image URl returned by the server...
+                if (!fromServer && qq.supportedFeatures.imagePreviews) {
+                    fileOrUrl = this.getFile(fileId);
+                }
+
+                /* jshint eqeqeq:false,eqnull:true */
+                if (fileOrUrl == null) {
+                    return new qq.Promise().failure(imgOrCanvas, "File or URL not found.");
+                }
+
+                return this._imageGenerator.generate(fileOrUrl, imgOrCanvas, options);
+            }
+        },
+
+        pauseUpload: function(id) {
+            var uploadData = this._uploadData.retrieve({id: id});
+
+            if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) {
+                return false;
+            }
+
+            // Pause only really makes sense if the file is uploading or retrying
+            if (qq.indexOf([qq.status.UPLOADING, qq.status.UPLOAD_RETRYING], uploadData.status) >= 0) {
+                if (this._handler.pause(id)) {
+                    this._uploadData.setStatus(id, qq.status.PAUSED);
+                    return true;
+                }
+                else {
+                    qq.log(qq.format("Unable to pause file ID {} ({}).", id, this.getName(id)), "error");
+                }
+            }
+            else {
+                qq.log(qq.format("Ignoring pause for file ID {} ({}).  Not in progress.", id, this.getName(id)), "error");
+            }
+
+            return false;
+        },
+
+        continueUpload: function(id) {
+            var uploadData = this._uploadData.retrieve({id: id});
+
+            if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) {
+                return false;
+            }
+
+            if (uploadData.status === qq.status.PAUSED) {
+                qq.log(qq.format("Paused file ID {} ({}) will be continued.  Not paused.", id, this.getName(id)));
+
+                if (!this._handler.upload(id)) {
+                    this._uploadData.setStatus(id, qq.status.QUEUED);
+                }
+                return true;
+            }
+            else {
+                qq.log(qq.format("Ignoring continue for file ID {} ({}).  Not paused.", id, this.getName(id)), "error");
+            }
+
+            return false;
+        },
+
+        getRemainingAllowedItems: function() {
+            var allowedItems = this._options.validation.itemLimit;
+
+            if (allowedItems > 0) {
+                return this._options.validation.itemLimit - this._netUploadedOrQueued;
+            }
+
+            return null;
+        }
+    };
+
+
+
+
+    /**
+     * Defines the private (internal) API for FineUploaderBasic mode.
+     */
+    qq.basePrivateApi = {
+        // Attempts to refresh session data only if the `qq.Session` module exists
+        // and a session endpoint has been specified.  The `onSessionRequestComplete`
+        // callback will be invoked once the refresh is complete.
+        _refreshSessionData: function() {
+            var self = this,
+                options = this._options.session;
+
+            /* jshint eqnull:true */
+            if (qq.Session && this._options.session.endpoint != null) {
+                if (!this._session) {
+                    qq.extend(options, this._options.cors);
+
+                    options.log = qq.bind(this.log, this);
+                    options.addFileRecord = qq.bind(this._addCannedFile, this);
+
+                    this._session = new qq.Session(options);
+                }
+
+                setTimeout(function() {
+                    self._session.refresh().then(function(response, xhrOrXdr) {
+
+                        self._options.callbacks.onSessionRequestComplete(response, true, xhrOrXdr);
+
+                    }, function(response, xhrOrXdr) {
+
+                        self._options.callbacks.onSessionRequestComplete(response, false, xhrOrXdr);
+                    });
+                }, 0);
+            }
+        },
+
+        // Updates internal state with a file record (not backed by a live file).  Returns the assigned ID.
+        _addCannedFile: function(sessionData) {
+            var id = this._uploadData.addFile(sessionData.uuid, sessionData.name, sessionData.size,
+                qq.status.UPLOAD_SUCCESSFUL);
+
+            sessionData.deleteFileEndpoint && this.setDeleteFileEndpoint(sessionData.deleteFileEndpoint, id);
+            sessionData.deleteFileParams && this.setDeleteFileParams(sessionData.deleteFileParams, id);
+
+            if (sessionData.thumbnailUrl) {
+                this._thumbnailUrls[id] = sessionData.thumbnailUrl;
+            }
+
+            this._netUploaded++;
+            this._netUploadedOrQueued++;
+
+            return id;
+        },
+
+        // Updates internal state when a new file has been received, and adds it along with its ID to a passed array.
+        _handleNewFile: function(file, newFileWrapperList) {
+            var size = -1,
+                uuid = qq.getUniqueId(),
+                name = qq.getFilename(file),
+                id;
+
+            if (file.size >= 0) {
+                size = file.size;
+            }
+            else if (file.blob) {
+                size = file.blob.size;
+            }
+
+            id = this._uploadData.addFile(uuid, name, size);
+            this._handler.add(id, file);
+
+            this._netUploadedOrQueued++;
+
+            newFileWrapperList.push({id: id, file: file});
+        },
+
+        // Creates an internal object that tracks various properties of each extra button,
+        // and then actually creates the extra button.
+        _generateExtraButtonSpecs: function() {
+            var self = this;
+
+            this._extraButtonSpecs = {};
+
+            qq.each(this._options.extraButtons, function(idx, extraButtonOptionEntry) {
+                var multiple = extraButtonOptionEntry.multiple,
+                    validation = qq.extend({}, self._options.validation, true),
+                    extraButtonSpec = qq.extend({}, extraButtonOptionEntry);
+
+                if (multiple === undefined) {
+                    multiple = self._options.multiple;
+                }
+
+                if (extraButtonSpec.validation) {
+                    qq.extend(validation, extraButtonOptionEntry.validation, true);
+                }
+
+                qq.extend(extraButtonSpec, {
+                    multiple: multiple,
+                    validation: validation
+                }, true);
+
+                self._initExtraButton(extraButtonSpec);
+            });
+        },
+
+        // Creates an extra button element
+        _initExtraButton: function(spec) {
+            var button = this._createUploadButton({
+                element: spec.element,
+                multiple: spec.multiple,
+                accept: spec.validation.acceptFiles,
+                folders: spec.folders,
+                allowedExtensions: spec.validation.allowedExtensions
+            });
+
+            this._extraButtonSpecs[button.getButtonId()] = spec;
+        },
+
+        /**
+         * Gets the internally used tracking ID for a button.
+         *
+         * @param buttonOrFileInputOrFile `File`, `<input type="file">`, or a button container element
+         * @returns {*} The button's ID, or undefined if no ID is recoverable
+         * @private
+         */
+        _getButtonId: function(buttonOrFileInputOrFile) {
+            var inputs, fileInput;
+
+            // If the item is a `Blob` it will never be associated with a button or drop zone.
+            if (buttonOrFileInputOrFile && !buttonOrFileInputOrFile.blob && !qq.isBlob(buttonOrFileInputOrFile)) {
+                if (qq.isFile(buttonOrFileInputOrFile)) {
+                    return buttonOrFileInputOrFile.qqButtonId;
+                }
+                else if (buttonOrFileInputOrFile.tagName.toLowerCase() === "input" &&
+                    buttonOrFileInputOrFile.type.toLowerCase() === "file") {
+
+                    return buttonOrFileInputOrFile.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME);
+                }
+
+                inputs = buttonOrFileInputOrFile.getElementsByTagName("input");
+
+                qq.each(inputs, function(idx, input) {
+                    if (input.getAttribute("type") === "file") {
+                        fileInput = input;
+                        return false;
+                    }
+                });
+
+                if (fileInput) {
+                    return fileInput.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME);
+                }
+            }
+        },
+
+        _annotateWithButtonId: function(file, associatedInput) {
+            if (qq.isFile(file)) {
+                file.qqButtonId = this._getButtonId(associatedInput);
+            }
+        },
+
+        _getButton: function(buttonId) {
+            var extraButtonsSpec = this._extraButtonSpecs[buttonId];
+
+            if (extraButtonsSpec) {
+                return extraButtonsSpec.element;
+            }
+            else if (buttonId === this._defaultButtonId) {
+                return this._options.button;
+            }
+        },
+
+        _handleCheckedCallback: function(details) {
+            var self = this,
+                callbackRetVal = details.callback();
+
+            if (callbackRetVal instanceof qq.Promise) {
+                this.log(details.name + " - waiting for " + details.name + " promise to be fulfilled for " + details.identifier);
+                return callbackRetVal.then(
+                    function(successParam) {
+                        self.log(details.name + " promise success for " + details.identifier);
+                        details.onSuccess(successParam);
+                    },
+                    function() {
+                        if (details.onFailure) {
+                            self.log(details.name + " promise failure for " + details.identifier);
+                            details.onFailure();
+                        }
+                        else {
+                            self.log(details.name + " promise failure for " + details.identifier);
+                        }
+                    });
+            }
+
+            if (callbackRetVal !== false) {
+                details.onSuccess(callbackRetVal);
+            }
+            else {
+                if (details.onFailure) {
+                    this.log(details.name + " - return value was 'false' for " + details.identifier + ".  Invoking failure callback.");
+                    details.onFailure();
+                }
+                else {
+                    this.log(details.name + " - return value was 'false' for " + details.identifier + ".  Will not proceed.");
+                }
+            }
+
+            return callbackRetVal;
+        },
+
+        /**
+         * Generate a tracked upload button.
+         *
+         * @param spec Object containing a required `element` property
+         * along with optional `multiple`, `accept`, and `folders`.
+         * @returns {qq.UploadButton}
+         * @private
+         */
+        _createUploadButton: function(spec) {
+            var self = this,
+                acceptFiles = spec.accept || this._options.validation.acceptFiles,
+                allowedExtensions = spec.allowedExtensions || this._options.validation.allowedExtensions;
+
+            function allowMultiple() {
+                if (qq.supportedFeatures.ajaxUploading) {
+                    // Workaround for bug in iOS7 (see #1039)
+                    if (qq.ios7() && self._isAllowedExtension(allowedExtensions, ".mov")) {
+                        return false;
+                    }
+
+                    if (spec.multiple === undefined) {
+                        return self._options.multiple;
+                    }
+
+                    return spec.multiple;
+                }
+
+                return false;
+            }
+
+            var button = new qq.UploadButton({
+                element: spec.element,
+                folders: spec.folders,
+                name: this._options.request.inputName,
+                multiple: allowMultiple(),
+                acceptFiles: acceptFiles,
+                onChange: function(input) {
+                    self._onInputChange(input);
+                },
+                hoverClass: this._options.classes.buttonHover,
+                focusClass: this._options.classes.buttonFocus
+            });
+
+            this._disposeSupport.addDisposer(function() {
+                button.dispose();
+            });
+
+            self._buttons.push(button);
+
+            return button;
+        },
+
+        _createUploadHandler: function(additionalOptions, namespace) {
+            var self = this,
+                options = {
+                    debug: this._options.debug,
+                    maxConnections: this._options.maxConnections,
+                    cors: this._options.cors,
+                    demoMode: this._options.demoMode,
+                    paramsStore: this._paramsStore,
+                    endpointStore: this._endpointStore,
+                    chunking: this._options.chunking,
+                    resume: this._options.resume,
+                    blobs: this._options.blobs,
+                    log: qq.bind(self.log, self),
+                    onProgress: function(id, name, loaded, total){
+                        self._onProgress(id, name, loaded, total);
+                        self._options.callbacks.onProgress(id, name, loaded, total);
+                    },
+                    onComplete: function(id, name, result, xhr){
+                        var retVal = self._onComplete(id, name, result, xhr);
+
+                        // If the internal `_onComplete` handler returns a promise, don't invoke the `onComplete` callback
+                        // until the promise has been fulfilled.
+                        if (retVal instanceof  qq.Promise) {
+                            retVal.done(function() {
+                                self._options.callbacks.onComplete(id, name, result, xhr);
+                            });
+                        }
+                        else {
+                            self._options.callbacks.onComplete(id, name, result, xhr);
+                        }
+                    },
+                    onCancel: function(id, name) {
+                        return self._handleCheckedCallback({
+                            name: "onCancel",
+                            callback: qq.bind(self._options.callbacks.onCancel, self, id, name),
+                            onSuccess: qq.bind(self._onCancel, self, id, name),
+                            identifier: id
+                        });
+                    },
+                    onUpload: function(id, name) {
+                        self._onUpload(id, name);
+                        self._options.callbacks.onUpload(id, name);
+                    },
+                    onUploadChunk: function(id, name, chunkData) {
+                        self._onUploadChunk(id, chunkData);
+                        self._options.callbacks.onUploadChunk(id, name, chunkData);
+                    },
+                    onUploadChunkSuccess: function(id, chunkData, result, xhr) {
+                        self._options.callbacks.onUploadChunkSuccess.apply(self, arguments);
+                    },
+                    onResume: function(id, name, chunkData) {
+                        return self._options.callbacks.onResume(id, name, chunkData);
+                    },
+                    onAutoRetry: function(id, name, responseJSON, xhr) {
+                        return self._onAutoRetry.apply(self, arguments);
+                    },
+                    onUuidChanged: function(id, newUuid) {
+                        self.log("Server requested UUID change from '" + self.getUuid(id) + "' to '" + newUuid + "'");
+                        self.setUuid(id, newUuid);
+                    },
+                    getName: qq.bind(self.getName, self),
+                    getUuid: qq.bind(self.getUuid, self),
+                    getSize: qq.bind(self.getSize, self)
+                };
+
+            qq.each(this._options.request, function(prop, val) {
+                options[prop] = val;
+            });
+
+            if (additionalOptions) {
+                qq.each(additionalOptions, function(key, val) {
+                    options[key] = val;
+                });
+            }
+
+            return new qq.UploadHandler(options, namespace);
+        },
+
+        _createDeleteHandler: function() {
+            var self = this;
+
+            return new qq.DeleteFileAjaxRequester({
+                method: this._options.deleteFile.method.toUpperCase(),
+                maxConnections: this._options.maxConnections,
+                uuidParamName: this._options.request.uuidName,
+                customHeaders: this._options.deleteFile.customHeaders,
+                paramsStore: this._deleteFileParamsStore,
+                endpointStore: this._deleteFileEndpointStore,
+                demoMode: this._options.demoMode,
+                cors: this._options.cors,
+                log: qq.bind(self.log, self),
+                onDelete: function(id) {
+                    self._onDelete(id);
+                    self._options.callbacks.onDelete(id);
+                },
+                onDeleteComplete: function(id, xhrOrXdr, isError) {
+                    self._onDeleteComplete(id, xhrOrXdr, isError);
+                    self._options.callbacks.onDeleteComplete(id, xhrOrXdr, isError);
+                }
+
+            });
+        },
+
+        _createPasteHandler: function() {
+            var self = this;
+
+            return new qq.PasteSupport({
+                targetElement: this._options.paste.targetElement,
+                callbacks: {
+                    log: qq.bind(self.log, self),
+                    pasteReceived: function(blob) {
+                        self._handleCheckedCallback({
+                            name: "onPasteReceived",
+                            callback: qq.bind(self._options.callbacks.onPasteReceived, self, blob),
+                            onSuccess: qq.bind(self._handlePasteSuccess, self, blob),
+                            identifier: "pasted image"
+                        });
+                    }
+                }
+            });
+        },
+
+        _createUploadDataTracker: function() {
+            var self = this;
+
+            return new qq.UploadData({
+                getName: function(id) {
+                    return self.getName(id);
+                },
+                getUuid: function(id) {
+                    return self.getUuid(id);
+                },
+                getSize: function(id) {
+                    return self.getSize(id);
+                },
+                onStatusChange: function(id, oldStatus, newStatus) {
+                    self._onUploadStatusChange(id, oldStatus, newStatus);
+                    self._options.callbacks.onStatusChange(id, oldStatus, newStatus);
+                }
+            });
+        },
+
+        _onUploadStatusChange: function(id, oldStatus, newStatus) {
+            // Make sure a "queued" retry attempt is canceled if the upload has been paused
+            if (newStatus === qq.status.PAUSED) {
+                clearTimeout(this._retryTimeouts[id]);
+            }
+        },
+
+        _handlePasteSuccess: function(blob, extSuppliedName) {
+            var extension = blob.type.split("/")[1],
+                name = extSuppliedName;
+
+            /*jshint eqeqeq: true, eqnull: true*/
+            if (name == null) {
+                name = this._options.paste.defaultName;
+            }
+
+            name += "." + extension;
+
+            this.addBlobs({
+                name: name,
+                blob: blob
+            });
+        },
+
+        _preventLeaveInProgress: function(){
+            var self = this;
+
+            this._disposeSupport.attach(window, "beforeunload", function(e){
+                if (self.getInProgress()) {
+                    e = e || window.event;
+                    // for ie, ff
+                    e.returnValue = self._options.messages.onLeave;
+                    // for webkit
+                    return self._options.messages.onLeave;
+                }
+            });
+        },
+
+        _onSubmit: function(id, name) {
+            //nothing to do yet in core uploader
+        },
+
+        _onProgress: function(id, name, loaded, total) {
+            //nothing to do yet in core uploader
+        },
+
+        _onComplete: function(id, name, result, xhr) {
+            if (!result.success) {
+                this._netUploadedOrQueued--;
+                this._uploadData.setStatus(id, qq.status.UPLOAD_FAILED);
+            }
+            else {
+                if (result.thumbnailUrl) {
+                    this._thumbnailUrls[id] = result.thumbnailUrl;
+                }
+
+                this._netUploaded++;
+                this._uploadData.setStatus(id, qq.status.UPLOAD_SUCCESSFUL);
+            }
+
+            this._maybeParseAndSendUploadError(id, name, result, xhr);
+
+            return result.success ? true : false;
+        },
+
+        _onCancel: function(id, name) {
+            this._netUploadedOrQueued--;
+
+            clearTimeout(this._retryTimeouts[id]);
+
+            var storedItemIndex = qq.indexOf(this._storedIds, id);
+            if (!this._options.autoUpload && storedItemIndex >= 0) {
+                this._storedIds.splice(storedItemIndex, 1);
+            }
+
+            this._uploadData.setStatus(id, qq.status.CANCELED);
+        },
+
+        _isDeletePossible: function() {
+            if (!qq.DeleteFileAjaxRequester || !this._options.deleteFile.enabled) {
+                return false;
+            }
+
+            if (this._options.cors.expected) {
+                if (qq.supportedFeatures.deleteFileCorsXhr) {
+                    return true;
+                }
+
+                if (qq.supportedFeatures.deleteFileCorsXdr && this._options.cors.allowXdr) {
+                    return true;
+                }
+
+                return false;
+            }
+
+            return true;
+        },
+
+        _onSubmitDelete: function(id, onSuccessCallback, additionalMandatedParams) {
+            var uuid = this.getUuid(id),
+                adjustedOnSuccessCallback;
+
+            if (onSuccessCallback) {
+                adjustedOnSuccessCallback = qq.bind(onSuccessCallback, this, id, uuid, additionalMandatedParams);
+            }
+
+            if (this._isDeletePossible()) {
+                return this._handleCheckedCallback({
+                    name: "onSubmitDelete",
+                    callback: qq.bind(this._options.callbacks.onSubmitDelete, this, id),
+                    onSuccess: adjustedOnSuccessCallback ||
+                        qq.bind(this._deleteHandler.sendDelete, this, id, uuid, additionalMandatedParams),
+                    identifier: id
+                });
+            }
+            else {
+                this.log("Delete request ignored for ID " + id + ", delete feature is disabled or request not possible " +
+                    "due to CORS on a user agent that does not support pre-flighting.", "warn");
+                return false;
+            }
+        },
+
+        _onDelete: function(id) {
+            this._uploadData.setStatus(id, qq.status.DELETING);
+        },
+
+        _onDeleteComplete: function(id, xhrOrXdr, isError) {
+            var name = this.getName(id);
+
+            if (isError) {
+                this._uploadData.setStatus(id, qq.status.DELETE_FAILED);
+                this.log("Delete request for '" + name + "' has failed.", "error");
+
+                // For error reporing, we only have accesss to the response status if this is not
+                // an `XDomainRequest`.
+                if (xhrOrXdr.withCredentials === undefined) {
+                    this._options.callbacks.onError(id, name, "Delete request failed", xhrOrXdr);
+                }
+                else {
+                    this._options.callbacks.onError(id, name, "Delete request failed with response code " + xhrOrXdr.status, xhrOrXdr);
+                }
+            }
+            else {
+                this._netUploadedOrQueued--;
+                this._netUploaded--;
+                this._handler.expunge(id);
+                this._uploadData.setStatus(id, qq.status.DELETED);
+                this.log("Delete request for '" + name + "' has succeeded.");
+            }
+        },
+
+        _onUpload: function(id, name) {
+            this._uploadData.setStatus(id, qq.status.UPLOADING);
+        },
+
+        _onUploadChunk: function(id, chunkData) {
+            //nothing to do in the base uploader
+        },
+
+        _onInputChange: function(input) {
+            var fileIndex;
+
+            if (qq.supportedFeatures.ajaxUploading) {
+                for (fileIndex = 0; fileIndex < input.files.length; fileIndex++) {
+                    this._annotateWithButtonId(input.files[fileIndex], input);
+                }
+
+                this.addFiles(input.files);
+            }
+            // Android 2.3.x will fire `onchange` even if no file has been selected
+            else if (input.value.length > 0) {
+                this.addFiles(input);
+            }
+
+            qq.each(this._buttons, function(idx, button) {
+                button.reset();
+            });
+        },
+
+        _onBeforeAutoRetry: function(id, name) {
+            this.log("Waiting " + this._options.retry.autoAttemptDelay + " seconds before retrying " + name + "...");
+        },
+
+        /**
+         * Attempt to automatically retry a failed upload.
+         *
+         * @param id The file ID of the failed upload
+         * @param name The name of the file associated with the failed upload
+         * @param responseJSON Response from the server, parsed into a javascript object
+         * @param xhr Ajax transport used to send the failed request
+         * @param callback Optional callback to be invoked if a retry is prudent.
+         * Invoked in lieu of asking the upload handler to retry.
+         * @returns {boolean} true if an auto-retry will occur
+         * @private
+         */
+        _onAutoRetry: function(id, name, responseJSON, xhr, callback) {
+            var self = this;
+
+            self._preventRetries[id] = responseJSON[self._options.retry.preventRetryResponseProperty];
+
+            if (self._shouldAutoRetry(id, name, responseJSON)) {
+                self._maybeParseAndSendUploadError.apply(self, arguments);
+                self._options.callbacks.onAutoRetry(id, name, self._autoRetries[id] + 1);
+                self._onBeforeAutoRetry(id, name);
+
+                self._retryTimeouts[id] = setTimeout(function() {
+                    self.log("Retrying " + name + "...");
+                    self._autoRetries[id]++;
+                    self._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING);
+
+                    if (callback) {
+                        callback(id);
+                    }
+                    else {
+                        self._handler.retry(id);
+                    }
+                }, self._options.retry.autoAttemptDelay * 1000);
+
+                return true;
+            }
+        },
+
+        _shouldAutoRetry: function(id, name, responseJSON) {
+            var uploadData = this._uploadData.retrieve({id: id});
+
+            /*jshint laxbreak: true */
+            if (!this._preventRetries[id]
+                && this._options.retry.enableAuto
+                && uploadData.status !== qq.status.PAUSED) {
+
+                if (this._autoRetries[id] === undefined) {
+                    this._autoRetries[id] = 0;
+                }
+
+                return this._autoRetries[id] < this._options.retry.maxAutoAttempts;
+            }
+
+            return false;
+        },
+
+        //return false if we should not attempt the requested retry
+        _onBeforeManualRetry: function(id) {
+            var itemLimit = this._options.validation.itemLimit;
+
+            if (this._preventRetries[id]) {
+                this.log("Retries are forbidden for id " + id, "warn");
+                return false;
+            }
+            else if (this._handler.isValid(id)) {
+                var fileName = this.getName(id);
+
+                if (this._options.callbacks.onManualRetry(id, fileName) === false) {
+                    return false;
+                }
+
+                if (itemLimit > 0 && this._netUploadedOrQueued+1 > itemLimit) {
+                    this._itemError("retryFailTooManyItems");
+                    return false;
+                }
+
+                this.log("Retrying upload for '" + fileName + "' (id: " + id + ")...");
+                return true;
+            }
+            else {
+                this.log("'" + id + "' is not a valid file ID", "error");
+                return false;
+            }
+        },
+
+        /**
+         * Conditionally orders a manual retry of a failed upload.
+         *
+         * @param id File ID of the failed upload
+         * @param callback Optional callback to invoke if a retry is prudent.
+         * In lieu of asking the upload handler to retry.
+         * @returns {boolean} true if a manual retry will occur
+         * @private
+         */
+        _manualRetry: function(id, callback) {
+            if (this._onBeforeManualRetry(id)) {
+                this._netUploadedOrQueued++;
+                this._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING);
+
+                if (callback) {
+                    callback(id);
+                }
+                else {
+                    this._handler.retry(id);
+                }
+
+                return true;
+            }
+        },
+
+        _maybeParseAndSendUploadError: function(id, name, response, xhr) {
+            // Assuming no one will actually set the response code to something other than 200
+            // and still set 'success' to true...
+            if (!response.success){
+                if (xhr && xhr.status !== 200 && !response.error) {
+                    this._options.callbacks.onError(id, name, "XHR returned response code " + xhr.status, xhr);
+                }
+                else {
+                    var errorReason = response.error ? response.error : this._options.text.defaultResponseError;
+                    this._options.callbacks.onError(id, name, errorReason, xhr);
+                }
+            }
+        },
+
+        _prepareItemsForUpload: function(items, params, endpoint) {
+            var validationDescriptors = this._getValidationDescriptors(items),
+                buttonId = this._getButtonId(items[0].file),
+                button = this._getButton(buttonId);
+
+            this._handleCheckedCallback({
+                name: "onValidateBatch",
+                callback: qq.bind(this._options.callbacks.onValidateBatch, this, validationDescriptors, button),
+                onSuccess: qq.bind(this._onValidateBatchCallbackSuccess, this, validationDescriptors, items, params, endpoint, button),
+                onFailure: qq.bind(this._onValidateBatchCallbackFailure, this, items),
+                identifier: "batch validation"
+            });
+        },
+
+        _upload: function(id, params, endpoint) {
+            var name = this.getName(id);
+
+            if (params) {
+                this.setParams(params, id);
+            }
+
+            if (endpoint) {
+                this.setEndpoint(endpoint, id);
+            }
+
+            this._handleCheckedCallback({
+                name: "onSubmit",
+                callback: qq.bind(this._options.callbacks.onSubmit, this, id, name),
+                onSuccess: qq.bind(this._onSubmitCallbackSuccess, this, id, name),
+                onFailure: qq.bind(this._fileOrBlobRejected, this, id, name),
+                identifier: id
+            });
+        },
+
+        _onSubmitCallbackSuccess: function(id, name) {
+            var buttonId;
+
+            if (qq.supportedFeatures.ajaxUploading) {
+                buttonId = this._handler.getFile(id).qqButtonId;
+            }
+            else {
+                buttonId = this._getButtonId(this._handler.getInput(id));
+            }
+
+            if (buttonId) {
+                this._buttonIdsForFileIds[id] = buttonId;
+            }
+
+            this._onSubmit.apply(this, arguments);
+            this._uploadData.setStatus(id, qq.status.SUBMITTED);
+            this._onSubmitted.apply(this, arguments);
+            this._options.callbacks.onSubmitted.apply(this, arguments);
+
+            if (this._options.autoUpload) {
+                if (!this._handler.upload(id)) {
+                    this._uploadData.setStatus(id, qq.status.QUEUED);
+                }
+            }
+            else {
+                this._storeForLater(id);
+            }
+        },
+
+        _onSubmitted: function(id) {
+            //nothing to do in the base uploader
+        },
+
+        _storeForLater: function(id) {
+            this._storedIds.push(id);
+        },
+
+        _onValidateBatchCallbackSuccess: function(validationDescriptors, items, params, endpoint, button) {
+            var errorMessage,
+                itemLimit = this._options.validation.itemLimit,
+                proposedNetFilesUploadedOrQueued = this._netUploadedOrQueued;
+
+            if (itemLimit === 0 || proposedNetFilesUploadedOrQueued <= itemLimit) {
+                if (items.length > 0) {
+                    this._handleCheckedCallback({
+                        name: "onValidate",
+                        callback: qq.bind(this._options.callbacks.onValidate, this, validationDescriptors[0], button),
+                        onSuccess: qq.bind(this._onValidateCallbackSuccess, this, items, 0, params, endpoint),
+                        onFailure: qq.bind(this._onValidateCallbackFailure, this, items, 0, params, endpoint),
+                        identifier: "Item '" + items[0].file.name + "', size: " + items[0].file.size
+                    });
+                }
+                else {
+                    this._itemError("noFilesError");
+                }
+            }
+            else {
+                this._onValidateBatchCallbackFailure(items);
+                errorMessage = this._options.messages.tooManyItemsError
+                    .replace(/\{netItems\}/g, proposedNetFilesUploadedOrQueued)
+                    .replace(/\{itemLimit\}/g, itemLimit);
+                this._batchError(errorMessage);
+            }
+        },
+
+        _onValidateBatchCallbackFailure: function(fileWrappers) {
+            var self = this;
+
+            qq.each(fileWrappers, function(idx, fileWrapper) {
+                self._fileOrBlobRejected(fileWrapper.id);
+            });
+        },
+
+        _onValidateCallbackSuccess: function(items, index, params, endpoint) {
+            var self = this,
+                nextIndex = index+1,
+                validationDescriptor = this._getValidationDescriptor(items[index].file);
+
+            this._validateFileOrBlobData(items[index], validationDescriptor)
+                .then(
+                    function() {
+                        self._upload(items[index].id, params, endpoint);
+                        self._maybeProcessNextItemAfterOnValidateCallback(true, items, nextIndex, params, endpoint);
+                    },
+                    function() {
+                        self._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint);
+                    }
+                );
+        },
+
+        _onValidateCallbackFailure: function(items, index, params, endpoint) {
+            var nextIndex = index+ 1;
+
+            this._fileOrBlobRejected(items[0].id, items[0].file.name);
+
+            this._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint);
+        },
+
+        _maybeProcessNextItemAfterOnValidateCallback: function(validItem, items, index, params, endpoint) {
+            var self = this;
+
+            if (items.length > index) {
+                if (validItem || !this._options.validation.stopOnFirstInvalidFile) {
+                    //use setTimeout to prevent a stack overflow with a large number of files in the batch & non-promissory callbacks
+                    setTimeout(function() {
+                        var validationDescriptor = self._getValidationDescriptor(items[index].file);
+
+                        self._handleCheckedCallback({
+                            name: "onValidate",
+                            callback: qq.bind(self._options.callbacks.onValidate, self, items[index].file),
+                            onSuccess: qq.bind(self._onValidateCallbackSuccess, self, items, index, params, endpoint),
+                            onFailure: qq.bind(self._onValidateCallbackFailure, self, items, index, params, endpoint),
+                            identifier: "Item '" + validationDescriptor.name + "', size: " + validationDescriptor.size
+                        });
+                    }, 0);
+                }
+                else if (!validItem) {
+                    for (; index < items.length; index++) {
+                        self._fileOrBlobRejected(items[index].id);
+                    }
+                }
+            }
+        },
+
+        /**
+         * Performs some internal validation checks on an item, defined in the `validation` option.
+         *
+         * @param fileWrapper Wrapper containing a `file` along with an `id`
+         * @param validationDescriptor Normalized information about the item (`size`, `name`).
+         * @returns qq.Promise with appropriate callbacks invoked depending on the validity of the file
+         * @private
+         */
+        _validateFileOrBlobData: function(fileWrapper, validationDescriptor) {
+            var self = this,
+                file = fileWrapper.file,
+                name = validationDescriptor.name,
+                size = validationDescriptor.size,
+                buttonId = this._getButtonId(file),
+                validationBase = this._getValidationBase(buttonId),
+                validityChecker = new qq.Promise();
+
+            validityChecker.then(
+                function() {},
+                function() {
+                    self._fileOrBlobRejected(fileWrapper.id, name);
+                });
+
+            if (qq.isFileOrInput(file) && !this._isAllowedExtension(validationBase.allowedExtensions, name)) {
+                this._itemError("typeError", name, file);
+                return validityChecker.failure();
+            }
+
+            if (size === 0) {
+                this._itemError("emptyError", name, file);
+                return validityChecker.failure();
+            }
+
+            if (size && validationBase.sizeLimit && size > validationBase.sizeLimit) {
+                this._itemError("sizeError", name, file);
+                return validityChecker.failure();
+            }
+
+            if (size && size < validationBase.minSizeLimit) {
+                this._itemError("minSizeError", name, file);
+                return validityChecker.failure();
+            }
+
+            if (qq.ImageValidation && qq.supportedFeatures.imagePreviews && qq.isFile(file)) {
+                new qq.ImageValidation(file, qq.bind(self.log, self)).validate(validationBase.image).then(
+                    validityChecker.success,
+                    function(errorCode) {
+                        self._itemError(errorCode + "ImageError", name, file);
+                        validityChecker.failure();
+                    }
+                );
+            }
+            else {
+                validityChecker.success();
+            }
+
+            return validityChecker;
+        },
+
+        _fileOrBlobRejected: function(id) {
+            this._netUploadedOrQueued--;
+            this._uploadData.setStatus(id, qq.status.REJECTED);
+        },
+
+        /**
+         * Constructs and returns a message that describes an item/file error.  Also calls `onError` callback.
+         *
+         * @param code REQUIRED - a code that corresponds to a stock message describing this type of error
+         * @param maybeNameOrNames names of the items that have failed, if applicable
+         * @param item `File`, `Blob`, or `<input type="file">`
+         * @private
+         */
+        _itemError: function(code, maybeNameOrNames, item) {
+            var message = this._options.messages[code],
+                allowedExtensions = [],
+                names = [].concat(maybeNameOrNames),
+                name = names[0],
+                buttonId = this._getButtonId(item),
+                validationBase = this._getValidationBase(buttonId),
+                extensionsForMessage, placeholderMatch;
+
+            function r(name, replacement){ message = message.replace(name, replacement); }
+
+            qq.each(validationBase.allowedExtensions, function(idx, allowedExtension) {
+                    /**
+                     * If an argument is not a string, ignore it.  Added when a possible issue with MooTools hijacking the
+                     * `allowedExtensions` array was discovered.  See case #735 in the issue tracker for more details.
+                     */
+                if (qq.isString(allowedExtension)) {
+                    allowedExtensions.push(allowedExtension);
+                }
+            });
+
+            extensionsForMessage = allowedExtensions.join(", ").toLowerCase();
+
+            r("{file}", this._options.formatFileName(name));
+            r("{extensions}", extensionsForMessage);
+            r("{sizeLimit}", this._formatSize(validationBase.sizeLimit));
+            r("{minSizeLimit}", this._formatSize(validationBase.minSizeLimit));
+
+            placeholderMatch = message.match(/(\{\w+\})/g);
+            if (placeholderMatch !== null) {
+                qq.each(placeholderMatch, function(idx, placeholder) {
+                    r(placeholder, names[idx]);
+                });
+            }
+
+            this._options.callbacks.onError(null, name, message, undefined);
+
+            return message;
+        },
+
+        _batchError: function(message) {
+            this._options.callbacks.onError(null, null, message, undefined);
+        },
+
+        _isAllowedExtension: function(allowed, fileName) {
+            var valid = false;
+
+            if (!allowed.length) {
+                return true;
+            }
+
+            qq.each(allowed, function(idx, allowedExt) {
+                /**
+                 * If an argument is not a string, ignore it.  Added when a possible issue with MooTools hijacking the
+                 * `allowedExtensions` array was discovered.  See case #735 in the issue tracker for more details.
+                 */
+                if (qq.isString(allowedExt)) {
+                    /*jshint eqeqeq: true, eqnull: true*/
+                    var extRegex = new RegExp("\\." + allowedExt + "$", "i");
+
+                    if (fileName.match(extRegex) != null) {
+                        valid = true;
+                        return false;
+                    }
+                }
+            });
+
+            return valid;
+        },
+
+        _formatSize: function(bytes){
+            var i = -1;
+            do {
+                bytes = bytes / 1000;
+                i++;
+            } while (bytes > 999);
+
+            return Math.max(bytes, 0.1).toFixed(1) + this._options.text.sizeSymbols[i];
+        },
+
+        _wrapCallbacks: function() {
+            var self, safeCallback;
+
+            self = this;
+
+            safeCallback = function(name, callback, args) {
+                var errorMsg;
+
+                try {
+                    return callback.apply(self, args);
+                }
+                catch (exception) {
+                    errorMsg = exception.message || exception.toString();
+                    self.log("Caught exception in '" + name + "' callback - " + errorMsg, "error");
+                }
+            };
+
+            /* jshint forin: false, loopfunc: true */
+            for (var prop in this._options.callbacks) {
+                (function() {
+                    var callbackName, callbackFunc;
+                    callbackName = prop;
+                    callbackFunc = self._options.callbacks[callbackName];
+                    self._options.callbacks[callbackName] = function() {
+                        return safeCallback(callbackName, callbackFunc, arguments);
+                    };
+                }());
+            }
+        },
+
+        _parseFileOrBlobDataName: function(fileOrBlobData) {
+            var name;
+
+            if (qq.isFileOrInput(fileOrBlobData)) {
+                if (fileOrBlobData.value) {
+                    // it is a file input
+                    // get input value and remove path to normalize
+                    name = fileOrBlobData.value.replace(/.*(\/|\\)/, "");
+                } else {
+                    // fix missing properties in Safari 4 and firefox 11.0a2
+                    name = (fileOrBlobData.fileName !== null && fileOrBlobData.fileName !== undefined) ? fileOrBlobData.fileName : fileOrBlobData.name;
+                }
+            }
+            else {
+                name = fileOrBlobData.name;
+            }
+
+            return name;
+        },
+
+        _parseFileOrBlobDataSize: function(fileOrBlobData) {
+            var size;
+
+            if (qq.isFileOrInput(fileOrBlobData)) {
+                if (fileOrBlobData.value === undefined) {
+                    // fix missing properties in Safari 4 and firefox 11.0a2
+                    size = (fileOrBlobData.fileSize !== null && fileOrBlobData.fileSize !== undefined) ? fileOrBlobData.fileSize : fileOrBlobData.size;
+                }
+            }
+            else {
+                size = fileOrBlobData.blob.size;
+            }
+
+            return size;
+        },
+
+        _getValidationDescriptor: function(fileOrBlobData) {
+            var fileDescriptor = {},
+                name = this._parseFileOrBlobDataName(fileOrBlobData),
+                size = this._parseFileOrBlobDataSize(fileOrBlobData);
+
+            fileDescriptor.name = name;
+            if (size !== undefined) {
+                fileDescriptor.size = size;
+            }
+
+            return fileDescriptor;
+        },
+
+        _getValidationDescriptors: function(fileWrappers) {
+            var self = this,
+                fileDescriptors = [];
+
+            qq.each(fileWrappers, function(idx, fileWrapper) {
+                fileDescriptors.push(self._getValidationDescriptor(fileWrapper.file));
+            });
+
+            return fileDescriptors;
+        },
+
+        _createParamsStore: function(type) {
+            var paramsStore = {},
+                self = this;
+
+            return {
+                setParams: function(params, id) {
+                    var paramsCopy = {};
+                    qq.extend(paramsCopy, params);
+                    paramsStore[id] = paramsCopy;
+                },
+
+                getParams: function(id) {
+                    /*jshint eqeqeq: true, eqnull: true*/
+                    var paramsCopy = {};
+
+                    if (id != null && paramsStore[id]) {
+                        qq.extend(paramsCopy, paramsStore[id]);
+                    }
+                    else {
+                        qq.extend(paramsCopy, self._options[type].params);
+                    }
+
+                    return paramsCopy;
+                },
+
+                remove: function(fileId) {
+                    return delete paramsStore[fileId];
+                },
+
+                reset: function() {
+                    paramsStore = {};
+                }
+            };
+        },
+
+        _createEndpointStore: function(type) {
+            var endpointStore = {},
+            self = this;
+
+            return {
+                setEndpoint: function(endpoint, id) {
+                    endpointStore[id] = endpoint;
+                },
+
+                getEndpoint: function(id) {
+                    /*jshint eqeqeq: true, eqnull: true*/
+                    if (id != null && endpointStore[id]) {
+                        return endpointStore[id];
+                    }
+
+                    return self._options[type].endpoint;
+                },
+
+                remove: function(fileId) {
+                    return delete endpointStore[fileId];
+                },
+
+                reset: function() {
+                    endpointStore = {};
+                }
+            };
+        },
+
+        // Allows camera access on either the default or an extra button for iOS devices.
+        _handleCameraAccess: function() {
+            if (this._options.camera.ios && qq.ios()) {
+                var acceptIosCamera = "image/*;capture=camera",
+                    button = this._options.camera.button,
+                    buttonId = button ? this._getButtonId(button) : this._defaultButtonId,
+                    optionRoot = this._options;
+
+                // If we are not targeting the default button, it is an "extra" button
+                if (buttonId && buttonId !== this._defaultButtonId) {
+                    optionRoot = this._extraButtonSpecs[buttonId];
+                }
+
+                // Camera access won't work in iOS if the `multiple` attribute is present on the file input
+                optionRoot.multiple = false;
+
+                // update the options
+                if (optionRoot.validation.acceptFiles === null) {
+                    optionRoot.validation.acceptFiles = acceptIosCamera;
+                }
+                else {
+                    optionRoot.validation.acceptFiles += "," + acceptIosCamera;
+                }
+
+                // update the already-created button
+                qq.each(this._buttons, function(idx, button) {
+                    if (button.getButtonId() === buttonId) {
+                        button.setMultiple(optionRoot.multiple);
+                        button.setAcceptFiles(optionRoot.acceptFiles);
+
+                        return false;
+                    }
+                });
+            }
+        },
+
+        // Get the validation options for this button.  Could be the default validation option
+        // or a specific one assigned to this particular button.
+        _getValidationBase: function(buttonId) {
+            var extraButtonSpec = this._extraButtonSpecs[buttonId];
+
+            return extraButtonSpec ? extraButtonSpec.validation : this._options.validation;
+
+        }
+    };
+}());
+
+/*globals qq*/
+(function(){
+    "use strict";
+
+    qq.FineUploaderBasic = function(o) {
+        // These options define FineUploaderBasic mode.
+        this._options = {
+            debug: false,
+            button: null,
+            multiple: true,
+            maxConnections: 3,
+            disableCancelForFormUploads: false,
+            autoUpload: true,
+
+            request: {
+                endpoint: "/server/upload",
+                params: {},
+                paramsInBody: true,
+                customHeaders: {},
+                forceMultipart: true,
+                inputName: "qqfile",
+                uuidName: "qquuid",
+                totalFileSizeName: "qqtotalfilesize",
+                filenameParam: "qqfilename"
+            },
+
+            validation: {
+                allowedExtensions: [],
+                sizeLimit: 0,
+                minSizeLimit: 0,
+                itemLimit: 0,
+                stopOnFirstInvalidFile: true,
+                acceptFiles: null,
+                image: {
+                    maxHeight: 0,
+                    maxWidth: 0,
+                    minHeight: 0,
+                    minWidth: 0
+                }
+            },
+
+            callbacks: {
+                onSubmit: function(id, name){},
+                onSubmitted: function(id, name){},
+                onComplete: function(id, name, responseJSON, maybeXhr){},
+                onCancel: function(id, name){},
+                onUpload: function(id, name){},
+                onUploadChunk: function(id, name, chunkData){},
+                onUploadChunkSuccess: function(id, chunkData, responseJSON, xhr){},
+                onResume: function(id, fileName, chunkData){},
+                onProgress: function(id, name, loaded, total){},
+                onError: function(id, name, reason, maybeXhrOrXdr) {},
+                onAutoRetry: function(id, name, attemptNumber) {},
+                onManualRetry: function(id, name) {},
+                onValidateBatch: function(fileOrBlobData) {},
+                onValidate: function(fileOrBlobData) {},
+                onSubmitDelete: function(id) {},
+                onDelete: function(id){},
+                onDeleteComplete: function(id, xhrOrXdr, isError){},
+                onPasteReceived: function(blob) {},
+                onStatusChange: function(id, oldStatus, newStatus) {},
+                onSessionRequestComplete: function(response, success, xhrOrXdr) {}
+            },
+
+            messages: {
+                typeError: "{file} has an invalid extension. Valid extension(s): {extensions}.",
+                sizeError: "{file} is too large, maximum file size is {sizeLimit}.",
+                minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.",
+                emptyError: "{file} is empty, please select files again without it.",
+                noFilesError: "No files to upload.",
+                tooManyItemsError: "Too many items ({netItems}) would be uploaded.  Item limit is {itemLimit}.",
+                maxHeightImageError: "Image is too tall.",
+                maxWidthImageError: "Image is too wide.",
+                minHeightImageError: "Image is not tall enough.",
+                minWidthImageError: "Image is not wide enough.",
+                retryFailTooManyItems: "Retry failed - you have reached your file limit.",
+                onLeave: "The files are being uploaded, if you leave now the upload will be canceled."
+            },
+
+            retry: {
+                enableAuto: false,
+                maxAutoAttempts: 3,
+                autoAttemptDelay: 5,
+                preventRetryResponseProperty: "preventRetry"
+            },
+
+            classes: {
+                buttonHover: "qq-upload-button-hover",
+                buttonFocus: "qq-upload-button-focus"
+            },
+
+            chunking: {
+                enabled: false,
+                partSize: 2000000,
+                paramNames: {
+                    partIndex: "qqpartindex",
+                    partByteOffset: "qqpartbyteoffset",
+                    chunkSize: "qqchunksize",
+                    totalFileSize: "qqtotalfilesize",
+                    totalParts: "qqtotalparts"
+                }
+            },
+
+            resume: {
+                enabled: false,
+                id: null,
+                cookiesExpireIn: 7, //days
+                paramNames: {
+                    resuming: "qqresume"
+                }
+            },
+
+            formatFileName: function(fileOrBlobName) {
+                if (fileOrBlobName !== undefined && fileOrBlobName.length > 33) {
+                    fileOrBlobName = fileOrBlobName.slice(0, 19) + "..." + fileOrBlobName.slice(-14);
+                }
+                return fileOrBlobName;
+            },
+
+            text: {
+                defaultResponseError: "Upload failure reason unknown",
+                sizeSymbols: ["kB", "MB", "GB", "TB", "PB", "EB"]
+            },
+
+            deleteFile : {
+                enabled: false,
+                method: "DELETE",
+                endpoint: "/server/upload",
+                customHeaders: {},
+                params: {}
+            },
+
+            cors: {
+                expected: false,
+                sendCredentials: false,
+                allowXdr: false
+            },
+
+            blobs: {
+                defaultName: "misc_data"
+            },
+
+            paste: {
+                targetElement: null,
+                defaultName: "pasted_image"
+            },
+
+            camera: {
+                ios: false,
+
+                // if ios is true: button is null means target the default button, otherwise target the button specified
+                button: null
+            },
+
+            // This refers to additional upload buttons to be handled by Fine Uploader.
+            // Each element is an object, containing `element` as the only required
+            // property.  The `element` must be a container that will ultimately
+            // contain an invisible `<input type="file">` created by Fine Uploader.
+            // Optional properties of each object include `multiple`, `validation`,
+            // and `folders`.
+            extraButtons: [],
+
+            // Depends on the session module.  Used to query the server for an initial file list
+            // during initialization and optionally after a `reset`.
+            session: {
+                endpoint: null,
+                params: {},
+                customHeaders: {},
+                refreshOnReset: true
+            }
+        };
+
+        // Replace any default options with user defined ones
+        qq.extend(this._options, o, true);
+
+        this._buttons = [];
+        this._extraButtonSpecs = {};
+        this._buttonIdsForFileIds = [];
+
+        this._wrapCallbacks();
+        this._disposeSupport =  new qq.DisposeSupport();
+
+        this._storedIds = [];
+        this._autoRetries = [];
+        this._retryTimeouts = [];
+        this._preventRetries = [];
+        this._thumbnailUrls = [];
+
+        this._netUploadedOrQueued = 0;
+        this._netUploaded = 0;
+        this._uploadData = this._createUploadDataTracker();
+
+        this._paramsStore = this._createParamsStore("request");
+        this._deleteFileParamsStore = this._createParamsStore("deleteFile");
+
+        this._endpointStore = this._createEndpointStore("request");
+        this._deleteFileEndpointStore = this._createEndpointStore("deleteFile");
+
+        this._handler = this._createUploadHandler();
+
+        this._deleteHandler = qq.DeleteFileAjaxRequester && this._createDeleteHandler();
+
+        if (this._options.button) {
+            this._defaultButtonId = this._createUploadButton({element: this._options.button}).getButtonId();
+        }
+
+        this._generateExtraButtonSpecs();
+
+        this._handleCameraAccess();
+
+        if (this._options.paste.targetElement) {
+            if (qq.PasteSupport) {
+                this._pasteHandler = this._createPasteHandler();
+            }
+            else {
+                qq.log("Paste support module not found", "info");
+            }
+        }
+
+        this._preventLeaveInProgress();
+
+        this._imageGenerator = qq.ImageGenerator && new qq.ImageGenerator(qq.bind(this.log, this));
+        this._refreshSessionData();
+    };
+
+    // Define the private & public API methods.
+    qq.FineUploaderBasic.prototype = qq.basePublicApi;
+    qq.extend(qq.FineUploaderBasic.prototype, qq.basePrivateApi);
+}());
+
+/*globals qq, XDomainRequest*/
+/** Generic class for sending non-upload ajax requests and handling the associated responses **/
+qq.AjaxRequester = function (o) {
+    "use strict";
+
+    var log, shouldParamsBeInQueryString,
+        queue = [],
+        requestData = [],
+        options = {
+            validMethods: ["POST"],
+            method: "POST",
+            contentType: "application/x-www-form-urlencoded",
+            maxConnections: 3,
+            customHeaders: {},
+            endpointStore: {},
+            paramsStore: {},
+            mandatedParams: {},
+            allowXRequestedWithAndCacheControl: true,
+            successfulResponseCodes: {
+                "DELETE": [200, 202, 204],
+                "POST": [200, 204],
+                "GET": [200]
+            },
+            cors: {
+                expected: false,
+                sendCredentials: false
+            },
+            log: function (str, level) {},
+            onSend: function (id) {},
+            onComplete: function (id, xhrOrXdr, isError) {}
+        };
+
+    qq.extend(options, o);
+    log = options.log;
+
+    if (qq.indexOf(options.validMethods, options.method) < 0) {
+        throw new Error("'" + options.method + "' is not a supported method for this type of request!");
+    }
+
+    // [Simple methods](http://www.w3.org/TR/cors/#simple-method)
+    // are defined by the W3C in the CORS spec as a list of methods that, in part,
+    // make a CORS request eligible to be exempt from preflighting.
+    function isSimpleMethod() {
+        return qq.indexOf(["GET", "POST", "HEAD"], options.method) >= 0;
+    }
+
+    // [Simple headers](http://www.w3.org/TR/cors/#simple-header)
+    // are defined by the W3C in the CORS spec as a list of headers that, in part,
+    // make a CORS request eligible to be exempt from preflighting.
+    function containsNonSimpleHeaders(headers) {
+        var containsNonSimple = false;
+
+        qq.each(containsNonSimple, function(idx, header) {
+            if (qq.indexOf(["Accept", "Accept-Language", "Content-Language", "Content-Type"], header) < 0) {
+                containsNonSimple = true;
+                return false;
+            }
+        });
+
+        return containsNonSimple;
+    }
+
+    function isXdr(xhr) {
+        //The `withCredentials` test is a commonly accepted way to determine if XHR supports CORS.
+        return options.cors.expected && xhr.withCredentials === undefined;
+    }
+
+    // Returns either a new `XMLHttpRequest` or `XDomainRequest` instance.
+    function getCorsAjaxTransport() {
+        var xhrOrXdr;
+
+        if (window.XMLHttpRequest || window.ActiveXObject) {
+            xhrOrXdr = qq.createXhrInstance();
+
+            if (xhrOrXdr.withCredentials === undefined) {
+                xhrOrXdr = new XDomainRequest();
+            }
+        }
+
+        return xhrOrXdr;
+    }
+
+    // Returns either a new XHR/XDR instance, or an existing one for the associated `File` or `Blob`.
+    function getXhrOrXdr(id, dontCreateIfNotExist) {
+        var xhrOrXdr = requestData[id].xhr;
+
+        if (!xhrOrXdr && !dontCreateIfNotExist) {
+            if (options.cors.expected) {
+                xhrOrXdr = getCorsAjaxTransport();
+            }
+            else {
+                xhrOrXdr = qq.createXhrInstance();
+            }
+
+            requestData[id].xhr = xhrOrXdr;
+        }
+
+        return xhrOrXdr;
+    }
+
+    // Removes element from queue, sends next request
+    function dequeue(id) {
+        var i = qq.indexOf(queue, id),
+            max = options.maxConnections,
+            nextId;
+
+        delete requestData[id];
+        queue.splice(i, 1);
+
+        if (queue.length >= max && i < max) {
+            nextId = queue[max - 1];
+            sendRequest(nextId);
+        }
+    }
+
+    function onComplete(id, xdrError) {
+        var xhr = getXhrOrXdr(id),
+            method = options.method,
+            isError = xdrError === true;
+
+        dequeue(id);
+
+        if (isError) {
+            log(method + " request for " + id + " has failed", "error");
+        }
+        else if (!isXdr(xhr) && !isResponseSuccessful(xhr.status)) {
+            isError = true;
+            log(method + " request for " + id + " has failed - response code " + xhr.status, "error");
+        }
+
+        options.onComplete(id, xhr, isError);
+    }
+
+    function getParams(id) {
+        var onDemandParams = requestData[id].additionalParams,
+            mandatedParams = options.mandatedParams,
+            params;
+
+        if (options.paramsStore.getParams) {
+            params = options.paramsStore.getParams(id);
+        }
+
+        if (onDemandParams) {
+            qq.each(onDemandParams, function (name, val) {
+                params = params || {};
+                params[name] = val;
+            });
+        }
+
+        if (mandatedParams) {
+            qq.each(mandatedParams, function (name, val) {
+                params = params || {};
+                params[name] = val;
+            });
+        }
+
+        return params;
+    }
+
+    function sendRequest(id) {
+        var xhr = getXhrOrXdr(id),
+            method = options.method,
+            params = getParams(id),
+            payload = requestData[id].payload,
+            url;
+
+        options.onSend(id);
+
+        url = createUrl(id, params);
+
+        // XDR and XHR status detection APIs differ a bit.
+        if (isXdr(xhr)) {
+            xhr.onload = getXdrLoadHandler(id);
+            xhr.onerror = getXdrErrorHandler(id);
+        }
+        else {
+            xhr.onreadystatechange = getXhrReadyStateChangeHandler(id);
+        }
+
+        // The last parameter is assumed to be ignored if we are actually using `XDomainRequest`.
+        xhr.open(method, url, true);
+
+        // Instruct the transport to send cookies along with the CORS request,
+        // unless we are using `XDomainRequest`, which is not capable of this.
+        if (options.cors.expected && options.cors.sendCredentials && !isXdr(xhr)) {
+            xhr.withCredentials = true;
+        }
+
+        setHeaders(id);
+
+        log("Sending " + method + " request for " + id);
+
+        if (payload) {
+            xhr.send(payload);
+        }
+        else if (shouldParamsBeInQueryString || !params) {
+            xhr.send();
+        }
+        else if (params && options.contentType.toLowerCase().indexOf("application/x-www-form-urlencoded") >= 0) {
+            xhr.send(qq.obj2url(params, ""));
+        }
+        else if (params && options.contentType.toLowerCase().indexOf("application/json") >= 0) {
+            xhr.send(JSON.stringify(params));
+        }
+        else {
+            xhr.send(params);
+        }
+    }
+
+    function createUrl(id, params) {
+        var endpoint = options.endpointStore.getEndpoint(id),
+            addToPath = requestData[id].addToPath;
+
+        /*jshint -W116,-W041 */
+        if (addToPath != undefined) {
+            endpoint += "/" + addToPath;
+        }
+
+        if (shouldParamsBeInQueryString && params) {
+            return qq.obj2url(params, endpoint);
+        }
+        else {
+            return endpoint;
+        }
+    }
+
+    // Invoked by the UA to indicate a number of possible states that describe
+    // a live `XMLHttpRequest` transport.
+    function getXhrReadyStateChangeHandler(id) {
+        return function () {
+            if (getXhrOrXdr(id).readyState === 4) {
+                onComplete(id);
+            }
+        };
+    }
+
+    // This will be called by IE to indicate **success** for an associated
+    // `XDomainRequest` transported request.
+    function getXdrLoadHandler(id) {
+        return function () {
+            onComplete(id);
+        };
+    }
+
+    // This will be called by IE to indicate **failure** for an associated
+    // `XDomainRequest` transported request.
+    function getXdrErrorHandler(id) {
+        return function () {
+            onComplete(id, true);
+        };
+    }
+
+    function setHeaders(id) {
+        var xhr = getXhrOrXdr(id),
+            customHeaders = options.customHeaders,
+            onDemandHeaders = requestData[id].additionalHeaders || {},
+            method = options.method,
+            allHeaders = {};
+
+        // If XDomainRequest is being used, we can't set headers, so just ignore this block.
+        if (!isXdr(xhr)) {
+            // Only attempt to add X-Requested-With & Cache-Control if permitted
+            if (options.allowXRequestedWithAndCacheControl) {
+                // Do not add X-Requested-With & Cache-Control if this is a cross-origin request
+                // OR the cross-origin request contains a non-simple method or header.
+                // This is done to ensure a preflight is not triggered exclusively based on the
+                // addition of these 2 non-simple headers.
+                if (!options.cors.expected || (!isSimpleMethod() || containsNonSimpleHeaders(customHeaders))) {
+                    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+                    xhr.setRequestHeader("Cache-Control", "no-cache");
+                }
+            }
+
+            if (options.contentType && (method === "POST" || method === "PUT")) {
+                xhr.setRequestHeader("Content-Type", options.contentType);
+            }
+
+            qq.extend(allHeaders, customHeaders);
+            qq.extend(allHeaders, onDemandHeaders);
+
+            qq.each(allHeaders, function (name, val) {
+                xhr.setRequestHeader(name, val);
+            });
+        }
+    }
+
+    function isResponseSuccessful(responseCode) {
+        return qq.indexOf(options.successfulResponseCodes[options.method], responseCode) >= 0;
+    }
+
+    function prepareToSend(id, addToPath, additionalParams, additionalHeaders, payload) {
+        requestData[id] = {
+            addToPath: addToPath,
+            additionalParams: additionalParams,
+            additionalHeaders: additionalHeaders,
+            payload: payload
+        };
+
+        var len = queue.push(id);
+
+        // if too many active connections, wait...
+        if (len <= options.maxConnections) {
+            sendRequest(id);
+        }
+    }
+
+
+    shouldParamsBeInQueryString = options.method === "GET" || options.method === "DELETE";
+
+    qq.extend(this, {
+        // Start the process of sending the request.  The ID refers to the file associated with the request.
+        initTransport: function(id) {
+            var path, params, headers, payload;
+
+            return {
+                // Optionally specify the end of the endpoint path for the request.
+                withPath: function(appendToPath) {
+                    path = appendToPath;
+                    return this;
+                },
+
+                // Optionally specify additional parameters to send along with the request.
+                // These will be added to the query string for GET/DELETE requests or the payload
+                // for POST/PUT requests.  The Content-Type of the request will be used to determine
+                // how these parameters should be formatted as well.
+                withParams: function(additionalParams) {
+                    params = additionalParams;
+                    return this;
+                },
+
+                // Optionally specify additional headers to send along with the request.
+                withHeaders: function(additionalHeaders) {
+                    headers = additionalHeaders;
+                    return this;
+                },
+
+                // Optionally specify a payload/body for the request.
+                withPayload: function(thePayload) {
+                    payload = thePayload;
+                    return this;
+                },
+
+                // Send the constructed request.
+                send: function() {
+                    prepareToSend(id, path, params, headers, payload);
+                }
+            };
+        }
+    });
+};
+
+/*globals qq*/
+/**
+ * Base upload handler module.  Delegates to more specific handlers.
+ *
+ * @param o Options.  Passed along to the specific handler submodule as well.
+ * @param namespace [optional] Namespace for the specific handler.
+ */
+qq.UploadHandler = function(o, namespace) {
+    "use strict";
+
+    var queue = [],
+        options, log, handlerImpl;
+
+    // Default options, can be overridden by the user
+    options = {
+        debug: false,
+        forceMultipart: true,
+        paramsInBody: false,
+        paramsStore: {},
+        endpointStore: {},
+        filenameParam: "qqfilename",
+        cors: {
+            expected: false,
+            sendCredentials: false
+        },
+        maxConnections: 3, // maximum number of concurrent uploads
+        uuidName: "qquuid",
+        totalFileSizeName: "qqtotalfilesize",
+        chunking: {
+            enabled: false,
+            partSize: 2000000, //bytes
+            paramNames: {
+                partIndex: "qqpartindex",
+                partByteOffset: "qqpartbyteoffset",
+                chunkSize: "qqchunksize",
+                totalParts: "qqtotalparts",
+                filename: "qqfilename"
+            }
+        },
+        resume: {
+            enabled: false,
+            id: null,
+            cookiesExpireIn: 7, //days
+            paramNames: {
+                resuming: "qqresume"
+            }
+        },
+        log: function(str, level) {},
+        onProgress: function(id, fileName, loaded, total){},
+        onComplete: function(id, fileName, response, xhr){},
+        onCancel: function(id, fileName){},
+        onUpload: function(id, fileName){},
+        onUploadChunk: function(id, fileName, chunkData){},
+        onUploadChunkSuccess: function(id, chunkData, response, xhr){},
+        onAutoRetry: function(id, fileName, response, xhr){},
+        onResume: function(id, fileName, chunkData){},
+        onUuidChanged: function(id, newUuid){},
+        getName: function(id) {}
+
+    };
+    qq.extend(options, o);
+
+    log = options.log;
+
+    /**
+     * Removes element from queue, starts upload of next
+     */
+    function dequeue(id) {
+        var i = qq.indexOf(queue, id),
+            max = options.maxConnections,
+            nextId;
+
+        if (i >= 0) {
+            queue.splice(i, 1);
+
+            if (queue.length >= max && i < max){
+                nextId = queue[max-1];
+                handlerImpl.upload(nextId);
+            }
+        }
+    }
+
+    function cancelSuccess(id) {
+        log("Cancelling " + id);
+        options.paramsStore.remove(id);
+        dequeue(id);
+    }
+
+    function determineHandlerImpl() {
+        var handlerType = namespace ? qq[namespace] : qq,
+            handlerModuleSubtype = qq.supportedFeatures.ajaxUploading ? "Xhr" : "Form";
+
+        handlerImpl = new handlerType["UploadHandler" + handlerModuleSubtype](
+            options,
+            {onUploadComplete: dequeue, onUuidChanged: options.onUuidChanged,
+                getName: options.getName, getUuid: options.getUuid, getSize: options.getSize, log: log}
+        );
+    }
+
+
+    qq.extend(this, {
+        /**
+         * Adds file or file input to the queue
+         * @returns id
+         **/
+        add: function(id, file) {
+            return handlerImpl.add.apply(this, arguments);
+        },
+
+        /**
+         * Sends the file identified by id
+         */
+        upload: function(id) {
+            var len = queue.push(id);
+
+            // if too many active uploads, wait...
+            if (len <= options.maxConnections){
+                handlerImpl.upload(id);
+                return true;
+            }
+
+            return false;
+        },
+
+        retry: function(id) {
+            var i = qq.indexOf(queue, id);
+            if (i >= 0) {
+                return handlerImpl.upload(id, true);
+            }
+            else {
+                return this.upload(id);
+            }
+        },
+
+        /**
+         * Cancels file upload by id
+         */
+        cancel: function(id) {
+            var cancelRetVal = handlerImpl.cancel(id);
+
+            if (cancelRetVal instanceof qq.Promise) {
+                cancelRetVal.then(function() {
+                    cancelSuccess(id);
+                });
+            }
+            else if (cancelRetVal !== false) {
+                cancelSuccess(id);
+            }
+        },
+
+        /**
+         * Cancels all queued or in-progress uploads
+         */
+        cancelAll: function() {
+            var self = this,
+                queueCopy = [];
+
+            qq.extend(queueCopy, queue);
+            qq.each(queueCopy, function(idx, fileId) {
+                self.cancel(fileId);
+            });
+
+            queue = [];
+        },
+
+        getFile: function(id) {
+            if (handlerImpl.getFile) {
+                return handlerImpl.getFile(id);
+            }
+        },
+
+        getInput: function(id) {
+            if (handlerImpl.getInput) {
+                return handlerImpl.getInput(id);
+            }
+        },
+
+        reset: function() {
+            log("Resetting upload handler");
+            this.cancelAll();
+            queue = [];
+            handlerImpl.reset();
+        },
+
+        expunge: function(id) {
+            if (this.isValid(id)) {
+                return handlerImpl.expunge(id);
+            }
+        },
+
+        /**
+         * Determine if the file exists.
+         */
+        isValid: function(id) {
+            return handlerImpl.isValid(id);
+        },
+
+        getResumableFilesData: function() {
+            if (handlerImpl.getResumableFilesData) {
+                return handlerImpl.getResumableFilesData();
+            }
+            return [];
+        },
+
+        /**
+         * This may or may not be implemented, depending on the handler.  For handlers where a third-party ID is
+         * available (such as the "key" for Amazon S3), this will return that value.  Otherwise, the return value
+         * will be undefined.
+         *
+         * @param id Internal file ID
+         * @returns {*} Some identifier used by a 3rd-party service involved in the upload process
+         */
+        getThirdPartyFileId: function(id) {
+            if (handlerImpl.getThirdPartyFileId && this.isValid(id)) {
+                return handlerImpl.getThirdPartyFileId(id);
+            }
+        },
+
+        /**
+         * Attempts to pause the associated upload if the specific handler supports this and the file is "valid".
+         * @param id ID of the upload/file to pause
+         * @returns {boolean} true if the upload was paused
+         */
+        pause: function(id) {
+            if (handlerImpl.pause && this.isValid(id) && handlerImpl.pause(id)) {
+                dequeue(id);
+                return true;
+            }
+        }
+    });
+
+    determineHandlerImpl();
+};
+
+/* globals qq */
+/**
+ * Common APIs exposed to creators of upload via form/iframe handlers.  This is reused and possibly overridden
+ * in some cases by specific form upload handlers.
+ *
+ * @param internalApi Object that will be filled with internal API methods
+ * @param spec Options/static values used to configure this handler
+ * @param proxy Callbacks & methods used to query for or push out data/changes
+ * @constructor
+ */
+qq.UploadHandlerFormApi = function(internalApi, spec, proxy) {
+    "use strict";
+
+    var formHandlerInstanceId = qq.getUniqueId(),
+        onloadCallbacks = {},
+        detachLoadEvents = {},
+        postMessageCallbackTimers = {},
+        publicApi = this,
+        isCors = spec.isCors,
+        fileState = spec.fileState,
+        inputName = spec.inputName,
+        onCancel = proxy.onCancel,
+        onUuidChanged = proxy.onUuidChanged,
+        getName = proxy.getName,
+        getUuid = proxy.getUuid,
+        log = proxy.log,
+        corsMessageReceiver = new qq.WindowReceiveMessage({log: log});
+
+
+    /**
+     * Remove any trace of the file from the handler.
+     *
+     * @param id ID of the associated file
+     */
+    function expungeFile(id) {
+        delete detachLoadEvents[id];
+        delete fileState[id];
+
+        // If we are dealing with CORS, we might still be waiting for a response from a loaded iframe.
+        // In that case, terminate the timer waiting for a message from the loaded iframe
+        // and stop listening for any more messages coming from this iframe.
+        if (isCors) {
+            clearTimeout(postMessageCallbackTimers[id]);
+            delete postMessageCallbackTimers[id];
+            corsMessageReceiver.stopReceivingMessages(id);
+        }
+
+        var iframe = document.getElementById(internalApi.getIframeName(id));
+        if (iframe) {
+            // To cancel request set src to something else.  We use src="javascript:false;"
+            // because it doesn't trigger ie6 prompt on https
+            iframe.setAttribute("src", "java" + String.fromCharCode(115) + "cript:false;"); //deal with "JSLint: javascript URL" warning, which apparently cannot be turned off
+
+            qq(iframe).remove();
+        }
+    }
+
+    /**
+     * If we are in CORS mode, we must listen for messages (containing the server response) from the associated
+     * iframe, since we cannot directly parse the content of the iframe due to cross-origin restrictions.
+     *
+     * @param iframe Listen for messages on this iframe.
+     * @param callback Invoke this callback with the message from the iframe.
+     */
+    function registerPostMessageCallback(iframe, callback) {
+        var iframeName = iframe.id,
+            fileId = getFileIdForIframeName(iframeName),
+            uuid = getUuid(fileId);
+
+        onloadCallbacks[uuid] = callback;
+
+        // When the iframe has loaded (after the server responds to an upload request)
+        // declare the attempt a failure if we don't receive a valid message shortly after the response comes in.
+        detachLoadEvents[fileId] = qq(iframe).attach("load", function() {
+            if (fileState[fileId].input) {
+                log("Received iframe load event for CORS upload request (iframe name " + iframeName + ")");
+
+                postMessageCallbackTimers[iframeName] = setTimeout(function() {
+                    var errorMessage = "No valid message received from loaded iframe for iframe name " + iframeName;
+                    log(errorMessage, "error");
+                    callback({
+                        error: errorMessage
+                    });
+                }, 1000);
+            }
+        });
+
+        // Listen for messages coming from this iframe.  When a message has been received, cancel the timer
+        // that declares the upload a failure if a message is not received within a reasonable amount of time.
+        corsMessageReceiver.receiveMessage(iframeName, function(message) {
+            log("Received the following window message: '" + message + "'");
+            var fileId = getFileIdForIframeName(iframeName),
+                response = internalApi.parseJsonResponse(fileId, message),
+                uuid = response.uuid,
+                onloadCallback;
+
+            if (uuid && onloadCallbacks[uuid]) {
+                log("Handling response for iframe name " + iframeName);
+                clearTimeout(postMessageCallbackTimers[iframeName]);
+                delete postMessageCallbackTimers[iframeName];
+
+                internalApi.detachLoadEvent(iframeName);
+
+                onloadCallback = onloadCallbacks[uuid];
+
+                delete onloadCallbacks[uuid];
+                corsMessageReceiver.stopReceivingMessages(iframeName);
+                onloadCallback(response);
+            }
+            else if (!uuid) {
+                log("'" + message + "' does not contain a UUID - ignoring.");
+            }
+        });
+    }
+
+    /**
+     * Generates an iframe to be used as a target for upload-related form submits.  This also adds the iframe
+     * to the current `document`.  Note that the iframe is hidden from view.
+     *
+     * @param name Name of the iframe.
+     * @returns {HTMLIFrameElement} The created iframe
+     */
+    function initIframeForUpload(name) {
+        var iframe = qq.toElement("<iframe src='javascript:false;' name='" + name + "' />");
+
+        iframe.setAttribute("id", name);
+
+        iframe.style.display = "none";
+        document.body.appendChild(iframe);
+
+        return iframe;
+    }
+
+    /**
+     * @param iframeName `document`-unique Name of the associated iframe
+     * @returns {*} ID of the associated file
+     */
+    function getFileIdForIframeName(iframeName) {
+        return iframeName.split("_")[0];
+    }
+
+
+// INTERNAL API
+
+    qq.extend(internalApi, {
+        /**
+         * @param fileId ID of the associated file
+         * @returns {string} The `document`-unique name of the iframe
+         */
+        getIframeName: function(fileId) {
+            return fileId + "_" + formHandlerInstanceId;
+        },
+
+        /**
+         * Creates an iframe with a specific document-unique name.
+         *
+         * @param id ID of the associated file
+         * @returns {HTMLIFrameElement}
+         */
+        createIframe: function(id) {
+            var iframeName = internalApi.getIframeName(id);
+
+            return initIframeForUpload(iframeName);
+        },
+
+        /**
+         * @param id ID of the associated file
+         * @param innerHtmlOrMessage JSON message
+         * @returns {*} The parsed response, or an empty object if the response could not be parsed
+         */
+        parseJsonResponse: function(id, innerHtmlOrMessage) {
+            var response;
+
+            try {
+                response = qq.parseJson(innerHtmlOrMessage);
+
+                if (response.newUuid !== undefined) {
+                    onUuidChanged(id, response.newUuid);
+                }
+            }
+            catch(error) {
+                log("Error when attempting to parse iframe upload response (" + error.message + ")", "error");
+                response = {};
+            }
+
+            return response;
+        },
+
+        /**
+         * Generates a form element and appends it to the `document`.  When the form is submitted, a specific iframe is targeted.
+         * The name of the iframe is passed in as a property of the spec parameter, and must be unique in the `document`.  Note
+         * that the form is hidden from view.
+         *
+         * @param spec An object containing various properties to be used when constructing the form.  Required properties are
+         * currently: `method`, `endpoint`, `params`, `paramsInBody`, and `targetName`.
+         * @returns {HTMLFormElement} The created form
+         */
+        initFormForUpload: function(spec) {
+            var method = spec.method,
+                endpoint = spec.endpoint,
+                params = spec.params,
+                paramsInBody = spec.paramsInBody,
+                targetName = spec.targetName,
+                form = qq.toElement("<form method='" + method + "' enctype='multipart/form-data'></form>"),
+                url = endpoint;
+
+            if (paramsInBody) {
+                qq.obj2Inputs(params, form);
+            }
+            else {
+                url = qq.obj2url(params, endpoint);
+            }
+
+            form.setAttribute("action", url);
+            form.setAttribute("target", targetName);
+            form.style.display = "none";
+            document.body.appendChild(form);
+
+            return form;
+        },
+
+        /**
+         * This function either delegates to a more specific message handler if CORS is involved,
+         * or simply registers a callback when the iframe has been loaded that invokes the passed callback
+         * after determining if the content of the iframe is accessible.
+         *
+         * @param iframe Associated iframe
+         * @param callback Callback to invoke after we have determined if the iframe content is accessible.
+         */
+        attachLoadEvent: function(iframe, callback) {
+            /*jslint eqeq: true*/
+            var responseDescriptor;
+
+            if (isCors) {
+                registerPostMessageCallback(iframe, callback);
+            }
+            else {
+                detachLoadEvents[iframe.id] = qq(iframe).attach("load", function(){
+                    log("Received response for " + iframe.id);
+
+                    // when we remove iframe from dom
+                    // the request stops, but in IE load
+                    // event fires
+                    if (!iframe.parentNode){
+                        return;
+                    }
+
+                    try {
+                        // fixing Opera 10.53
+                        if (iframe.contentDocument &&
+                            iframe.contentDocument.body &&
+                            iframe.contentDocument.body.innerHTML == "false"){
+                            // In Opera event is fired second time
+                            // when body.innerHTML changed from false
+                            // to server response approx. after 1 sec
+                            // when we upload file with iframe
+                            return;
+                        }
+                    }
+                    catch (error) {
+                        //IE may throw an "access is denied" error when attempting to access contentDocument on the iframe in some cases
+                        log("Error when attempting to access iframe during handling of upload response (" + error.message + ")", "error");
+                        responseDescriptor = {success: false};
+                    }
+
+                    callback(responseDescriptor);
+                });
+            }
+        },
+
+        /**
+         * Called when we are no longer interested in being notified when an iframe has loaded.
+         *
+         * @param id Associated file ID
+         */
+        detachLoadEvent: function(id) {
+            if (detachLoadEvents[id] !== undefined) {
+                detachLoadEvents[id]();
+                delete detachLoadEvents[id];
+            }
+        }
+    });
+
+
+// PUBLIC API
+
+    qq.extend(this, {
+        add: function(id, fileInput) {
+            fileState[id] = {input: fileInput};
+
+            fileInput.setAttribute("name", inputName);
+
+            // remove file input from DOM
+            if (fileInput.parentNode){
+                qq(fileInput).remove();
+            }
+        },
+
+        getInput: function(id) {
+            return fileState[id].input;
+        },
+
+        isValid: function(id) {
+            return fileState[id] !== undefined &&
+                fileState[id].input !== undefined;
+        },
+
+        reset: function() {
+            fileState.length = 0;
+        },
+
+        expunge: function(id) {
+            return expungeFile(id);
+        },
+
+        cancel: function(id) {
+            var onCancelRetVal = onCancel(id, getName(id));
+
+            if (onCancelRetVal instanceof qq.Promise) {
+                return onCancelRetVal.then(function() {
+                    this.expunge(id);
+                });
+            }
+            else if (onCancelRetVal !== false) {
+                this.expunge(id);
+                return true;
+            }
+
+            return false;
+        },
+
+        upload: function(id) {
+            // implementation-specific
+        }
+    });
+};
+
+/* globals qq */
+/**
+ * Common API exposed to creators of XHR handlers.  This is reused and possibly overriding in some cases by specific
+ * XHR upload handlers.
+ *
+ * @param internalApi Object that will be filled with internal API methods
+ * @param spec Options/static values used to configure this handler
+ * @param proxy Callbacks & methods used to query for or push out data/changes
+ * @constructor
+ */
+qq.UploadHandlerXhrApi = function(internalApi, spec, proxy) {
+    "use strict";
+
+    var publicApi = this,
+        fileState = spec.fileState,
+        chunking = spec.chunking,
+        onUpload = proxy.onUpload,
+        onCancel = proxy.onCancel,
+        onUuidChanged = proxy.onUuidChanged,
+        getName = proxy.getName,
+        getSize = proxy.getSize,
+        log = proxy.log;
+
+
+    function getChunk(fileOrBlob, startByte, endByte) {
+        if (fileOrBlob.slice) {
+            return fileOrBlob.slice(startByte, endByte);
+        }
+        else if (fileOrBlob.mozSlice) {
+            return fileOrBlob.mozSlice(startByte, endByte);
+        }
+        else if (fileOrBlob.webkitSlice) {
+            return fileOrBlob.webkitSlice(startByte, endByte);
+        }
+    }
+
+    qq.extend(internalApi, {
+        /**
+         * Creates an XHR instance for this file and stores it in the fileState.
+         *
+         * @param id File ID
+         * @returns {XMLHttpRequest}
+         */
+        createXhr: function(id) {
+            var xhr = qq.createXhrInstance();
+
+            fileState[id].xhr = xhr;
+
+            return xhr;
+        },
+
+        /**
+         * @param id ID of the associated file
+         * @returns {number} Number of parts this file can be divided into, or undefined if chunking is not supported in this UA
+         */
+        getTotalChunks: function(id) {
+            if (chunking) {
+                var fileSize = getSize(id),
+                    chunkSize = chunking.partSize;
+
+                return Math.ceil(fileSize / chunkSize);
+            }
+        },
+
+        getChunkData: function(id, chunkIndex) {
+            var chunkSize = chunking.partSize,
+                fileSize = getSize(id),
+                fileOrBlob = publicApi.getFile(id),
+                startBytes = chunkSize * chunkIndex,
+                endBytes = startBytes+chunkSize >= fileSize ? fileSize : startBytes+chunkSize,
+                totalChunks = internalApi.getTotalChunks(id);
+
+            return {
+                part: chunkIndex,
+                start: startBytes,
+                end: endBytes,
+                count: totalChunks,
+                blob: getChunk(fileOrBlob, startBytes, endBytes),
+                size: endBytes - startBytes
+            };
+        },
+
+        getChunkDataForCallback: function(chunkData) {
+            return {
+                partIndex: chunkData.part,
+                startByte: chunkData.start + 1,
+                endByte: chunkData.end,
+                totalParts: chunkData.count
+            };
+        }
+    });
+
+    qq.extend(this, {
+        /**
+         * Adds File or Blob to the queue
+         **/
+        add: function(id, fileOrBlobData) {
+            if (qq.isFile(fileOrBlobData)) {
+                fileState[id] = {file: fileOrBlobData};
+            }
+            else if (qq.isBlob(fileOrBlobData.blob)) {
+                fileState[id] =  {blobData: fileOrBlobData};
+            }
+            else {
+                throw new Error("Passed obj is not a File or BlobData (in qq.UploadHandlerXhr)");
+            }
+        },
+
+        getFile: function(id) {
+            if (fileState[id]) {
+                return fileState[id].file || fileState[id].blobData.blob;
+            }
+        },
+
+        isValid: function(id) {
+            return fileState[id] !== undefined;
+        },
+
+        reset: function() {
+            fileState.length = 0;
+        },
+
+        expunge: function(id) {
+            var xhr = fileState[id].xhr;
+
+            if (xhr) {
+                xhr.onreadystatechange = null;
+                xhr.abort();
+            }
+
+            delete fileState[id];
+        },
+
+        /**
+         * Sends the file identified by id to the server
+         */
+        upload: function(id, retry) {
+            fileState[id] && delete fileState[id].paused;
+            return onUpload(id, retry);
+        },
+
+        cancel: function(id) {
+            var onCancelRetVal = onCancel(id, getName(id));
+
+            if (onCancelRetVal instanceof qq.Promise) {
+                return onCancelRetVal.then(function() {
+                    this.expunge(id);
+                });
+            }
+            else if (onCancelRetVal !== false) {
+                this.expunge(id);
+                return true;
+            }
+
+            return false;
+        },
+
+        pause: function(id) {
+            var xhr = fileState[id].xhr;
+
+            if(xhr) {
+                log(qq.format("Aborting XHR upload for {} '{}' due to pause instruction.", id, getName(id)));
+                fileState[id].paused = true;
+                xhr.abort();
+                return true;
+            }
+        }
+    });
+};
+
+/*globals qq */
+/*jshint -W117 */
+qq.WindowReceiveMessage = function(o) {
+    "use strict";
+
+    var options = {
+            log: function(message, level) {}
+        },
+        callbackWrapperDetachers = {};
+
+    qq.extend(options, o);
+
+    qq.extend(this, {
+        receiveMessage : function(id, callback) {
+            var onMessageCallbackWrapper = function(event) {
+                    callback(event.data);
+                };
+
+            if (window.postMessage) {
+                callbackWrapperDetachers[id] = qq(window).attach("message", onMessageCallbackWrapper);
+            }
+            else {
+                log("iframe message passing not supported in this browser!", "error");
+            }
+        },
+
+        stopReceivingMessages : function(id) {
+            if (window.postMessage) {
+                var detacher = callbackWrapperDetachers[id];
+                if (detacher) {
+                    detacher();
+                }
+            }
+        }
+    });
+};
+
+/*globals qq */
+/**
+ * Defines the public API for FineUploader mode.
+ */
+(function(){
+    "use strict";
+
+    qq.uiPublicApi = {
+        clearStoredFiles: function() {
+            this._parent.prototype.clearStoredFiles.apply(this, arguments);
+            this._templating.clearFiles();
+        },
+
+        addExtraDropzone: function(element){
+            this._dnd && this._dnd.setupExtraDropzone(element);
+        },
+
+        removeExtraDropzone: function(element){
+            if (this._dnd) {
+                return this._dnd.removeDropzone(element);
+            }
+        },
+
+        getItemByFileId: function(id) {
+            return this._templating.getFileContainer(id);
+        },
+
+        reset: function() {
+            this._parent.prototype.reset.apply(this, arguments);
+            this._templating.reset();
+
+            if (!this._options.button && this._templating.getButton()) {
+                this._defaultButtonId = this._createUploadButton({element: this._templating.getButton()}).getButtonId();
+            }
+
+            if (this._dnd) {
+                this._dnd.dispose();
+                this._dnd = this._setupDragAndDrop();
+            }
+
+            this._totalFilesInBatch = 0;
+            this._filesInBatchAddedToUi = 0;
+
+            this._setupClickAndEditEventHandlers();
+        },
+
+        pauseUpload: function(id) {
+            var paused = this._parent.prototype.pauseUpload.apply(this, arguments);
+
+            paused && this._templating.uploadPaused(id);
+            return paused;
+        },
+
+        continueUpload: function(id) {
+            var continued = this._parent.prototype.continueUpload.apply(this, arguments);
+
+            continued && this._templating.uploadContinued(id);
+            return continued;
+        },
+
+        getId: function(fileContainerOrChildEl) {
+            return this._templating.getFileId(fileContainerOrChildEl);
+        },
+
+        getDropTarget: function(fileId) {
+            var file = this.getFile(fileId);
+
+            return file.qqDropTarget;
+        }
+    };
+
+
+
+
+    /**
+     * Defines the private (internal) API for FineUploader mode.
+     */
+    qq.uiPrivateApi = {
+        _getButton: function(buttonId) {
+            var button = this._parent.prototype._getButton.apply(this, arguments);
+
+            if (!button) {
+                if (buttonId === this._defaultButtonId) {
+                    button = this._templating.getButton();
+                }
+            }
+
+            return button;
+        },
+
+        _removeFileItem: function(fileId) {
+            this._templating.removeFile(fileId);
+        },
+
+        _setupClickAndEditEventHandlers: function() {
+            this._fileButtonsClickHandler = qq.FileButtonsClickHandler && this._bindFileButtonsClickEvent();
+
+            // A better approach would be to check specifically for focusin event support by querying the DOM API,
+            // but the DOMFocusIn event is not exposed as a property, so we have to resort to UA string sniffing.
+            this._focusinEventSupported = !qq.firefox();
+
+            if (this._isEditFilenameEnabled())
+            {
+                this._filenameClickHandler = this._bindFilenameClickEvent();
+                this._filenameInputFocusInHandler = this._bindFilenameInputFocusInEvent();
+                this._filenameInputFocusHandler = this._bindFilenameInputFocusEvent();
+            }
+        },
+
+        _setupDragAndDrop: function() {
+            var self = this,
+                dropZoneElements = this._options.dragAndDrop.extraDropzones,
+                templating = this._templating,
+                defaultDropZone = templating.getDropZone();
+
+            defaultDropZone && dropZoneElements.push(defaultDropZone);
+
+            return new qq.DragAndDrop({
+                dropZoneElements: dropZoneElements,
+                allowMultipleItems: this._options.multiple,
+                classes: {
+                    dropActive: this._options.classes.dropActive
+                },
+                callbacks: {
+                    processingDroppedFiles: function() {
+                        templating.showDropProcessing();
+                    },
+                    processingDroppedFilesComplete: function(files, targetEl) {
+                        templating.hideDropProcessing();
+
+                        qq.each(files, function(idx, file) {
+                            file.qqDropTarget = targetEl;
+                        });
+
+                        if (files) {
+                            self.addFiles(files, null, null);
+                        }
+                    },
+                    dropError: function(code, errorData) {
+                        self._itemError(code, errorData);
+                    },
+                    dropLog: function(message, level) {
+                        self.log(message, level);
+                    }
+                }
+            });
+        },
+
+        _bindFileButtonsClickEvent: function() {
+            var self = this;
+
+            return new qq.FileButtonsClickHandler({
+                templating: this._templating,
+
+                log: function(message, lvl) {
+                    self.log(message, lvl);
+                },
+
+                onDeleteFile: function(fileId) {
+                    self.deleteFile(fileId);
+                },
+
+                onCancel: function(fileId) {
+                    self.cancel(fileId);
+                },
+
+                onRetry: function(fileId) {
+                    qq(self._templating.getFileContainer(fileId)).removeClass(self._classes.retryable);
+                    self.retry(fileId);
+                },
+
+                onPause: function(fileId) {
+                    self.pauseUpload(fileId);
+                },
+
+                onContinue: function(fileId) {
+                    self.continueUpload(fileId);
+                },
+
+                onGetName: function(fileId) {
+                    return self.getName(fileId);
+                }
+            });
+        },
+
+        _isEditFilenameEnabled: function() {
+            /*jshint -W014 */
+            return this._templating.isEditFilenamePossible()
+                && !this._options.autoUpload
+                && qq.FilenameClickHandler
+                && qq.FilenameInputFocusHandler
+                && qq.FilenameInputFocusHandler;
+        },
+
+        _filenameEditHandler: function() {
+            var self = this,
+                templating = this._templating;
+
+            return {
+                templating: templating,
+                log: function(message, lvl) {
+                    self.log(message, lvl);
+                },
+                onGetUploadStatus: function(fileId) {
+                    return self.getUploads({id: fileId}).status;
+                },
+                onGetName: function(fileId) {
+                    return self.getName(fileId);
+                },
+                onSetName: function(id, newName) {
+                    var formattedFilename = self._options.formatFileName(newName);
+
+                    templating.updateFilename(id, formattedFilename);
+                    self.setName(id, newName);
+                },
+                onEditingStatusChange: function(id, isEditing) {
+                    var qqInput = qq(templating.getEditInput(id)),
+                        qqFileContainer = qq(templating.getFileContainer(id));
+
+                    if (isEditing) {
+                        qqInput.addClass("qq-editing");
+                        templating.hideFilename(id);
+                        templating.hideEditIcon(id);
+                    }
+                    else {
+                        qqInput.removeClass("qq-editing");
+                        templating.showFilename(id);
+                        templating.showEditIcon(id);
+                    }
+
+                    // Force IE8 and older to repaint
+                    qqFileContainer.addClass("qq-temp").removeClass("qq-temp");
+                }
+            };
+        },
+
+        _onUploadStatusChange: function(id, oldStatus, newStatus) {
+            this._parent.prototype._onUploadStatusChange.apply(this, arguments);
+
+            if (this._isEditFilenameEnabled()) {
+                // Status for a file exists before it has been added to the DOM, so we must be careful here.
+                if (this._templating.getFileContainer(id) && newStatus !== qq.status.SUBMITTED) {
+                    this._templating.markFilenameEditable(id);
+                    this._templating.hideEditIcon(id);
+                }
+            }
+        },
+
+        _bindFilenameInputFocusInEvent: function() {
+            var spec = qq.extend({}, this._filenameEditHandler());
+
+            return new qq.FilenameInputFocusInHandler(spec);
+        },
+
+        _bindFilenameInputFocusEvent: function() {
+            var spec = qq.extend({}, this._filenameEditHandler());
+
+            return new qq.FilenameInputFocusHandler(spec);
+        },
+
+        _bindFilenameClickEvent: function() {
+            var spec = qq.extend({}, this._filenameEditHandler());
+
+            return new qq.FilenameClickHandler(spec);
+        },
+
+        _storeForLater: function(id) {
+            this._parent.prototype._storeForLater.apply(this, arguments);
+            this._templating.hideSpinner(id);
+        },
+
+        _onSubmit: function(id, name) {
+            this._parent.prototype._onSubmit.apply(this, arguments);
+            this._addToList(id, name);
+        },
+
+        // The file item has been added to the DOM.
+        _onSubmitted: function(id) {
+            // If the edit filename feature is enabled, mark the filename element as "editable" and the associated edit icon
+            if (this._isEditFilenameEnabled()) {
+                this._templating.markFilenameEditable(id);
+                this._templating.showEditIcon(id);
+
+                // If the focusin event is not supported, we must add a focus handler to the newly create edit filename text input
+                if (!this._focusinEventSupported) {
+                    this._filenameInputFocusHandler.addHandler(this._templating.getEditInput(id));
+                }
+            }
+        },
+
+        // Update the progress bar & percentage as the file is uploaded
+        _onProgress: function(id, name, loaded, total){
+            this._parent.prototype._onProgress.apply(this, arguments);
+
+            this._templating.updateProgress(id, loaded, total);
+
+            if (loaded === total) {
+                this._templating.hideCancel(id);
+                this._templating.hidePause(id);
+
+                this._templating.setStatusText(id, this._options.text.waitingForResponse);
+
+                // If last byte was sent, display total file size
+                this._displayFileSize(id);
+            }
+            else {
+                // If still uploading, display percentage - total size is actually the total request(s) size
+                this._displayFileSize(id, loaded, total);
+            }
+        },
+
+        _onComplete: function(id, name, result, xhr) {
+            var parentRetVal = this._parent.prototype._onComplete.apply(this, arguments),
+                templating = this._templating,
+                self = this;
+
+            function completeUpload(result) {
+                templating.setStatusText(id);
+
+                qq(templating.getFileContainer(id)).removeClass(self._classes.retrying);
+                templating.hideProgress(id);
+
+                if (!self._options.disableCancelForFormUploads || qq.supportedFeatures.ajaxUploading) {
+                    templating.hideCancel(id);
+                }
+                templating.hideSpinner(id);
+
+                if (result.success) {
+                    self._markFileAsSuccessful(id);
+                }
+                else {
+                    qq(templating.getFileContainer(id)).addClass(self._classes.fail);
+
+                    if (self._templating.isRetryPossible() && !self._preventRetries[id]) {
+                        qq(templating.getFileContainer(id)).addClass(self._classes.retryable);
+                    }
+                    self._controlFailureTextDisplay(id, result);
+                }
+            }
+
+            // The parent may need to perform some async operation before we can accurately determine the status of the upload.
+            if (parentRetVal instanceof qq.Promise) {
+                parentRetVal.done(function(newResult) {
+                    completeUpload(newResult);
+                });
+
+            }
+            else {
+                completeUpload(result);
+            }
+
+            return parentRetVal;
+        },
+
+        _markFileAsSuccessful: function(id) {
+            var templating = this._templating;
+
+            if (this._isDeletePossible()) {
+                templating.showDeleteButton(id);
+            }
+
+            qq(templating.getFileContainer(id)).addClass(this._classes.success);
+
+            this._maybeUpdateThumbnail(id);
+        },
+
+        _onUpload: function(id, name){
+            var parentRetVal = this._parent.prototype._onUpload.apply(this, arguments);
+
+            this._templating.showSpinner(id);
+
+            return parentRetVal;
+        },
+
+        _onUploadChunk: function(id, chunkData) {
+            this._parent.prototype._onUploadChunk.apply(this, arguments);
+
+            // Only display the pause button if we have finished uploading at least one chunk
+            chunkData.partIndex > 0 && this._templating.allowPause(id);
+        },
+
+        _onCancel: function(id, name) {
+            this._parent.prototype._onCancel.apply(this, arguments);
+            this._removeFileItem(id);
+        },
+
+        _onBeforeAutoRetry: function(id) {
+            var retryNumForDisplay, maxAuto, retryNote;
+
+            this._parent.prototype._onBeforeAutoRetry.apply(this, arguments);
+
+            this._showCancelLink(id);
+
+            if (this._options.retry.showAutoRetryNote) {
+                retryNumForDisplay = this._autoRetries[id] + 1;
+                maxAuto = this._options.retry.maxAutoAttempts;
+
+                retryNote = this._options.retry.autoRetryNote.replace(/\{retryNum\}/g, retryNumForDisplay);
+                retryNote = retryNote.replace(/\{maxAuto\}/g, maxAuto);
+
+                this._templating.setStatusText(id, retryNote);
+                qq(this._templating.getFileContainer(id)).addClass(this._classes.retrying);
+            }
+        },
+
+        //return false if we should not attempt the requested retry
+        _onBeforeManualRetry: function(id) {
+            if (this._parent.prototype._onBeforeManualRetry.apply(this, arguments)) {
+                this._templating.resetProgress(id);
+                qq(this._templating.getFileContainer(id)).removeClass(this._classes.fail);
+                this._templating.setStatusText(id);
+                this._templating.showSpinner(id);
+                this._showCancelLink(id);
+                return true;
+            }
+            else {
+                qq(this._templating.getFileContainer(id)).addClass(this._classes.retryable);
+                return false;
+            }
+        },
+
+        _onSubmitDelete: function(id) {
+            var onSuccessCallback = qq.bind(this._onSubmitDeleteSuccess, this);
+
+            this._parent.prototype._onSubmitDelete.call(this, id, onSuccessCallback);
+        },
+
+        _onSubmitDeleteSuccess: function(id, uuid, additionalMandatedParams) {
+            if (this._options.deleteFile.forceConfirm) {
+                this._showDeleteConfirm.apply(this, arguments);
+            }
+            else {
+                this._sendDeleteRequest.apply(this, arguments);
+            }
+        },
+
+        _onDeleteComplete: function(id, xhr, isError) {
+            this._parent.prototype._onDeleteComplete.apply(this, arguments);
+
+            this._templating.hideSpinner(id);
+
+            if (isError) {
+                this._templating.setStatusText(id, this._options.deleteFile.deletingFailedText);
+                this._templating.showDeleteButton(id);
+            }
+            else {
+                this._removeFileItem(id);
+            }
+        },
+
+        _sendDeleteRequest: function(id, uuid, additionalMandatedParams) {
+            this._templating.hideDeleteButton(id);
+            this._templating.showSpinner(id);
+            this._templating.setStatusText(id, this._options.deleteFile.deletingStatusText);
+            this._deleteHandler.sendDelete.apply(this, arguments);
+        },
+
+        _showDeleteConfirm: function(id, uuid, mandatedParams) {
+            /*jshint -W004 */
+            var fileName = this.getName(id),
+                confirmMessage = this._options.deleteFile.confirmMessage.replace(/\{filename\}/g, fileName),
+                uuid = this.getUuid(id),
+                deleteRequestArgs = arguments,
+                self = this,
+                retVal;
+
+            retVal = this._options.showConfirm(confirmMessage);
+
+            if (retVal instanceof qq.Promise) {
+                retVal.then(function () {
+                    self._sendDeleteRequest.apply(self, deleteRequestArgs);
+                });
+            }
+            else if (retVal !== false) {
+                self._sendDeleteRequest.apply(self, deleteRequestArgs);
+            }
+        },
+
+        _addToList: function(id, name, canned) {
+            var prependData,
+                prependIndex = 0;
+
+            if (this._options.display.prependFiles) {
+                if (this._totalFilesInBatch > 1 && this._filesInBatchAddedToUi > 0) {
+                    prependIndex = this._filesInBatchAddedToUi - 1;
+                }
+
+                prependData = {
+                    index: prependIndex
+                };
+            }
+
+            if (!canned) {
+                if (this._options.disableCancelForFormUploads && !qq.supportedFeatures.ajaxUploading) {
+                    this._templating.disableCancel();
+                }
+
+                if (!this._options.multiple) {
+                    this._handler.cancelAll();
+                    this._clearList();
+                }
+            }
+
+            this._templating.addFile(id, this._options.formatFileName(name), prependData);
+
+            if (canned) {
+                this._thumbnailUrls[id] && this._templating.updateThumbnail(id, this._thumbnailUrls[id], true);
+            }
+            else {
+                this._templating.generatePreview(id, this.getFile(id));
+            }
+
+            this._filesInBatchAddedToUi += 1;
+
+            if (this._options.display.fileSizeOnSubmit && qq.supportedFeatures.ajaxUploading) {
+                this._displayFileSize(id);
+            }
+        },
+
+        _clearList: function(){
+            this._templating.clearFiles();
+            this.clearStoredFiles();
+        },
+
+        _displayFileSize: function(id, loadedSize, totalSize) {
+            var size = this.getSize(id),
+                sizeForDisplay = this._formatSize(size);
+
+            if (size >= 0) {
+                if (loadedSize !== undefined && totalSize !== undefined) {
+                    sizeForDisplay = this._formatProgress(loadedSize, totalSize);
+                }
+
+                this._templating.updateSize(id, sizeForDisplay);
+            }
+        },
+
+        _formatProgress: function (uploadedSize, totalSize) {
+            var message = this._options.text.formatProgress;
+            function r(name, replacement) { message = message.replace(name, replacement); }
+
+            r("{percent}", Math.round(uploadedSize / totalSize * 100));
+            r("{total_size}", this._formatSize(totalSize));
+            return message;
+        },
+
+        _controlFailureTextDisplay: function(id, response) {
+            var mode, maxChars, responseProperty, failureReason, shortFailureReason;
+
+            mode = this._options.failedUploadTextDisplay.mode;
+            maxChars = this._options.failedUploadTextDisplay.maxChars;
+            responseProperty = this._options.failedUploadTextDisplay.responseProperty;
+
+            if (mode === "custom") {
+                failureReason = response[responseProperty];
+                if (failureReason) {
+                    if (failureReason.length > maxChars) {
+                        shortFailureReason = failureReason.substring(0, maxChars) + "...";
+                    }
+                }
+                else {
+                    failureReason = this._options.text.failUpload;
+                    this.log("'" + responseProperty + "' is not a valid property on the server response.", "warn");
+                }
+
+                this._templating.setStatusText(id, shortFailureReason || failureReason);
+
+                if (this._options.failedUploadTextDisplay.enableTooltip) {
+                    this._showTooltip(id, failureReason);
+                }
+            }
+            else if (mode === "default") {
+                this._templating.setStatusText(id, this._options.text.failUpload);
+            }
+            else if (mode !== "none") {
+                this.log("failedUploadTextDisplay.mode value of '" + mode + "' is not valid", "warn");
+            }
+        },
+
+        _showTooltip: function(id, text) {
+            this._templating.getFileContainer(id).title = text;
+        },
+
+        _showCancelLink: function(id) {
+            if (!this._options.disableCancelForFormUploads || qq.supportedFeatures.ajaxUploading) {
+                this._templating.showCancel(id);
+            }
+        },
+
+        _itemError: function(code, name, item) {
+            var message = this._parent.prototype._itemError.apply(this, arguments);
+            this._options.showMessage(message);
+        },
+
+        _batchError: function(message) {
+            this._parent.prototype._batchError.apply(this, arguments);
+            this._options.showMessage(message);
+        },
+
+        _setupPastePrompt: function() {
+            var self = this;
+
+            this._options.callbacks.onPasteReceived = function() {
+                var message = self._options.paste.namePromptMessage,
+                    defaultVal = self._options.paste.defaultName;
+
+                return self._options.showPrompt(message, defaultVal);
+            };
+        },
+
+        _fileOrBlobRejected: function(id, name) {
+            this._totalFilesInBatch -= 1;
+            this._parent.prototype._fileOrBlobRejected.apply(this, arguments);
+        },
+
+        _prepareItemsForUpload: function(items, params, endpoint) {
+            this._totalFilesInBatch = items.length;
+            this._filesInBatchAddedToUi = 0;
+            this._parent.prototype._prepareItemsForUpload.apply(this, arguments);
+        },
+
+        _maybeUpdateThumbnail: function(fileId) {
+            var thumbnailUrl = this._thumbnailUrls[fileId];
+
+            this._templating.updateThumbnail(fileId, thumbnailUrl);
+        },
+
+        _addCannedFile: function(sessionData) {
+            var id = this._parent.prototype._addCannedFile.apply(this, arguments);
+
+            this._addToList(id, this.getName(id), true);
+            this._templating.hideSpinner(id);
+            this._templating.hideCancel(id);
+            this._markFileAsSuccessful(id);
+
+            return id;
+        }
+    };
+}());
+
+/*globals qq */
+/**
+ * This defines FineUploader mode, which is a default UI w/ drag & drop uploading.
+ */
+qq.FineUploader = function(o, namespace) {
+    "use strict";
+
+    // By default this should inherit instance data from FineUploaderBasic, but this can be overridden
+    // if the (internal) caller defines a different parent.  The parent is also used by
+    // the private and public API functions that need to delegate to a parent function.
+    this._parent = namespace ? qq[namespace].FineUploaderBasic : qq.FineUploaderBasic;
+    this._parent.apply(this, arguments);
+
+    // Options provided by FineUploader mode
+    qq.extend(this._options, {
+        element: null,
+
+        button: null,
+
+        listElement: null,
+
+        dragAndDrop: {
+            extraDropzones: []
+        },
+
+        text: {
+            formatProgress: "{percent}% of {total_size}",
+            failUpload: "Upload failed",
+            waitingForResponse: "Processing...",
+            paused: "Paused"
+        },
+
+        template: "qq-template",
+
+        classes: {
+            retrying: "qq-upload-retrying",
+            retryable: "qq-upload-retryable",
+            success: "qq-upload-success",
+            fail: "qq-upload-fail",
+            editable: "qq-editable",
+            hide: "qq-hide",
+            dropActive: "qq-upload-drop-area-active"
+        },
+
+        failedUploadTextDisplay: {
+            mode: "default", //default, custom, or none
+            maxChars: 50,
+            responseProperty: "error",
+            enableTooltip: true
+        },
+
+        messages: {
+            tooManyFilesError: "You may only drop one file",
+            unsupportedBrowser: "Unrecoverable error - this browser does not permit file uploading of any kind."
+        },
+
+        retry: {
+            showAutoRetryNote: true,
+            autoRetryNote: "Retrying {retryNum}/{maxAuto}..."
+        },
+
+        deleteFile: {
+            forceConfirm: false,
+            confirmMessage: "Are you sure you want to delete {filename}?",
+            deletingStatusText: "Deleting...",
+            deletingFailedText: "Delete failed"
+
+        },
+
+        display: {
+            fileSizeOnSubmit: false,
+            prependFiles: false
+        },
+
+        paste: {
+            promptForName: false,
+            namePromptMessage: "Please name this image"
+        },
+
+        thumbnails: {
+            placeholders: {
+                waitUntilResponse: false,
+                notAvailablePath: null,
+                waitingPath: null
+            }
+        },
+
+        showMessage: function(message){
+            setTimeout(function() {
+                window.alert(message);
+            }, 0);
+        },
+
+        showConfirm: function(message) {
+            return window.confirm(message);
+        },
+
+        showPrompt: function(message, defaultValue) {
+            return window.prompt(message, defaultValue);
+        }
+    }, true);
+
+    // Replace any default options with user defined ones
+    qq.extend(this._options, o, true);
+
+    this._templating = new qq.Templating({
+        log: qq.bind(this.log, this),
+        templateIdOrEl: this._options.template,
+        containerEl: this._options.element,
+        fileContainerEl: this._options.listElement,
+        button: this._options.button,
+        imageGenerator: this._imageGenerator,
+        classes: {
+            hide: this._options.classes.hide,
+            editable: this._options.classes.editable
+        },
+        placeholders: {
+            waitUntilUpdate: this._options.thumbnails.placeholders.waitUntilResponse,
+            thumbnailNotAvailable: this._options.thumbnails.placeholders.notAvailablePath,
+            waitingForThumbnail: this._options.thumbnails.placeholders.waitingPath
+        },
+        text: this._options.text
+    });
+
+    if (!qq.supportedFeatures.uploading || (this._options.cors.expected && !qq.supportedFeatures.uploadCors)) {
+        this._templating.renderFailure(this._options.messages.unsupportedBrowser);
+    }
+    else {
+        this._wrapCallbacks();
+
+        this._templating.render();
+
+        this._classes = this._options.classes;
+
+        if (!this._options.button && this._templating.getButton()) {
+            this._defaultButtonId = this._createUploadButton({element: this._templating.getButton()}).getButtonId();
+        }
+
+        this._setupClickAndEditEventHandlers();
+
+        if (qq.DragAndDrop && qq.supportedFeatures.fileDrop) {
+            this._dnd = this._setupDragAndDrop();
+        }
+
+        if (this._options.paste.targetElement && this._options.paste.promptForName) {
+            if (qq.PasteSupport) {
+                this._setupPastePrompt();
+            }
+            else {
+                qq.log("Paste support module not found.", "info");
+            }
+        }
+
+        this._totalFilesInBatch = 0;
+        this._filesInBatchAddedToUi = 0;
+    }
+};
+
+// Inherit the base public & private API methods
+qq.extend(qq.FineUploader.prototype, qq.basePublicApi);
+qq.extend(qq.FineUploader.prototype, qq.basePrivateApi);
+
+// Add the FineUploader/default UI public & private UI methods, which may override some base methods.
+qq.extend(qq.FineUploader.prototype, qq.uiPublicApi);
+qq.extend(qq.FineUploader.prototype, qq.uiPrivateApi);
+
+/* globals qq */
+/* jshint -W065 */
+/**
+ * Module responsible for rendering all Fine Uploader UI templates.  This module also asserts at least
+ * a limited amount of control over the template elements after they are added to the DOM.
+ * Wherever possible, this module asserts total control over template elements present in the DOM.
+ *
+ * @param spec Specification object used to control various templating behaviors
+ * @constructor
+ */
+qq.Templating = function(spec) {
+    "use strict";
+
+    var FILE_ID_ATTR = "qq-file-id",
+        FILE_CLASS_PREFIX = "qq-file-id-",
+        THUMBNAIL_MAX_SIZE_ATTR = "qq-max-size",
+        THUMBNAIL_SERVER_SCALE_ATTR = "qq-server-scale",
+        // This variable is duplicated in the DnD module since it can function as a standalone as well
+        HIDE_DROPZONE_ATTR = "qq-hide-dropzone",
+        isCancelDisabled = false,
+        thumbnailMaxSize = -1,
+        options = {
+            log: null,
+            templateIdOrEl: "qq-template",
+            containerEl: null,
+            fileContainerEl: null,
+            button: null,
+            imageGenerator: null,
+            classes: {
+                hide: "qq-hide",
+                editable: "qq-editable"
+            },
+            placeholders: {
+                waitUntilUpdate: false,
+                thumbnailNotAvailable: null,
+                waitingForThumbnail: null
+            },
+            text: {
+                paused: "Paused"
+            }
+        },
+        selectorClasses = {
+            button: "qq-upload-button-selector",
+            drop: "qq-upload-drop-area-selector",
+            list: "qq-upload-list-selector",
+            progressBarContainer: "qq-progress-bar-container-selector",
+            progressBar: "qq-progress-bar-selector",
+            file: "qq-upload-file-selector",
+            spinner: "qq-upload-spinner-selector",
+            size: "qq-upload-size-selector",
+            cancel: "qq-upload-cancel-selector",
+            pause: "qq-upload-pause-selector",
+            continueButton: "qq-upload-continue-selector",
+            deleteButton: "qq-upload-delete-selector",
+            retry: "qq-upload-retry-selector",
+            statusText: "qq-upload-status-text-selector",
+            editFilenameInput: "qq-edit-filename-selector",
+            editNameIcon: "qq-edit-filename-icon-selector",
+            dropProcessing: "qq-drop-processing-selector",
+            dropProcessingSpinner: "qq-drop-processing-spinner-selector",
+            thumbnail: "qq-thumbnail-selector"
+        },
+        previewGeneration = {},
+        cachedThumbnailNotAvailableImg = new qq.Promise(),
+        cachedWaitingForThumbnailImg = new qq.Promise(),
+        log,
+        isEditElementsExist,
+        isRetryElementExist,
+        templateHtml,
+        container,
+        fileList,
+        showThumbnails,
+        serverScale;
+
+    /**
+     * Grabs the HTML from the script tag holding the template markup.  This function will also adjust
+     * some internally-tracked state variables based on the contents of the template.
+     * The template is filtered so that irrelevant elements (such as the drop zone if DnD is not supported)
+     * are omitted from the DOM.  Useful errors will be thrown if the template cannot be parsed.
+     *
+     * @returns {{template: *, fileTemplate: *}} HTML for the top-level file items templates
+     */
+    function parseAndGetTemplate() {
+        var scriptEl,
+            scriptHtml,
+            fileListNode,
+            tempTemplateEl,
+            fileListHtml,
+            defaultButton,
+            dropArea,
+            thumbnail,
+            dropProcessing;
+
+        log("Parsing template");
+
+        /*jshint -W116*/
+        if (options.templateIdOrEl == null) {
+            throw new Error("You MUST specify either a template element or ID!");
+        }
+
+        // Grab the contents of the script tag holding the template.
+        if (qq.isString(options.templateIdOrEl)) {
+            scriptEl = document.getElementById(options.templateIdOrEl);
+
+            if (scriptEl === null) {
+                throw new Error(qq.format("Cannot find template script at ID '{}'!", options.templateIdOrEl));
+            }
+
+            scriptHtml = scriptEl.innerHTML;
+        }
+        else {
+            if (options.templateIdOrEl.innerHTML === undefined) {
+                throw new Error("You have specified an invalid value for the template option!  " +
+                    "It must be an ID or an Element.");
+            }
+
+            scriptHtml = options.templateIdOrEl.innerHTML;
+        }
+
+        scriptHtml = qq.trimStr(scriptHtml);
+        tempTemplateEl = document.createElement("div");
+        tempTemplateEl.appendChild(qq.toElement(scriptHtml));
+
+        // Don't include the default template button in the DOM
+        // if an alternate button container has been specified.
+        if (options.button) {
+            defaultButton = qq(tempTemplateEl).getByClass(selectorClasses.button)[0];
+            if (defaultButton) {
+                qq(defaultButton).remove();
+            }
+        }
+
+        // Omit the drop processing element from the DOM if DnD is not supported by the UA,
+        // or the drag and drop module is not found.
+        // NOTE: We are consciously not removing the drop zone if the UA doesn't support DnD
+        // to support layouts where the drop zone is also a container for visible elements,
+        // such as the file list.
+        if (!qq.DragAndDrop || !qq.supportedFeatures.fileDrop) {
+            dropProcessing = qq(tempTemplateEl).getByClass(selectorClasses.dropProcessing)[0];
+            if (dropProcessing) {
+                qq(dropProcessing).remove();
+            }
+
+        }
+
+        dropArea = qq(tempTemplateEl).getByClass(selectorClasses.drop)[0];
+
+        // If DnD is not available then remove
+        // it from the DOM as well.
+        if (dropArea && !qq.DragAndDrop) {
+            qq.log("DnD module unavailable.", "info");
+            qq(dropArea).remove();
+        }
+
+        // If there is a drop area defined in the template, and the current UA doesn't support DnD,
+        // and the drop area is marked as "hide before enter", ensure it is hidden as the DnD module
+        // will not do this (since we will not be loading the DnD module)
+        if (dropArea && !qq.supportedFeatures.fileDrop &&
+            qq(dropArea).hasAttribute(HIDE_DROPZONE_ATTR)) {
+
+            qq(dropArea).css({
+                display: "none"
+            });
+        }
+
+        // Ensure the `showThumbnails` flag is only set if the thumbnail element
+        // is present in the template AND the current UA is capable of generating client-side previews.
+        thumbnail = qq(tempTemplateEl).getByClass(selectorClasses.thumbnail)[0];
+        if (!showThumbnails) {
+            thumbnail && qq(thumbnail).remove();
+        }
+        else if (thumbnail) {
+            thumbnailMaxSize = parseInt(thumbnail.getAttribute(THUMBNAIL_MAX_SIZE_ATTR));
+            // Only enforce max size if the attr value is non-zero
+            thumbnailMaxSize = thumbnailMaxSize > 0 ? thumbnailMaxSize : null;
+
+            serverScale = qq(thumbnail).hasAttribute(THUMBNAIL_SERVER_SCALE_ATTR);
+        }
+        showThumbnails = showThumbnails && thumbnail;
+
+        isEditElementsExist = qq(tempTemplateEl).getByClass(selectorClasses.editFilenameInput).length > 0;
+        isRetryElementExist = qq(tempTemplateEl).getByClass(selectorClasses.retry).length > 0;
+
+        fileListNode = qq(tempTemplateEl).getByClass(selectorClasses.list)[0];
+        /*jshint -W116*/
+        if (fileListNode == null) {
+            throw new Error("Could not find the file list container in the template!");
+        }
+
+        fileListHtml = fileListNode.innerHTML;
+        fileListNode.innerHTML = "";
+
+        log("Template parsing complete");
+
+        return {
+            template: qq.trimStr(tempTemplateEl.innerHTML),
+            fileTemplate: qq.trimStr(fileListHtml)
+        };
+    }
+
+    function getFile(id) {
+        return qq(fileList).getByClass(FILE_CLASS_PREFIX + id)[0];
+    }
+
+    function getTemplateEl(context, cssClass) {
+        return qq(context).getByClass(cssClass)[0];
+    }
+
+    function prependFile(el, index) {
+        var parentEl = fileList,
+            beforeEl = parentEl.firstChild;
+
+        if (index > 0) {
+            beforeEl = qq(parentEl).children()[index].nextSibling;
+
+        }
+
+        parentEl.insertBefore(el, beforeEl);
+    }
+
+    function getCancel(id) {
+        return getTemplateEl(getFile(id), selectorClasses.cancel);
+    }
+
+    function getPause(id) {
+        return getTemplateEl(getFile(id), selectorClasses.pause);
+    }
+
+    function getContinue(id) {
+        return getTemplateEl(getFile(id), selectorClasses.continueButton);
+    }
+
+    function getProgress(id) {
+        return getTemplateEl(getFile(id), selectorClasses.progressBarContainer) ||
+            getTemplateEl(getFile(id), selectorClasses.progressBar);
+    }
+
+    function getSpinner(id) {
+        return getTemplateEl(getFile(id), selectorClasses.spinner);
+    }
+
+    function getEditIcon(id) {
+        return getTemplateEl(getFile(id), selectorClasses.editNameIcon);
+    }
+
+    function getSize(id) {
+        return getTemplateEl(getFile(id), selectorClasses.size);
+    }
+
+    function getDelete(id) {
+        return getTemplateEl(getFile(id), selectorClasses.deleteButton);
+    }
+
+    function getRetry(id) {
+        return getTemplateEl(getFile(id), selectorClasses.retry);
+    }
+
+    function getFilename(id) {
+        return getTemplateEl(getFile(id), selectorClasses.file);
+    }
+
+    function getDropProcessing() {
+        return getTemplateEl(container, selectorClasses.dropProcessing);
+    }
+
+    function getThumbnail(id) {
+        return showThumbnails && getTemplateEl(getFile(id), selectorClasses.thumbnail);
+    }
+
+    function hide(el) {
+        el && qq(el).addClass(options.classes.hide);
+    }
+
+    function show(el) {
+        el && qq(el).removeClass(options.classes.hide);
+    }
+
+    function setProgressBarWidth(id, percent) {
+        var bar = getProgress(id);
+
+        if (bar && !qq(bar).hasClass(selectorClasses.progressBar)) {
+            bar = qq(bar).getByClass(selectorClasses.progressBar)[0];
+        }
+
+        bar && qq(bar).css({width: percent + "%"});
+    }
+
+    // During initialization of the templating module we should cache any
+    // placeholder images so we can quickly swap them into the file list on demand.
+    // Any placeholder images that cannot be loaded/found are simply ignored.
+    function cacheThumbnailPlaceholders() {
+        var notAvailableUrl =  options.placeholders.thumbnailNotAvailable,
+            waitingUrl = options.placeholders.waitingForThumbnail,
+            spec = {
+                maxSize: thumbnailMaxSize,
+                scale: serverScale
+            };
+
+        if (showThumbnails) {
+            if (notAvailableUrl) {
+                options.imageGenerator.generate(notAvailableUrl, new Image(), spec).then(
+                    function(updatedImg) {
+                        cachedThumbnailNotAvailableImg.success(updatedImg);
+                    },
+                    function() {
+                        cachedThumbnailNotAvailableImg.failure();
+                        log("Problem loading 'not available' placeholder image at " + notAvailableUrl, "error");
+                    }
+                );
+            }
+            else {
+                cachedThumbnailNotAvailableImg.failure();
+            }
+
+            if (waitingUrl) {
+                options.imageGenerator.generate(waitingUrl, new Image(), spec).then(
+                    function(updatedImg) {
+                        cachedWaitingForThumbnailImg.success(updatedImg);
+                    },
+                    function() {
+                        cachedWaitingForThumbnailImg.failure();
+                        log("Problem loading 'waiting for thumbnail' placeholder image at " + waitingUrl, "error");
+                    }
+                );
+            }
+            else {
+                cachedWaitingForThumbnailImg.failure();
+            }
+        }
+    }
+
+    // Displays a "waiting for thumbnail" type placeholder image
+    // iff we were able to load it during initialization of the templating module.
+    function displayWaitingImg(thumbnail) {
+        cachedWaitingForThumbnailImg.then(function(img) {
+            maybeScalePlaceholderViaCss(img, thumbnail);
+            /* jshint eqnull:true */
+            if (thumbnail.getAttribute("src") == null) {
+                thumbnail.src = img.src;
+                show(thumbnail);
+            }
+        }, function() {
+            // In some browsers (such as IE9 and older) an img w/out a src attribute
+            // are displayed as "broken" images, so we sohuld just hide the img tag
+            // if we aren't going to display the "waiting" placeholder.
+            hide(thumbnail);
+        });
+    }
+
+    // Displays a "thumbnail not available" type placeholder image
+    // iff we were able to load this placeholder during initialization
+    // of the templating module or after preview generation has failed.
+    function maybeSetDisplayNotAvailableImg(id, thumbnail) {
+        var previewing = previewGeneration[id] || new qq.Promise().failure();
+
+        cachedThumbnailNotAvailableImg.then(function(img) {
+            previewing.then(
+                function() {
+                    delete previewGeneration[id];
+                },
+                function() {
+                    maybeScalePlaceholderViaCss(img, thumbnail);
+                    thumbnail.src = img.src;
+                    show(thumbnail);
+                    delete previewGeneration[id];
+                }
+            );
+        });
+    }
+
+    // Ensures a placeholder image does not exceed any max size specified
+    // via `style` attribute properties iff <canvas> was not used to scale
+    // the placeholder AND the target <img> doesn't already have these `style` attribute properties set.
+    function maybeScalePlaceholderViaCss(placeholder, thumbnail) {
+        var maxWidth = placeholder.style.maxWidth,
+            maxHeight = placeholder.style.maxHeight;
+
+        if (maxHeight && maxWidth && !thumbnail.style.maxWidth && !thumbnail.style.maxHeight) {
+            qq(thumbnail).css({
+                maxWidth: maxWidth,
+                maxHeight: maxHeight
+            });
+        }
+    }
+
+
+    qq.extend(options, spec);
+    log = options.log;
+
+    container = options.containerEl;
+    showThumbnails = options.imageGenerator !== undefined;
+    templateHtml = parseAndGetTemplate();
+
+    cacheThumbnailPlaceholders();
+
+    qq.extend(this, {
+        render: function() {
+            log("Rendering template in DOM.");
+
+            container.innerHTML = templateHtml.template;
+            hide(getDropProcessing());
+            fileList = options.fileContainerEl || getTemplateEl(container, selectorClasses.list);
+
+            log("Template rendering complete");
+        },
+
+        renderFailure: function(message) {
+            var cantRenderEl = qq.toElement(message);
+            container.innerHTML = "";
+            container.appendChild(cantRenderEl);
+        },
+
+        reset: function() {
+            this.render();
+        },
+
+        clearFiles: function() {
+            fileList.innerHTML = "";
+        },
+
+        disableCancel: function() {
+            isCancelDisabled = true;
+        },
+
+        addFile: function(id, name, prependInfo) {
+            var fileEl = qq.toElement(templateHtml.fileTemplate),
+                fileNameEl = getTemplateEl(fileEl, selectorClasses.file);
+
+            qq(fileEl).addClass(FILE_CLASS_PREFIX + id);
+            fileNameEl && qq(fileNameEl).setText(name);
+            fileEl.setAttribute(FILE_ID_ATTR, id);
+
+            if (prependInfo) {
+                prependFile(fileEl, prependInfo.index);
+            }
+            else {
+                fileList.appendChild(fileEl);
+            }
+
+            hide(getProgress(id));
+            hide(getSize(id));
+            hide(getDelete(id));
+            hide(getRetry(id));
+            hide(getPause(id));
+            hide(getContinue(id));
+
+            if (isCancelDisabled) {
+                this.hideCancel(id);
+            }
+        },
+
+        removeFile: function(id) {
+            qq(getFile(id)).remove();
+        },
+
+        getFileId: function(el) {
+            var currentNode = el;
+
+            if (currentNode) {
+                /*jshint -W116*/
+                while (currentNode.getAttribute(FILE_ID_ATTR) == null) {
+                    currentNode = currentNode.parentNode;
+                }
+
+                return parseInt(currentNode.getAttribute(FILE_ID_ATTR));
+            }
+        },
+
+        getFileList: function() {
+            return fileList;
+        },
+
+        markFilenameEditable: function(id) {
+            var filename = getFilename(id);
+
+            filename && qq(filename).addClass(options.classes.editable);
+        },
+
+        updateFilename: function(id, name) {
+            var filename = getFilename(id);
+
+            filename && qq(filename).setText(name);
+        },
+
+        hideFilename: function(id) {
+            hide(getFilename(id));
+        },
+
+        showFilename: function(id) {
+            show(getFilename(id));
+        },
+
+        isFileName: function(el) {
+            return qq(el).hasClass(selectorClasses.file);
+        },
+
+        getButton: function() {
+            return options.button || getTemplateEl(container, selectorClasses.button);
+        },
+
+        hideDropProcessing: function() {
+            hide(getDropProcessing());
+        },
+
+        showDropProcessing: function() {
+            show(getDropProcessing());
+        },
+
+        getDropZone: function() {
+            return getTemplateEl(container, selectorClasses.drop);
+        },
+
+        isEditFilenamePossible: function() {
+            return isEditElementsExist;
+        },
+
+        isRetryPossible: function() {
+            return isRetryElementExist;
+        },
+
+        getFileContainer: function(id) {
+            return getFile(id);
+        },
+
+        showEditIcon: function(id) {
+            var icon = getEditIcon(id);
+
+            icon && qq(icon).addClass(options.classes.editable);
+        },
+
+        hideEditIcon: function(id) {
+            var icon = getEditIcon(id);
+
+            icon && qq(icon).removeClass(options.classes.editable);
+        },
+
+        isEditIcon: function(el) {
+            return qq(el).hasClass(selectorClasses.editNameIcon);
+        },
+
+        getEditInput: function(id) {
+            return getTemplateEl(getFile(id), selectorClasses.editFilenameInput);
+        },
+
+        isEditInput: function(el) {
+            return qq(el).hasClass(selectorClasses.editFilenameInput);
+        },
+
+        updateProgress: function(id, loaded, total) {
+            var bar = getProgress(id),
+                percent;
+
+            if (bar) {
+                percent = Math.round(loaded / total * 100);
+
+                if (loaded === total) {
+                    hide(bar);
+                }
+                else {
+                    show(bar);
+                }
+
+                setProgressBarWidth(id, percent);
+            }
+        },
+
+        hideProgress: function(id) {
+            var bar = getProgress(id);
+
+            bar && hide(bar);
+        },
+
+        resetProgress: function(id) {
+            setProgressBarWidth(id, 0);
+        },
+
+        showCancel: function(id) {
+            if (!isCancelDisabled) {
+                var cancel = getCancel(id);
+
+                cancel && qq(cancel).removeClass(options.classes.hide);
+            }
+        },
+
+        hideCancel: function(id) {
+            hide(getCancel(id));
+        },
+
+        isCancel: function(el)  {
+            return qq(el).hasClass(selectorClasses.cancel);
+        },
+
+        allowPause: function(id) {
+            show(getPause(id));
+            hide(getContinue(id));
+        },
+
+        uploadPaused: function(id) {
+            this.setStatusText(id, options.text.paused);
+            this.allowContinueButton(id);
+            hide(getSpinner(id));
+        },
+
+        hidePause: function(id) {
+            hide(getPause(id));
+        },
+
+        isPause: function(el) {
+            return qq(el).hasClass(selectorClasses.pause);
+        },
+
+        isContinueButton: function(el) {
+            return qq(el).hasClass(selectorClasses.continueButton);
+        },
+
+        allowContinueButton: function(id) {
+            show(getContinue(id));
+            hide(getPause(id));
+        },
+
+        uploadContinued: function(id) {
+            this.setStatusText(id, "");
+            this.allowPause(id);
+            show(getSpinner(id));
+        },
+
+        showDeleteButton: function(id) {
+            show(getDelete(id));
+        },
+
+        hideDeleteButton: function(id) {
+            hide(getDelete(id));
+        },
+
+        isDeleteButton: function(el) {
+            return qq(el).hasClass(selectorClasses.deleteButton);
+        },
+
+        isRetry: function(el) {
+            return qq(el).hasClass(selectorClasses.retry);
+        },
+
+        updateSize: function(id, text) {
+            var size = getSize(id);
+
+            if (size) {
+                show(size);
+                qq(size).setText(text);
+            }
+        },
+
+        setStatusText: function(id, text) {
+            var textEl = getTemplateEl(getFile(id), selectorClasses.statusText);
+
+            if (textEl) {
+                /*jshint -W116*/
+                if (text == null) {
+                    qq(textEl).clearText();
+                }
+                else {
+                    qq(textEl).setText(text);
+                }
+            }
+        },
+
+        hideSpinner: function(id) {
+            hide(getSpinner(id));
+        },
+
+        showSpinner: function(id) {
+            show(getSpinner(id));
+        },
+
+        generatePreview: function(id, fileOrBlob) {
+            var thumbnail = getThumbnail(id),
+                spec = {
+                    maxSize: thumbnailMaxSize,
+                    scale: true,
+                    orient: true
+                };
+
+            if (qq.supportedFeatures.imagePreviews) {
+                previewGeneration[id] = new qq.Promise();
+
+                if (thumbnail) {
+                    displayWaitingImg(thumbnail);
+                    return options.imageGenerator.generate(fileOrBlob, thumbnail, spec).then(
+                        function() {
+                            show(thumbnail);
+                            previewGeneration[id].success();
+                        },
+                        function() {
+                            previewGeneration[id].failure();
+
+                            // Display the "not available" placeholder img only if we are
+                            // not expecting a thumbnail at a later point, such as in a server response.
+                            if (!options.placeholders.waitUntilUpdate) {
+                                maybeSetDisplayNotAvailableImg(id, thumbnail);
+                            }
+                        });
+                }
+            }
+            else if (thumbnail) {
+                displayWaitingImg(thumbnail);
+            }
+        },
+
+        updateThumbnail: function(id, thumbnailUrl, showWaitingImg) {
+            var thumbnail = getThumbnail(id),
+                spec = {
+                    maxSize: thumbnailMaxSize,
+                    scale: serverScale
+                };
+
+            if (thumbnail) {
+                if (thumbnailUrl) {
+                    if (showWaitingImg) {
+                        displayWaitingImg(thumbnail);
+                    }
+
+                    return options.imageGenerator.generate(thumbnailUrl, thumbnail, spec).then(
+                        function() {
+                            show(thumbnail);
+                        },
+                        function() {
+                            maybeSetDisplayNotAvailableImg(id, thumbnail);
+                        }
+                    );
+                }
+                else {
+                    maybeSetDisplayNotAvailableImg(id, thumbnail);
+                }
+            }
+        }
+    });
+};
+
+/*globals qq*/
+/**
+ * Upload handler used that assumes the current user agent does not have any support for the
+ * File API, and, therefore, makes use of iframes and forms to submit the files directly to
+ * a generic server.
+ *
+ * @param options Options passed from the base handler
+ * @param proxy Callbacks & methods used to query for or push out data/changes
+ */
+qq.UploadHandlerForm = function(options, proxy) {
+    "use strict";
+
+    var fileState = [],
+        uploadCompleteCallback = proxy.onUploadComplete,
+        onUuidChanged = proxy.onUuidChanged,
+        getName = proxy.getName,
+        getUuid = proxy.getUuid,
+        uploadComplete = uploadCompleteCallback,
+        log = proxy.log,
+        internalApi = {};
+
+
+    /**
+     * Returns json object received by iframe from server.
+     */
+    function getIframeContentJson(id, iframe) {
+        /*jshint evil: true*/
+
+        var response;
+
+        //IE may throw an "access is denied" error when attempting to access contentDocument on the iframe in some cases
+        try {
+            // iframe.contentWindow.document - for IE<7
+            var doc = iframe.contentDocument || iframe.contentWindow.document,
+                innerHtml = doc.body.innerHTML;
+
+            log("converting iframe's innerHTML to JSON");
+            log("innerHTML = " + innerHtml);
+            //plain text response may be wrapped in <pre> tag
+            if (innerHtml && innerHtml.match(/^<pre/i)) {
+                innerHtml = doc.body.firstChild.firstChild.nodeValue;
+            }
+
+            response = internalApi.parseJsonResponse(id, innerHtml);
+        }
+        catch(error) {
+            log("Error when attempting to parse form upload response (" + error.message + ")", "error");
+            response = {success: false};
+        }
+
+        return response;
+    }
+
+    /**
+     * Creates form, that will be submitted to iframe
+     */
+    function createForm(id, iframe){
+        var params = options.paramsStore.getParams(id),
+            method = options.demoMode ? "GET" : "POST",
+            endpoint = options.endpointStore.getEndpoint(id),
+            name = getName(id);
+
+        params[options.uuidName] = getUuid(id);
+        params[options.filenameParam] = name;
+
+        return internalApi.initFormForUpload({
+            method: method,
+            endpoint: endpoint,
+            params: params,
+            paramsInBody: options.paramsInBody,
+            targetName: iframe.name
+        });
+    }
+
+    qq.extend(this, new qq.UploadHandlerFormApi(internalApi,
+        {fileState: fileState, isCors: options.cors.expected, inputName: options.inputName},
+        {onCancel: options.onCancel, onUuidChanged: onUuidChanged, getName: getName, getUuid: getUuid, log: log}));
+
+    qq.extend(this, {
+        upload: function(id) {
+            var input = fileState[id].input,
+                fileName = getName(id),
+                iframe = internalApi.createIframe(id),
+                form;
+
+            if (!input){
+                throw new Error("file with passed id was not added, or already uploaded or canceled");
+            }
+
+            options.onUpload(id, getName(id));
+
+            form = createForm(id, iframe);
+            form.appendChild(input);
+
+            internalApi.attachLoadEvent(iframe, function(responseFromMessage){
+                log("iframe loaded");
+
+                var response = responseFromMessage ? responseFromMessage : getIframeContentJson(id, iframe);
+
+                internalApi.detachLoadEvent(id);
+
+                //we can't remove an iframe if the iframe doesn't belong to the same domain
+                if (!options.cors.expected) {
+                    qq(iframe).remove();
+                }
+
+                if (!response.success) {
+                    if (options.onAutoRetry(id, fileName, response)) {
+                        return;
+                    }
+                }
+                options.onComplete(id, fileName, response);
+                uploadComplete(id);
+            });
+
+            log("Sending upload request for " + id);
+            form.submit();
+            qq(form).remove();
+        }
+    });
+};
+
+/*globals qq*/
+/**
+ * Upload handler used to upload to traditional endpoints.  It depends on File API support, and, therefore,
+ * makes use of `XMLHttpRequest` level 2 to upload `File`s and `Blob`s to a generic server.
+ *
+ * @param spec Options passed from the base handler
+ * @param proxy Callbacks & methods used to query for or push out data/changes
+ */
+qq.UploadHandlerXhr = function(spec, proxy) {
+    "use strict";
+
+    var uploadComplete = proxy.onUploadComplete,
+        onUuidChanged = proxy.onUuidChanged,
+        getName = proxy.getName,
+        getUuid = proxy.getUuid,
+        getSize = proxy.getSize,
+        log = proxy.log,
+        fileState = [],
+        cookieItemDelimiter = "|",
+        chunkFiles = spec.chunking.enabled && qq.supportedFeatures.chunking,
+        resumeEnabled = spec.resume.enabled && chunkFiles && qq.supportedFeatures.resume,
+        multipart = spec.forceMultipart || spec.paramsInBody,
+        internalApi = {},
+        publicApi = this,
+        resumeId;
+
+    function getResumeId() {
+        if (spec.resume.id !== null &&
+            spec.resume.id !== undefined &&
+            !qq.isFunction(spec.resume.id) &&
+            !qq.isObject(spec.resume.id)) {
+
+            return spec.resume.id;
+        }
+    }
+
+    resumeId = getResumeId();
+
+    function addChunkingSpecificParams(id, params, chunkData) {
+        var size = getSize(id),
+            name = getName(id);
+
+        params[spec.chunking.paramNames.partIndex] = chunkData.part;
+        params[spec.chunking.paramNames.partByteOffset] = chunkData.start;
+        params[spec.chunking.paramNames.chunkSize] = chunkData.size;
+        params[spec.chunking.paramNames.totalParts] = chunkData.count;
+        params[spec.totalFileSizeName] = size;
+
+        /**
+         * When a Blob is sent in a multipart request, the filename value in the content-disposition header is either "blob"
+         * or an empty string.  So, we will need to include the actual file name as a param in this case.
+         */
+        if (multipart) {
+            params[spec.filenameParam] = name;
+        }
+    }
+
+    function addResumeSpecificParams(params) {
+        params[spec.resume.paramNames.resuming] = true;
+    }
+
+    function getChunk(fileOrBlob, startByte, endByte) {
+        if (fileOrBlob.slice) {
+            return fileOrBlob.slice(startByte, endByte);
+        }
+        else if (fileOrBlob.mozSlice) {
+            return fileOrBlob.mozSlice(startByte, endByte);
+        }
+        else if (fileOrBlob.webkitSlice) {
+            return fileOrBlob.webkitSlice(startByte, endByte);
+        }
+    }
+
+    function setParamsAndGetEntityToSend(params, xhr, fileOrBlob, id) {
+        var formData = new FormData(),
+            method = spec.demoMode ? "GET" : "POST",
+            endpoint = spec.endpointStore.getEndpoint(id),
+            url = endpoint,
+            name = getName(id),
+            size = getSize(id);
+
+        params[spec.uuidName] = getUuid(id);
+        params[spec.filenameParam] = name;
+
+
+        if (multipart) {
+            params[spec.totalFileSizeName] = size;
+        }
+
+        //build query string
+        if (!spec.paramsInBody) {
+            if (!multipart) {
+                params[spec.inputName] = name;
+            }
+            url = qq.obj2url(params, endpoint);
+        }
+
+        xhr.open(method, url, true);
+
+        if (spec.cors.expected && spec.cors.sendCredentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (multipart) {
+            if (spec.paramsInBody) {
+                qq.obj2FormData(params, formData);
+            }
+
+            formData.append(spec.inputName, fileOrBlob);
+            return formData;
+        }
+
+        return fileOrBlob;
+    }
+
+    function setHeaders(id, xhr) {
+        var extraHeaders = spec.customHeaders,
+            fileOrBlob = fileState[id].file || fileState[id].blobData.blob;
+
+        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+        xhr.setRequestHeader("Cache-Control", "no-cache");
+
+        if (!multipart) {
+            xhr.setRequestHeader("Content-Type", "application/octet-stream");
+            //NOTE: return mime type in xhr works on chrome 16.0.9 firefox 11.0a2
+            xhr.setRequestHeader("X-Mime-Type", fileOrBlob.type);
+        }
+
+        qq.each(extraHeaders, function(name, val) {
+            xhr.setRequestHeader(name, val);
+        });
+    }
+
+    function handleCompletedItem(id, response, xhr) {
+        var name = getName(id),
+            size = getSize(id);
+
+        fileState[id].attemptingResume = false;
+
+        spec.onProgress(id, name, size, size);
+        spec.onComplete(id, name, response, xhr);
+
+        if (fileState[id]) {
+            delete fileState[id].xhr;
+        }
+
+        uploadComplete(id);
+    }
+
+    function uploadNextChunk(id) {
+        var chunkIdx = fileState[id].remainingChunkIdxs[0],
+            chunkData = internalApi.getChunkData(id, chunkIdx),
+            xhr = internalApi.createXhr(id),
+            size = getSize(id),
+            name = getName(id),
+            toSend, params;
+
+        if (fileState[id].loaded === undefined) {
+            fileState[id].loaded = 0;
+        }
+
+        if (resumeEnabled && fileState[id].file) {
+            persistChunkData(id, chunkData);
+        }
+
+        xhr.onreadystatechange = getReadyStateChangeHandler(id, xhr);
+
+        xhr.upload.onprogress = function(e) {
+            if (e.lengthComputable) {
+                var totalLoaded = e.loaded + fileState[id].loaded,
+                    estTotalRequestsSize = calcAllRequestsSizeForChunkedUpload(id, chunkIdx, e.total);
+
+                spec.onProgress(id, name, totalLoaded, estTotalRequestsSize);
+            }
+        };
+
+        spec.onUploadChunk(id, name, internalApi.getChunkDataForCallback(chunkData));
+
+        params = spec.paramsStore.getParams(id);
+        addChunkingSpecificParams(id, params, chunkData);
+
+        if (fileState[id].attemptingResume) {
+            addResumeSpecificParams(params);
+        }
+
+        toSend = setParamsAndGetEntityToSend(params, xhr, chunkData.blob, id);
+        setHeaders(id, xhr);
+
+        log("Sending chunked upload request for item " + id + ": bytes " + (chunkData.start+1) + "-" + chunkData.end + " of " + size);
+        xhr.send(toSend);
+    }
+
+    function calcAllRequestsSizeForChunkedUpload(id, chunkIdx, requestSize) {
+        var chunkData = internalApi.getChunkData(id, chunkIdx),
+            blobSize = chunkData.size,
+            overhead = requestSize - blobSize,
+            size = getSize(id),
+            chunkCount = chunkData.count,
+            initialRequestOverhead = fileState[id].initialRequestOverhead,
+            overheadDiff = overhead - initialRequestOverhead;
+
+        fileState[id].lastRequestOverhead = overhead;
+
+        if (chunkIdx === 0) {
+            fileState[id].lastChunkIdxProgress = 0;
+            fileState[id].initialRequestOverhead = overhead;
+            fileState[id].estTotalRequestsSize = size + (chunkCount * overhead);
+        }
+        else if (fileState[id].lastChunkIdxProgress !== chunkIdx) {
+            fileState[id].lastChunkIdxProgress = chunkIdx;
+            fileState[id].estTotalRequestsSize += overheadDiff;
+        }
+
+        return fileState[id].estTotalRequestsSize;
+    }
+
+    function getLastRequestOverhead(id) {
+        if (multipart) {
+            return fileState[id].lastRequestOverhead;
+        }
+        else {
+            return 0;
+        }
+    }
+
+    function handleSuccessfullyCompletedChunk(id, response, xhr) {
+        var chunkIdx = fileState[id].remainingChunkIdxs.shift(),
+            chunkData = internalApi.getChunkData(id, chunkIdx);
+
+        fileState[id].attemptingResume = false;
+        fileState[id].loaded += chunkData.size + getLastRequestOverhead(id);
+
+        spec.onUploadChunkSuccess(id, internalApi.getChunkDataForCallback(chunkData), response, xhr);
+
+        if (fileState[id].remainingChunkIdxs.length > 0) {
+            uploadNextChunk(id);
+        }
+        else {
+            if (resumeEnabled) {
+                deletePersistedChunkData(id);
+            }
+
+            handleCompletedItem(id, response, xhr);
+        }
+    }
+
+    function isErrorResponse(xhr, response) {
+        return xhr.status !== 200 || !response.success || response.reset;
+    }
+
+    function parseResponse(id, xhr) {
+        var response;
+
+        try {
+            log(qq.format("Received response status {} with body: {}", xhr.status, xhr.responseText));
+
+            response = qq.parseJson(xhr.responseText);
+
+            if (response.newUuid !== undefined) {
+                onUuidChanged(id, response.newUuid);
+            }
+        }
+        catch(error) {
+            log("Error when attempting to parse xhr response text (" + error.message + ")", "error");
+            response = {};
+        }
+
+        return response;
+    }
+
+    function handleResetResponse(id) {
+        log("Server has ordered chunking effort to be restarted on next attempt for item ID " + id, "error");
+
+        if (resumeEnabled) {
+            deletePersistedChunkData(id);
+            fileState[id].attemptingResume = false;
+        }
+
+        fileState[id].remainingChunkIdxs = [];
+        delete fileState[id].loaded;
+        delete fileState[id].estTotalRequestsSize;
+        delete fileState[id].initialRequestOverhead;
+    }
+
+    function handleResetResponseOnResumeAttempt(id) {
+        fileState[id].attemptingResume = false;
+        log("Server has declared that it cannot handle resume for item ID " + id + " - starting from the first chunk", "error");
+        handleResetResponse(id);
+        publicApi.upload(id, true);
+    }
+
+    function handleNonResetErrorResponse(id, response, xhr) {
+        var name = getName(id);
+
+        if (spec.onAutoRetry(id, name, response, xhr)) {
+            return;
+        }
+        else {
+            handleCompletedItem(id, response, xhr);
+        }
+    }
+
+    function onComplete(id, xhr) {
+        var state = fileState[id],
+            attemptingResume = state && state.attemptingResume,
+            paused = state && state.paused,
+            response;
+
+        // The logic in this function targets uploads that have not been paused or canceled,
+        // so return at once if this is not the case.
+        if (!state || paused) {
+            return;
+        }
+
+        log("xhr - server response received for " + id);
+        log("responseText = " + xhr.responseText);
+        response = parseResponse(id, xhr);
+
+        if (isErrorResponse(xhr, response)) {
+            if (response.reset) {
+                handleResetResponse(id);
+            }
+
+            if (attemptingResume && response.reset) {
+                handleResetResponseOnResumeAttempt(id);
+            }
+            else {
+                handleNonResetErrorResponse(id, response, xhr);
+            }
+        }
+        else if (chunkFiles) {
+            handleSuccessfullyCompletedChunk(id, response, xhr);
+        }
+        else {
+            handleCompletedItem(id, response, xhr);
+        }
+    }
+
+    function getReadyStateChangeHandler(id, xhr) {
+        return function() {
+            if (xhr.readyState === 4) {
+                onComplete(id, xhr);
+            }
+        };
+    }
+
+    function persistChunkData(id, chunkData) {
+        var fileUuid = getUuid(id),
+            lastByteSent = fileState[id].loaded,
+            initialRequestOverhead = fileState[id].initialRequestOverhead,
+            estTotalRequestsSize = fileState[id].estTotalRequestsSize,
+            cookieName = getChunkDataCookieName(id),
+            cookieValue = fileUuid +
+                cookieItemDelimiter + chunkData.part +
+                cookieItemDelimiter + lastByteSent +
+                cookieItemDelimiter + initialRequestOverhead +
+                cookieItemDelimiter + estTotalRequestsSize,
+            cookieExpDays = spec.resume.cookiesExpireIn;
+
+        qq.setCookie(cookieName, cookieValue, cookieExpDays);
+    }
+
+    function deletePersistedChunkData(id) {
+        if (fileState[id].file) {
+            var cookieName = getChunkDataCookieName(id);
+            qq.deleteCookie(cookieName);
+        }
+    }
+
+    function getPersistedChunkData(id) {
+        var chunkCookieValue = qq.getCookie(getChunkDataCookieName(id)),
+            filename = getName(id),
+            sections, uuid, partIndex, lastByteSent, initialRequestOverhead, estTotalRequestsSize;
+
+        if (chunkCookieValue) {
+            sections = chunkCookieValue.split(cookieItemDelimiter);
+
+            if (sections.length === 5) {
+                uuid = sections[0];
+                partIndex = parseInt(sections[1], 10);
+                lastByteSent = parseInt(sections[2], 10);
+                initialRequestOverhead = parseInt(sections[3], 10);
+                estTotalRequestsSize = parseInt(sections[4], 10);
+
+                return {
+                    uuid: uuid,
+                    part: partIndex,
+                    lastByteSent: lastByteSent,
+                    initialRequestOverhead: initialRequestOverhead,
+                    estTotalRequestsSize: estTotalRequestsSize
+                };
+            }
+            else {
+                log("Ignoring previously stored resume/chunk cookie for " + filename + " - old cookie format", "warn");
+            }
+        }
+    }
+
+    function getChunkDataCookieName(id) {
+        var filename = getName(id),
+            fileSize = getSize(id),
+            maxChunkSize = spec.chunking.partSize,
+            cookieName;
+
+        cookieName = "qqfilechunk" + cookieItemDelimiter + encodeURIComponent(filename) + cookieItemDelimiter + fileSize + cookieItemDelimiter + maxChunkSize;
+
+        if (resumeId !== undefined) {
+            cookieName += cookieItemDelimiter + resumeId;
+        }
+
+        return cookieName;
+    }
+
+    function calculateRemainingChunkIdxsAndUpload(id, firstChunkIndex) {
+        var currentChunkIndex;
+
+        for (currentChunkIndex = internalApi.getTotalChunks(id)-1; currentChunkIndex >= firstChunkIndex; currentChunkIndex-=1) {
+            fileState[id].remainingChunkIdxs.unshift(currentChunkIndex);
+        }
+
+        uploadNextChunk(id);
+    }
+
+    function onResumeSuccess(id, name, firstChunkIndex, persistedChunkInfoForResume) {
+        firstChunkIndex = persistedChunkInfoForResume.part;
+        fileState[id].loaded = persistedChunkInfoForResume.lastByteSent;
+        fileState[id].estTotalRequestsSize = persistedChunkInfoForResume.estTotalRequestsSize;
+        fileState[id].initialRequestOverhead = persistedChunkInfoForResume.initialRequestOverhead;
+        fileState[id].attemptingResume = true;
+        log("Resuming " + name + " at partition index " + firstChunkIndex);
+
+        calculateRemainingChunkIdxsAndUpload(id, firstChunkIndex);
+    }
+
+    function handlePossibleResumeAttempt(id, persistedChunkInfoForResume, firstChunkIndex) {
+        var name = getName(id),
+            firstChunkDataForResume = internalApi.getChunkData(id, persistedChunkInfoForResume.part),
+            onResumeRetVal;
+
+        onResumeRetVal = spec.onResume(id, name, internalApi.getChunkDataForCallback(firstChunkDataForResume));
+        if (onResumeRetVal instanceof qq.Promise) {
+            log("Waiting for onResume promise to be fulfilled for " + id);
+            onResumeRetVal.then(
+                function() {
+                    onResumeSuccess(id, name, firstChunkIndex, persistedChunkInfoForResume);
+                },
+                function() {
+                    log("onResume promise fulfilled - failure indicated.  Will not resume.");
+                    calculateRemainingChunkIdxsAndUpload(id, firstChunkIndex);
+                }
+            );
+        }
+        else if (onResumeRetVal !== false) {
+            onResumeSuccess(id, name, firstChunkIndex, persistedChunkInfoForResume);
+        }
+        else {
+            log("onResume callback returned false.  Will not resume.");
+            calculateRemainingChunkIdxsAndUpload(id, firstChunkIndex);
+        }
+    }
+
+    function handleFileChunkingUpload(id, retry) {
+        var firstChunkIndex = 0,
+            persistedChunkInfoForResume;
+
+        if (!fileState[id].remainingChunkIdxs || fileState[id].remainingChunkIdxs.length === 0) {
+            fileState[id].remainingChunkIdxs = [];
+
+            if (resumeEnabled && !retry && fileState[id].file) {
+                persistedChunkInfoForResume = getPersistedChunkData(id);
+                if (persistedChunkInfoForResume) {
+                    handlePossibleResumeAttempt(id, persistedChunkInfoForResume, firstChunkIndex);
+                }
+                else {
+                    calculateRemainingChunkIdxsAndUpload(id, firstChunkIndex);
+                }
+            }
+            else {
+                calculateRemainingChunkIdxsAndUpload(id, firstChunkIndex);
+            }
+        }
+        else {
+            uploadNextChunk(id);
+        }
+    }
+
+    function handleStandardFileUpload(id) {
+        var fileOrBlob = fileState[id].file || fileState[id].blobData.blob,
+            name = getName(id),
+            xhr, params, toSend;
+
+        fileState[id].loaded = 0;
+
+        xhr = internalApi.createXhr(id);
+
+        xhr.upload.onprogress = function(e){
+            if (e.lengthComputable){
+                fileState[id].loaded = e.loaded;
+                spec.onProgress(id, name, e.loaded, e.total);
+            }
+        };
+
+        xhr.onreadystatechange = getReadyStateChangeHandler(id, xhr);
+
+        params = spec.paramsStore.getParams(id);
+        toSend = setParamsAndGetEntityToSend(params, xhr, fileOrBlob, id);
+        setHeaders(id, xhr);
+
+        log("Sending upload request for " + id);
+        xhr.send(toSend);
+    }
+
+    function handleUploadSignal(id, retry) {
+        var name = getName(id);
+
+        if (publicApi.isValid(id)) {
+            spec.onUpload(id, name);
+
+            if (chunkFiles) {
+                handleFileChunkingUpload(id, retry);
+            }
+            else {
+                handleStandardFileUpload(id);
+            }
+        }
+    }
+
+
+    qq.extend(this, new qq.UploadHandlerXhrApi(
+        internalApi,
+        {fileState: fileState, chunking: chunkFiles ? spec.chunking : null},
+        {onUpload: handleUploadSignal, onCancel: spec.onCancel, onUuidChanged: onUuidChanged, getName: getName,
+            getSize: getSize, getUuid: getUuid, log: log}
+    ));
+
+    // Base XHR API overrides
+    qq.override(this, function(super_) {
+        return {
+            add: function(id, fileOrBlobData) {
+                var persistedChunkData;
+
+                super_.add.apply(this, arguments);
+
+                if (resumeEnabled) {
+                    persistedChunkData = getPersistedChunkData(id);
+
+                    if (persistedChunkData) {
+                        onUuidChanged(id, persistedChunkData.uuid);
+                    }
+                }
+
+                return id;
+            },
+
+            getResumableFilesData: function() {
+                var matchingCookieNames = [],
+                    resumableFilesData = [];
+
+                if (chunkFiles && resumeEnabled) {
+                    if (resumeId === undefined) {
+                        matchingCookieNames = qq.getCookieNames(new RegExp("^qqfilechunk\\" + cookieItemDelimiter + ".+\\" +
+                            cookieItemDelimiter + "\\d+\\" + cookieItemDelimiter + spec.chunking.partSize + "="));
+                    }
+                    else {
+                        matchingCookieNames = qq.getCookieNames(new RegExp("^qqfilechunk\\" + cookieItemDelimiter + ".+\\" +
+                            cookieItemDelimiter + "\\d+\\" + cookieItemDelimiter + spec.chunking.partSize + "\\" +
+                            cookieItemDelimiter + resumeId + "="));
+                    }
+
+                    qq.each(matchingCookieNames, function(idx, cookieName) {
+                        var cookiesNameParts = cookieName.split(cookieItemDelimiter);
+                        var cookieValueParts = qq.getCookie(cookieName).split(cookieItemDelimiter);
+
+                        resumableFilesData.push({
+                            name: decodeURIComponent(cookiesNameParts[1]),
+                            size: cookiesNameParts[2],
+                            uuid: cookieValueParts[0],
+                            partIdx: cookieValueParts[1]
+                        });
+                    });
+
+                    return resumableFilesData;
+                }
+                return [];
+            },
+
+            expunge: function(id) {
+                if (resumeEnabled) {
+                    deletePersistedChunkData(id);
+                }
+
+                super_.expunge(id);
+            }
+        };
+    });
+};
+
+/*globals qq*/
+qq.PasteSupport = function(o) {
+    "use strict";
+
+    var options, detachPasteHandler;
+
+    options = {
+        targetElement: null,
+        callbacks: {
+            log: function(message, level) {},
+            pasteReceived: function(blob) {}
+        }
+    };
+
+    function isImage(item) {
+        return item.type &&
+            item.type.indexOf("image/") === 0;
+    }
+
+    function registerPasteHandler() {
+        qq(options.targetElement).attach("paste", function(event) {
+            var clipboardData = event.clipboardData;
+
+            if (clipboardData) {
+                qq.each(clipboardData.items, function(idx, item) {
+                    if (isImage(item)) {
+                        var blob = item.getAsFile();
+                        options.callbacks.pasteReceived(blob);
+                    }
+                });
+            }
+        });
+    }
+
+    function unregisterPasteHandler() {
+        if (detachPasteHandler) {
+            detachPasteHandler();
+        }
+    }
+
+    qq.extend(options, o);
+    registerPasteHandler();
+
+    qq.extend(this, {
+        reset: function() {
+            unregisterPasteHandler();
+        }
+    });
+};
+
+/*globals qq, document, CustomEvent*/
+qq.DragAndDrop = function(o) {
+    "use strict";
+
+    var options,
+        HIDE_ZONES_EVENT_NAME = "qq-hidezones",
+        HIDE_BEFORE_ENTER_ATTR = "qq-hide-dropzone",
+        uploadDropZones = [],
+        droppedFiles = [],
+        disposeSupport = new qq.DisposeSupport();
+
+    options = {
+        dropZoneElements: [],
+        allowMultipleItems: true,
+        classes: {
+            dropActive: null
+        },
+        callbacks: new qq.DragAndDrop.callbacks()
+    };
+
+    qq.extend(options, o, true);
+
+    function uploadDroppedFiles(files, uploadDropZone) {
+        // We need to convert the `FileList` to an actual `Array` to avoid iteration issues
+        var filesAsArray = Array.prototype.slice.call(files);
+
+        options.callbacks.dropLog("Grabbed " + files.length + " dropped files.");
+        uploadDropZone.dropDisabled(false);
+        options.callbacks.processingDroppedFilesComplete(filesAsArray, uploadDropZone.getElement());
+    }
+
+    function traverseFileTree(entry) {
+        var dirReader,
+            parseEntryPromise = new qq.Promise();
+
+        if (entry.isFile) {
+            entry.file(function(file) {
+                droppedFiles.push(file);
+                parseEntryPromise.success();
+            },
+            function(fileError) {
+                options.callbacks.dropLog("Problem parsing '" + entry.fullPath + "'.  FileError code " + fileError.code + ".", "error");
+                parseEntryPromise.failure();
+            });
+        }
+        else if (entry.isDirectory) {
+            dirReader = entry.createReader();
+            dirReader.readEntries(function(entries) {
+                var entriesLeft = entries.length;
+
+                qq.each(entries, function(idx, entry) {
+                    traverseFileTree(entry).done(function() {
+                        entriesLeft-=1;
+
+                        if (entriesLeft === 0) {
+                            parseEntryPromise.success();
+                        }
+                    });
+                });
+
+                if (!entries.length) {
+                    parseEntryPromise.success();
+                }
+            }, function(fileError) {
+                options.callbacks.dropLog("Problem parsing '" + entry.fullPath + "'.  FileError code " + fileError.code + ".", "error");
+                parseEntryPromise.failure();
+            });
+        }
+
+        return parseEntryPromise;
+    }
+
+    function handleDataTransfer(dataTransfer, uploadDropZone) {
+        var pendingFolderPromises = [],
+            handleDataTransferPromise = new qq.Promise();
+
+        options.callbacks.processingDroppedFiles();
+        uploadDropZone.dropDisabled(true);
+
+        if (dataTransfer.files.length > 1 && !options.allowMultipleItems) {
+            options.callbacks.processingDroppedFilesComplete([]);
+            options.callbacks.dropError("tooManyFilesError", "");
+            uploadDropZone.dropDisabled(false);
+            handleDataTransferPromise.failure();
+        }
+        else {
+            droppedFiles = [];
+
+            if (qq.isFolderDropSupported(dataTransfer)) {
+                qq.each(dataTransfer.items, function(idx, item) {
+                    var entry = item.webkitGetAsEntry();
+
+                    if (entry) {
+                        //due to a bug in Chrome's File System API impl - #149735
+                        if (entry.isFile) {
+                            droppedFiles.push(item.getAsFile());
+                        }
+
+                        else {
+                            pendingFolderPromises.push(traverseFileTree(entry).done(function() {
+                                pendingFolderPromises.pop();
+                                if (pendingFolderPromises.length === 0) {
+                                    handleDataTransferPromise.success();
+                                }
+                            }));
+                        }
+                    }
+                });
+            }
+            else {
+                droppedFiles = dataTransfer.files;
+            }
+
+            if (pendingFolderPromises.length === 0) {
+                handleDataTransferPromise.success();
+            }
+        }
+
+        return handleDataTransferPromise;
+    }
+
+    function setupDropzone(dropArea) {
+        var dropZone = new qq.UploadDropZone({
+            HIDE_ZONES_EVENT_NAME: HIDE_ZONES_EVENT_NAME,
+            element: dropArea,
+            onEnter: function(e){
+                qq(dropArea).addClass(options.classes.dropActive);
+                e.stopPropagation();
+            },
+            onLeaveNotDescendants: function(e){
+                qq(dropArea).removeClass(options.classes.dropActive);
+            },
+            onDrop: function(e){
+                handleDataTransfer(e.dataTransfer, dropZone).done(function() {
+                    uploadDroppedFiles(droppedFiles, dropZone);
+                });
+            }
+        });
+
+        disposeSupport.addDisposer(function() {
+            dropZone.dispose();
+        });
+
+        qq(dropArea).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropArea).hide();
+
+        uploadDropZones.push(dropZone);
+
+        return dropZone;
+    }
+
+    function isFileDrag(dragEvent) {
+        var fileDrag;
+
+        qq.each(dragEvent.dataTransfer.types, function(key, val) {
+            if (val === "Files") {
+                fileDrag = true;
+                return false;
+            }
+        });
+
+        return fileDrag;
+    }
+
+    function leavingDocumentOut(e) {
+        /* jshint -W041, eqeqeq:false */
+            // null coords for Chrome and Safari Windows
+        return ((qq.chrome() || (qq.safari() && qq.windows())) && e.clientX == 0 && e.clientY == 0) ||
+            // null e.relatedTarget for Firefox
+            (qq.firefox() && !e.relatedTarget);
+    }
+
+    function setupDragDrop() {
+        var dropZones = options.dropZoneElements;
+
+        qq.each(dropZones, function(idx, dropZone) {
+            var uploadDropZone = setupDropzone(dropZone);
+
+            // IE <= 9 does not support the File API used for drag+drop uploads
+            if (dropZones.length && (!qq.ie() || qq.ie10())) {
+                disposeSupport.attach(document, "dragenter", function(e) {
+                    if (!uploadDropZone.dropDisabled() && isFileDrag(e)) {
+                        qq.each(dropZones, function(idx, dropZone) {
+                            // We can't apply styles to non-HTMLElements, since they lack the `style` property
+                            if (dropZone instanceof HTMLElement) {
+                                qq(dropZone).css({display: "block"});
+                            }
+                        });
+                    }
+                });
+            }
+        });
+
+        disposeSupport.attach(document, "dragleave", function(e) {
+            if (leavingDocumentOut(e)) {
+                qq.each(dropZones, function(idx, dropZone) {
+                    qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropZone).hide();
+                });
+            }
+        });
+
+        disposeSupport.attach(document, "drop", function(e){
+            qq.each(dropZones, function(idx, dropZone) {
+                qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropZone).hide();
+            });
+            e.preventDefault();
+        });
+
+        disposeSupport.attach(document, HIDE_ZONES_EVENT_NAME, function(e) {
+            qq.each(options.dropZoneElements, function(idx, zone) {
+                qq(zone).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(zone).hide();
+                qq(zone).removeClass(options.classes.dropActive);
+            });
+        });
+    }
+
+    setupDragDrop();
+
+    qq.extend(this, {
+        setupExtraDropzone: function(element) {
+            options.dropZoneElements.push(element);
+            setupDropzone(element);
+        },
+
+        removeDropzone: function(element) {
+            var i,
+                dzs = options.dropZoneElements;
+
+            for(i in dzs) {
+                if (dzs[i] === element) {
+                    return dzs.splice(i, 1);
+                }
+            }
+        },
+
+        dispose: function() {
+            disposeSupport.dispose();
+            qq.each(uploadDropZones, function(idx, dropZone) {
+                dropZone.dispose();
+            });
+        }
+    });
+};
+
+qq.DragAndDrop.callbacks = function() {
+    "use strict";
+
+    return {
+        processingDroppedFiles: function() {},
+        processingDroppedFilesComplete: function(files, targetEl) {},
+        dropError: function(code, errorSpecifics) {
+            qq.log("Drag & drop error code '" + code + " with these specifics: '" + errorSpecifics + "'", "error");
+        },
+        dropLog: function(message, level) {
+            qq.log(message, level);
+        }
+    };
+};
+
+qq.UploadDropZone = function(o){
+    "use strict";
+
+    var disposeSupport = new qq.DisposeSupport(),
+        options, element, preventDrop, dropOutsideDisabled;
+
+    options = {
+        element: null,
+        onEnter: function(e){},
+        onLeave: function(e){},
+        // is not fired when leaving element by hovering descendants
+        onLeaveNotDescendants: function(e){},
+        onDrop: function(e){}
+    };
+
+    qq.extend(options, o);
+    element = options.element;
+
+    function dragover_should_be_canceled(){
+        return qq.safari() || (qq.firefox() && qq.windows());
+    }
+
+    function disableDropOutside(e){
+        // run only once for all instances
+        if (!dropOutsideDisabled ){
+
+            // for these cases we need to catch onDrop to reset dropArea
+            if (dragover_should_be_canceled){
+                disposeSupport.attach(document, "dragover", function(e){
+                    e.preventDefault();
+                });
+            } else {
+                disposeSupport.attach(document, "dragover", function(e){
+                    if (e.dataTransfer){
+                        e.dataTransfer.dropEffect = "none";
+                        e.preventDefault();
+                    }
+                });
+            }
+
+            dropOutsideDisabled = true;
+        }
+    }
+
+    function isValidFileDrag(e){
+        // e.dataTransfer currently causing IE errors
+        // IE9 does NOT support file API, so drag-and-drop is not possible
+        if (qq.ie() && !qq.ie10()) {
+            return false;
+        }
+
+        var effectTest, dt = e.dataTransfer,
+        // do not check dt.types.contains in webkit, because it crashes safari 4
+        isSafari = qq.safari();
+
+        // dt.effectAllowed is none in Safari 5
+        // dt.types.contains check is for firefox
+
+        // dt.effectAllowed crashes IE11 when files have been dragged from
+        // the filesystem
+        effectTest = (qq.ie10() || qq.ie11()) ? true : dt.effectAllowed !== "none";
+        return dt && effectTest && (dt.files || (!isSafari && dt.types.contains && dt.types.contains("Files")));
+    }
+
+    function isOrSetDropDisabled(isDisabled) {
+        if (isDisabled !== undefined) {
+            preventDrop = isDisabled;
+        }
+        return preventDrop;
+    }
+
+    function triggerHidezonesEvent() {
+        var hideZonesEvent;
+
+        function triggerUsingOldApi() {
+            hideZonesEvent = document.createEvent("Event");
+            hideZonesEvent.initEvent(options.HIDE_ZONES_EVENT_NAME, true, true);
+        }
+
+        if (window.CustomEvent) {
+            try {
+                hideZonesEvent = new CustomEvent(options.HIDE_ZONES_EVENT_NAME);
+            }
+            catch (err) {
+                triggerUsingOldApi();
+            }
+        }
+        else {
+            triggerUsingOldApi();
+        }
+
+        document.dispatchEvent(hideZonesEvent);
+    }
+
+    function attachEvents(){
+        disposeSupport.attach(element, "dragover", function(e){
+            if (!isValidFileDrag(e)) {
+                return;
+            }
+
+            // dt.effectAllowed crashes IE11 when files have been dragged from
+            // the filesystem
+            var effect = (qq.ie() || qq.ie11()) ? null : e.dataTransfer.effectAllowed;
+            if (effect === "move" || effect === "linkMove"){
+                e.dataTransfer.dropEffect = "move"; // for FF (only move allowed)
+            } else {
+                e.dataTransfer.dropEffect = "copy"; // for Chrome
+            }
+
+            e.stopPropagation();
+            e.preventDefault();
+        });
+
+        disposeSupport.attach(element, "dragenter", function(e){
+            if (!isOrSetDropDisabled()) {
+                if (!isValidFileDrag(e)) {
+                    return;
+                }
+                options.onEnter(e);
+            }
+        });
+
+        disposeSupport.attach(element, "dragleave", function(e){
+            if (!isValidFileDrag(e)) {
+                return;
+            }
+
+            options.onLeave(e);
+
+            var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);
+            // do not fire when moving a mouse over a descendant
+            if (qq(this).contains(relatedTarget)) {
+                return;
+            }
+
+            options.onLeaveNotDescendants(e);
+        });
+
+        disposeSupport.attach(element, "drop", function(e) {
+            if (!isOrSetDropDisabled()) {
+                if (!isValidFileDrag(e)) {
+                    return;
+                }
+
+                e.preventDefault();
+                e.stopPropagation();
+                options.onDrop(e);
+
+                triggerHidezonesEvent();
+            }
+        });
+    }
+
+    disableDropOutside();
+    attachEvents();
+
+    qq.extend(this, {
+        dropDisabled: function(isDisabled) {
+            return isOrSetDropDisabled(isDisabled);
+        },
+
+        dispose: function() {
+            disposeSupport.dispose();
+        },
+
+        getElement: function() {
+            return element;
+        }
+    });
+};
+
+/*globals qq, XMLHttpRequest*/
+qq.DeleteFileAjaxRequester = function(o) {
+    "use strict";
+
+    var requester,
+        options = {
+            method: "DELETE",
+            uuidParamName: "qquuid",
+            endpointStore: {},
+            maxConnections: 3,
+            customHeaders: {},
+            paramsStore: {},
+            demoMode: false,
+            cors: {
+                expected: false,
+                sendCredentials: false
+            },
+            log: function(str, level) {},
+            onDelete: function(id) {},
+            onDeleteComplete: function(id, xhrOrXdr, isError) {}
+        };
+
+    qq.extend(options, o);
+
+    function getMandatedParams() {
+        if (options.method.toUpperCase() === "POST") {
+            return {
+                "_method": "DELETE"
+            };
+        }
+
+        return {};
+    }
+
+    requester = new qq.AjaxRequester({
+        validMethods: ["POST", "DELETE"],
+        method: options.method,
+        endpointStore: options.endpointStore,
+        paramsStore: options.paramsStore,
+        mandatedParams: getMandatedParams(),
+        maxConnections: options.maxConnections,
+        customHeaders: options.customHeaders,
+        demoMode: options.demoMode,
+        log: options.log,
+        onSend: options.onDelete,
+        onComplete: options.onDeleteComplete,
+        cors: options.cors
+    });
+
+
+    qq.extend(this, {
+        sendDelete: function(id, uuid, additionalMandatedParams) {
+            var additionalOptions = additionalMandatedParams || {};
+
+            options.log("Submitting delete file request for " + id);
+
+            if (options.method === "DELETE") {
+                requester.initTransport(id)
+                    .withPath(uuid)
+                    .withParams(additionalOptions)
+                    .send();
+            }
+            else {
+                additionalOptions[options.uuidParamName] = uuid;
+                requester.initTransport(id)
+                    .withParams(additionalOptions)
+                    .send();
+            }
+        }
+    });
+};
+
+/*global qq, define */
+/*jshint strict:false,bitwise:false,nonew:false,asi:true,-W064,-W116,-W089 */
+/**
+ * Mega pixel image rendering library for iOS6 Safari
+ *
+ * Fixes iOS6 Safari's image file rendering issue for large size image (over mega-pixel),
+ * which causes unexpected subsampling when drawing it in canvas.
+ * By using this library, you can safely render the image with proper stretching.
+ *
+ * Copyright (c) 2012 Shinichi Tomita <shinichi.tomita@gmail.com>
+ * Released under the MIT license
+ */
+(function() {
+
+  /**
+   * Detect subsampling in loaded image.
+   * In iOS, larger images than 2M pixels may be subsampled in rendering.
+   */
+  function detectSubsampling(img) {
+    var iw = img.naturalWidth, ih = img.naturalHeight;
+    if (iw * ih > 1024 * 1024) { // subsampling may happen over megapixel image
+      var canvas = document.createElement('canvas');
+      canvas.width = canvas.height = 1;
+      var ctx = canvas.getContext('2d');
+      ctx.drawImage(img, -iw + 1, 0);
+      // subsampled image becomes half smaller in rendering size.
+      // check alpha channel value to confirm image is covering edge pixel or not.
+      // if alpha value is 0 image is not covering, hence subsampled.
+      return ctx.getImageData(0, 0, 1, 1).data[3] === 0;
+    } else {
+      return false;
+    }
+  }
+
+  /**
+   * Detecting vertical squash in loaded image.
+   * Fixes a bug which squash image vertically while drawing into canvas for some images.
+   */
+  function detectVerticalSquash(img, iw, ih) {
+    var canvas = document.createElement('canvas');
+    canvas.width = 1;
+    canvas.height = ih;
+    var ctx = canvas.getContext('2d');
+    ctx.drawImage(img, 0, 0);
+    var data = ctx.getImageData(0, 0, 1, ih).data;
+    // search image edge pixel position in case it is squashed vertically.
+    var sy = 0;
+    var ey = ih;
+    var py = ih;
+    while (py > sy) {
+      var alpha = data[(py - 1) * 4 + 3];
+      if (alpha === 0) {
+        ey = py;
+      } else {
+        sy = py;
+      }
+      py = (ey + sy) >> 1;
+    }
+    var ratio = (py / ih);
+    return (ratio===0)?1:ratio;
+  }
+
+  /**
+   * Rendering image element (with resizing) and get its data URL
+   */
+  function renderImageToDataURL(img, options, doSquash) {
+    var canvas = document.createElement('canvas'),
+        mime = options.mime || "image/jpeg";
+
+    renderImageToCanvas(img, canvas, options, doSquash);
+    return canvas.toDataURL(mime, options.quality || 0.8);
+  }
+
+  /**
+   * Rendering image element (with resizing) into the canvas element
+   */
+  function renderImageToCanvas(img, canvas, options, doSquash) {
+    var iw = img.naturalWidth, ih = img.naturalHeight;
+    var width = options.width, height = options.height;
+    var ctx = canvas.getContext('2d');
+    ctx.save();
+    transformCoordinate(canvas, width, height, options.orientation);
+
+    // Fine Uploader specific: Save some CPU cycles if not using iOS
+    // Assumption: This logic is only needed to overcome iOS image sampling issues
+    if (qq.ios()) {
+        var subsampled = detectSubsampling(img);
+        if (subsampled) {
+          iw /= 2;
+          ih /= 2;
+        }
+        var d = 1024; // size of tiling canvas
+        var tmpCanvas = document.createElement('canvas');
+        tmpCanvas.width = tmpCanvas.height = d;
+        var tmpCtx = tmpCanvas.getContext('2d');
+        var vertSquashRatio = doSquash ? detectVerticalSquash(img, iw, ih) : 1;
+        var dw = Math.ceil(d * width / iw);
+        var dh = Math.ceil(d * height / ih / vertSquashRatio);
+        var sy = 0;
+        var dy = 0;
+        while (sy < ih) {
+          var sx = 0;
+          var dx = 0;
+          while (sx < iw) {
+            tmpCtx.clearRect(0, 0, d, d);
+            tmpCtx.drawImage(img, -sx, -sy);
+            ctx.drawImage(tmpCanvas, 0, 0, d, d, dx, dy, dw, dh);
+            sx += d;
+            dx += dw;
+          }
+          sy += d;
+          dy += dh;
+        }
+        ctx.restore();
+        tmpCanvas = tmpCtx = null;
+    }
+    else {
+        ctx.drawImage(img, 0, 0, width, height);
+    }
+  }
+
+  /**
+   * Transform canvas coordination according to specified frame size and orientation
+   * Orientation value is from EXIF tag
+   */
+  function transformCoordinate(canvas, width, height, orientation) {
+    switch (orientation) {
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+        canvas.width = height;
+        canvas.height = width;
+        break;
+      default:
+        canvas.width = width;
+        canvas.height = height;
+    }
+    var ctx = canvas.getContext('2d');
+    switch (orientation) {
+      case 2:
+        // horizontal flip
+        ctx.translate(width, 0);
+        ctx.scale(-1, 1);
+        break;
+      case 3:
+        // 180 rotate left
+        ctx.translate(width, height);
+        ctx.rotate(Math.PI);
+        break;
+      case 4:
+        // vertical flip
+        ctx.translate(0, height);
+        ctx.scale(1, -1);
+        break;
+      case 5:
+        // vertical flip + 90 rotate right
+        ctx.rotate(0.5 * Math.PI);
+        ctx.scale(1, -1);
+        break;
+      case 6:
+        // 90 rotate right
+        ctx.rotate(0.5 * Math.PI);
+        ctx.translate(0, -height);
+        break;
+      case 7:
+        // horizontal flip + 90 rotate right
+        ctx.rotate(0.5 * Math.PI);
+        ctx.translate(width, -height);
+        ctx.scale(-1, 1);
+        break;
+      case 8:
+        // 90 rotate left
+        ctx.rotate(-0.5 * Math.PI);
+        ctx.translate(-width, 0);
+        break;
+      default:
+        break;
+    }
+  }
+
+
+  /**
+   * MegaPixImage class
+   */
+  function MegaPixImage(srcImage, errorCallback) {
+    if (window.Blob && srcImage instanceof Blob) {
+      var img = new Image();
+      var URL = window.URL && window.URL.createObjectURL ? window.URL :
+                window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL :
+                null;
+      if (!URL) { throw Error("No createObjectURL function found to create blob url"); }
+      img.src = URL.createObjectURL(srcImage);
+      this.blob = srcImage;
+      srcImage = img;
+    }
+    if (!srcImage.naturalWidth && !srcImage.naturalHeight) {
+      var _this = this;
+      srcImage.onload = function() {
+        var listeners = _this.imageLoadListeners;
+        if (listeners) {
+          _this.imageLoadListeners = null;
+          for (var i=0, len=listeners.length; i<len; i++) {
+            listeners[i]();
+          }
+        }
+      };
+      srcImage.onerror = errorCallback;
+      this.imageLoadListeners = [];
+    }
+    this.srcImage = srcImage;
+  }
+
+  /**
+   * Rendering megapix image into specified target element
+   */
+  MegaPixImage.prototype.render = function(target, options) {
+    if (this.imageLoadListeners) {
+      var _this = this;
+      this.imageLoadListeners.push(function() { _this.render(target, options) });
+      return;
+    }
+    options = options || {};
+    var imgWidth = this.srcImage.naturalWidth, imgHeight = this.srcImage.naturalHeight,
+        width = options.width, height = options.height,
+        maxWidth = options.maxWidth, maxHeight = options.maxHeight,
+        doSquash = !this.blob || this.blob.type === 'image/jpeg';
+    if (width && !height) {
+      height = (imgHeight * width / imgWidth) << 0;
+    } else if (height && !width) {
+      width = (imgWidth * height / imgHeight) << 0;
+    } else {
+      width = imgWidth;
+      height = imgHeight;
+    }
+    if (maxWidth && width > maxWidth) {
+      width = maxWidth;
+      height = (imgHeight * width / imgWidth) << 0;
+    }
+    if (maxHeight && height > maxHeight) {
+      height = maxHeight;
+      width = (imgWidth * height / imgHeight) << 0;
+    }
+    var opt = { width : width, height : height };
+    for (var k in options) opt[k] = options[k];
+
+    var tagName = target.tagName.toLowerCase();
+    if (tagName === 'img') {
+      target.src = renderImageToDataURL(this.srcImage, opt, doSquash);
+    } else if (tagName === 'canvas') {
+      renderImageToCanvas(this.srcImage, target, opt, doSquash);
+    }
+    if (typeof this.onrender === 'function') {
+      this.onrender(target);
+    }
+  };
+
+  /**
+   * Export class to global
+   */
+  if (typeof define === 'function' && define.amd) {
+    define([], function() { return MegaPixImage; }); // for AMD loader
+  } else {
+    this.MegaPixImage = MegaPixImage;
+  }
+
+})();
+
+/*globals qq, MegaPixImage */
+/**
+ * Draws a thumbnail of a Blob/File/URL onto an <img> or <canvas>.
+ *
+ * @constructor
+ */
+qq.ImageGenerator = function(log) {
+    "use strict";
+
+    function isImg(el) {
+        return el.tagName.toLowerCase() === "img";
+    }
+
+    function isCanvas(el) {
+        return el.tagName.toLowerCase() === "canvas";
+    }
+
+    function isImgCorsSupported() {
+        return new Image().crossOrigin !== undefined;
+    }
+
+    function isCanvasSupported() {
+        var canvas = document.createElement("canvas");
+
+        return canvas.getContext && canvas.getContext("2d");
+    }
+
+    // This is only meant to determine the MIME type of a renderable image file.
+    // It is used to ensure images drawn from a URL that have transparent backgrounds
+    // are rendered correctly, among other things.
+    function determineMimeOfFileName(nameWithPath) {
+        /*jshint -W015 */
+        var pathSegments = nameWithPath.split("/"),
+            name = pathSegments[pathSegments.length - 1],
+            extension = qq.getExtension(name);
+
+        extension = extension && extension.toLowerCase();
+
+        switch(extension) {
+            case "jpeg":
+            case "jpg":
+                return "image/jpeg";
+            case "png":
+                return "image/png";
+            case "bmp":
+                return "image/bmp";
+            case "gif":
+                return "image/gif";
+            case "tiff":
+            case "tif":
+                return "image/tiff";
+        }
+    }
+
+    // This will likely not work correctly in IE8 and older.
+    // It's only used as part of a formula to determine
+    // if a canvas can be used to scale a server-hosted thumbnail.
+    // If canvas isn't supported by the UA (IE8 and older)
+    // this method should not even be called.
+    function isCrossOrigin(url) {
+        var targetAnchor = document.createElement("a"),
+            targetProtocol, targetHostname, targetPort;
+
+        targetAnchor.href = url;
+
+        targetProtocol = targetAnchor.protocol;
+        targetPort = targetAnchor.port;
+        targetHostname = targetAnchor.hostname;
+
+        if (targetProtocol.toLowerCase() !== window.location.protocol.toLowerCase()) {
+            return true;
+        }
+
+        if (targetHostname.toLowerCase() !== window.location.hostname.toLowerCase()) {
+            return true;
+        }
+
+        // IE doesn't take ports into consideration when determining if two endpoints are same origin.
+        if (targetPort !== window.location.port && !qq.ie()) {
+            return true;
+        }
+
+        return false;
+    }
+
+    function registerImgLoadListeners(img, promise) {
+        img.onload = function() {
+            img.onload = null;
+            img.onerror = null;
+            promise.success(img);
+        };
+
+        img.onerror = function() {
+            img.onload = null;
+            img.onerror = null;
+            log("Problem drawing thumbnail!", "error");
+            promise.failure(img, "Problem drawing thumbnail!");
+        };
+    }
+
+    function registerCanvasDrawImageListener(canvas, promise) {
+        var context = canvas.getContext("2d"),
+            oldDrawImage = context.drawImage;
+
+        // The image is drawn on the canvas by a third-party library,
+        // and we want to know when this happens so we can fulfill the associated promise.
+        context.drawImage = function() {
+            oldDrawImage.apply(this, arguments);
+            promise.success(canvas);
+            context.drawImage = oldDrawImage;
+        };
+    }
+
+    // Fulfills a `qq.Promise` when an image has been drawn onto the target,
+    // whether that is a <canvas> or an <img>.  The attempt is considered a
+    // failure if the target is not an <img> or a <canvas>, or if the drawing
+    // attempt was not successful.
+    function registerThumbnailRenderedListener(imgOrCanvas, promise) {
+        var registered = isImg(imgOrCanvas) || isCanvas(imgOrCanvas);
+
+        if (isImg(imgOrCanvas)) {
+            registerImgLoadListeners(imgOrCanvas, promise);
+        }
+        else if (isCanvas(imgOrCanvas)) {
+            registerCanvasDrawImageListener(imgOrCanvas, promise);
+        }
+        else {
+            promise.failure(imgOrCanvas);
+            log(qq.format("Element container of type {} is not supported!", imgOrCanvas.tagName), "error");
+        }
+
+        return registered;
+    }
+
+    // Draw a preview iff the current UA can natively display it.
+    // Also rotate the image if necessary.
+    function draw(fileOrBlob, container, options) {
+        var drawPreview = new qq.Promise(),
+            identifier = new qq.Identify(fileOrBlob, log),
+            maxSize = options.maxSize,
+            megapixErrorHandler = function() {
+                container.onerror = null;
+                container.onload = null;
+                log("Could not render preview, file may be too large!", "error");
+                drawPreview.failure(container, "Browser cannot render image!");
+            };
+
+        identifier.isPreviewable().then(
+            function(mime) {
+                var exif = new qq.Exif(fileOrBlob, log),
+                    mpImg = new MegaPixImage(fileOrBlob, megapixErrorHandler);
+
+                if (registerThumbnailRenderedListener(container, drawPreview)) {
+                    exif.parse().then(
+                        function(exif) {
+                            var orientation = exif.Orientation;
+
+                            mpImg.render(container, {
+                                maxWidth: maxSize,
+                                maxHeight: maxSize,
+                                orientation: orientation,
+                                mime: mime
+                            });
+                        },
+
+                        function(failureMsg) {
+                            log(qq.format("EXIF data could not be parsed ({}).  Assuming orientation = 1.", failureMsg));
+
+                            mpImg.render(container, {
+                                maxWidth: maxSize,
+                                maxHeight: maxSize,
+                                mime: mime
+                            });
+                        }
+                    );
+                }
+            },
+
+            function() {
+                log("Not previewable");
+                drawPreview.failure(container, "Not previewable");
+            }
+        );
+
+        return drawPreview;
+    }
+
+    function drawOnCanvasOrImgFromUrl(url, canvasOrImg, draw, maxSize) {
+        var tempImg = new Image(),
+            tempImgRender = new qq.Promise();
+
+        registerThumbnailRenderedListener(tempImg, tempImgRender);
+
+        if (isCrossOrigin(url)) {
+            tempImg.crossOrigin = "anonymous";
+        }
+
+        tempImg.src = url;
+
+        tempImgRender.then(function() {
+            registerThumbnailRenderedListener(canvasOrImg, draw);
+
+            var mpImg = new MegaPixImage(tempImg);
+            mpImg.render(canvasOrImg, {
+                maxWidth: maxSize,
+                maxHeight: maxSize,
+                mime: determineMimeOfFileName(url)
+            });
+        });
+    }
+
+    function drawOnImgFromUrlWithCssScaling(url, img, draw, maxSize) {
+        registerThumbnailRenderedListener(img, draw);
+        qq(img).css({
+            maxWidth: maxSize + "px",
+            maxHeight: maxSize + "px"
+        });
+
+        img.src = url;
+    }
+
+    // Draw a (server-hosted) thumbnail given a URL.
+    // This will optionally scale the thumbnail as well.
+    // It attempts to use <canvas> to scale, but will fall back
+    // to max-width and max-height style properties if the UA
+    // doesn't support canvas or if the images is cross-domain and
+    // the UA doesn't support the crossorigin attribute on img tags,
+    // which is required to scale a cross-origin image using <canvas> &
+    // then export it back to an <img>.
+    function drawFromUrl(url, container, options) {
+        var draw = new qq.Promise(),
+            scale = options.scale,
+            maxSize = scale ? options.maxSize : null;
+
+        // container is an img, scaling needed
+        if (scale && isImg(container)) {
+            // Iff canvas is available in this UA, try to use it for scaling.
+            // Otherwise, fall back to CSS scaling
+            if (isCanvasSupported()) {
+                // Attempt to use <canvas> for image scaling,
+                // but we must fall back to scaling via CSS/styles
+                // if this is a cross-origin image and the UA doesn't support <img> CORS.
+                if (isCrossOrigin(url) && !isImgCorsSupported()) {
+                    drawOnImgFromUrlWithCssScaling(url, container, draw, maxSize);
+                }
+                else {
+                    drawOnCanvasOrImgFromUrl(url, container, draw, maxSize);
+                }
+            }
+            else {
+                drawOnImgFromUrlWithCssScaling(url, container, draw, maxSize);
+            }
+        }
+        // container is a canvas, scaling optional
+        else if (isCanvas(container)) {
+            drawOnCanvasOrImgFromUrl(url, container, draw, maxSize);
+        }
+        // container is an img & no scaling: just set the src attr to the passed url
+        else if (registerThumbnailRenderedListener(container, draw)) {
+            container.src = url;
+        }
+
+        return draw;
+    }
+
+
+    qq.extend(this, {
+        /**
+         * Generate a thumbnail.  Depending on the arguments, this may either result in
+         * a client-side rendering of an image (if a `Blob` is supplied) or a server-generated
+         * image that may optionally be scaled client-side using <canvas> or CSS/styles (as a fallback).
+         *
+         * @param fileBlobOrUrl a `File`, `Blob`, or a URL pointing to the image
+         * @param container <img> or <canvas> to contain the preview
+         * @param options possible properties include `maxSize` (int), `orient` (bool), and `resize` (bool)
+         * @returns qq.Promise fulfilled when the preview has been drawn, or the attempt has failed
+         */
+        generate: function(fileBlobOrUrl, container, options) {
+            if (qq.isString(fileBlobOrUrl)) {
+                log("Attempting to update thumbnail based on server response.");
+                return drawFromUrl(fileBlobOrUrl, container, options || {});
+            }
+            else {
+                log("Attempting to draw client-side image preview.");
+                return draw(fileBlobOrUrl, container, options || {});
+            }
+        }
+    });
+
+    /*<testing>*/
+    this._testing = {};
+    this._testing.isImg = isImg;
+    this._testing.isCanvas = isCanvas;
+    this._testing.isCrossOrigin = isCrossOrigin;
+    this._testing.determineMimeOfFileName = determineMimeOfFileName;
+    /*</testing>*/
+};
+
+/*globals qq */
+/**
+ * EXIF image data parser.  Currently only parses the Orientation tag value,
+ * but this may be expanded to other tags in the future.
+ *
+ * @param fileOrBlob Attempt to parse EXIF data in this `Blob`
+ * @constructor
+ */
+qq.Exif = function(fileOrBlob, log) {
+    "use strict";
+
+    // Orientation is the only tag parsed here at this time.
+    var TAG_IDS = [274],
+        TAG_INFO = {
+            274: {
+                name: "Orientation",
+                bytes: 2
+            }
+        };
+
+    // Convert a little endian (hex string) to big endian (decimal).
+    function parseLittleEndian(hex) {
+        var result = 0,
+            pow = 0;
+
+        while (hex.length > 0) {
+            result += parseInt(hex.substring(0, 2), 16) * Math.pow(2, pow);
+            hex = hex.substring(2, hex.length);
+            pow += 8;
+        }
+
+        return result;
+    }
+
+    // Find the byte offset, of Application Segment 1 (EXIF).
+    // External callers need not supply any arguments.
+    function seekToApp1(offset, promise) {
+        var theOffset = offset,
+            thePromise = promise;
+        if (theOffset === undefined) {
+            theOffset = 2;
+            thePromise = new qq.Promise();
+        }
+
+        qq.readBlobToHex(fileOrBlob, theOffset, 4).then(function(hex) {
+            var match = /^ffe([0-9])/.exec(hex);
+            if (match) {
+                if (match[1] !== "1") {
+                    var segmentLength = parseInt(hex.slice(4, 8), 16);
+                    seekToApp1(theOffset + segmentLength + 2, thePromise);
+                }
+                else {
+                    thePromise.success(theOffset);
+                }
+            }
+            else {
+                thePromise.failure("No EXIF header to be found!");
+            }
+        });
+
+        return thePromise;
+    }
+
+    // Find the byte offset of Application Segment 1 (EXIF) for valid JPEGs only.
+    function getApp1Offset() {
+        var promise = new qq.Promise();
+
+        qq.readBlobToHex(fileOrBlob, 0, 6).then(function(hex) {
+            if (hex.indexOf("ffd8") !== 0) {
+                promise.failure("Not a valid JPEG!");
+            }
+            else {
+                seekToApp1().then(function(offset) {
+                    promise.success(offset);
+                },
+                function(error) {
+                    promise.failure(error);
+                });
+            }
+        });
+
+        return promise;
+    }
+
+    // Determine the byte ordering of the EXIF header.
+    function isLittleEndian(app1Start) {
+        var promise = new qq.Promise();
+
+        qq.readBlobToHex(fileOrBlob, app1Start + 10, 2).then(function(hex) {
+            promise.success(hex === "4949");
+        });
+
+        return promise;
+    }
+
+    // Determine the number of directory entries in the EXIF header.
+    function getDirEntryCount(app1Start, littleEndian) {
+        var promise = new qq.Promise();
+
+        qq.readBlobToHex(fileOrBlob, app1Start + 18, 2).then(function(hex) {
+            if (littleEndian) {
+                return promise.success(parseLittleEndian(hex));
+            }
+            else {
+                promise.success(parseInt(hex, 16));
+            }
+        });
+
+        return promise;
+    }
+
+    // Get the IFD portion of the EXIF header as a hex string.
+    function getIfd(app1Start, dirEntries) {
+        var offset = app1Start + 20,
+            bytes = dirEntries * 12;
+
+        return qq.readBlobToHex(fileOrBlob, offset, bytes);
+    }
+
+    // Obtain an array of all directory entries (as hex strings) in the EXIF header.
+    function getDirEntries(ifdHex) {
+        var entries = [],
+            offset = 0;
+
+        while (offset+24 <= ifdHex.length) {
+            entries.push(ifdHex.slice(offset, offset + 24));
+            offset += 24;
+        }
+
+        return entries;
+    }
+
+    // Obtain values for all relevant tags and return them.
+    function getTagValues(littleEndian, dirEntries) {
+        var TAG_VAL_OFFSET = 16,
+            tagsToFind = qq.extend([], TAG_IDS),
+            vals = {};
+
+        qq.each(dirEntries, function(idx, entry) {
+            var idHex = entry.slice(0, 4),
+                id = littleEndian ? parseLittleEndian(idHex) : parseInt(idHex, 16),
+                tagsToFindIdx = tagsToFind.indexOf(id),
+                tagValHex, tagName, tagValLength;
+
+            if (tagsToFindIdx >= 0) {
+                tagName = TAG_INFO[id].name;
+                tagValLength = TAG_INFO[id].bytes;
+                tagValHex = entry.slice(TAG_VAL_OFFSET, TAG_VAL_OFFSET + (tagValLength*2));
+                vals[tagName] = littleEndian ? parseLittleEndian(tagValHex) : parseInt(tagValHex, 16);
+
+                tagsToFind.splice(tagsToFindIdx, 1);
+            }
+
+            if (tagsToFind.length === 0) {
+                return false;
+            }
+        });
+
+        return vals;
+    }
+
+    qq.extend(this, {
+        /**
+         * Attempt to parse the EXIF header for the `Blob` associated with this instance.
+         *
+         * @returns {qq.Promise} To be fulfilled when the parsing is complete.
+         * If successful, the parsed EXIF header as an object will be included.
+         */
+        parse: function() {
+            var parser = new qq.Promise(),
+                onParseFailure = function(message) {
+                    log(qq.format("EXIF header parse failed: '{}' ", message));
+                    parser.failure(message);
+                };
+
+            getApp1Offset().then(function(app1Offset) {
+                log(qq.format("Moving forward with EXIF header parsing for '{}'", fileOrBlob.name === undefined ? "blob" : fileOrBlob.name));
+
+                isLittleEndian(app1Offset).then(function(littleEndian) {
+
+                    log(qq.format("EXIF Byte order is {} endian", littleEndian ? "little" : "big"));
+
+                    getDirEntryCount(app1Offset, littleEndian).then(function(dirEntryCount) {
+
+                        log(qq.format("Found {} APP1 directory entries", dirEntryCount));
+
+                        getIfd(app1Offset, dirEntryCount).then(function(ifdHex) {
+                            var dirEntries = getDirEntries(ifdHex),
+                                tagValues = getTagValues(littleEndian, dirEntries);
+
+                            log("Successfully parsed some EXIF tags");
+
+                            parser.success(tagValues);
+                        }, onParseFailure);
+                    }, onParseFailure);
+                }, onParseFailure);
+            }, onParseFailure);
+
+            return parser;
+        }
+    });
+
+    /*<testing>*/
+    this._testing = {};
+    this._testing.parseLittleEndian = parseLittleEndian;
+    /*</testing>*/
+};
+
+/*globals qq */
+qq.Identify = function(fileOrBlob, log) {
+    "use strict";
+
+    var PREVIEWABLE_MAGIC_BYTES = {
+            "image/jpeg": "ffd8ff",
+            "image/gif": "474946",
+            "image/png": "89504e",
+            "image/bmp": "424d",
+            "image/tiff": ["49492a00", "4d4d002a"]
+        };
+
+    function isIdentifiable(magicBytes, questionableBytes) {
+        var identifiable = false,
+            magicBytesEntries = [].concat(magicBytes);
+
+        qq.each(magicBytesEntries, function(idx, magicBytesArrayEntry) {
+            if (questionableBytes.indexOf(magicBytesArrayEntry) === 0) {
+                identifiable = true;
+                return false;
+            }
+        });
+
+        return identifiable;
+    }
+
+    qq.extend(this, {
+        isPreviewable: function() {
+            var idenitifer = new qq.Promise(),
+                previewable = false,
+                name = fileOrBlob.name === undefined ? "blob" : fileOrBlob.name;
+
+            log(qq.format("Attempting to determine if {} can be rendered in this browser", name));
+
+            qq.readBlobToHex(fileOrBlob, 0, 4).then(function(hex) {
+                qq.each(PREVIEWABLE_MAGIC_BYTES, function(mime, bytes) {
+                    if (isIdentifiable(bytes, hex)) {
+                        // Safari is the only supported browser that can deal with TIFFs natively,
+                        // so, if this is a TIFF and the UA isn't Safari, declare this file "non-previewable".
+                        if (mime !== "image/tiff" || qq.safari()) {
+                            previewable = true;
+                            idenitifer.success(mime);
+                        }
+
+                        return false;
+                    }
+                });
+
+                log(qq.format("'{}' is {} able to be rendered in this browser", name, previewable ? "" : "NOT"));
+
+                if (!previewable) {
+                    idenitifer.failure();
+                }
+            });
+
+            return idenitifer;
+        }
+    });
+};
+
+/*globals qq*/
+/**
+ * Attempts to validate an image, wherever possible.
+ *
+ * @param blob File or Blob representing a user-selecting image.
+ * @param log Uses this to post log messages to the console.
+ * @constructor
+ */
+qq.ImageValidation = function(blob, log) {
+    "use strict";
+
+    /**
+     * @param limits Object with possible image-related limits to enforce.
+     * @returns {boolean} true if at least one of the limits has a non-zero value
+     */
+    function hasNonZeroLimits(limits) {
+        var atLeastOne = false;
+
+        qq.each(limits, function(limit, value) {
+            if (value > 0) {
+                atLeastOne = true;
+                return false;
+            }
+        });
+
+        return atLeastOne;
+    }
+
+    /**
+     * @returns {qq.Promise} The promise is a failure if we can't obtain the width & height.
+     * Otherwise, `success` is called on the returned promise with an object containing
+     * `width` and `height` properties.
+     */
+    function getWidthHeight() {
+        var sizeDetermination = new qq.Promise();
+
+        new qq.Identify(blob, log).isPreviewable().then(function() {
+            var image = new Image(),
+                url = window.URL && window.URL.createObjectURL ? window.URL :
+                      window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL :
+                      null;
+
+            if (url) {
+                image.onerror = function() {
+                    log("Cannot determine dimensions for image.  May be too large.", "error");
+                    sizeDetermination.failure();
+                };
+
+                image.onload = function() {
+                    sizeDetermination.success({
+                        width: this.width,
+                        height: this.height
+                    });
+                };
+
+                image.src = url.createObjectURL(blob);
+            }
+            else {
+                log("No createObjectURL function available to generate image URL!", "error");
+                sizeDetermination.failure();
+            }
+        }, sizeDetermination.failure);
+
+        return sizeDetermination;
+    }
+
+    /**
+     *
+     * @param limits Object with possible image-related limits to enforce.
+     * @param dimensions Object containing `width` & `height` properties for the image to test.
+     * @returns {String || undefined} The name of the failing limit.  Undefined if no failing limits.
+     */
+    function getFailingLimit(limits, dimensions) {
+        var failingLimit;
+
+        qq.each(limits, function(limitName, limitValue) {
+            if (limitValue > 0) {
+                var limitMatcher = /(max|min)(Width|Height)/.exec(limitName),
+                    dimensionPropName = limitMatcher[2].charAt(0).toLowerCase() + limitMatcher[2].slice(1),
+                    actualValue = dimensions[dimensionPropName];
+
+                /*jshint -W015*/
+                switch(limitMatcher[1]) {
+                    case "min":
+                        if (actualValue < limitValue) {
+                            failingLimit = limitName;
+                            return false;
+                        }
+                        break;
+                    case "max":
+                        if (actualValue > limitValue) {
+                            failingLimit = limitName;
+                            return false;
+                        }
+                        break;
+                }
+            }
+        });
+
+        return failingLimit;
+    }
+
+    /**
+     * Validate the associated blob.
+     *
+     * @param limits
+     * @returns {qq.Promise} `success` is called on the promise is the image is valid or
+     * if the blob is not an image, or if the image is not verifiable.
+     * Otherwise, `failure` with the name of the failing limit.
+     */
+    this.validate = function(limits) {
+        var validationEffort = new qq.Promise();
+
+        log("Attempting to validate image.");
+
+        if (hasNonZeroLimits(limits)) {
+            getWidthHeight().then(function(dimensions) {
+                var failingLimit = getFailingLimit(limits, dimensions);
+
+                if (failingLimit) {
+                    validationEffort.failure(failingLimit);
+                }
+                else {
+                    validationEffort.success();
+                }
+            }, validationEffort.success);
+        }
+        else {
+            validationEffort.success();
+        }
+
+        return validationEffort;
+    };
+};
+
+/* globals qq */
+/**
+ * Module used to control populating the initial list of files.
+ *
+ * @constructor
+ */
+qq.Session = function(spec) {
+    "use strict";
+
+    var options = {
+        endpoint: null,
+        params: {},
+        customHeaders: {},
+        cors: {},
+        addFileRecord: function(sessionData) {},
+        log: function(message, level) {}
+    };
+
+    qq.extend(options, spec, true);
+
+
+    function isJsonResponseValid(response) {
+        if (qq.isArray(response)) {
+            return true;
+        }
+
+        options.log("Session response is not an array.", "error");
+    }
+
+    function handleFileItems(fileItems, success, xhrOrXdr, promise) {
+        var someItemsIgnored = false;
+
+        success = success && isJsonResponseValid(fileItems);
+
+        if (success) {
+            qq.each(fileItems, function(idx, fileItem) {
+                /* jshint eqnull:true */
+                if (fileItem.uuid == null) {
+                    someItemsIgnored = true;
+                    options.log(qq.format("Session response item {} did not include a valid UUID - ignoring.", idx), "error");
+                }
+                else if (fileItem.name == null) {
+                    someItemsIgnored = true;
+                    options.log(qq.format("Session response item {} did not include a valid name - ignoring.", idx), "error");
+                }
+                else {
+                    try {
+                        options.addFileRecord(fileItem);
+                        return true;
+                    }
+                    catch(err) {
+                        someItemsIgnored = true;
+                        options.log(err.message, "error");
+                    }
+                }
+
+                return false;
+            });
+        }
+
+        promise[success && !someItemsIgnored ? "success" : "failure"](fileItems, xhrOrXdr);
+    }
+
+    // Initiate a call to the server that will be used to populate the initial file list.
+    // Returns a `qq.Promise`.
+    this.refresh = function() {
+        /*jshint indent:false */
+        var refreshEffort = new qq.Promise(),
+            refreshCompleteCallback = function(response, success, xhrOrXdr) {
+                handleFileItems(response, success, xhrOrXdr, refreshEffort);
+            },
+            requsterOptions = qq.extend({}, options),
+            requester = new qq.SessionAjaxRequester(
+                qq.extend(requsterOptions, {onComplete: refreshCompleteCallback})
+            );
+
+        requester.queryServer();
+
+        return refreshEffort;
+    };
+};
+
+/*globals qq, XMLHttpRequest*/
+/**
+ * Thin module used to send GET requests to the server, expecting information about session
+ * data used to initialize an uploader instance.
+ *
+ * @param spec Various options used to influence the associated request.
+ * @constructor
+ */
+qq.SessionAjaxRequester = function(spec) {
+    "use strict";
+
+    var requester,
+        options = {
+            endpoint: null,
+            customHeaders: {},
+            params: {},
+            cors: {
+                expected: false,
+                sendCredentials: false
+            },
+            onComplete: function(response, success, xhrOrXdr) {},
+            log: function(str, level) {}
+        };
+
+    qq.extend(options, spec);
+
+    function onComplete(id, xhrOrXdr, isError) {
+        var response = null;
+
+        /* jshint eqnull:true */
+        if (xhrOrXdr.responseText != null) {
+            try {
+                response = qq.parseJson(xhrOrXdr.responseText);
+            }
+            catch(err) {
+                options.log("Problem parsing session response: " + err.message, "error");
+                isError = true;
+            }
+        }
+
+        options.onComplete(response, !isError, xhrOrXdr);
+    }
+
+    requester = new qq.AjaxRequester({
+        validMethods: ["GET"],
+        method: "GET",
+        endpointStore: {
+            getEndpoint: function() {
+                return options.endpoint;
+            }
+        },
+        customHeaders: options.customHeaders,
+        log: options.log,
+        onComplete: onComplete,
+        cors: options.cors
+    });
+
+
+    qq.extend(this, {
+        queryServer: function() {
+            var params = qq.extend({}, options.params);
+
+            // cache buster, particularly for IE & iOS
+            params.qqtimestamp = new Date().getTime();
+
+            options.log("Session query request.");
+
+            requester.initTransport("sessionRefresh")
+                .withParams(params)
+                .send();
+        }
+    });
+};
+
+/*globals qq */
+// Base handler for UI (FineUploader mode) events.
+// Some more specific handlers inherit from this one.
+qq.UiEventHandler = function(s, protectedApi) {
+    "use strict";
+
+    var disposer = new qq.DisposeSupport(),
+        spec = {
+            eventType: "click",
+            attachTo: null,
+            onHandled: function(target, event) {}
+        };
+
+
+    // This makes up the "public" API methods that will be accessible
+    // to instances constructing a base or child handler
+    qq.extend(this, {
+        addHandler: function(element) {
+            addHandler(element);
+        },
+
+        dispose: function() {
+            disposer.dispose();
+        }
+    });
+
+    function addHandler(element) {
+        disposer.attach(element, spec.eventType, function(event) {
+            // Only in IE: the `event` is a property of the `window`.
+            event = event || window.event;
+
+            // On older browsers, we must check the `srcElement` instead of the `target`.
+            var target = event.target || event.srcElement;
+
+            spec.onHandled(target, event);
+        });
+    }
+
+    // These make up the "protected" API methods that children of this base handler will utilize.
+    qq.extend(protectedApi, {
+        getFileIdFromItem: function(item) {
+            return item.qqFileId;
+        },
+
+        getDisposeSupport: function() {
+            return disposer;
+        }
+    });
+
+
+    qq.extend(spec, s);
+
+    if (spec.attachTo) {
+        addHandler(spec.attachTo);
+    }
+};
+
+/* global qq */
+qq.FileButtonsClickHandler = function(s) {
+    "use strict";
+
+    var inheritedInternalApi = {},
+        spec = {
+            templating: null,
+            log: function(message, lvl) {},
+            onDeleteFile: function(fileId) {},
+            onCancel: function(fileId) {},
+            onRetry: function(fileId) {},
+            onPause: function(fileId) {},
+            onContinue: function(fileId) {},
+            onGetName: function(fileId) {}
+        },
+        buttonHandlers = {
+            cancel: function(id) { spec.onCancel(id); },
+            retry:  function(id) { spec.onRetry(id); },
+            deleteButton: function(id) { spec.onDeleteFile(id); },
+            pause: function(id) { spec.onPause(id); },
+            continueButton: function(id) { spec.onContinue(id); }
+        };
+
+    function examineEvent(target, event) {
+        qq.each(buttonHandlers, function(buttonType, handler) {
+            var firstLetterCapButtonType = buttonType.charAt(0).toUpperCase() + buttonType.slice(1),
+                fileId;
+
+            if (spec.templating["is" + firstLetterCapButtonType](target)) {
+                fileId = spec.templating.getFileId(target);
+                qq.preventDefault(event);
+                spec.log(qq.format("Detected valid file button click event on file '{}', ID: {}.", spec.onGetName(fileId), fileId));
+                handler(fileId);
+                return false;
+            }
+        });
+    }
+
+    qq.extend(spec, s);
+
+    spec.eventType = "click";
+    spec.onHandled = examineEvent;
+    spec.attachTo = spec.templating.getFileList();
+
+    qq.extend(this, new qq.UiEventHandler(spec, inheritedInternalApi));
+};
+
+/*globals qq */
+// Child of FilenameEditHandler.  Used to detect click events on filename display elements.
+qq.FilenameClickHandler = function(s) {
+    "use strict";
+
+    var inheritedInternalApi = {},
+        spec = {
+            templating: null,
+            log: function(message, lvl) {},
+            classes: {
+                file: "qq-upload-file",
+                editNameIcon: "qq-edit-filename-icon"
+            },
+            onGetUploadStatus: function(fileId) {},
+            onGetName: function(fileId) {}
+        };
+
+    qq.extend(spec, s);
+
+    // This will be called by the parent handler when a `click` event is received on the list element.
+    function examineEvent(target, event) {
+        if (spec.templating.isFileName(target) || spec.templating.isEditIcon(target)) {
+            var fileId = spec.templating.getFileId(target),
+                status = spec.onGetUploadStatus(fileId);
+
+            // We only allow users to change filenames of files that have been submitted but not yet uploaded.
+            if (status === qq.status.SUBMITTED) {
+                spec.log(qq.format("Detected valid filename click event on file '{}', ID: {}.", spec.onGetName(fileId), fileId));
+                qq.preventDefault(event);
+
+                inheritedInternalApi.handleFilenameEdit(fileId, target, true);
+            }
+        }
+    }
+
+    spec.eventType = "click";
+    spec.onHandled = examineEvent;
+
+    qq.extend(this, new qq.FilenameEditHandler(spec, inheritedInternalApi));
+};
+
+/*globals qq */
+// Child of FilenameEditHandler.  Used to detect focusin events on file edit input elements.
+qq.FilenameInputFocusInHandler = function(s, inheritedInternalApi) {
+    "use strict";
+
+    var spec = {
+            templating: null,
+            onGetUploadStatus: function(fileId) {},
+            log: function(message, lvl) {}
+        };
+
+    if (!inheritedInternalApi) {
+        inheritedInternalApi = {};
+    }
+
+    // This will be called by the parent handler when a `focusin` event is received on the list element.
+    function handleInputFocus(target, event) {
+        if (spec.templating.isEditInput(target)) {
+            var fileId = spec.templating.getFileId(target),
+                status = spec.onGetUploadStatus(fileId);
+
+            if (status === qq.status.SUBMITTED) {
+                spec.log(qq.format("Detected valid filename input focus event on file '{}', ID: {}.", spec.onGetName(fileId), fileId));
+                inheritedInternalApi.handleFilenameEdit(fileId, target);
+            }
+        }
+    }
+
+    spec.eventType = "focusin";
+    spec.onHandled = handleInputFocus;
+
+    qq.extend(spec, s);
+    qq.extend(this, new qq.FilenameEditHandler(spec, inheritedInternalApi));
+};
+
+/*globals qq */
+/**
+ * Child of FilenameInputFocusInHandler.  Used to detect focus events on file edit input elements.  This child module is only
+ * needed for UAs that do not support the focusin event.  Currently, only Firefox lacks this event.
+ *
+ * @param spec Overrides for default specifications
+ */
+qq.FilenameInputFocusHandler = function(spec) {
+    "use strict";
+
+    spec.eventType = "focus";
+    spec.attachTo = null;
+
+    qq.extend(this, new qq.FilenameInputFocusInHandler(spec, {}));
+};
+
+/*globals qq */
+// Handles edit-related events on a file item (FineUploader mode).  This is meant to be a parent handler.
+// Children will delegate to this handler when specific edit-related actions are detected.
+qq.FilenameEditHandler = function(s, inheritedInternalApi) {
+    "use strict";
+
+    var spec = {
+            templating: null,
+            log: function(message, lvl) {},
+            onGetUploadStatus: function(fileId) {},
+            onGetName: function(fileId) {},
+            onSetName: function(fileId, newName) {},
+            onEditingStatusChange: function(fileId, isEditing) {}
+        };
+
+
+    function getFilenameSansExtension(fileId) {
+        var filenameSansExt = spec.onGetName(fileId),
+            extIdx = filenameSansExt.lastIndexOf(".");
+
+        if (extIdx > 0) {
+            filenameSansExt = filenameSansExt.substr(0, extIdx);
+        }
+
+        return filenameSansExt;
+    }
+
+    function getOriginalExtension(fileId) {
+        var origName = spec.onGetName(fileId);
+        return qq.getExtension(origName);
+    }
+
+    // Callback iff the name has been changed
+    function handleNameUpdate(newFilenameInputEl, fileId) {
+        var newName = newFilenameInputEl.value,
+            origExtension;
+
+        if (newName !== undefined && qq.trimStr(newName).length > 0) {
+            origExtension = getOriginalExtension(fileId);
+
+            if (origExtension !== undefined) {
+                newName = newName + "." + origExtension;
+            }
+
+            spec.onSetName(fileId, newName);
+        }
+
+        spec.onEditingStatusChange(fileId, false);
+    }
+
+    // The name has been updated if the filename edit input loses focus.
+    function registerInputBlurHandler(inputEl, fileId) {
+        inheritedInternalApi.getDisposeSupport().attach(inputEl, "blur", function() {
+            handleNameUpdate(inputEl, fileId);
+        });
+    }
+
+    // The name has been updated if the user presses enter.
+    function registerInputEnterKeyHandler(inputEl, fileId) {
+        inheritedInternalApi.getDisposeSupport().attach(inputEl, "keyup", function(event) {
+
+            var code = event.keyCode || event.which;
+
+            if (code === 13) {
+                handleNameUpdate(inputEl, fileId);
+            }
+        });
+    }
+
+    qq.extend(spec, s);
+
+    spec.attachTo = spec.templating.getFileList();
+
+    qq.extend(this, new qq.UiEventHandler(spec, inheritedInternalApi));
+
+    qq.extend(inheritedInternalApi, {
+        handleFilenameEdit: function(id, target, focusInput) {
+            var newFilenameInputEl = spec.templating.getEditInput(id);
+
+            spec.onEditingStatusChange(id, true);
+
+            newFilenameInputEl.value = getFilenameSansExtension(id);
+
+            if (focusInput) {
+                newFilenameInputEl.focus();
+            }
+
+            registerInputBlurHandler(newFilenameInputEl, id);
+            registerInputEnterKeyHandler(newFilenameInputEl, id);
+        }
+    });
+};
+
+/*! 2014-01-19 */
diff --git a/webcit/static/instant_messenger.html b/webcit/static/instant_messenger.html
new file mode 100644 (file)
index 0000000..59f9981
--- /dev/null
@@ -0,0 +1,218 @@
+<html>
+<head>
+       <title>Citadel Instant Messenger</title>
+       <script type="text/javascript" src="prototype.js"></script>
+       <script type="text/javascript" src="wclib.js"></script>
+       <script type="text/javascript" src="authmethods.js"></script>
+</head>
+<body onLoad='FetchNewMsgs();'>
+
+<div id="thetop" style="position:fixed;width:100%;height:15%;top:0%;left:0%">
+<div id="spacer1" style="background:#aaaaaa"><br></div>
+<div id="tab_bar" style="background:#aaaaaa">&nbsp;&nbsp;</div>
+<div id="spacer2" style="background:#aaaaaa"><br></div>
+</div>
+
+<div id="main" style="position:fixed;width:100%;height:85%;top:15%;left:0%;overflow:auto;background:#ffffff"></div>
+
+<script type="text/javascript">
+/*
+ * Copyright 2000 - 2010 The Citadel Team
+ * Licensed under the GPL V3
+ *
+ * Chat window for Person 2 Person Chat
+ *
+ */
+
+var gexp_divs = new Array();
+var num_gexp_divs = 0;
+var shown_div = '';
+var my_name = '';
+
+function SendSomething(which_div, sendform, recipient) {
+       thetext = document.forms[sendform].elements['sendthis'].value;
+
+       // If the user didn't type anything, don't do anything.
+       if (thetext == '') {
+               return false;
+       }
+
+       // Clear the box
+       document.forms[sendform].elements['sendthis'].value = '';
+
+       // Write it to the tab
+       $(which_div).innerHTML = $(which_div).innerHTML
+                               + '<b>'
+                               + '<font color=\"#FF0000\">'
+                               + my_name
+                               + '</font>'
+                               + ':</b> '
+                               + thetext
+                               + '<br>\n';
+
+       // Scroll to the bottom of the tab
+       $('main').scrollTop = 999999;
+
+       // Send the text to the server
+       parms = 'r=' + Math.random()
+               + '&recp=' + encodeURIComponent(recipient)
+               + '&msg=' + encodeURIComponent(thetext);
+       new Ajax.Request('../ajax_send_instant_message',
+               {
+                       method: 'post',
+                       parameters: parms
+               }
+       );
+
+       // Refocus to the text box
+       document.forms[sendform].elements['sendthis'].focus();
+
+       // Don't submit the form
+       return false;
+}
+
+function TabSelect(which_div) {
+       if (shown_div != '') {
+               $(shown_div).style.display = 'none' ;
+               if ($('select_'+shown_div)) {
+                       $('select_'+shown_div).style.fontWeight = 'normal';
+                       $('select_'+shown_div).style.backgroundColor = '#cccccc';
+               }
+       }
+       shown_div = 'tab_' + which_div;
+       $(shown_div).style.display = 'block' ;
+       if ($('select_'+shown_div)) {
+               $('select_'+shown_div).style.fontWeight='bold';
+               $('select_'+shown_div).style.backgroundColor = '#ffffff';
+       }
+}
+
+
+function ShowNewMsg(gexp_xmlresponse) {
+
+       // It isn't really XML.  It's a Citadel server response.
+       gexp_response = gexp_xmlresponse.responseText;
+
+       if (gexp_response.substring(0, 1) != '1') {
+               return;
+       }
+
+       // Extract fields...
+       breakpos = gexp_response.indexOf('\n');
+       result = gexp_response.substring(0, breakpos-1);
+       the_message = gexp_response.substring(breakpos+1);
+       the_message = the_message.substring(0, the_message.indexOf('\n000'));
+       sender = extract_token(result.substring(4), 3, '|');
+
+       // Figure out which div to write it to...
+       which_div = '';
+       if (num_gexp_divs > 0) {
+               for (i=0; i<num_gexp_divs; ++i) {
+                       if (gexp_divs[i] == sender) {
+                               which_div = 'gexp' + i ;
+                       }
+               }
+       }
+
+       // Not found?  Create it.
+       if (which_div == '') {
+               gexp_divs[num_gexp_divs] = sender;
+               which_div = 'gexp' + num_gexp_divs;
+               ++num_gexp_divs;
+               $('main').innerHTML =
+                         $('main').innerHTML
+                       + '<div id=\"tab_' + which_div + '\" style=\"display:none;cursor:pointer\">'
+                       + '<div id=\"' + which_div + '\">'
+                       + '<br><br><br><br><br><br><br><br><br><br>'
+                       + '<br><br><br><br><br><br><br><br><br><br>'
+                       + '</div>'
+                       + '<div align=\"center\" id=\"response_'
+                       + which_div + '\" style=\"background:#ddddee\">'
+                       + '<br><form method=\"post\" action=\"null\" name=\"sendform_' + which_div + '\" '
+                       + 'onSubmit=\"return SendSomething(\'' + which_div + '\', \'sendform_'
+                       + which_div + '\', \'' + sender + '\');\">'
+                       + '<img src=\"webcit_icons/essen/16x16/chat.png\">&nbsp;'
+                       + '<input type=\"text\" size=\"72\" maxlength=\"600\" name=\"sendthis\">'
+                       + '</form>'
+                       + '<br></div>'
+                       + '</div>\n';
+               $('tab_bar').innerHTML =
+                         $('tab_bar').innerHTML
+                       + '<span id=\"select_tab_' + which_div + '\" onClick=\"TabSelect(\'' + which_div + '\');\">'
+                       + '&nbsp;' + sender + '&nbsp;'
+                       + '</span>&nbsp;&nbsp;&nbsp;';
+
+               // Raise the window in case it was buried
+               window.focus();
+       }
+
+       // Switch tabs
+       TabSelect(which_div);
+
+       // Write it to the tab
+       $(which_div).innerHTML = $(which_div).innerHTML
+                               + '<b>'
+                               + '<font color=\"#0000FF\">'
+                               + sender
+                               + '</font>'
+                               + ':</b> '
+                               + the_message
+                               + '<br>\n';
+
+       // Scroll to the bottom of the tab
+       $('main').scrollTop = 999999;
+
+       // Refocus to the send box
+       document.forms['sendform_'+which_div].elements['sendthis'].focus();
+
+       // Keep trying for new messages until the server tells us to stop.
+       FetchNewMsgs();
+}
+
+// This is called periodically to check for new incoming messages
+function FetchNewMsgs() {
+       parms = encodeURI('g_cmd=GEXP&r=' + Math.random());
+       new Ajax.Request('../ajax_servcmd',
+               {
+                       method: 'get',
+                       parameters: parms,
+                       onSuccess: ShowNewMsg
+               }
+       );
+}
+
+// Perform some initialization.
+parms = encodeURI('g_cmd=GREG _SELF_&r=' + Math.random());
+new Ajax.Request('../ajax_servcmd',
+       {
+               method: 'get',
+               parameters: parms,
+               onSuccess: GrabMyName
+       }
+);
+
+// Learn my name.
+function GrabMyName(greg_xmlresponse) {
+
+       // It isn't really XML.  It's a Citadel server response.
+       greg_response = greg_xmlresponse.responseText;
+
+       if (greg_response.substring(0, 1) != '1') {
+               return;
+       }
+
+       // Extract fields...
+       breakpos = greg_response.indexOf('\n');
+       result = greg_response.substring(0, breakpos);
+       my_name = result.substring(4);
+}
+
+
+// Cause FetchNewMsgs() to be called periodically.
+new PeriodicalExecuter(FetchNewMsgs, 10);
+
+</script>
+
+
+</body>
+</html>
diff --git a/webcit/static/loading.gif b/webcit/static/loading.gif
new file mode 100755 (executable)
index 0000000..6fba776
Binary files /dev/null and b/webcit/static/loading.gif differ
diff --git a/webcit/static/mobile.js b/webcit/static/mobile.js
new file mode 100644 (file)
index 0000000..dc14857
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2005 - 2009 The Citadel Team
+ * Licensed under the GPL V3
+ */
+
+var currentMsgDisplay = null;
+function CtdlLoadMsgMouseDown(event, msgnum) {
+  /*   if (currentMsgDisplay != null) {
+               currentMsgDisplay.style.display = "none";
+       } 
+       var id = "m_"+msgnum;
+var preview_pane = document.getElementById(id);
+preview_pane.style.display = "block";
+preview_pane.innerHTML = "<i>Loading message</i>";
+currentMsgDisplay = preview_pane;
+var req = new XMLHttpRequest();
+req.open('GET', '/msg/'+msgnum, true);
+req.onreadystatechange = function (aEvt) {
+  if (req.readyState == 4) {
+     if(req.status == 200)
+      currentMsgDisplay.innerHTML = "<button onMouseDown=\"CtdlHideMsg()\">(Hide message)</button><br>"+req.responseText;
+     else
+      currentMsgDisplay.innerHTML = "Error loading message";
+  }
+};
+req.send(null); */
+  window.location = "/mobilemsg/"+msgnum;
+}
+function CtdlHideMsg() {
+       currentMsgDisplay.style.display = "none";
+}
diff --git a/webcit/static/modal.js b/webcit/static/modal.js
new file mode 100644 (file)
index 0000000..5b631b1
--- /dev/null
@@ -0,0 +1,89 @@
+var focusedElement = null;
+
+var modal = document.getElementById('modal');
+var dialog = document.getElementById('dialog');
+var body = document.getElementById('global');
+var html = document.documentElement;
+
+var modalShowing = (html.className === 'modal');
+
+
+// Have to hack for Safari, due to poor support for the focus() function.
+try {
+       var isSafari = window.navigator.vendor.match(/Apple/);
+} catch (ex) {
+       isSafari = false;
+}
+if ( isSafari ) {
+       var dialogFocuser = document.createElement('a');
+       dialogFocuser.href="#";
+       dialogFocuser.style.display='block';
+       dialogFocuser.style.height='0';
+       dialogFocuser.style.width='0';
+       dialogFocuser.style.position = 'absolute';
+       dialog.insertBefore(dialogFocuser, dialog.firstChild);
+} else {
+       dialogFocuser = dialog;
+}
+
+window.onunload = function () {
+       dialogFocuser = focusedElement = modal = dialog = body = html = null;
+};
+
+var onfocus = function (e) {
+       e = e || window.event;
+       var el = e.target || e.srcElement;
+
+       // save the last focused element when the modal is hidden.
+       if ( !modalShowing ) {
+               focusedElement = el;
+               return;
+       }
+       
+       // if we're focusing the dialog, then just clear the blurring flag.
+       // else, focus the dialog and prevent the other event.
+       var p = el.parentNode;
+       while ( p && p.parentNode && p !== dialog ) {
+               p=p.parentNode;
+       }
+       if ( p !== dialog ) {
+               dialogFocuser.focus();
+       }
+};
+
+
+
+var onblur = function () {
+       if ( !modalShowing ) {
+               focusedElement = body;
+       }
+};
+
+html.onfocus = html.onfocusin = onfocus;
+html.onblur = html.onfocusout = onblur;
+if ( isSafari ) {
+       html.addEventListener('DOMFocusIn',onfocus);
+       html.addEventListener('DOMFocusOut',onblur);
+}
+// focus and blur events are tricky to bubble.
+// need to do some special stuff to handle MSIE.
+
+
+function toggleModal (b) {
+
+       if (modalShowing && b) return;
+       if (!modalShowing && !b) return;
+       
+       html.className=modalShowing?'':'modal';
+
+       modalShowing = !modalShowing;
+
+       if (modalShowing) {
+               dialog.focus();
+       } else if (focusedElement) {
+               try {
+                       focusedElement.focus();
+               } catch(ex) {}
+       }
+       
+};
diff --git a/webcit/static/nanotree.js b/webcit/static/nanotree.js
new file mode 100644 (file)
index 0000000..c22b7d5
--- /dev/null
@@ -0,0 +1,910 @@
+/**\r
+* Original Author of this file: Martin Mouritzen. (martin@nano.dk)\r
+*\r
+*\r
+* (Lack of) Documentation:\r
+*\r
+*\r
+* If a finishedLoading method exists, it will be called when the tree is loaded.\r
+* (good to display a div, etc.).\r
+*\r
+*\r
+* You have to set the variable rootNode (as a TreeNode).\r
+*\r
+* You have to set a container element, this is the element in which the tree will be.\r
+*\r
+*\r
+* TODO: \r
+* Save cookies better (only 1 cookie for each tree). Else the page will totally cookieclutter.\r
+*\r
+***********************************************************************\r
+* Configuration variables.\r
+************************************************************************/\r
+\r
+// Should the rootNode be displayed.\r
+var showRootNode = true;\r
+\r
+// Should the dashed lines between nodes be shown.\r
+var showLines = true;\r
+\r
+// Should the nodes be sorted? (You can either specify a number, then it will be sorted by that, else it will\r
+// be sorted alphabetically (by name).\r
+var sortNodes = true;\r
+\r
+// This is IMPORTANT... use an unique id for each document you use the tree in. (else they'll get mixed up).\r
+var documentID = window.location.href;\r
+\r
+// being read from cookie.\r
+var nodesOpen = new Array();\r
+\r
+// RootNode of the tree.\r
+var rootNode;\r
+\r
+// Container to display the Tree in.\r
+var container;\r
+\r
+// Shows/Hides subnodes on startup\r
+var showAllNodesOnStartup = false;\r
+\r
+// Is the roots dragable?\r
+var dragable = false;\r
+\r
+\r
+/************************************************************************\r
+* The following is just instancevariables.\r
+************************************************************************/\r
+var href = '';\r
+\r
+// rootNodeCallBack name (if null, it's not selectable).\r
+var rootNodeCallBack = null;\r
+\r
+// selectedNode\r
+var selectedNode = null;\r
+\r
+var states = '';\r
+var statearray = new Array();\r
+\r
+var treeNodeEdited = null;\r
+\r
+var editaborted = false;\r
+\r
+var floatDragElement = null;\r
+var colouredElement = null;\r
+var draggedNodeID = null;\r
+var lastDraggedOnNodeID = null;\r
+\r
+\r
+/**\r
+* The TreeNode Object\r
+* @param id unique id of this treenode\r
+* @param name The title of this node\r
+* @param icon The icon if this node (Can also be an array with 2 elements, the first one will represent the closed state, and the next one the open state)\r
+* @param param A parameter, this can be pretty much anything. (eg. an array with information).\r
+* @param orderNumber an orderNumber If one is given the nodes will be sorted by this (else they'll be sorted alphabetically (If sorting is on).\r
+*/\r
+function TreeNode(id,name,icon,param,orderNumber) {\r
+       this.id = id;\r
+       this.childs = new Array();\r
+       this.name = (name == null ? 'unset name' : name);\r
+       this.icon = (icon == null ? '' : icon);\r
+       this.parent = null;\r
+       this.handler = null;\r
+       this.param = (param == null ? '' : param);\r
+       this.orderNumber = (orderNumber == null ? -1 : orderNumber);\r
+       \r
+       this.openeventlisteners = new Array();\r
+       this.editeventlisteners = new Array();\r
+       this.moveeventlisteners = new Array();\r
+       this.haschilds = false;\r
+       this.editable = false;\r
+       this.linestring = '';\r
+       \r
+       this.nextSibling = null;\r
+       this.prevSibling = null;\r
+       \r
+       this.childsHasBeenFetched = false;\r
+\r
+       this.getID = function() {\r
+               return this.id;\r
+       }\r
+       this.setName = function(newname) {\r
+               this.name = newname;\r
+       }\r
+       this.getName = function() {\r
+               return this.name;\r
+       }\r
+       this.getParam = function() {\r
+               return this.param;\r
+       }\r
+       this.setIcon = function(icon) {\r
+               this.icon = icon;\r
+       }\r
+       this.getIcon = function() {\r
+               if (typeof(this.icon) == 'object') {\r
+                       return this.icon[0];\r
+               }\r
+               return this.icon;\r
+       }\r
+       this.getOpenIcon = function() {\r
+               if (typeof(this.icon) == 'object') {\r
+                       return this.icon[1];\r
+               }\r
+               return this.icon;\r
+       }\r
+       this.hasIcon = function () {\r
+               return this.icon != '';\r
+       }\r
+       this.getOrderNumber = function() {\r
+               return this.orderNumber;\r
+       }\r
+       this.addOpenEventListener = function(event) {\r
+               this.openeventlisteners[this.openeventlisteners.length] = event;\r
+       }\r
+       this.gotOpenEventListeners = function() {\r
+               return (this.openeventlisteners.length > 0);\r
+       }\r
+       this.addEditEventListener = function(event) {\r
+               this.editeventlisteners[this.editeventlisteners.length] = event;\r
+       }\r
+       this.gotEditEventListeners = function() {\r
+               return (this.editeventlisteners.length > 0);\r
+       }\r
+       this.addMoveEventListener = function(event) {\r
+               this.moveeventlisteners[this.moveeventlisteners.length] = event;\r
+       }\r
+       this.gotMoveEventListeners = function() {\r
+               return (this.moveeventlisteners.length > 0);\r
+       }\r
+       this.addChild = function(childNode) {\r
+               var possiblePrevNode = this.childs[this.childs.length - 1]\r
+               if (possiblePrevNode) {\r
+                       possiblePrevNode.nextSibling = childNode;\r
+                       childNode.prevSibling = possiblePrevNode;\r
+                       // alert(childNode.prevSibling);\r
+               }\r
+\r
+               this.childs[this.childs.length] = childNode;\r
+               childNode.setParent(this);\r
+\r
+               if (sortNodes) {\r
+                       function sortByOrder(a,b) {\r
+                               var order1 = a.getOrderNumber();\r
+                               var order2 = b.getOrderNumber();\r
+                               if (order1 == -1 || order2 == -1) {\r
+                                       return a.getName().toLowerCase() > b.getName().toLowerCase() ? 1 : -1;\r
+                               }\r
+                               else {\r
+                                       if (order1 == order2) {\r
+                                               // If they got the same order number, then we'll sort by their title.\r
+                                               return a.getName().toLowerCase() > b.getName().toLowerCase() ? 1 : -1;\r
+                                       }\r
+                                       else {\r
+                                               return order1 - order2;\r
+                                       }\r
+                               }\r
+                       }\r
+                       this.childs.sort(sortByOrder);\r
+               }\r
+       }\r
+       this.removeChild = function(childNode) {\r
+               var found = false;\r
+               for (var i=0;i<this.childs.length;i++) {\r
+                       if (found) {\r
+                               this.childs[i] = this.childs[i + 1];\r
+                       }\r
+                       if (this.childs[i] == childNode) {\r
+                               if (i == (this.childs.length - 1)) {\r
+                                       this.childs[i] = null;\r
+                               }\r
+                               else {\r
+                                       this.childs[i] = this.childs[i + 1];\r
+                               }\r
+                               found = true;\r
+                       }\r
+               }\r
+               if (found) {\r
+                       this.childs.length = this.childs.length-1;\r
+               }\r
+       }\r
+       this.resetChilds = function() {\r
+               this.childs = new Array();\r
+       }\r
+       this.setHasChilds = function(hasChilds) {\r
+               this.haschilds = hasChilds;\r
+       }\r
+       this.hasChilds = function() {\r
+               if (this.haschilds == true) {\r
+                       return true;\r
+               }\r
+               return (this.childs.length > 0);\r
+       }\r
+       this.getChildCount = function() {\r
+               return this.childs.length;\r
+       }\r
+       this.getFirstChild = function() {\r
+               if (this.hasChilds()) {\r
+                       return this.childs[0];\r
+               }\r
+               return null;\r
+       }\r
+       this.gotHandler = function() {\r
+               return this.handler != null;\r
+       }\r
+       this.setHandler = function(handler) {\r
+               this.handler = handler;\r
+       }\r
+       this.getHandler = function() {\r
+               return this.handler;\r
+       }\r
+       this.setParent = function(parent) {\r
+               this.parent = parent;\r
+       }\r
+       this.getParent = function() {\r
+               return this.parent;\r
+       }\r
+       this.getLineString = function() {\r
+               return this.linestring;\r
+       }\r
+       this.setLineString = function(string) {\r
+               this.linestring = string;\r
+       }\r
+       this.isEditable = function() {\r
+               return this.editable;\r
+       }\r
+       this.setEditable = function(editable) {\r
+               this.editable = editable;\r
+       }\r
+       \r
+}\r
+function getTreeNode(nodeID) {\r
+       return findNodeWithID(rootNode,nodeID);\r
+}\r
+function findNodeWithID(node,nodeID) {\r
+       if (node.getID() == nodeID) {\r
+               return node;\r
+       }\r
+       else {\r
+               if (node.hasChilds()) {\r
+                       for(var i=0;i<node.getChildCount();i++) {\r
+                               var value = findNodeWithID(node.childs[i],nodeID);\r
+                               if (value != false) {\r
+                                       return value;\r
+                               }\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+}\r
+function readStates() {\r
+       //setCookie('tree' + documentID,'');\r
+       states = getCookie('tree' + documentID);\r
+       if (states != null) {\r
+               var array = states.split(';');\r
+               for(var i=0;i<array.length;i++) {\r
+                       var singlestate = array[i].split('|');\r
+                       statearray[i] = new Array();\r
+                       statearray[i]["key"] = singlestate[0];\r
+                       statearray[i]["state"]  = singlestate[1];\r
+               }\r
+       }\r
+}\r
+function getState(nodeID) {\r
+       for(var i=0;i<statearray.length;i++) {\r
+               if (statearray[i]["key"] == nodeID) {\r
+                       state = statearray[i]["state"];\r
+                       if (state == null || state == '') {\r
+                               state = 'closed';\r
+                       }\r
+                       return state;\r
+               }\r
+       }\r
+       return "closed";\r
+}\r
+function writeStates(nodeID,newstate) {\r
+       //alert(nodeID);\r
+       var str = '';\r
+       var found = false;\r
+       for(var i=0;i<statearray.length;i++) {\r
+               if (statearray[i]["key"] == nodeID) {\r
+                       statearray[i]["state"] = newstate;\r
+                       found = true;\r
+               }\r
+               if (statearray[i]["state"] != null) {\r
+                       str += statearray[i]["key"] + '|' + statearray[i]["state"] + ';';\r
+               }\r
+       }\r
+       if (found == false) {\r
+               statearray[statearray.length] = new Array();\r
+               statearray[statearray.length - 1]["key"] = nodeID;\r
+               statearray[statearray.length - 1]["state"] = newstate;\r
+               if (newstate != null) {\r
+                       str += nodeID + '|' + newstate + ';';\r
+               }\r
+       }\r
+       setCookie('tree' + documentID,str);\r
+}\r
+function showTree(path) {\r
+       readStates();\r
+       \r
+       href = path;\r
+       window.focus();\r
+       window.onblur = blurSelection;\r
+       window.onfocus = focusSelection;\r
+       var str = '';\r
+       str = '<div id="node' + rootNode.getID() + '" class="treetitle" style="display:' + (showRootNode == true ? 'block' : 'none') + '">';\r
+       str += '<nobr>';\r
+       if (rootNode.hasIcon()) {\r
+               str += '<img src="' + rootNode.getIcon() + '" style="vertical-align:middle;">';\r
+       }\r
+       str += '<span style="vertical-align:middle;">&nbsp;' + rootNode.getName() + '</span>';\r
+       str += '</nobr></div>';\r
+       \r
+       if (rootNode.hasChilds()) {\r
+               for(i=0;i<rootNode.childs.length;i++) {\r
+                       nodeContents = showNode(rootNode.childs[i],(i == (rootNode.getChildCount() -1)));\r
+                       str = str + nodeContents;\r
+               }\r
+       }\r
+       container.innerHTML = str;\r
+       if (window.finishedLoading) {\r
+               finishedLoading();\r
+       }\r
+}\r
+/**\r
+* Shows the given node, and subnodes.\r
+*/\r
+function showNode(treeNode,lastNode) {\r
+       linestring = treeNode.getLineString();\r
+       var state = getState(treeNode.getID());\r
+       var str;\r
+       str = '<div style="filter:alpha(opacity=100);" ondragenter="dragEnter(' + treeNode.getID() + ');" ondragleave="dragLeave();" ondragstart="startDrag(' + treeNode.getID() + ');" ondrag="dragMove();" ondragend="endDrag(' + treeNode.getID() + ')" id="node' + treeNode.getID() + '">';\r
+       str += '<nobr>';\r
+       for(var y=0;y<linestring.length;y++) {\r
+               if (linestring.charAt(y) == 'I') {\r
+                       str += '<img src="' + href + 'static/' + (showLines ? 'line' : 'white') + '.gif" style="width:19px;height:20px;vertical-align:middle;">';\r
+               }\r
+               else if (linestring.charAt(y) == 'B') {\r
+                       str += '<img src="' + href + 'static/white.gif" style="width:19px;height:20px;vertical-align:middle;">';\r
+               }\r
+       }\r
+       if (treeNode.hasChilds()) {\r
+               // If this is the first child of the rootNode, and showRootNode is false, we want to display a different icon.\r
+               if (!showRootNode && (treeNode.getParent() == rootNode) && (treeNode.getParent().getFirstChild() == treeNode)) {\r
+                       if (!lastNode) {\r
+                               str += '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/' + (state == 'open' ? (showLines ? 'minus_no_root' : 'minus_nolines') : (showLines ? 'plus_no_root' : 'plus_nolines')) + '.gif" style="width:19px;height:20px;vertical-align:middle;" OnClick="handleNode(' + treeNode.getID() + ');">';\r
+                       }\r
+                       else {\r
+                               str += '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/' + (state == 'open' ? 'minus_last' : 'plus_last') + '_no_root.gif" style="width:19px;height:20px;vertical-align:middle;" OnClick="handleNode(' + treeNode.getID() + ');">';\r
+                       }\r
+               }\r
+               else {\r
+                       if (!lastNode) {\r
+                               str += '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/' + (state == 'open' ? (showLines ? 'minus' : 'minus_nolines') : (showLines ? 'plus' : 'plus_nolines')) + '.gif" style="width:19px;height:20px;vertical-align:middle;" OnClick="handleNode(' + treeNode.getID() + ');">';\r
+                       }\r
+                       else {\r
+                               str += '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/' + (state == 'open' ? (showLines ? 'minus_last' : 'minus_nolines') : (showLines ? 'plus_last' : 'plus_nolines')) + '.gif" style="width:19px;height:20px;vertical-align:middle;" OnClick="handleNode(' + treeNode.getID() + ');">';\r
+                       }\r
+               }\r
+       }\r
+       else {\r
+               // If this is the first child of the rootNode, and showRootNode is false, we want to display a different icon.\r
+               if (!showRootNode && (treeNode.getParent() == rootNode) && (treeNode.getParent().getFirstChild() == treeNode)) {\r
+                       if (!lastNode) {\r
+                               str += '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/' + (showLines ? 't_no_root' : 'white') + '.gif" style="width:19px;height:20px;vertical-align:middle;">';\r
+                       }\r
+                       else {\r
+                               str += '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/white.gif" style="width:19px;height:20px;vertical-align:middle;">';\r
+                       }\r
+               }\r
+               else {\r
+                       if (!lastNode) {\r
+                               str += '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/' + (showLines ? 't' : 'white') + '.gif" style="width:19px;height:20px;vertical-align:middle;">';\r
+                       }\r
+                       else {\r
+                               str += '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/' + (showLines ? 'lastnode' : 'white') + '.gif" style="width:19px;height:20px;vertical-align:middle;">';\r
+                       }\r
+               }\r
+       }\r
+       iconStartImage = treeNode.getIcon();\r
+       if (state != 'closed') {\r
+               if (treeNode.hasChilds()) {\r
+                       iconStartImage = treeNode.getOpenIcon();\r
+               }\r
+       }\r
+       \r
+       str += '<img id="iconimage' + treeNode.getID() + '" src="' + iconStartImage + '" style="vertical-align:middle;" OnClick="selectNode(' + treeNode.getID() + ')">';\r
+       str += '&nbsp;<span unselectable="ON" style="vertical-align:middle;" class="treetitle" ID="title' + treeNode.getID() + '" OnDblClick="handleNode(' + treeNode.getID() + ')" OnClick="selectNode(' + treeNode.getID() + ')">';\r
+       str += treeNode.getName();\r
+       str += '</span>';\r
+       str += '</nobr>';\r
+       str += '</div>';\r
+\r
+       if (treeNode.hasChilds()) {\r
+               if (state == 'open') {\r
+                       str += '<div id="node' + treeNode.getID() + 'sub" style="display:block;">';\r
+                       fireOpenEvent(treeNode);\r
+                       // alert('openevent: ' + treeNode.getName());\r
+               }\r
+               else {\r
+                       str += '<div id="node' + treeNode.getID() + 'sub" style="display:' + (showAllNodesOnStartup == true ? 'block;' : 'none;') + ';">';\r
+               }\r
+               var subgroupstr = '';\r
+               var newChar = '';\r
+\r
+               if (!lastNode) {\r
+                       newChar = 'I';\r
+               }\r
+               else {\r
+                       newChar = 'B';\r
+               }\r
+               for(var z=0;z<treeNode.getChildCount();z++) {\r
+                       treeNode.childs[z].setLineString(linestring + newChar);\r
+               }\r
+               for(var z=0;z<treeNode.getChildCount();z++) {\r
+                       subgroupstr += showNode(treeNode.childs[z],(z == (treeNode.getChildCount() -1)));\r
+               }\r
+               str += subgroupstr;\r
+               str += '</div>';\r
+       }\r
+       else {\r
+               str += '<div id="node' + treeNode.getID() + 'sub" style="display:none;">';\r
+               str += '</div>';\r
+       }\r
+       return str;\r
+}\r
+/*\r
+function mouseMove() {\r
+       if (dragging) {\r
+               alert('bob');\r
+       }\r
+}\r
+function mouseUp() {\r
+       if (dragging) {\r
+               alert('dropped on something!');\r
+       }\r
+}\r
+*/\r
+function startDrag(nodeID) {\r
+       if (!dragable) {\r
+               return;\r
+       }\r
+       draggedNodeID = nodeID;\r
+       \r
+       var srcObj = window.event.srcElement;\r
+       while(srcObj.tagName != 'DIV') {\r
+               srcObj = srcObj.parentElement;\r
+       }\r
+       floatDragElement = document.createElement('DIV');\r
+\r
+       floatDragElement.innerHTML = srcObj.innerHTML;\r
+       floatDragElement.childNodes[0].removeChild(floatDragElement.childNodes[0].childNodes[0]);\r
+       \r
+       document.body.appendChild(floatDragElement);\r
+       floatDragElement.style.zIndex = 100;\r
+       floatDragElement.style.position = 'absolute';\r
+       floatDragElement.style.filter='progid:DXImageTransform.Microsoft.Alpha(1,opacity=60);';\r
+}\r
+function findSpanChild(element) {\r
+       if (element.tagName == 'SPAN') {\r
+               return element;\r
+       }\r
+       else {\r
+               if (element.childNodes) {\r
+                       for(var i=0;i<element.childNodes.length;i++) {\r
+                               var value = findSpanChild(element.childNodes[i]);\r
+                               if (value != false) {\r
+                                       return value;\r
+                               }\r
+                       }\r
+                       return false;\r
+               }\r
+       }\r
+}\r
+function dragEnter(nodeID) {\r
+       if (!dragable) {\r
+               return;\r
+       }\r
+       lastDraggedOnNodeID = nodeID;\r
+       \r
+       if (colouredElement) {\r
+               findSpanChild(colouredElement).className = 'treetitle';\r
+       }\r
+       colouredElement = window.event.srcElement;\r
+       while(colouredElement.tagName != 'DIV') {\r
+               colouredElement = colouredElement.parentElement;\r
+               if (colouredElement.tagName == 'BODY') {\r
+                       // Something gone seriously wrong.\r
+                       alert('Drag failure, reached <BODY>!');\r
+                       return;\r
+               }\r
+       }       \r
+       findSpanChild(colouredElement).className = 'treetitleselectedfocused';\r
+}\r
+function dragLeave() {\r
+       if (!dragable) {\r
+               return;\r
+       }\r
+}\r
+function endDrag(nodeID) {\r
+       if (!dragable) {\r
+               return;\r
+       }\r
+       if (lastDraggedOnNodeID != null) {\r
+               fireMoveEvent(getTreeNode(lastDraggedOnNodeID),draggedNodeID,lastDraggedOnNodeID);\r
+       }\r
+}\r
+function dragProceed() {\r
+       if (!dragable) {\r
+               return;\r
+       }\r
+       var dragged = getTreeNode(draggedNodeID);\r
+       var newparent = getTreeNode(lastDraggedOnNodeID);\r
+\r
+       var oldparent = dragged.getParent();\r
+       \r
+       oldparent.removeChild(dragged);\r
+       newparent.addChild(dragged);\r
+       \r
+       refreshNode(oldparent);\r
+       refreshNode(newparent);\r
+       \r
+       _dragClean()\r
+}\r
+function dragCancel() {\r
+       if (!dragable) {\r
+               return;\r
+       }\r
+       _dragClean()\r
+}\r
+/**\r
+* Don't call this yourself.\r
+*/\r
+function _dragClean() {\r
+       if (!dragable) {\r
+               return;\r
+       }\r
+       if (colouredElement) {\r
+               findSpanChild(colouredElement).className = 'treetitle';\r
+       }\r
+       \r
+       floatDragElement.parentElement.removeChild(floatDragElement);\r
+       floatDragElement = null;\r
+       colouredElement = null;\r
+       draggedNodeID = null;\r
+       lastDraggedOnNodeID = null;\r
+}\r
+function dragMove() {\r
+       if (!dragable) {\r
+               return;\r
+       }\r
+       floatDragElement.style.top = window.event.clientY;\r
+       floatDragElement.style.left = window.event.clientX;\r
+}\r
+function editEnded() {\r
+       if (treeNodeEdited != null) {\r
+               // treeNodeEdited.getID();\r
+               var editTitle = document.getElementById('title' + treeNodeEdited.getID());\r
+               var input = editTitle.childNodes[0];\r
+       \r
+               var newValue = input.value;\r
+               \r
+               if (newValue == treeNodeEdited.getName()) {\r
+                       editTitle.innerHTML = newValue;\r
+                       treeNodeEdited = null;\r
+                       return;\r
+               }\r
+       \r
+               fireEditEvent(treeNodeEdited,newValue);\r
+               \r
+               if (!editaborted) {\r
+                       treeNodeEdited.setName(newValue);\r
+                       editTitle.innerHTML = newValue;\r
+               }\r
+       \r
+               treeNodeEdited = null;\r
+       }\r
+}\r
+function selectNode(nodeID) {\r
+       var treeNode = getTreeNode(nodeID);\r
+\r
+       if (selectedNode != null) {\r
+               if (selectedNode == nodeID) {\r
+                       if (treeNode.isEditable()) {\r
+                               if (treeNodeEdited == treeNode) {\r
+                                       return;\r
+                               }\r
+                               treeNodeEdited = treeNode;\r
+                               var editTitle = document.getElementById('title' + treeNode.getID());\r
+                               editTitle.className = 'editednode';\r
+                               \r
+\r
+                               editTitle.innerHTML = '<input type="text" onKeypress="if (event.keyCode == 13) { this.onblur = null; editEnded(); }" name="editednode" class="editednodeinput">';\r
+                               var input = editTitle.childNodes[0];\r
+                               input.value = treeNode.getName();\r
+                               input.focus();\r
+                               input.select();\r
+                               input.onblur = editEnded;\r
+                       }\r
+                       return;\r
+               }\r
+               if (treeNodeEdited != null) {\r
+                       editEnded();\r
+               }\r
+               var oldNodeTitle = document.getElementById('title' + selectedNode);\r
+               oldNodeTitle.className = 'treetitle';\r
+       }\r
+       selectedNode = nodeID;\r
+       var nodetitle = document.getElementById('title' + selectedNode);\r
+       nodetitle.className = 'treetitleselectedfocused';\r
+       \r
+       if (treeNode.gotHandler()) {\r
+               eval(treeNode.getHandler() + '(getTreeNode(' + nodeID + '));');\r
+       }\r
+       else {\r
+               standardClick(treeNode);\r
+       }\r
+}\r
+function refreshNode(treeNode) {\r
+       var submenu = document.getElementById('node' + treeNode.getID() + 'sub');\r
+       var str = '';\r
+       for(var i=0;i<treeNode.getChildCount();i++) {\r
+               var parent = treeNode.getParent();\r
+               if (!parent) {\r
+                       treeNode.childs[i].setLineString(treeNode.getLineString() + 'B');\r
+               }\r
+               else {\r
+                       if (parent.childs[parent.childs.length - 1] == treeNode) {\r
+                               treeNode.childs[i].setLineString(treeNode.getLineString() + 'B');\r
+                       }\r
+                       else {\r
+                               treeNode.childs[i].setLineString(treeNode.getLineString() + 'I');\r
+                       }\r
+               }\r
+               str += showNode(treeNode.childs[i],i == (treeNode.getChildCount() - 1));\r
+       }\r
+       var actionimage = document.getElementById('handler' + treeNode.getID());\r
+       if (treeNode.getChildCount() == 0) {\r
+               // TreeNode haven't got any children, make sure the right image is displayed.\r
+               if (actionimage.src.indexOf('last') == -1) {\r
+                       actionimage.src = href + 'static/' + (showLines ? 't' : 'white') + '.gif';\r
+               }\r
+               else {\r
+                       actionimage.src = href + 'static/' + (showLines ? 'lastnode' : 'white') + '.gif';\r
+               }\r
+               actionimage.onclick = null;\r
+               \r
+               // Close the submenu\r
+               if (submenu) {\r
+                       submenu.style.display = 'none';\r
+               }\r
+       }\r
+       else {\r
+               // We have children, make sure to display the + and - icon.\r
+               if (actionimage.src.indexOf('plus') != -1) {\r
+                       // The TreeNode have already got children, and displays them.\r
+               }\r
+               else if (actionimage.src.indexOf('minus') != -1) {\r
+                       // The TreeNode have already got children, and displays them.\r
+               }\r
+               else {\r
+                       if (actionimage.src.indexOf('last') == -1) {\r
+                               actionimage.outerHTML = '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/' + (showLines ? 'plus' : 'plus_nolines') + '.gif" style="width:19px;height:20px;vertical-align:middle;" OnClick="handleNode(' + treeNode.getID() + ');">';\r
+                       }\r
+                       else {\r
+                               actionimage.outerHTML = '<img id="handler' + treeNode.getID() + '" src="' + href + 'static/plus_last.gif" style="width:19px;height:20px;vertical-align:middle;" OnClick="handleNode(' + treeNode.getID() + ');">';\r
+                       }\r
+               }\r
+       }\r
+       submenu.innerHTML = str;\r
+}\r
+function handleNode(nodeID) {\r
+       var treeNode = getTreeNode(nodeID);     \r
+       if (!treeNode.hasChilds()) { // No reason to handle a node without childs.\r
+               return;\r
+       }\r
+       \r
+       var submenu = document.getElementById('node' + nodeID + 'sub');\r
+       \r
+       var iconimageholder = document.getElementById('iconimage' + nodeID);\r
+       var actionimage = document.getElementById('handler' + nodeID);\r
+\r
+       // This will be used if showRootNode is set to false.\r
+       var firstChildOfRoot = false;\r
+       if (actionimage.src.indexOf('_no_root') != -1) {\r
+               firstChildOfRoot = true;\r
+       }\r
+       \r
+       if (submenu.style.display == 'none') {\r
+               writeStates(nodeID,'open');\r
+               fireOpenEvent(treeNode);\r
+               submenu.style.display = 'block';\r
+\r
+               iconimageholder.src = treeNode.getOpenIcon();\r
+       \r
+               if (actionimage.src.indexOf('last') == -1) {\r
+                       actionimage.src = href + 'static/' + ((firstChildOfRoot) ? 'minus_no_root' : (showLines ? 'minus' : 'minus_nolines')) + '.gif';\r
+               }\r
+               else {\r
+                       actionimage.src = href + 'static/' + ((firstChildOfRoot) ? 'minus_last_no_root' : (showLines ? 'minus_last' : 'minus_nolines')) + '.gif';\r
+               }\r
+       }\r
+       else {\r
+               writeStates(nodeID,'closed');\r
+               submenu.style.display = 'none';\r
+               \r
+               iconimageholder.src = treeNode.getIcon();\r
+               \r
+               if (actionimage.src.indexOf('last') == -1) {\r
+                       actionimage.src = href + 'static/' + ((firstChildOfRoot) ? 'plus_no_root' : (showLines ? 'plus' : 'plus_nolines')) + '.gif';\r
+               }\r
+               else {\r
+                       actionimage.src = href + 'static/' + ((firstChildOfRoot) ? 'plus_last_no_root' : (showLines ? 'plus_last' : 'plus_nolines')) + '.gif';\r
+               }\r
+       }\r
+}\r
+function fireOpenEvent(treeNode) {\r
+       if (treeNode.gotOpenEventListeners()) {\r
+               for(var i=0;i<treeNode.openeventlisteners.length;i++) {\r
+                       eval(treeNode.openeventlisteners[i] + '(' + treeNode.getID() + ');');\r
+               }\r
+       }\r
+}\r
+function fireEditEvent(treeNode,newVal) {\r
+       if (treeNode.gotEditEventListeners()) {\r
+               for(var i=0;i<treeNode.editeventlisteners.length;i++) {\r
+                       eval(treeNode.editeventlisteners[i] + '(' + treeNode.getID() + ',\'' + escape(newVal) + '\');');\r
+               }\r
+       }\r
+}\r
+function fireMoveEvent(treeNode,draggedNodeID,droppedOnNodeID) {\r
+       if (treeNode.gotMoveEventListeners()) {\r
+               for(var i=0;i<treeNode.moveeventlisteners.length;i++) {\r
+                       eval(treeNode.moveeventlisteners[i] + '(' + draggedNodeID + ',' + droppedOnNodeID + ');');\r
+               }\r
+       }\r
+}\r
+function blurSelection() {\r
+       if (selectedNode != null) {\r
+               var oldNodeTitle = document.getElementById('title' + selectedNode);\r
+               oldNodeTitle.className = 'treetitleselectedblured';\r
+       }\r
+}\r
+function focusSelection() {\r
+       if (selectedNode != null) {\r
+               var oldNodeTitle = document.getElementById('title' + selectedNode);\r
+               oldNodeTitle.className = 'treetitleselectedfocused';\r
+       }\r
+}\r
+function getCookieVal (offset) {  \r
+       var endstr = document.cookie.indexOf (";",offset);  \r
+       if (endstr == -1) {\r
+               endstr = document.cookie.length;\r
+       }\r
+       return unescape(document.cookie.substring(offset,endstr));\r
+}\r
+function getCookie (name) {  \r
+       var arg = name + "=";\r
+       var alen = arg.length;\r
+       var clen = document.cookie.length;\r
+       var i = 0;\r
+       while (i < clen) {\r
+               var j = i + alen;\r
+               if (document.cookie.substring(i, j) == arg) {\r
+                       return getCookieVal(j);\r
+               }\r
+               i = document.cookie.indexOf(" ", i) + 1;\r
+               if (i == 0) {\r
+                       break;\r
+               }\r
+       }\r
+       return null;\r
+}\r
+function setCookie (name, value) {  \r
+       var argv = setCookie.arguments;  \r
+       var argc = setCookie.arguments.length;  \r
+       var expires = (argc > 2) ? argv[2] : null;  \r
+       var path = (argc > 3) ? argv[3] : null;  \r
+       var domain = (argc > 4) ? argv[4] : null;  \r
+       var secure = (argc > 5) ? argv[5] : false;  \r
+       document.cookie = name + "=" + escape (value) + ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + ((path == null) ? "" : ("; path=" + path)) + ((domain == null) ? "" : ("; domain=" + domain)) + ((secure == true) ? "; secure" : "");\r
+}\r
+function expandNode() {\r
+       var state = getState(selectedNode);\r
+       if (state == 'open') {\r
+               var currentTreeNode = getTreeNode(selectedNode);\r
+               if (currentTreeNode.hasChilds()) {\r
+                       selectNode(currentTreeNode.childs[0].getID());\r
+               }\r
+       }\r
+       else {\r
+               handleNode(selectedNode);\r
+       }\r
+}\r
+function subtractNode() {\r
+       var state = getState(selectedNode);\r
+       if (state == 'closed') {\r
+               var currentTreeNode = getTreeNode(selectedNode);\r
+               var parent = currentTreeNode.getParent();\r
+               if (parent != null && parent != rootNode) {\r
+                       selectNode(parent.getID());\r
+               }\r
+       }\r
+       else {\r
+               handleNode(selectedNode);\r
+       }\r
+}\r
+function selectPrevNode() {\r
+       var currentTreeNode = getTreeNode(selectedNode);\r
+       if (currentTreeNode.prevSibling != null) {\r
+\r
+               var state = getState(currentTreeNode.prevSibling.getID());\r
+\r
+               if (state == 'open' && currentTreeNode.prevSibling.hasChilds()) {\r
+                       // We have to find the last open child of the previoussiblings childs.\r
+                       var current = currentTreeNode.prevSibling.childs[currentTreeNode.prevSibling.childs.length - 1];\r
+                       var currentstate = 'open';\r
+                       while (current.hasChilds() && (getState(current.getID()) == 'open')) {\r
+                               current = current.childs[current.childs.length - 1];\r
+                       }\r
+                       selectNode(current.getID());\r
+               }\r
+               else {\r
+                       selectNode(currentTreeNode.prevSibling.getID());\r
+               }\r
+       }\r
+       else {\r
+               if (currentTreeNode.getParent() != null && currentTreeNode.getParent() != rootNode) {\r
+                       selectNode(currentTreeNode.getParent().getID());\r
+               }\r
+       }\r
+}\r
+function selectNextNode() {\r
+       var currentTreeNode = getTreeNode(selectedNode);\r
+\r
+       var state = getState(selectedNode);\r
+       if (state == 'open' && currentTreeNode.hasChilds()) {\r
+               selectNode(currentTreeNode.childs[0].getID());\r
+       }       \r
+       else {\r
+               if (currentTreeNode.nextSibling != null) {\r
+                       selectNode(currentTreeNode.nextSibling.getID());\r
+               }\r
+               else {\r
+                       // Continue up the tree until we either hit null, or a parent which have a child.\r
+                       var parent = currentTreeNode;\r
+                       while ((parent = parent.getParent()) != rootNode) {\r
+                               if (parent.nextSibling != null) {\r
+                                       selectNode(parent.nextSibling.getID());\r
+                                       break;\r
+                               }\r
+                       }\r
+                       /*\r
+                       if (currentTreeNode.getParent().nextSibling != null) {\r
+                               selectNode(currentTreeNode.getParent().nextSibling.getID());\r
+                       }\r
+                       */\r
+               }\r
+       }\r
+}\r
+function keyDown(event) {\r
+       if (window.event) {\r
+               event = window.event;\r
+       }\r
+       if (event.keyCode == 38) { // Up\r
+               selectPrevNode();\r
+               return false;\r
+       }\r
+       else if (event.keyCode == 40) { // Down\r
+               selectNextNode();\r
+               return false;\r
+       }\r
+       else if (event.keyCode == 37) { // left\r
+               subtractNode();\r
+               return false;\r
+       }\r
+       else if (event.keyCode == 39) { // right\r
+               expandNode();\r
+               return false;\r
+       }\r
+}\r
+document.onkeydown = keyDown;\r
diff --git a/webcit/static/palette.htm b/webcit/static/palette.htm
new file mode 100644 (file)
index 0000000..0e723a5
--- /dev/null
@@ -0,0 +1,124 @@
+<html>
+<head>
+       <title>Text Color</title>
+       <script type="text/javascript">
+       <!--
+       function selectColor(color) {
+               self.parent.setColor(color);
+       }
+       
+       function InitColorPalette() {
+               if (document.getElementsByTagName)
+                       var x = document.getElementsByTagName('TD');
+               else if (document.all)
+                       var x = document.all.tags('TD');
+               for (var i=0;i<x.length;i++) {
+                       x[i].onmouseover = over;
+                       x[i].onmouseout = out;
+                       x[i].onclick = click;
+               }
+       }
+       
+       function over() {
+               this.style.border='1px dotted white';
+       }
+       
+       function out() {
+               this.style.border='1px solid gray';
+       }
+       
+       function click() {
+               selectColor(this.id);
+       }
+       //-->
+       </script>
+</head>
+<body bgcolor="white" onLoad="InitColorPalette()" leftmargin="0" rightmargin="0" marginwidth="0" marginheight="0" topmargin="0" bottommargin="0">
+<table width="150" height="100" cellpadding="0" cellspacing="1" border="1" align="center">
+       <tr>
+               <td id="#FFFFFF" bgcolor="#FFFFFF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFCCCC" bgcolor="#FFCCCC" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFCC99" bgcolor="#FFCC99" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFFF99" bgcolor="#FFFF99" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFFFCC" bgcolor="#FFFFCC" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#99FF99" bgcolor="#99FF99" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#99FFFF" bgcolor="#99FFFF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#CCFFFF" bgcolor="#CCFFFF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#CCCCFF" bgcolor="#CCCCFF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFCCFF" bgcolor="#FFCCFF" width="10" height="10"><img width="1" height="1"></td>
+       </tr>
+       <tr>
+               <td id="#CCCCCC" bgcolor="#CCCCCC" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FF6666" bgcolor="#FF6666" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FF9966" bgcolor="#FF9966" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFFF66" bgcolor="#FFFF66" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFFF33" bgcolor="#FFFF33" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#66FF99" bgcolor="#66FF99" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#33FFFF" bgcolor="#33FFFF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#66FFFF" bgcolor="#66FFFF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#9999FF" bgcolor="#9999FF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FF99FF" bgcolor="#FF99FF" width="10" height="10"><img width="1" height="1"></td>
+       </tr>
+       <tr>
+               <td id="#C0C0C0" bgcolor="#C0C0C0" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FF0000" bgcolor="#FF0000" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FF9900" bgcolor="#FF9900" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFCC66" bgcolor="#FFCC66" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFFF00" bgcolor="#FFFF00" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#33FF33" bgcolor="#33FF33" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#66CCCC" bgcolor="#66CCCC" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#33CCFF" bgcolor="#33CCFF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#6666CC" bgcolor="#6666CC" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#CC66CC" bgcolor="#CC66CC" width="10" height="10"><img width="1" height="1"></td>
+       </tr>
+       <tr>
+               <td id="#999999" bgcolor="#999999" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#CC0000" bgcolor="#CC0000" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FF6600" bgcolor="#FF6600" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFCC33" bgcolor="#FFCC33" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#FFCC00" bgcolor="#FFCC00" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#33CC00" bgcolor="#33CC00" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#00CCCC" bgcolor="#00CCCC" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#3366FF" bgcolor="#3366FF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#6633FF" bgcolor="#6633FF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#CC33CC" bgcolor="#CC33CC" width="10" height="10"><img width="1" height="1"></td>
+       </tr>
+       <tr>
+               <td id="#666666" bgcolor="#666666" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#990000" bgcolor="#990000" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#CC6600" bgcolor="#CC6600" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#CC9933" bgcolor="#CC9933" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#999900" bgcolor="#999900" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#009900" bgcolor="#009900" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#339999" bgcolor="#339999" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#3333FF" bgcolor="#3333FF" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#6600CC" bgcolor="#6600CC" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#993399" bgcolor="#993399" width="10" height="10"><img width="1" height="1"></td>
+       </tr>
+       <tr>
+               <td id="#333333" bgcolor="#333333" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#660000" bgcolor="#660000" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#993300" bgcolor="#993300" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#996633" bgcolor="#996633" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#666600" bgcolor="#666600" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#006600" bgcolor="#006600" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#336666" bgcolor="#336666" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#000099" bgcolor="#000099" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#333399" bgcolor="#333399" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#663366" bgcolor="#663366" width="10" height="10"><img width="1" height="1"></td>
+       </tr>
+       <tr>
+               <td id="#000000" bgcolor="#000000" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#330000" bgcolor="#330000" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#663300" bgcolor="#663300" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#663333" bgcolor="#663333" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#333300" bgcolor="#333300" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#003300" bgcolor="#003300" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#003333" bgcolor="#003333" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#000066" bgcolor="#000066" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#330099" bgcolor="#330099" width="10" height="10"><img width="1" height="1"></td>
+               <td id="#330033" bgcolor="#330033" width="10" height="10"><img width="1" height="1"></td>
+       </tr>
+</table>
+</body>
+</html>
diff --git a/webcit/static/processing.gif b/webcit/static/processing.gif
new file mode 100755 (executable)
index 0000000..7c99504
Binary files /dev/null and b/webcit/static/processing.gif differ
diff --git a/webcit/static/prototype.js b/webcit/static/prototype.js
new file mode 100644 (file)
index 0000000..04a4779
--- /dev/null
@@ -0,0 +1,6081 @@
+/*  Prototype JavaScript framework, version 1.7
+ *  (c) 2005-2010 Sam Stephenson
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://www.prototypejs.org/
+ *
+ *--------------------------------------------------------------------------*/
+
+var Prototype = {
+
+  Version: '1.7',
+
+  Browser: (function(){
+    var ua = navigator.userAgent;
+    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
+    return {
+      IE:             !!window.attachEvent && !isOpera,
+      Opera:          isOpera,
+      WebKit:         ua.indexOf('AppleWebKit/') > -1,
+      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
+      MobileSafari:   /Apple.*Mobile/.test(ua)
+    }
+  })(),
+
+  BrowserFeatures: {
+    XPath: !!document.evaluate,
+
+    SelectorsAPI: !!document.querySelector,
+
+    ElementExtensions: (function() {
+      var constructor = window.Element || window.HTMLElement;
+      return !!(constructor && constructor.prototype);
+    })(),
+    SpecificElementExtensions: (function() {
+      if (typeof window.HTMLDivElement !== 'undefined')
+        return true;
+
+      var div = document.createElement('div'),
+          form = document.createElement('form'),
+          isSupported = false;
+
+      if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) {
+        isSupported = true;
+      }
+
+      div = form = null;
+
+      return isSupported;
+    })()
+  },
+
+  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
+  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+  emptyFunction: function() { },
+
+  K: function(x) { return x }
+};
+
+if (Prototype.Browser.MobileSafari)
+  Prototype.BrowserFeatures.SpecificElementExtensions = false;
+/* Based on Alex Arnell's inheritance implementation. */
+
+var Class = (function() {
+
+  var IS_DONTENUM_BUGGY = (function(){
+    for (var p in { toString: 1 }) {
+      if (p === 'toString') return false;
+    }
+    return true;
+  })();
+
+  function subclass() {};
+  function create() {
+    var parent = null, properties = $A(arguments);
+    if (Object.isFunction(properties[0]))
+      parent = properties.shift();
+
+    function klass() {
+      this.initialize.apply(this, arguments);
+    }
+
+    Object.extend(klass, Class.Methods);
+    klass.superclass = parent;
+    klass.subclasses = [];
+
+    if (parent) {
+      subclass.prototype = parent.prototype;
+      klass.prototype = new subclass;
+      parent.subclasses.push(klass);
+    }
+
+    for (var i = 0, length = properties.length; i < length; i++)
+      klass.addMethods(properties[i]);
+
+    if (!klass.prototype.initialize)
+      klass.prototype.initialize = Prototype.emptyFunction;
+
+    klass.prototype.constructor = klass;
+    return klass;
+  }
+
+  function addMethods(source) {
+    var ancestor   = this.superclass && this.superclass.prototype,
+        properties = Object.keys(source);
+
+    if (IS_DONTENUM_BUGGY) {
+      if (source.toString != Object.prototype.toString)
+        properties.push("toString");
+      if (source.valueOf != Object.prototype.valueOf)
+        properties.push("valueOf");
+    }
+
+    for (var i = 0, length = properties.length; i < length; i++) {
+      var property = properties[i], value = source[property];
+      if (ancestor && Object.isFunction(value) &&
+          value.argumentNames()[0] == "$super") {
+        var method = value;
+        value = (function(m) {
+          return function() { return ancestor[m].apply(this, arguments); };
+        })(property).wrap(method);
+
+        value.valueOf = method.valueOf.bind(method);
+        value.toString = method.toString.bind(method);
+      }
+      this.prototype[property] = value;
+    }
+
+    return this;
+  }
+
+  return {
+    create: create,
+    Methods: {
+      addMethods: addMethods
+    }
+  };
+})();
+(function() {
+
+  var _toString = Object.prototype.toString,
+      NULL_TYPE = 'Null',
+      UNDEFINED_TYPE = 'Undefined',
+      BOOLEAN_TYPE = 'Boolean',
+      NUMBER_TYPE = 'Number',
+      STRING_TYPE = 'String',
+      OBJECT_TYPE = 'Object',
+      FUNCTION_CLASS = '[object Function]',
+      BOOLEAN_CLASS = '[object Boolean]',
+      NUMBER_CLASS = '[object Number]',
+      STRING_CLASS = '[object String]',
+      ARRAY_CLASS = '[object Array]',
+      DATE_CLASS = '[object Date]',
+      NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON &&
+        typeof JSON.stringify === 'function' &&
+        JSON.stringify(0) === '0' &&
+        typeof JSON.stringify(Prototype.K) === 'undefined';
+
+  function Type(o) {
+    switch(o) {
+      case null: return NULL_TYPE;
+      case (void 0): return UNDEFINED_TYPE;
+    }
+    var type = typeof o;
+    switch(type) {
+      case 'boolean': return BOOLEAN_TYPE;
+      case 'number':  return NUMBER_TYPE;
+      case 'string':  return STRING_TYPE;
+    }
+    return OBJECT_TYPE;
+  }
+
+  function extend(destination, source) {
+    for (var property in source)
+      destination[property] = source[property];
+    return destination;
+  }
+
+  function inspect(object) {
+    try {
+      if (isUndefined(object)) return 'undefined';
+      if (object === null) return 'null';
+      return object.inspect ? object.inspect() : String(object);
+    } catch (e) {
+      if (e instanceof RangeError) return '...';
+      throw e;
+    }
+  }
+
+  function toJSON(value) {
+    return Str('', { '': value }, []);
+  }
+
+  function Str(key, holder, stack) {
+    var value = holder[key],
+        type = typeof value;
+
+    if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') {
+      value = value.toJSON(key);
+    }
+
+    var _class = _toString.call(value);
+
+    switch (_class) {
+      case NUMBER_CLASS:
+      case BOOLEAN_CLASS:
+      case STRING_CLASS:
+        value = value.valueOf();
+    }
+
+    switch (value) {
+      case null: return 'null';
+      case true: return 'true';
+      case false: return 'false';
+    }
+
+    type = typeof value;
+    switch (type) {
+      case 'string':
+        return value.inspect(true);
+      case 'number':
+        return isFinite(value) ? String(value) : 'null';
+      case 'object':
+
+        for (var i = 0, length = stack.length; i < length; i++) {
+          if (stack[i] === value) { throw new TypeError(); }
+        }
+        stack.push(value);
+
+        var partial = [];
+        if (_class === ARRAY_CLASS) {
+          for (var i = 0, length = value.length; i < length; i++) {
+            var str = Str(i, value, stack);
+            partial.push(typeof str === 'undefined' ? 'null' : str);
+          }
+          partial = '[' + partial.join(',') + ']';
+        } else {
+          var keys = Object.keys(value);
+          for (var i = 0, length = keys.length; i < length; i++) {
+            var key = keys[i], str = Str(key, value, stack);
+            if (typeof str !== "undefined") {
+               partial.push(key.inspect(true)+ ':' + str);
+             }
+          }
+          partial = '{' + partial.join(',') + '}';
+        }
+        stack.pop();
+        return partial;
+    }
+  }
+
+  function stringify(object) {
+    return JSON.stringify(object);
+  }
+
+  function toQueryString(object) {
+    return $H(object).toQueryString();
+  }
+
+  function toHTML(object) {
+    return object && object.toHTML ? object.toHTML() : String.interpret(object);
+  }
+
+  function keys(object) {
+    if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); }
+    var results = [];
+    for (var property in object) {
+      if (object.hasOwnProperty(property)) {
+        results.push(property);
+      }
+    }
+    return results;
+  }
+
+  function values(object) {
+    var results = [];
+    for (var property in object)
+      results.push(object[property]);
+    return results;
+  }
+
+  function clone(object) {
+    return extend({ }, object);
+  }
+
+  function isElement(object) {
+    return !!(object && object.nodeType == 1);
+  }
+
+  function isArray(object) {
+    return _toString.call(object) === ARRAY_CLASS;
+  }
+
+  var hasNativeIsArray = (typeof Array.isArray == 'function')
+    && Array.isArray([]) && !Array.isArray({});
+
+  if (hasNativeIsArray) {
+    isArray = Array.isArray;
+  }
+
+  function isHash(object) {
+    return object instanceof Hash;
+  }
+
+  function isFunction(object) {
+    return _toString.call(object) === FUNCTION_CLASS;
+  }
+
+  function isString(object) {
+    return _toString.call(object) === STRING_CLASS;
+  }
+
+  function isNumber(object) {
+    return _toString.call(object) === NUMBER_CLASS;
+  }
+
+  function isDate(object) {
+    return _toString.call(object) === DATE_CLASS;
+  }
+
+  function isUndefined(object) {
+    return typeof object === "undefined";
+  }
+
+  extend(Object, {
+    extend:        extend,
+    inspect:       inspect,
+    toJSON:        NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON,
+    toQueryString: toQueryString,
+    toHTML:        toHTML,
+    keys:          Object.keys || keys,
+    values:        values,
+    clone:         clone,
+    isElement:     isElement,
+    isArray:       isArray,
+    isHash:        isHash,
+    isFunction:    isFunction,
+    isString:      isString,
+    isNumber:      isNumber,
+    isDate:        isDate,
+    isUndefined:   isUndefined
+  });
+})();
+Object.extend(Function.prototype, (function() {
+  var slice = Array.prototype.slice;
+
+  function update(array, args) {
+    var arrayLength = array.length, length = args.length;
+    while (length--) array[arrayLength + length] = args[length];
+    return array;
+  }
+
+  function merge(array, args) {
+    array = slice.call(array, 0);
+    return update(array, args);
+  }
+
+  function argumentNames() {
+    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
+      .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
+      .replace(/\s+/g, '').split(',');
+    return names.length == 1 && !names[0] ? [] : names;
+  }
+
+  function bind(context) {
+    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
+    var __method = this, args = slice.call(arguments, 1);
+    return function() {
+      var a = merge(args, arguments);
+      return __method.apply(context, a);
+    }
+  }
+
+  function bindAsEventListener(context) {
+    var __method = this, args = slice.call(arguments, 1);
+    return function(event) {
+      var a = update([event || window.event], args);
+      return __method.apply(context, a);
+    }
+  }
+
+  function curry() {
+    if (!arguments.length) return this;
+    var __method = this, args = slice.call(arguments, 0);
+    return function() {
+      var a = merge(args, arguments);
+      return __method.apply(this, a);
+    }
+  }
+
+  function delay(timeout) {
+    var __method = this, args = slice.call(arguments, 1);
+    timeout = timeout * 1000;
+    return window.setTimeout(function() {
+      return __method.apply(__method, args);
+    }, timeout);
+  }
+
+  function defer() {
+    var args = update([0.01], arguments);
+    return this.delay.apply(this, args);
+  }
+
+  function wrap(wrapper) {
+    var __method = this;
+    return function() {
+      var a = update([__method.bind(this)], arguments);
+      return wrapper.apply(this, a);
+    }
+  }
+
+  function methodize() {
+    if (this._methodized) return this._methodized;
+    var __method = this;
+    return this._methodized = function() {
+      var a = update([this], arguments);
+      return __method.apply(null, a);
+    };
+  }
+
+  return {
+    argumentNames:       argumentNames,
+    bind:                bind,
+    bindAsEventListener: bindAsEventListener,
+    curry:               curry,
+    delay:               delay,
+    defer:               defer,
+    wrap:                wrap,
+    methodize:           methodize
+  }
+})());
+
+
+
+(function(proto) {
+
+
+  function toISOString() {
+    return this.getUTCFullYear() + '-' +
+      (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
+      this.getUTCDate().toPaddedString(2) + 'T' +
+      this.getUTCHours().toPaddedString(2) + ':' +
+      this.getUTCMinutes().toPaddedString(2) + ':' +
+      this.getUTCSeconds().toPaddedString(2) + 'Z';
+  }
+
+
+  function toJSON() {
+    return this.toISOString();
+  }
+
+  if (!proto.toISOString) proto.toISOString = toISOString;
+  if (!proto.toJSON) proto.toJSON = toJSON;
+
+})(Date.prototype);
+
+
+RegExp.prototype.match = RegExp.prototype.test;
+
+RegExp.escape = function(str) {
+  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+};
+var PeriodicalExecuter = Class.create({
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  execute: function() {
+    this.callback(this);
+  },
+
+  stop: function() {
+    if (!this.timer) return;
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.execute();
+        this.currentlyExecuting = false;
+      } catch(e) {
+        this.currentlyExecuting = false;
+        throw e;
+      }
+    }
+  }
+});
+Object.extend(String, {
+  interpret: function(value) {
+    return value == null ? '' : String(value);
+  },
+  specialChar: {
+    '\b': '\\b',
+    '\t': '\\t',
+    '\n': '\\n',
+    '\f': '\\f',
+    '\r': '\\r',
+    '\\': '\\\\'
+  }
+});
+
+Object.extend(String.prototype, (function() {
+  var NATIVE_JSON_PARSE_SUPPORT = window.JSON &&
+    typeof JSON.parse === 'function' &&
+    JSON.parse('{"test": true}').test;
+
+  function prepareReplacement(replacement) {
+    if (Object.isFunction(replacement)) return replacement;
+    var template = new Template(replacement);
+    return function(match) { return template.evaluate(match) };
+  }
+
+  function gsub(pattern, replacement) {
+    var result = '', source = this, match;
+    replacement = prepareReplacement(replacement);
+
+    if (Object.isString(pattern))
+      pattern = RegExp.escape(pattern);
+
+    if (!(pattern.length || pattern.source)) {
+      replacement = replacement('');
+      return replacement + source.split('').join(replacement) + replacement;
+    }
+
+    while (source.length > 0) {
+      if (match = source.match(pattern)) {
+        result += source.slice(0, match.index);
+        result += String.interpret(replacement(match));
+        source  = source.slice(match.index + match[0].length);
+      } else {
+        result += source, source = '';
+      }
+    }
+    return result;
+  }
+
+  function sub(pattern, replacement, count) {
+    replacement = prepareReplacement(replacement);
+    count = Object.isUndefined(count) ? 1 : count;
+
+    return this.gsub(pattern, function(match) {
+      if (--count < 0) return match[0];
+      return replacement(match);
+    });
+  }
+
+  function scan(pattern, iterator) {
+    this.gsub(pattern, iterator);
+    return String(this);
+  }
+
+  function truncate(length, truncation) {
+    length = length || 30;
+    truncation = Object.isUndefined(truncation) ? '...' : truncation;
+    return this.length > length ?
+      this.slice(0, length - truncation.length) + truncation : String(this);
+  }
+
+  function strip() {
+    return this.replace(/^\s+/, '').replace(/\s+$/, '');
+  }
+
+  function stripTags() {
+    return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, '');
+  }
+
+  function stripScripts() {
+    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+  }
+
+  function extractScripts() {
+    var matchAll = new RegExp(Prototype.ScriptFragment, 'img'),
+        matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+    return (this.match(matchAll) || []).map(function(scriptTag) {
+      return (scriptTag.match(matchOne) || ['', ''])[1];
+    });
+  }
+
+  function evalScripts() {
+    return this.extractScripts().map(function(script) { return eval(script) });
+  }
+
+  function escapeHTML() {
+    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+  }
+
+  function unescapeHTML() {
+    return this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
+  }
+
+
+  function toQueryParams(separator) {
+    var match = this.strip().match(/([^?#]*)(#.*)?$/);
+    if (!match) return { };
+
+    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
+      if ((pair = pair.split('='))[0]) {
+        var key = decodeURIComponent(pair.shift()),
+            value = pair.length > 1 ? pair.join('=') : pair[0];
+
+        if (value != undefined) value = decodeURIComponent(value);
+
+        if (key in hash) {
+          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
+          hash[key].push(value);
+        }
+        else hash[key] = value;
+      }
+      return hash;
+    });
+  }
+
+  function toArray() {
+    return this.split('');
+  }
+
+  function succ() {
+    return this.slice(0, this.length - 1) +
+      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+  }
+
+  function times(count) {
+    return count < 1 ? '' : new Array(count + 1).join(this);
+  }
+
+  function camelize() {
+    return this.replace(/-+(.)?/g, function(match, chr) {
+      return chr ? chr.toUpperCase() : '';
+    });
+  }
+
+  function capitalize() {
+    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+  }
+
+  function underscore() {
+    return this.replace(/::/g, '/')
+               .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
+               .replace(/([a-z\d])([A-Z])/g, '$1_$2')
+               .replace(/-/g, '_')
+               .toLowerCase();
+  }
+
+  function dasherize() {
+    return this.replace(/_/g, '-');
+  }
+
+  function inspect(useDoubleQuotes) {
+    var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) {
+      if (character in String.specialChar) {
+        return String.specialChar[character];
+      }
+      return '\\u00' + character.charCodeAt().toPaddedString(2, 16);
+    });
+    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  }
+
+  function unfilterJSON(filter) {
+    return this.replace(filter || Prototype.JSONFilter, '$1');
+  }
+
+  function isJSON() {
+    var str = this;
+    if (str.blank()) return false;
+    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
+    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
+    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
+    return (/^[\],:{}\s]*$/).test(str);
+  }
+
+  function evalJSON(sanitize) {
+    var json = this.unfilterJSON(),
+        cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+    if (cx.test(json)) {
+      json = json.replace(cx, function (a) {
+        return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+      });
+    }
+    try {
+      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
+    } catch (e) { }
+    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
+  }
+
+  function parseJSON() {
+    var json = this.unfilterJSON();
+    return JSON.parse(json);
+  }
+
+  function include(pattern) {
+    return this.indexOf(pattern) > -1;
+  }
+
+  function startsWith(pattern) {
+    return this.lastIndexOf(pattern, 0) === 0;
+  }
+
+  function endsWith(pattern) {
+    var d = this.length - pattern.length;
+    return d >= 0 && this.indexOf(pattern, d) === d;
+  }
+
+  function empty() {
+    return this == '';
+  }
+
+  function blank() {
+    return /^\s*$/.test(this);
+  }
+
+  function interpolate(object, pattern) {
+    return new Template(this, pattern).evaluate(object);
+  }
+
+  return {
+    gsub:           gsub,
+    sub:            sub,
+    scan:           scan,
+    truncate:       truncate,
+    strip:          String.prototype.trim || strip,
+    stripTags:      stripTags,
+    stripScripts:   stripScripts,
+    extractScripts: extractScripts,
+    evalScripts:    evalScripts,
+    escapeHTML:     escapeHTML,
+    unescapeHTML:   unescapeHTML,
+    toQueryParams:  toQueryParams,
+    parseQuery:     toQueryParams,
+    toArray:        toArray,
+    succ:           succ,
+    times:          times,
+    camelize:       camelize,
+    capitalize:     capitalize,
+    underscore:     underscore,
+    dasherize:      dasherize,
+    inspect:        inspect,
+    unfilterJSON:   unfilterJSON,
+    isJSON:         isJSON,
+    evalJSON:       NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON,
+    include:        include,
+    startsWith:     startsWith,
+    endsWith:       endsWith,
+    empty:          empty,
+    blank:          blank,
+    interpolate:    interpolate
+  };
+})());
+
+var Template = Class.create({
+  initialize: function(template, pattern) {
+    this.template = template.toString();
+    this.pattern = pattern || Template.Pattern;
+  },
+
+  evaluate: function(object) {
+    if (object && Object.isFunction(object.toTemplateReplacements))
+      object = object.toTemplateReplacements();
+
+    return this.template.gsub(this.pattern, function(match) {
+      if (object == null) return (match[1] + '');
+
+      var before = match[1] || '';
+      if (before == '\\') return match[2];
+
+      var ctx = object, expr = match[3],
+          pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
+
+      match = pattern.exec(expr);
+      if (match == null) return before;
+
+      while (match != null) {
+        var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
+        ctx = ctx[comp];
+        if (null == ctx || '' == match[3]) break;
+        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
+        match = pattern.exec(expr);
+      }
+
+      return before + String.interpret(ctx);
+    });
+  }
+});
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+
+var $break = { };
+
+var Enumerable = (function() {
+  function each(iterator, context) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        iterator.call(context, value, index++);
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+    return this;
+  }
+
+  function eachSlice(number, iterator, context) {
+    var index = -number, slices = [], array = this.toArray();
+    if (number < 1) return array;
+    while ((index += number) < array.length)
+      slices.push(array.slice(index, index+number));
+    return slices.collect(iterator, context);
+  }
+
+  function all(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!iterator.call(context, value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  }
+
+  function any(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result = false;
+    this.each(function(value, index) {
+      if (result = !!iterator.call(context, value, index))
+        throw $break;
+    });
+    return result;
+  }
+
+  function collect(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var results = [];
+    this.each(function(value, index) {
+      results.push(iterator.call(context, value, index));
+    });
+    return results;
+  }
+
+  function detect(iterator, context) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator.call(context, value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  }
+
+  function findAll(iterator, context) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator.call(context, value, index))
+        results.push(value);
+    });
+    return results;
+  }
+
+  function grep(filter, iterator, context) {
+    iterator = iterator || Prototype.K;
+    var results = [];
+
+    if (Object.isString(filter))
+      filter = new RegExp(RegExp.escape(filter));
+
+    this.each(function(value, index) {
+      if (filter.match(value))
+        results.push(iterator.call(context, value, index));
+    });
+    return results;
+  }
+
+  function include(object) {
+    if (Object.isFunction(this.indexOf))
+      if (this.indexOf(object) != -1) return true;
+
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  }
+
+  function inGroupsOf(number, fillWith) {
+    fillWith = Object.isUndefined(fillWith) ? null : fillWith;
+    return this.eachSlice(number, function(slice) {
+      while(slice.length < number) slice.push(fillWith);
+      return slice;
+    });
+  }
+
+  function inject(memo, iterator, context) {
+    this.each(function(value, index) {
+      memo = iterator.call(context, memo, value, index);
+    });
+    return memo;
+  }
+
+  function invoke(method) {
+    var args = $A(arguments).slice(1);
+    return this.map(function(value) {
+      return value[method].apply(value, args);
+    });
+  }
+
+  function max(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result;
+    this.each(function(value, index) {
+      value = iterator.call(context, value, index);
+      if (result == null || value >= result)
+        result = value;
+    });
+    return result;
+  }
+
+  function min(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var result;
+    this.each(function(value, index) {
+      value = iterator.call(context, value, index);
+      if (result == null || value < result)
+        result = value;
+    });
+    return result;
+  }
+
+  function partition(iterator, context) {
+    iterator = iterator || Prototype.K;
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      (iterator.call(context, value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  }
+
+  function pluck(property) {
+    var results = [];
+    this.each(function(value) {
+      results.push(value[property]);
+    });
+    return results;
+  }
+
+  function reject(iterator, context) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator.call(context, value, index))
+        results.push(value);
+    });
+    return results;
+  }
+
+  function sortBy(iterator, context) {
+    return this.map(function(value, index) {
+      return {
+        value: value,
+        criteria: iterator.call(context, value, index)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  }
+
+  function toArray() {
+    return this.map();
+  }
+
+  function zip() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (Object.isFunction(args.last()))
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      return iterator(collections.pluck(index));
+    });
+  }
+
+  function size() {
+    return this.toArray().length;
+  }
+
+  function inspect() {
+    return '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+
+
+
+
+
+
+
+
+
+  return {
+    each:       each,
+    eachSlice:  eachSlice,
+    all:        all,
+    every:      all,
+    any:        any,
+    some:       any,
+    collect:    collect,
+    map:        collect,
+    detect:     detect,
+    findAll:    findAll,
+    select:     findAll,
+    filter:     findAll,
+    grep:       grep,
+    include:    include,
+    member:     include,
+    inGroupsOf: inGroupsOf,
+    inject:     inject,
+    invoke:     invoke,
+    max:        max,
+    min:        min,
+    partition:  partition,
+    pluck:      pluck,
+    reject:     reject,
+    sortBy:     sortBy,
+    toArray:    toArray,
+    entries:    toArray,
+    zip:        zip,
+    size:       size,
+    inspect:    inspect,
+    find:       detect
+  };
+})();
+
+function $A(iterable) {
+  if (!iterable) return [];
+  if ('toArray' in Object(iterable)) return iterable.toArray();
+  var length = iterable.length || 0, results = new Array(length);
+  while (length--) results[length] = iterable[length];
+  return results;
+}
+
+
+function $w(string) {
+  if (!Object.isString(string)) return [];
+  string = string.strip();
+  return string ? string.split(/\s+/) : [];
+}
+
+Array.from = $A;
+
+
+(function() {
+  var arrayProto = Array.prototype,
+      slice = arrayProto.slice,
+      _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available
+
+  function each(iterator, context) {
+    for (var i = 0, length = this.length >>> 0; i < length; i++) {
+      if (i in this) iterator.call(context, this[i], i, this);
+    }
+  }
+  if (!_each) _each = each;
+
+  function clear() {
+    this.length = 0;
+    return this;
+  }
+
+  function first() {
+    return this[0];
+  }
+
+  function last() {
+    return this[this.length - 1];
+  }
+
+  function compact() {
+    return this.select(function(value) {
+      return value != null;
+    });
+  }
+
+  function flatten() {
+    return this.inject([], function(array, value) {
+      if (Object.isArray(value))
+        return array.concat(value.flatten());
+      array.push(value);
+      return array;
+    });
+  }
+
+  function without() {
+    var values = slice.call(arguments, 0);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  }
+
+  function reverse(inline) {
+    return (inline === false ? this.toArray() : this)._reverse();
+  }
+
+  function uniq(sorted) {
+    return this.inject([], function(array, value, index) {
+      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
+        array.push(value);
+      return array;
+    });
+  }
+
+  function intersect(array) {
+    return this.uniq().findAll(function(item) {
+      return array.detect(function(value) { return item === value });
+    });
+  }
+
+
+  function clone() {
+    return slice.call(this, 0);
+  }
+
+  function size() {
+    return this.length;
+  }
+
+  function inspect() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  }
+
+  function indexOf(item, i) {
+    i || (i = 0);
+    var length = this.length;
+    if (i < 0) i = length + i;
+    for (; i < length; i++)
+      if (this[i] === item) return i;
+    return -1;
+  }
+
+  function lastIndexOf(item, i) {
+    i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+    var n = this.slice(0, i).reverse().indexOf(item);
+    return (n < 0) ? n : i - n - 1;
+  }
+
+  function concat() {
+    var array = slice.call(this, 0), item;
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      item = arguments[i];
+      if (Object.isArray(item) && !('callee' in item)) {
+        for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
+          array.push(item[j]);
+      } else {
+        array.push(item);
+      }
+    }
+    return array;
+  }
+
+  Object.extend(arrayProto, Enumerable);
+
+  if (!arrayProto._reverse)
+    arrayProto._reverse = arrayProto.reverse;
+
+  Object.extend(arrayProto, {
+    _each:     _each,
+    clear:     clear,
+    first:     first,
+    last:      last,
+    compact:   compact,
+    flatten:   flatten,
+    without:   without,
+    reverse:   reverse,
+    uniq:      uniq,
+    intersect: intersect,
+    clone:     clone,
+    toArray:   clone,
+    size:      size,
+    inspect:   inspect
+  });
+
+  var CONCAT_ARGUMENTS_BUGGY = (function() {
+    return [].concat(arguments)[0][0] !== 1;
+  })(1,2)
+
+  if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;
+
+  if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;
+  if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf;
+})();
+function $H(object) {
+  return new Hash(object);
+};
+
+var Hash = Class.create(Enumerable, (function() {
+  function initialize(object) {
+    this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+  }
+
+
+  function _each(iterator) {
+    for (var key in this._object) {
+      var value = this._object[key], pair = [key, value];
+      pair.key = key;
+      pair.value = value;
+      iterator(pair);
+    }
+  }
+
+  function set(key, value) {
+    return this._object[key] = value;
+  }
+
+  function get(key) {
+    if (this._object[key] !== Object.prototype[key])
+      return this._object[key];
+  }
+
+  function unset(key) {
+    var value = this._object[key];
+    delete this._object[key];
+    return value;
+  }
+
+  function toObject() {
+    return Object.clone(this._object);
+  }
+
+
+
+  function keys() {
+    return this.pluck('key');
+  }
+
+  function values() {
+    return this.pluck('value');
+  }
+
+  function index(value) {
+    var match = this.detect(function(pair) {
+      return pair.value === value;
+    });
+    return match && match.key;
+  }
+
+  function merge(object) {
+    return this.clone().update(object);
+  }
+
+  function update(object) {
+    return new Hash(object).inject(this, function(result, pair) {
+      result.set(pair.key, pair.value);
+      return result;
+    });
+  }
+
+  function toQueryPair(key, value) {
+    if (Object.isUndefined(value)) return key;
+    return key + '=' + encodeURIComponent(String.interpret(value));
+  }
+
+  function toQueryString() {
+    return this.inject([], function(results, pair) {
+      var key = encodeURIComponent(pair.key), values = pair.value;
+
+      if (values && typeof values == 'object') {
+        if (Object.isArray(values)) {
+          var queryValues = [];
+          for (var i = 0, len = values.length, value; i < len; i++) {
+            value = values[i];
+            queryValues.push(toQueryPair(key, value));
+          }
+          return results.concat(queryValues);
+        }
+      } else results.push(toQueryPair(key, values));
+      return results;
+    }).join('&');
+  }
+
+  function inspect() {
+    return '#<Hash:{' + this.map(function(pair) {
+      return pair.map(Object.inspect).join(': ');
+    }).join(', ') + '}>';
+  }
+
+  function clone() {
+    return new Hash(this);
+  }
+
+  return {
+    initialize:             initialize,
+    _each:                  _each,
+    set:                    set,
+    get:                    get,
+    unset:                  unset,
+    toObject:               toObject,
+    toTemplateReplacements: toObject,
+    keys:                   keys,
+    values:                 values,
+    index:                  index,
+    merge:                  merge,
+    update:                 update,
+    toQueryString:          toQueryString,
+    inspect:                inspect,
+    toJSON:                 toObject,
+    clone:                  clone
+  };
+})());
+
+Hash.from = $H;
+Object.extend(Number.prototype, (function() {
+  function toColorPart() {
+    return this.toPaddedString(2, 16);
+  }
+
+  function succ() {
+    return this + 1;
+  }
+
+  function times(iterator, context) {
+    $R(0, this, true).each(iterator, context);
+    return this;
+  }
+
+  function toPaddedString(length, radix) {
+    var string = this.toString(radix || 10);
+    return '0'.times(length - string.length) + string;
+  }
+
+  function abs() {
+    return Math.abs(this);
+  }
+
+  function round() {
+    return Math.round(this);
+  }
+
+  function ceil() {
+    return Math.ceil(this);
+  }
+
+  function floor() {
+    return Math.floor(this);
+  }
+
+  return {
+    toColorPart:    toColorPart,
+    succ:           succ,
+    times:          times,
+    toPaddedString: toPaddedString,
+    abs:            abs,
+    round:          round,
+    ceil:           ceil,
+    floor:          floor
+  };
+})());
+
+function $R(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+}
+
+var ObjectRange = Class.create(Enumerable, (function() {
+  function initialize(start, end, exclusive) {
+    this.start = start;
+    this.end = end;
+    this.exclusive = exclusive;
+  }
+
+  function _each(iterator) {
+    var value = this.start;
+    while (this.include(value)) {
+      iterator(value);
+      value = value.succ();
+    }
+  }
+
+  function include(value) {
+    if (value < this.start)
+      return false;
+    if (this.exclusive)
+      return value < this.end;
+    return value <= this.end;
+  }
+
+  return {
+    initialize: initialize,
+    _each:      _each,
+    include:    include
+  };
+})());
+
+
+
+var Abstract = { };
+
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) { }
+    }
+
+    return returnValue;
+  }
+};
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new XMLHttpRequest()},
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+    ) || false;
+  },
+
+  activeRequestCount: 0
+};
+
+Ajax.Responders = {
+  responders: [],
+
+  _each: function(iterator) {
+    this.responders._each(iterator);
+  },
+
+  register: function(responder) {
+    if (!this.include(responder))
+      this.responders.push(responder);
+  },
+
+  unregister: function(responder) {
+    this.responders = this.responders.without(responder);
+  },
+
+  dispatch: function(callback, request, transport, json) {
+    this.each(function(responder) {
+      if (Object.isFunction(responder[callback])) {
+        try {
+          responder[callback].apply(responder, [request, transport, json]);
+        } catch (e) { }
+      }
+    });
+  }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+  onCreate:   function() { Ajax.activeRequestCount++ },
+  onComplete: function() { Ajax.activeRequestCount-- }
+});
+Ajax.Base = Class.create({
+  initialize: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      contentType:  'application/x-www-form-urlencoded',
+      encoding:     'UTF-8',
+      parameters:   '',
+      evalJSON:     true,
+      evalJS:       true
+    };
+    Object.extend(this.options, options || { });
+
+    this.options.method = this.options.method.toLowerCase();
+
+    if (Object.isHash(this.options.parameters))
+      this.options.parameters = this.options.parameters.toObject();
+  }
+});
+Ajax.Request = Class.create(Ajax.Base, {
+  _complete: false,
+
+  initialize: function($super, url, options) {
+    $super(options);
+    this.transport = Ajax.getTransport();
+    this.request(url);
+  },
+
+  request: function(url) {
+    this.url = url;
+    this.method = this.options.method;
+    var params = Object.isString(this.options.parameters) ?
+          this.options.parameters :
+          Object.toQueryString(this.options.parameters);
+
+    if (!['get', 'post'].include(this.method)) {
+      params += (params ? '&' : '') + "_method=" + this.method;
+      this.method = 'post';
+    }
+
+    if (params && this.method === 'get') {
+      this.url += (this.url.include('?') ? '&' : '?') + params;
+    }
+
+    this.parameters = params.toQueryParams();
+
+    try {
+      var response = new Ajax.Response(this);
+      if (this.options.onCreate) this.options.onCreate(response);
+      Ajax.Responders.dispatch('onCreate', this, response);
+
+      this.transport.open(this.method.toUpperCase(), this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
+
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.setRequestHeaders();
+
+      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
+      this.transport.send(this.body);
+
+      /* Force Firefox to handle ready state 4 for synchronous requests */
+      if (!this.options.asynchronous && this.transport.overrideMimeType)
+        this.onStateChange();
+
+    }
+    catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState > 1 && !((readyState == 4) && this._complete))
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  setRequestHeaders: function() {
+    var headers = {
+      'X-Requested-With': 'XMLHttpRequest',
+      'X-Prototype-Version': Prototype.Version,
+      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+    };
+
+    if (this.method == 'post') {
+      headers['Content-type'] = this.options.contentType +
+        (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+      /* Force "Connection: close" for older Mozilla browsers to work
+       * around a bug where XMLHttpRequest sends an incorrect
+       * Content-length header. See Mozilla Bugzilla #246651.
+       */
+      if (this.transport.overrideMimeType &&
+          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+            headers['Connection'] = 'close';
+    }
+
+    if (typeof this.options.requestHeaders == 'object') {
+      var extras = this.options.requestHeaders;
+
+      if (Object.isFunction(extras.push))
+        for (var i = 0, length = extras.length; i < length; i += 2)
+          headers[extras[i]] = extras[i+1];
+      else
+        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
+    }
+
+    for (var name in headers)
+      this.transport.setRequestHeader(name, headers[name]);
+  },
+
+  success: function() {
+    var status = this.getStatus();
+    return !status || (status >= 200 && status < 300) || status == 304;
+  },
+
+  getStatus: function() {
+    try {
+      if (this.transport.status === 1223) return 204;
+      return this.transport.status || 0;
+    } catch (e) { return 0 }
+  },
+
+  respondToReadyState: function(readyState) {
+    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
+
+    if (state == 'Complete') {
+      try {
+        this._complete = true;
+        (this.options['on' + response.status]
+         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(response, response.headerJSON);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      var contentType = response.getHeader('Content-type');
+      if (this.options.evalJS == 'force'
+          || (this.options.evalJS && this.isSameOrigin() && contentType
+          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
+        this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
+      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    if (state == 'Complete') {
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+    }
+  },
+
+  isSameOrigin: function() {
+    var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
+    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
+      protocol: location.protocol,
+      domain: document.domain,
+      port: location.port ? ':' + location.port : ''
+    }));
+  },
+
+  getHeader: function(name) {
+    try {
+      return this.transport.getResponseHeader(name) || null;
+    } catch (e) { return null; }
+  },
+
+  evalResponse: function() {
+    try {
+      return eval((this.transport.responseText || '').unfilterJSON());
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+
+
+
+
+
+
+
+Ajax.Response = Class.create({
+  initialize: function(request){
+    this.request = request;
+    var transport  = this.transport  = request.transport,
+        readyState = this.readyState = transport.readyState;
+
+    if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
+      this.status       = this.getStatus();
+      this.statusText   = this.getStatusText();
+      this.responseText = String.interpret(transport.responseText);
+      this.headerJSON   = this._getHeaderJSON();
+    }
+
+    if (readyState == 4) {
+      var xml = transport.responseXML;
+      this.responseXML  = Object.isUndefined(xml) ? null : xml;
+      this.responseJSON = this._getResponseJSON();
+    }
+  },
+
+  status:      0,
+
+  statusText: '',
+
+  getStatus: Ajax.Request.prototype.getStatus,
+
+  getStatusText: function() {
+    try {
+      return this.transport.statusText || '';
+    } catch (e) { return '' }
+  },
+
+  getHeader: Ajax.Request.prototype.getHeader,
+
+  getAllHeaders: function() {
+    try {
+      return this.getAllResponseHeaders();
+    } catch (e) { return null }
+  },
+
+  getResponseHeader: function(name) {
+    return this.transport.getResponseHeader(name);
+  },
+
+  getAllResponseHeaders: function() {
+    return this.transport.getAllResponseHeaders();
+  },
+
+  _getHeaderJSON: function() {
+    var json = this.getHeader('X-JSON');
+    if (!json) return null;
+    json = decodeURIComponent(escape(json));
+    try {
+      return json.evalJSON(this.request.options.sanitizeJSON ||
+        !this.request.isSameOrigin());
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  },
+
+  _getResponseJSON: function() {
+    var options = this.request.options;
+    if (!options.evalJSON || (options.evalJSON != 'force' &&
+      !(this.getHeader('Content-type') || '').include('application/json')) ||
+        this.responseText.blank())
+          return null;
+    try {
+      return this.responseText.evalJSON(options.sanitizeJSON ||
+        !this.request.isSameOrigin());
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  }
+});
+
+Ajax.Updater = Class.create(Ajax.Request, {
+  initialize: function($super, container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    };
+
+    options = Object.clone(options);
+    var onComplete = options.onComplete;
+    options.onComplete = (function(response, json) {
+      this.updateContent(response.responseText);
+      if (Object.isFunction(onComplete)) onComplete(response, json);
+    }).bind(this);
+
+    $super(url, options);
+  },
+
+  updateContent: function(responseText) {
+    var receiver = this.container[this.success() ? 'success' : 'failure'],
+        options = this.options;
+
+    if (!options.evalScripts) responseText = responseText.stripScripts();
+
+    if (receiver = $(receiver)) {
+      if (options.insertion) {
+        if (Object.isString(options.insertion)) {
+          var insertion = { }; insertion[options.insertion] = responseText;
+          receiver.insert(insertion);
+        }
+        else options.insertion(receiver, responseText);
+      }
+      else receiver.update(responseText);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
+  initialize: function($super, container, url, options) {
+    $super(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = (this.options.decay || 1);
+
+    this.updater = { };
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.options.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(response) {
+    if (this.options.decay) {
+      this.decay = (response.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = response.responseText;
+    }
+    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+
+
+function $(element) {
+  if (arguments.length > 1) {
+    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+      elements.push($(arguments[i]));
+    return elements;
+  }
+  if (Object.isString(element))
+    element = document.getElementById(element);
+  return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+  document._getElementsByXPath = function(expression, parentElement) {
+    var results = [];
+    var query = document.evaluate(expression, $(parentElement) || document,
+      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    for (var i = 0, length = query.snapshotLength; i < length; i++)
+      results.push(Element.extend(query.snapshotItem(i)));
+    return results;
+  };
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!Node) var Node = { };
+
+if (!Node.ELEMENT_NODE) {
+  Object.extend(Node, {
+    ELEMENT_NODE: 1,
+    ATTRIBUTE_NODE: 2,
+    TEXT_NODE: 3,
+    CDATA_SECTION_NODE: 4,
+    ENTITY_REFERENCE_NODE: 5,
+    ENTITY_NODE: 6,
+    PROCESSING_INSTRUCTION_NODE: 7,
+    COMMENT_NODE: 8,
+    DOCUMENT_NODE: 9,
+    DOCUMENT_TYPE_NODE: 10,
+    DOCUMENT_FRAGMENT_NODE: 11,
+    NOTATION_NODE: 12
+  });
+}
+
+
+
+(function(global) {
+  function shouldUseCache(tagName, attributes) {
+    if (tagName === 'select') return false;
+    if ('type' in attributes) return false;
+    return true;
+  }
+
+  var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){
+    try {
+      var el = document.createElement('<input name="x">');
+      return el.tagName.toLowerCase() === 'input' && el.name === 'x';
+    }
+    catch(err) {
+      return false;
+    }
+  })();
+
+  var element = global.Element;
+
+  global.Element = function(tagName, attributes) {
+    attributes = attributes || { };
+    tagName = tagName.toLowerCase();
+    var cache = Element.cache;
+
+    if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) {
+      tagName = '<' + tagName + ' name="' + attributes.name + '">';
+      delete attributes.name;
+      return Element.writeAttribute(document.createElement(tagName), attributes);
+    }
+
+    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
+
+    var node = shouldUseCache(tagName, attributes) ?
+     cache[tagName].cloneNode(false) : document.createElement(tagName);
+
+    return Element.writeAttribute(node, attributes);
+  };
+
+  Object.extend(global.Element, element || { });
+  if (element) global.Element.prototype = element.prototype;
+
+})(this);
+
+Element.idCounter = 1;
+Element.cache = { };
+
+Element._purgeElement = function(element) {
+  var uid = element._prototypeUID;
+  if (uid) {
+    Element.stopObserving(element);
+    element._prototypeUID = void 0;
+    delete Element.Storage[uid];
+  }
+}
+
+Element.Methods = {
+  visible: function(element) {
+    return $(element).style.display != 'none';
+  },
+
+  toggle: function(element) {
+    element = $(element);
+    Element[Element.visible(element) ? 'hide' : 'show'](element);
+    return element;
+  },
+
+  hide: function(element) {
+    element = $(element);
+    element.style.display = 'none';
+    return element;
+  },
+
+  show: function(element) {
+    element = $(element);
+    element.style.display = '';
+    return element;
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+    return element;
+  },
+
+  update: (function(){
+
+    var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){
+      var el = document.createElement("select"),
+          isBuggy = true;
+      el.innerHTML = "<option value=\"test\">test</option>";
+      if (el.options && el.options[0]) {
+        isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION";
+      }
+      el = null;
+      return isBuggy;
+    })();
+
+    var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){
+      try {
+        var el = document.createElement("table");
+        if (el && el.tBodies) {
+          el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>";
+          var isBuggy = typeof el.tBodies[0] == "undefined";
+          el = null;
+          return isBuggy;
+        }
+      } catch (e) {
+        return true;
+      }
+    })();
+
+    var LINK_ELEMENT_INNERHTML_BUGGY = (function() {
+      try {
+        var el = document.createElement('div');
+        el.innerHTML = "<link>";
+        var isBuggy = (el.childNodes.length === 0);
+        el = null;
+        return isBuggy;
+      } catch(e) {
+        return true;
+      }
+    })();
+
+    var ANY_INNERHTML_BUGGY = SELECT_ELEMENT_INNERHTML_BUGGY ||
+     TABLE_ELEMENT_INNERHTML_BUGGY || LINK_ELEMENT_INNERHTML_BUGGY;
+
+    var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () {
+      var s = document.createElement("script"),
+          isBuggy = false;
+      try {
+        s.appendChild(document.createTextNode(""));
+        isBuggy = !s.firstChild ||
+          s.firstChild && s.firstChild.nodeType !== 3;
+      } catch (e) {
+        isBuggy = true;
+      }
+      s = null;
+      return isBuggy;
+    })();
+
+
+    function update(element, content) {
+      element = $(element);
+      var purgeElement = Element._purgeElement;
+
+      var descendants = element.getElementsByTagName('*'),
+       i = descendants.length;
+      while (i--) purgeElement(descendants[i]);
+
+      if (content && content.toElement)
+        content = content.toElement();
+
+      if (Object.isElement(content))
+        return element.update().insert(content);
+
+      content = Object.toHTML(content);
+
+      var tagName = element.tagName.toUpperCase();
+
+      if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) {
+        element.text = content;
+        return element;
+      }
+
+      if (ANY_INNERHTML_BUGGY) {
+        if (tagName in Element._insertionTranslations.tags) {
+          while (element.firstChild) {
+            element.removeChild(element.firstChild);
+          }
+          Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+            .each(function(node) {
+              element.appendChild(node)
+            });
+        } else if (LINK_ELEMENT_INNERHTML_BUGGY && Object.isString(content) && content.indexOf('<link') > -1) {
+          while (element.firstChild) {
+            element.removeChild(element.firstChild);
+          }
+          var nodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts(), true);
+          nodes.each(function(node) { element.appendChild(node) });
+        }
+        else {
+          element.innerHTML = content.stripScripts();
+        }
+      }
+      else {
+        element.innerHTML = content.stripScripts();
+      }
+
+      content.evalScripts.bind(content).defer();
+      return element;
+    }
+
+    return update;
+  })(),
+
+  replace: function(element, content) {
+    element = $(element);
+    if (content && content.toElement) content = content.toElement();
+    else if (!Object.isElement(content)) {
+      content = Object.toHTML(content);
+      var range = element.ownerDocument.createRange();
+      range.selectNode(element);
+      content.evalScripts.bind(content).defer();
+      content = range.createContextualFragment(content.stripScripts());
+    }
+    element.parentNode.replaceChild(content, element);
+    return element;
+  },
+
+  insert: function(element, insertions) {
+    element = $(element);
+
+    if (Object.isString(insertions) || Object.isNumber(insertions) ||
+        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+          insertions = {bottom:insertions};
+
+    var content, insert, tagName, childNodes;
+
+    for (var position in insertions) {
+      content  = insertions[position];
+      position = position.toLowerCase();
+      insert = Element._insertionTranslations[position];
+
+      if (content && content.toElement) content = content.toElement();
+      if (Object.isElement(content)) {
+        insert(element, content);
+        continue;
+      }
+
+      content = Object.toHTML(content);
+
+      tagName = ((position == 'before' || position == 'after')
+        ? element.parentNode : element).tagName.toUpperCase();
+
+      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+
+      if (position == 'top' || position == 'after') childNodes.reverse();
+      childNodes.each(insert.curry(element));
+
+      content.evalScripts.bind(content).defer();
+    }
+
+    return element;
+  },
+
+  wrap: function(element, wrapper, attributes) {
+    element = $(element);
+    if (Object.isElement(wrapper))
+      $(wrapper).writeAttribute(attributes || { });
+    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
+    else wrapper = new Element('div', wrapper);
+    if (element.parentNode)
+      element.parentNode.replaceChild(wrapper, element);
+    wrapper.appendChild(element);
+    return wrapper;
+  },
+
+  inspect: function(element) {
+    element = $(element);
+    var result = '<' + element.tagName.toLowerCase();
+    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+      var property = pair.first(),
+          attribute = pair.last(),
+          value = (element[property] || '').toString();
+      if (value) result += ' ' + attribute + '=' + value.inspect(true);
+    });
+    return result + '>';
+  },
+
+  recursivelyCollect: function(element, property, maximumLength) {
+    element = $(element);
+    maximumLength = maximumLength || -1;
+    var elements = [];
+
+    while (element = element[property]) {
+      if (element.nodeType == 1)
+        elements.push(Element.extend(element));
+      if (elements.length == maximumLength)
+        break;
+    }
+
+    return elements;
+  },
+
+  ancestors: function(element) {
+    return Element.recursivelyCollect(element, 'parentNode');
+  },
+
+  descendants: function(element) {
+    return Element.select(element, "*");
+  },
+
+  firstDescendant: function(element) {
+    element = $(element).firstChild;
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    return $(element);
+  },
+
+  immediateDescendants: function(element) {
+    var results = [], child = $(element).firstChild;
+    while (child) {
+      if (child.nodeType === 1) {
+        results.push(Element.extend(child));
+      }
+      child = child.nextSibling;
+    }
+    return results;
+  },
+
+  previousSiblings: function(element, maximumLength) {
+    return Element.recursivelyCollect(element, 'previousSibling');
+  },
+
+  nextSiblings: function(element) {
+    return Element.recursivelyCollect(element, 'nextSibling');
+  },
+
+  siblings: function(element) {
+    element = $(element);
+    return Element.previousSiblings(element).reverse()
+      .concat(Element.nextSiblings(element));
+  },
+
+  match: function(element, selector) {
+    element = $(element);
+    if (Object.isString(selector))
+      return Prototype.Selector.match(element, selector);
+    return selector.match(element);
+  },
+
+  up: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(element.parentNode);
+    var ancestors = Element.ancestors(element);
+    return Object.isNumber(expression) ? ancestors[expression] :
+      Prototype.Selector.find(ancestors, expression, index);
+  },
+
+  down: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return Element.firstDescendant(element);
+    return Object.isNumber(expression) ? Element.descendants(element)[expression] :
+      Element.select(element, expression)[index || 0];
+  },
+
+  previous: function(element, expression, index) {
+    element = $(element);
+    if (Object.isNumber(expression)) index = expression, expression = false;
+    if (!Object.isNumber(index)) index = 0;
+
+    if (expression) {
+      return Prototype.Selector.find(element.previousSiblings(), expression, index);
+    } else {
+      return element.recursivelyCollect("previousSibling", index + 1)[index];
+    }
+  },
+
+  next: function(element, expression, index) {
+    element = $(element);
+    if (Object.isNumber(expression)) index = expression, expression = false;
+    if (!Object.isNumber(index)) index = 0;
+
+    if (expression) {
+      return Prototype.Selector.find(element.nextSiblings(), expression, index);
+    } else {
+      var maximumLength = Object.isNumber(index) ? index + 1 : 1;
+      return element.recursivelyCollect("nextSibling", index + 1)[index];
+    }
+  },
+
+
+  select: function(element) {
+    element = $(element);
+    var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
+    return Prototype.Selector.select(expressions, element);
+  },
+
+  adjacent: function(element) {
+    element = $(element);
+    var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
+    return Prototype.Selector.select(expressions, element.parentNode).without(element);
+  },
+
+  identify: function(element) {
+    element = $(element);
+    var id = Element.readAttribute(element, 'id');
+    if (id) return id;
+    do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id));
+    Element.writeAttribute(element, 'id', id);
+    return id;
+  },
+
+  readAttribute: function(element, name) {
+    element = $(element);
+    if (Prototype.Browser.IE) {
+      var t = Element._attributeTranslations.read;
+      if (t.values[name]) return t.values[name](element, name);
+      if (t.names[name]) name = t.names[name];
+      if (name.include(':')) {
+        return (!element.attributes || !element.attributes[name]) ? null :
+         element.attributes[name].value;
+      }
+    }
+    return element.getAttribute(name);
+  },
+
+  writeAttribute: function(element, name, value) {
+    element = $(element);
+    var attributes = { }, t = Element._attributeTranslations.write;
+
+    if (typeof name == 'object') attributes = name;
+    else attributes[name] = Object.isUndefined(value) ? true : value;
+
+    for (var attr in attributes) {
+      name = t.names[attr] || attr;
+      value = attributes[attr];
+      if (t.values[attr]) name = t.values[attr](element, value);
+      if (value === false || value === null)
+        element.removeAttribute(name);
+      else if (value === true)
+        element.setAttribute(name, name);
+      else element.setAttribute(name, value);
+    }
+    return element;
+  },
+
+  getHeight: function(element) {
+    return Element.getDimensions(element).height;
+  },
+
+  getWidth: function(element) {
+    return Element.getDimensions(element).width;
+  },
+
+  classNames: function(element) {
+    return new Element.ClassNames(element);
+  },
+
+  hasClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    var elementClassName = element.className;
+    return (elementClassName.length > 0 && (elementClassName == className ||
+      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    if (!Element.hasClassName(element, className))
+      element.className += (element.className ? ' ' : '') + className;
+    return element;
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    element.className = element.className.replace(
+      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
+    return element;
+  },
+
+  toggleClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    return Element[Element.hasClassName(element, className) ?
+      'removeClassName' : 'addClassName'](element, className);
+  },
+
+  cleanWhitespace: function(element) {
+    element = $(element);
+    var node = element.firstChild;
+    while (node) {
+      var nextNode = node.nextSibling;
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+        element.removeChild(node);
+      node = nextNode;
+    }
+    return element;
+  },
+
+  empty: function(element) {
+    return $(element).innerHTML.blank();
+  },
+
+  descendantOf: function(element, ancestor) {
+    element = $(element), ancestor = $(ancestor);
+
+    if (element.compareDocumentPosition)
+      return (element.compareDocumentPosition(ancestor) & 8) === 8;
+
+    if (ancestor.contains)
+      return ancestor.contains(element) && ancestor !== element;
+
+    while (element = element.parentNode)
+      if (element == ancestor) return true;
+
+    return false;
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var pos = Element.cumulativeOffset(element);
+    window.scrollTo(pos[0], pos[1]);
+    return element;
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    style = style == 'float' ? 'cssFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value || value == 'auto') {
+      var css = document.defaultView.getComputedStyle(element, null);
+      value = css ? css[style] : null;
+    }
+    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
+    return value == 'auto' ? null : value;
+  },
+
+  getOpacity: function(element) {
+    return $(element).getStyle('opacity');
+  },
+
+  setStyle: function(element, styles) {
+    element = $(element);
+    var elementStyle = element.style, match;
+    if (Object.isString(styles)) {
+      element.style.cssText += ';' + styles;
+      return styles.include('opacity') ?
+        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
+    }
+    for (var property in styles)
+      if (property == 'opacity') element.setOpacity(styles[property]);
+      else
+        elementStyle[(property == 'float' || property == 'cssFloat') ?
+          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
+            property] = styles[property];
+
+    return element;
+  },
+
+  setOpacity: function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+    return element;
+  },
+
+  makePositioned: function(element) {
+    element = $(element);
+    var pos = Element.getStyle(element, 'position');
+    if (pos == 'static' || !pos) {
+      element._madePositioned = true;
+      element.style.position = 'relative';
+      if (Prototype.Browser.Opera) {
+        element.style.top = 0;
+        element.style.left = 0;
+      }
+    }
+    return element;
+  },
+
+  undoPositioned: function(element) {
+    element = $(element);
+    if (element._madePositioned) {
+      element._madePositioned = undefined;
+      element.style.position =
+        element.style.top =
+        element.style.left =
+        element.style.bottom =
+        element.style.right = '';
+    }
+    return element;
+  },
+
+  makeClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return element;
+    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
+    if (element._overflow !== 'hidden')
+      element.style.overflow = 'hidden';
+    return element;
+  },
+
+  undoClipping: function(element) {
+    element = $(element);
+    if (!element._overflow) return element;
+    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+    element._overflow = null;
+    return element;
+  },
+
+  clonePosition: function(element, source) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || { });
+
+    source = $(source);
+    var p = Element.viewportOffset(source), delta = [0, 0], parent = null;
+
+    element = $(element);
+
+    if (Element.getStyle(element, 'position') == 'absolute') {
+      parent = Element.getOffsetParent(element);
+      delta = Element.viewportOffset(parent);
+    }
+
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
+    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
+    return element;
+  }
+};
+
+Object.extend(Element.Methods, {
+  getElementsBySelector: Element.Methods.select,
+
+  childElements: Element.Methods.immediateDescendants
+});
+
+Element._attributeTranslations = {
+  write: {
+    names: {
+      className: 'class',
+      htmlFor:   'for'
+    },
+    values: { }
+  }
+};
+
+if (Prototype.Browser.Opera) {
+  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
+    function(proceed, element, style) {
+      switch (style) {
+        case 'height': case 'width':
+          if (!Element.visible(element)) return null;
+
+          var dim = parseInt(proceed(element, style), 10);
+
+          if (dim !== element['offset' + style.capitalize()])
+            return dim + 'px';
+
+          var properties;
+          if (style === 'height') {
+            properties = ['border-top-width', 'padding-top',
+             'padding-bottom', 'border-bottom-width'];
+          }
+          else {
+            properties = ['border-left-width', 'padding-left',
+             'padding-right', 'border-right-width'];
+          }
+          return properties.inject(dim, function(memo, property) {
+            var val = proceed(element, property);
+            return val === null ? memo : memo - parseInt(val, 10);
+          }) + 'px';
+        default: return proceed(element, style);
+      }
+    }
+  );
+
+  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
+    function(proceed, element, attribute) {
+      if (attribute === 'title') return element.title;
+      return proceed(element, attribute);
+    }
+  );
+}
+
+else if (Prototype.Browser.IE) {
+  Element.Methods.getStyle = function(element, style) {
+    element = $(element);
+    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value && element.currentStyle) value = element.currentStyle[style];
+
+    if (style == 'opacity') {
+      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if (value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+
+    if (value == 'auto') {
+      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
+        return element['offset' + style.capitalize()] + 'px';
+      return null;
+    }
+    return value;
+  };
+
+  Element.Methods.setOpacity = function(element, value) {
+    function stripAlpha(filter){
+      return filter.replace(/alpha\([^\)]*\)/gi,'');
+    }
+    element = $(element);
+    var currentStyle = element.currentStyle;
+    if ((currentStyle && !currentStyle.hasLayout) ||
+      (!currentStyle && element.style.zoom == 'normal'))
+        element.style.zoom = 1;
+
+    var filter = element.getStyle('filter'), style = element.style;
+    if (value == 1 || value === '') {
+      (filter = stripAlpha(filter)) ?
+        style.filter = filter : style.removeAttribute('filter');
+      return element;
+    } else if (value < 0.00001) value = 0;
+    style.filter = stripAlpha(filter) +
+      'alpha(opacity=' + (value * 100) + ')';
+    return element;
+  };
+
+  Element._attributeTranslations = (function(){
+
+    var classProp = 'className',
+        forProp = 'for',
+        el = document.createElement('div');
+
+    el.setAttribute(classProp, 'x');
+
+    if (el.className !== 'x') {
+      el.setAttribute('class', 'x');
+      if (el.className === 'x') {
+        classProp = 'class';
+      }
+    }
+    el = null;
+
+    el = document.createElement('label');
+    el.setAttribute(forProp, 'x');
+    if (el.htmlFor !== 'x') {
+      el.setAttribute('htmlFor', 'x');
+      if (el.htmlFor === 'x') {
+        forProp = 'htmlFor';
+      }
+    }
+    el = null;
+
+    return {
+      read: {
+        names: {
+          'class':      classProp,
+          'className':  classProp,
+          'for':        forProp,
+          'htmlFor':    forProp
+        },
+        values: {
+          _getAttr: function(element, attribute) {
+            return element.getAttribute(attribute);
+          },
+          _getAttr2: function(element, attribute) {
+            return element.getAttribute(attribute, 2);
+          },
+          _getAttrNode: function(element, attribute) {
+            var node = element.getAttributeNode(attribute);
+            return node ? node.value : "";
+          },
+          _getEv: (function(){
+
+            var el = document.createElement('div'), f;
+            el.onclick = Prototype.emptyFunction;
+            var value = el.getAttribute('onclick');
+
+            if (String(value).indexOf('{') > -1) {
+              f = function(element, attribute) {
+                attribute = element.getAttribute(attribute);
+                if (!attribute) return null;
+                attribute = attribute.toString();
+                attribute = attribute.split('{')[1];
+                attribute = attribute.split('}')[0];
+                return attribute.strip();
+              };
+            }
+            else if (value === '') {
+              f = function(element, attribute) {
+                attribute = element.getAttribute(attribute);
+                if (!attribute) return null;
+                return attribute.strip();
+              };
+            }
+            el = null;
+            return f;
+          })(),
+          _flag: function(element, attribute) {
+            return $(element).hasAttribute(attribute) ? attribute : null;
+          },
+          style: function(element) {
+            return element.style.cssText.toLowerCase();
+          },
+          title: function(element) {
+            return element.title;
+          }
+        }
+      }
+    }
+  })();
+
+  Element._attributeTranslations.write = {
+    names: Object.extend({
+      cellpadding: 'cellPadding',
+      cellspacing: 'cellSpacing'
+    }, Element._attributeTranslations.read.names),
+    values: {
+      checked: function(element, value) {
+        element.checked = !!value;
+      },
+
+      style: function(element, value) {
+        element.style.cssText = value ? value : '';
+      }
+    }
+  };
+
+  Element._attributeTranslations.has = {};
+
+  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
+      'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
+    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
+    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
+  });
+
+  (function(v) {
+    Object.extend(v, {
+      href:        v._getAttr2,
+      src:         v._getAttr2,
+      type:        v._getAttr,
+      action:      v._getAttrNode,
+      disabled:    v._flag,
+      checked:     v._flag,
+      readonly:    v._flag,
+      multiple:    v._flag,
+      onload:      v._getEv,
+      onunload:    v._getEv,
+      onclick:     v._getEv,
+      ondblclick:  v._getEv,
+      onmousedown: v._getEv,
+      onmouseup:   v._getEv,
+      onmouseover: v._getEv,
+      onmousemove: v._getEv,
+      onmouseout:  v._getEv,
+      onfocus:     v._getEv,
+      onblur:      v._getEv,
+      onkeypress:  v._getEv,
+      onkeydown:   v._getEv,
+      onkeyup:     v._getEv,
+      onsubmit:    v._getEv,
+      onreset:     v._getEv,
+      onselect:    v._getEv,
+      onchange:    v._getEv
+    });
+  })(Element._attributeTranslations.read.values);
+
+  if (Prototype.BrowserFeatures.ElementExtensions) {
+    (function() {
+      function _descendants(element) {
+        var nodes = element.getElementsByTagName('*'), results = [];
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.tagName !== "!") // Filter out comment nodes.
+            results.push(node);
+        return results;
+      }
+
+      Element.Methods.down = function(element, expression, index) {
+        element = $(element);
+        if (arguments.length == 1) return element.firstDescendant();
+        return Object.isNumber(expression) ? _descendants(element)[expression] :
+          Element.select(element, expression)[index || 0];
+      }
+    })();
+  }
+
+}
+
+else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1) ? 0.999999 :
+      (value === '') ? '' : (value < 0.00001) ? 0 : value;
+    return element;
+  };
+}
+
+else if (Prototype.Browser.WebKit) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+
+    if (value == 1)
+      if (element.tagName.toUpperCase() == 'IMG' && element.width) {
+        element.width++; element.width--;
+      } else try {
+        var n = document.createTextNode(' ');
+        element.appendChild(n);
+        element.removeChild(n);
+      } catch (e) { }
+
+    return element;
+  };
+}
+
+if ('outerHTML' in document.documentElement) {
+  Element.Methods.replace = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) {
+      element.parentNode.replaceChild(content, element);
+      return element;
+    }
+
+    content = Object.toHTML(content);
+    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
+
+    if (Element._insertionTranslations.tags[tagName]) {
+      var nextSibling = element.next(),
+          fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+      parent.removeChild(element);
+      if (nextSibling)
+        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
+      else
+        fragments.each(function(node) { parent.appendChild(node) });
+    }
+    else element.outerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+Element._returnOffset = function(l, t) {
+  var result = [l, t];
+  result.left = l;
+  result.top = t;
+  return result;
+};
+
+Element._getContentFromAnonymousElement = function(tagName, html, force) {
+  var div = new Element('div'),
+      t = Element._insertionTranslations.tags[tagName];
+
+  var workaround = false;
+  if (t) workaround = true;
+  else if (force) {
+    workaround = true;
+    t = ['', '', 0];
+  }
+
+  if (workaround) {
+    div.innerHTML = '&nbsp;' + t[0] + html + t[1];
+    div.removeChild(div.firstChild);
+    for (var i = t[2]; i--; ) {
+      div = div.firstChild;
+    }
+  }
+  else {
+    div.innerHTML = html;
+  }
+  return $A(div.childNodes);
+};
+
+Element._insertionTranslations = {
+  before: function(element, node) {
+    element.parentNode.insertBefore(node, element);
+  },
+  top: function(element, node) {
+    element.insertBefore(node, element.firstChild);
+  },
+  bottom: function(element, node) {
+    element.appendChild(node);
+  },
+  after: function(element, node) {
+    element.parentNode.insertBefore(node, element.nextSibling);
+  },
+  tags: {
+    TABLE:  ['<table>',                '</table>',                   1],
+    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
+    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
+    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
+    SELECT: ['<select>',               '</select>',                  1]
+  }
+};
+
+(function() {
+  var tags = Element._insertionTranslations.tags;
+  Object.extend(tags, {
+    THEAD: tags.TBODY,
+    TFOOT: tags.TBODY,
+    TH:    tags.TD
+  });
+})();
+
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    attribute = Element._attributeTranslations.has[attribute] || attribute;
+    var node = $(element).getAttributeNode(attribute);
+    return !!(node && node.specified);
+  }
+};
+
+Element.Methods.ByTag = { };
+
+Object.extend(Element, Element.Methods);
+
+(function(div) {
+
+  if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
+    window.HTMLElement = { };
+    window.HTMLElement.prototype = div['__proto__'];
+    Prototype.BrowserFeatures.ElementExtensions = true;
+  }
+
+  div = null;
+
+})(document.createElement('div'));
+
+Element.extend = (function() {
+
+  function checkDeficiency(tagName) {
+    if (typeof window.Element != 'undefined') {
+      var proto = window.Element.prototype;
+      if (proto) {
+        var id = '_' + (Math.random()+'').slice(2),
+            el = document.createElement(tagName);
+        proto[id] = 'x';
+        var isBuggy = (el[id] !== 'x');
+        delete proto[id];
+        el = null;
+        return isBuggy;
+      }
+    }
+    return false;
+  }
+
+  function extendElementWith(element, methods) {
+    for (var property in methods) {
+      var value = methods[property];
+      if (Object.isFunction(value) && !(property in element))
+        element[property] = value.methodize();
+    }
+  }
+
+  var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object');
+
+  if (Prototype.BrowserFeatures.SpecificElementExtensions) {
+    if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) {
+      return function(element) {
+        if (element && typeof element._extendedByPrototype == 'undefined') {
+          var t = element.tagName;
+          if (t && (/^(?:object|applet|embed)$/i.test(t))) {
+            extendElementWith(element, Element.Methods);
+            extendElementWith(element, Element.Methods.Simulated);
+            extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]);
+          }
+        }
+        return element;
+      }
+    }
+    return Prototype.K;
+  }
+
+  var Methods = { }, ByTag = Element.Methods.ByTag;
+
+  var extend = Object.extend(function(element) {
+    if (!element || typeof element._extendedByPrototype != 'undefined' ||
+        element.nodeType != 1 || element == window) return element;
+
+    var methods = Object.clone(Methods),
+        tagName = element.tagName.toUpperCase();
+
+    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
+
+    extendElementWith(element, methods);
+
+    element._extendedByPrototype = Prototype.emptyFunction;
+    return element;
+
+  }, {
+    refresh: function() {
+      if (!Prototype.BrowserFeatures.ElementExtensions) {
+        Object.extend(Methods, Element.Methods);
+        Object.extend(Methods, Element.Methods.Simulated);
+      }
+    }
+  });
+
+  extend.refresh();
+  return extend;
+})();
+
+if (document.documentElement.hasAttribute) {
+  Element.hasAttribute = function(element, attribute) {
+    return element.hasAttribute(attribute);
+  };
+}
+else {
+  Element.hasAttribute = Element.Methods.Simulated.hasAttribute;
+}
+
+Element.addMethods = function(methods) {
+  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
+
+  if (!methods) {
+    Object.extend(Form, Form.Methods);
+    Object.extend(Form.Element, Form.Element.Methods);
+    Object.extend(Element.Methods.ByTag, {
+      "FORM":     Object.clone(Form.Methods),
+      "INPUT":    Object.clone(Form.Element.Methods),
+      "SELECT":   Object.clone(Form.Element.Methods),
+      "TEXTAREA": Object.clone(Form.Element.Methods),
+      "BUTTON":   Object.clone(Form.Element.Methods)
+    });
+  }
+
+  if (arguments.length == 2) {
+    var tagName = methods;
+    methods = arguments[1];
+  }
+
+  if (!tagName) Object.extend(Element.Methods, methods || { });
+  else {
+    if (Object.isArray(tagName)) tagName.each(extend);
+    else extend(tagName);
+  }
+
+  function extend(tagName) {
+    tagName = tagName.toUpperCase();
+    if (!Element.Methods.ByTag[tagName])
+      Element.Methods.ByTag[tagName] = { };
+    Object.extend(Element.Methods.ByTag[tagName], methods);
+  }
+
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!Object.isFunction(value)) continue;
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = value.methodize();
+    }
+  }
+
+  function findDOMClass(tagName) {
+    var klass;
+    var trans = {
+      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
+      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
+      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
+      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
+      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
+      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
+      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
+      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
+      "FrameSet", "IFRAME": "IFrame"
+    };
+    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName.capitalize() + 'Element';
+    if (window[klass]) return window[klass];
+
+    var element = document.createElement(tagName),
+        proto = element['__proto__'] || element.constructor.prototype;
+
+    element = null;
+    return proto;
+  }
+
+  var elementPrototype = window.HTMLElement ? HTMLElement.prototype :
+   Element.prototype;
+
+  if (F.ElementExtensions) {
+    copy(Element.Methods, elementPrototype);
+    copy(Element.Methods.Simulated, elementPrototype, true);
+  }
+
+  if (F.SpecificElementExtensions) {
+    for (var tag in Element.Methods.ByTag) {
+      var klass = findDOMClass(tag);
+      if (Object.isUndefined(klass)) continue;
+      copy(T[tag], klass.prototype);
+    }
+  }
+
+  Object.extend(Element, Element.Methods);
+  delete Element.ByTag;
+
+  if (Element.extend.refresh) Element.extend.refresh();
+  Element.cache = { };
+};
+
+
+document.viewport = {
+
+  getDimensions: function() {
+    return { width: this.getWidth(), height: this.getHeight() };
+  },
+
+  getScrollOffsets: function() {
+    return Element._returnOffset(
+      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
+      window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop);
+  }
+};
+
+(function(viewport) {
+  var B = Prototype.Browser, doc = document, element, property = {};
+
+  function getRootElement() {
+    if (B.WebKit && !doc.evaluate)
+      return document;
+
+    if (B.Opera && window.parseFloat(window.opera.version()) < 9.5)
+      return document.body;
+
+    return document.documentElement;
+  }
+
+  function define(D) {
+    if (!element) element = getRootElement();
+
+    property[D] = 'client' + D;
+
+    viewport['get' + D] = function() { return element[property[D]] };
+    return viewport['get' + D]();
+  }
+
+  viewport.getWidth  = define.curry('Width');
+
+  viewport.getHeight = define.curry('Height');
+})(document.viewport);
+
+
+Element.Storage = {
+  UID: 1
+};
+
+Element.addMethods({
+  getStorage: function(element) {
+    if (!(element = $(element))) return;
+
+    var uid;
+    if (element === window) {
+      uid = 0;
+    } else {
+      if (typeof element._prototypeUID === "undefined")
+        element._prototypeUID = Element.Storage.UID++;
+      uid = element._prototypeUID;
+    }
+
+    if (!Element.Storage[uid])
+      Element.Storage[uid] = $H();
+
+    return Element.Storage[uid];
+  },
+
+  store: function(element, key, value) {
+    if (!(element = $(element))) return;
+
+    if (arguments.length === 2) {
+      Element.getStorage(element).update(key);
+    } else {
+      Element.getStorage(element).set(key, value);
+    }
+
+    return element;
+  },
+
+  retrieve: function(element, key, defaultValue) {
+    if (!(element = $(element))) return;
+    var hash = Element.getStorage(element), value = hash.get(key);
+
+    if (Object.isUndefined(value)) {
+      hash.set(key, defaultValue);
+      value = defaultValue;
+    }
+
+    return value;
+  },
+
+  clone: function(element, deep) {
+    if (!(element = $(element))) return;
+    var clone = element.cloneNode(deep);
+    clone._prototypeUID = void 0;
+    if (deep) {
+      var descendants = Element.select(clone, '*'),
+          i = descendants.length;
+      while (i--) {
+        descendants[i]._prototypeUID = void 0;
+      }
+    }
+    return Element.extend(clone);
+  },
+
+  purge: function(element) {
+    if (!(element = $(element))) return;
+    var purgeElement = Element._purgeElement;
+
+    purgeElement(element);
+
+    var descendants = element.getElementsByTagName('*'),
+     i = descendants.length;
+
+    while (i--) purgeElement(descendants[i]);
+
+    return null;
+  }
+});
+
+(function() {
+
+  function toDecimal(pctString) {
+    var match = pctString.match(/^(\d+)%?$/i);
+    if (!match) return null;
+    return (Number(match[1]) / 100);
+  }
+
+  function getPixelValue(value, property, context) {
+    var element = null;
+    if (Object.isElement(value)) {
+      element = value;
+      value = element.getStyle(property);
+    }
+
+    if (value === null) {
+      return null;
+    }
+
+    if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) {
+      return window.parseFloat(value);
+    }
+
+    var isPercentage = value.include('%'), isViewport = (context === document.viewport);
+
+    if (/\d/.test(value) && element && element.runtimeStyle && !(isPercentage && isViewport)) {
+      var style = element.style.left, rStyle = element.runtimeStyle.left;
+      element.runtimeStyle.left = element.currentStyle.left;
+      element.style.left = value || 0;
+      value = element.style.pixelLeft;
+      element.style.left = style;
+      element.runtimeStyle.left = rStyle;
+
+      return value;
+    }
+
+    if (element && isPercentage) {
+      context = context || element.parentNode;
+      var decimal = toDecimal(value);
+      var whole = null;
+      var position = element.getStyle('position');
+
+      var isHorizontal = property.include('left') || property.include('right') ||
+       property.include('width');
+
+      var isVertical =  property.include('top') || property.include('bottom') ||
+        property.include('height');
+
+      if (context === document.viewport) {
+        if (isHorizontal) {
+          whole = document.viewport.getWidth();
+        } else if (isVertical) {
+          whole = document.viewport.getHeight();
+        }
+      } else {
+        if (isHorizontal) {
+          whole = $(context).measure('width');
+        } else if (isVertical) {
+          whole = $(context).measure('height');
+        }
+      }
+
+      return (whole === null) ? 0 : whole * decimal;
+    }
+
+    return 0;
+  }
+
+  function toCSSPixels(number) {
+    if (Object.isString(number) && number.endsWith('px')) {
+      return number;
+    }
+    return number + 'px';
+  }
+
+  function isDisplayed(element) {
+    var originalElement = element;
+    while (element && element.parentNode) {
+      var display = element.getStyle('display');
+      if (display === 'none') {
+        return false;
+      }
+      element = $(element.parentNode);
+    }
+    return true;
+  }
+
+  var hasLayout = Prototype.K;
+  if ('currentStyle' in document.documentElement) {
+    hasLayout = function(element) {
+      if (!element.currentStyle.hasLayout) {
+        element.style.zoom = 1;
+      }
+      return element;
+    };
+  }
+
+  function cssNameFor(key) {
+    if (key.include('border')) key = key + '-width';
+    return key.camelize();
+  }
+
+  Element.Layout = Class.create(Hash, {
+    initialize: function($super, element, preCompute) {
+      $super();
+      this.element = $(element);
+
+      Element.Layout.PROPERTIES.each( function(property) {
+        this._set(property, null);
+      }, this);
+
+      if (preCompute) {
+        this._preComputing = true;
+        this._begin();
+        Element.Layout.PROPERTIES.each( this._compute, this );
+        this._end();
+        this._preComputing = false;
+      }
+    },
+
+    _set: function(property, value) {
+      return Hash.prototype.set.call(this, property, value);
+    },
+
+    set: function(property, value) {
+      throw "Properties of Element.Layout are read-only.";
+    },
+
+    get: function($super, property) {
+      var value = $super(property);
+      return value === null ? this._compute(property) : value;
+    },
+
+    _begin: function() {
+      if (this._prepared) return;
+
+      var element = this.element;
+      if (isDisplayed(element)) {
+        this._prepared = true;
+        return;
+      }
+
+      var originalStyles = {
+        position:   element.style.position   || '',
+        width:      element.style.width      || '',
+        visibility: element.style.visibility || '',
+        display:    element.style.display    || ''
+      };
+
+      element.store('prototype_original_styles', originalStyles);
+
+      var position = element.getStyle('position'),
+       width = element.getStyle('width');
+
+      if (width === "0px" || width === null) {
+        element.style.display = 'block';
+        width = element.getStyle('width');
+      }
+
+      var context = (position === 'fixed') ? document.viewport :
+       element.parentNode;
+
+      element.setStyle({
+        position:   'absolute',
+        visibility: 'hidden',
+        display:    'block'
+      });
+
+      var positionedWidth = element.getStyle('width');
+
+      var newWidth;
+      if (width && (positionedWidth === width)) {
+        newWidth = getPixelValue(element, 'width', context);
+      } else if (position === 'absolute' || position === 'fixed') {
+        newWidth = getPixelValue(element, 'width', context);
+      } else {
+        var parent = element.parentNode, pLayout = $(parent).getLayout();
+
+        newWidth = pLayout.get('width') -
+         this.get('margin-left') -
+         this.get('border-left') -
+         this.get('padding-left') -
+         this.get('padding-right') -
+         this.get('border-right') -
+         this.get('margin-right');
+      }
+
+      element.setStyle({ width: newWidth + 'px' });
+
+      this._prepared = true;
+    },
+
+    _end: function() {
+      var element = this.element;
+      var originalStyles = element.retrieve('prototype_original_styles');
+      element.store('prototype_original_styles', null);
+      element.setStyle(originalStyles);
+      this._prepared = false;
+    },
+
+    _compute: function(property) {
+      var COMPUTATIONS = Element.Layout.COMPUTATIONS;
+      if (!(property in COMPUTATIONS)) {
+        throw "Property not found.";
+      }
+
+      return this._set(property, COMPUTATIONS[property].call(this, this.element));
+    },
+
+    toObject: function() {
+      var args = $A(arguments);
+      var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
+       args.join(' ').split(' ');
+      var obj = {};
+      keys.each( function(key) {
+        if (!Element.Layout.PROPERTIES.include(key)) return;
+        var value = this.get(key);
+        if (value != null) obj[key] = value;
+      }, this);
+      return obj;
+    },
+
+    toHash: function() {
+      var obj = this.toObject.apply(this, arguments);
+      return new Hash(obj);
+    },
+
+    toCSS: function() {
+      var args = $A(arguments);
+      var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
+       args.join(' ').split(' ');
+      var css = {};
+
+      keys.each( function(key) {
+        if (!Element.Layout.PROPERTIES.include(key)) return;
+        if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return;
+
+        var value = this.get(key);
+        if (value != null) css[cssNameFor(key)] = value + 'px';
+      }, this);
+      return css;
+    },
+
+    inspect: function() {
+      return "#<Element.Layout>";
+    }
+  });
+
+  Object.extend(Element.Layout, {
+    PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'),
+
+    COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'),
+
+    COMPUTATIONS: {
+      'height': function(element) {
+        if (!this._preComputing) this._begin();
+
+        var bHeight = this.get('border-box-height');
+        if (bHeight <= 0) {
+          if (!this._preComputing) this._end();
+          return 0;
+        }
+
+        var bTop = this.get('border-top'),
+         bBottom = this.get('border-bottom');
+
+        var pTop = this.get('padding-top'),
+         pBottom = this.get('padding-bottom');
+
+        if (!this._preComputing) this._end();
+
+        return bHeight - bTop - bBottom - pTop - pBottom;
+      },
+
+      'width': function(element) {
+        if (!this._preComputing) this._begin();
+
+        var bWidth = this.get('border-box-width');
+        if (bWidth <= 0) {
+          if (!this._preComputing) this._end();
+          return 0;
+        }
+
+        var bLeft = this.get('border-left'),
+         bRight = this.get('border-right');
+
+        var pLeft = this.get('padding-left'),
+         pRight = this.get('padding-right');
+
+        if (!this._preComputing) this._end();
+
+        return bWidth - bLeft - bRight - pLeft - pRight;
+      },
+
+      'padding-box-height': function(element) {
+        var height = this.get('height'),
+         pTop = this.get('padding-top'),
+         pBottom = this.get('padding-bottom');
+
+        return height + pTop + pBottom;
+      },
+
+      'padding-box-width': function(element) {
+        var width = this.get('width'),
+         pLeft = this.get('padding-left'),
+         pRight = this.get('padding-right');
+
+        return width + pLeft + pRight;
+      },
+
+      'border-box-height': function(element) {
+        if (!this._preComputing) this._begin();
+        var height = element.offsetHeight;
+        if (!this._preComputing) this._end();
+        return height;
+      },
+
+      'border-box-width': function(element) {
+        if (!this._preComputing) this._begin();
+        var width = element.offsetWidth;
+        if (!this._preComputing) this._end();
+        return width;
+      },
+
+      'margin-box-height': function(element) {
+        var bHeight = this.get('border-box-height'),
+         mTop = this.get('margin-top'),
+         mBottom = this.get('margin-bottom');
+
+        if (bHeight <= 0) return 0;
+
+        return bHeight + mTop + mBottom;
+      },
+
+      'margin-box-width': function(element) {
+        var bWidth = this.get('border-box-width'),
+         mLeft = this.get('margin-left'),
+         mRight = this.get('margin-right');
+
+        if (bWidth <= 0) return 0;
+
+        return bWidth + mLeft + mRight;
+      },
+
+      'top': function(element) {
+        var offset = element.positionedOffset();
+        return offset.top;
+      },
+
+      'bottom': function(element) {
+        var offset = element.positionedOffset(),
+         parent = element.getOffsetParent(),
+         pHeight = parent.measure('height');
+
+        var mHeight = this.get('border-box-height');
+
+        return pHeight - mHeight - offset.top;
+      },
+
+      'left': function(element) {
+        var offset = element.positionedOffset();
+        return offset.left;
+      },
+
+      'right': function(element) {
+        var offset = element.positionedOffset(),
+         parent = element.getOffsetParent(),
+         pWidth = parent.measure('width');
+
+        var mWidth = this.get('border-box-width');
+
+        return pWidth - mWidth - offset.left;
+      },
+
+      'padding-top': function(element) {
+        return getPixelValue(element, 'paddingTop');
+      },
+
+      'padding-bottom': function(element) {
+        return getPixelValue(element, 'paddingBottom');
+      },
+
+      'padding-left': function(element) {
+        return getPixelValue(element, 'paddingLeft');
+      },
+
+      'padding-right': function(element) {
+        return getPixelValue(element, 'paddingRight');
+      },
+
+      'border-top': function(element) {
+        return getPixelValue(element, 'borderTopWidth');
+      },
+
+      'border-bottom': function(element) {
+        return getPixelValue(element, 'borderBottomWidth');
+      },
+
+      'border-left': function(element) {
+        return getPixelValue(element, 'borderLeftWidth');
+      },
+
+      'border-right': function(element) {
+        return getPixelValue(element, 'borderRightWidth');
+      },
+
+      'margin-top': function(element) {
+        return getPixelValue(element, 'marginTop');
+      },
+
+      'margin-bottom': function(element) {
+        return getPixelValue(element, 'marginBottom');
+      },
+
+      'margin-left': function(element) {
+        return getPixelValue(element, 'marginLeft');
+      },
+
+      'margin-right': function(element) {
+        return getPixelValue(element, 'marginRight');
+      }
+    }
+  });
+
+  if ('getBoundingClientRect' in document.documentElement) {
+    Object.extend(Element.Layout.COMPUTATIONS, {
+      'right': function(element) {
+        var parent = hasLayout(element.getOffsetParent());
+        var rect = element.getBoundingClientRect(),
+         pRect = parent.getBoundingClientRect();
+
+        return (pRect.right - rect.right).round();
+      },
+
+      'bottom': function(element) {
+        var parent = hasLayout(element.getOffsetParent());
+        var rect = element.getBoundingClientRect(),
+         pRect = parent.getBoundingClientRect();
+
+        return (pRect.bottom - rect.bottom).round();
+      }
+    });
+  }
+
+  Element.Offset = Class.create({
+    initialize: function(left, top) {
+      this.left = left.round();
+      this.top  = top.round();
+
+      this[0] = this.left;
+      this[1] = this.top;
+    },
+
+    relativeTo: function(offset) {
+      return new Element.Offset(
+        this.left - offset.left,
+        this.top  - offset.top
+      );
+    },
+
+    inspect: function() {
+      return "#<Element.Offset left: #{left} top: #{top}>".interpolate(this);
+    },
+
+    toString: function() {
+      return "[#{left}, #{top}]".interpolate(this);
+    },
+
+    toArray: function() {
+      return [this.left, this.top];
+    }
+  });
+
+  function getLayout(element, preCompute) {
+    return new Element.Layout(element, preCompute);
+  }
+
+  function measure(element, property) {
+    return $(element).getLayout().get(property);
+  }
+
+  function getDimensions(element) {
+    element = $(element);
+    var display = Element.getStyle(element, 'display');
+
+    if (display && display !== 'none') {
+      return { width: element.offsetWidth, height: element.offsetHeight };
+    }
+
+    var style = element.style;
+    var originalStyles = {
+      visibility: style.visibility,
+      position:   style.position,
+      display:    style.display
+    };
+
+    var newStyles = {
+      visibility: 'hidden',
+      display:    'block'
+    };
+
+    if (originalStyles.position !== 'fixed')
+      newStyles.position = 'absolute';
+
+    Element.setStyle(element, newStyles);
+
+    var dimensions = {
+      width:  element.offsetWidth,
+      height: element.offsetHeight
+    };
+
+    Element.setStyle(element, originalStyles);
+
+    return dimensions;
+  }
+
+  function getOffsetParent(element) {
+    element = $(element);
+
+    if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
+      return $(document.body);
+
+    var isInline = (Element.getStyle(element, 'display') === 'inline');
+    if (!isInline && element.offsetParent) return $(element.offsetParent);
+
+    while ((element = element.parentNode) && element !== document.body) {
+      if (Element.getStyle(element, 'position') !== 'static') {
+        return isHtml(element) ? $(document.body) : $(element);
+      }
+    }
+
+    return $(document.body);
+  }
+
+
+  function cumulativeOffset(element) {
+    element = $(element);
+    var valueT = 0, valueL = 0;
+    if (element.parentNode) {
+      do {
+        valueT += element.offsetTop  || 0;
+        valueL += element.offsetLeft || 0;
+        element = element.offsetParent;
+      } while (element);
+    }
+    return new Element.Offset(valueL, valueT);
+  }
+
+  function positionedOffset(element) {
+    element = $(element);
+
+    var layout = element.getLayout();
+
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        if (isBody(element)) break;
+        var p = Element.getStyle(element, 'position');
+        if (p !== 'static') break;
+      }
+    } while (element);
+
+    valueL -= layout.get('margin-top');
+    valueT -= layout.get('margin-left');
+
+    return new Element.Offset(valueL, valueT);
+  }
+
+  function cumulativeScrollOffset(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return new Element.Offset(valueL, valueT);
+  }
+
+  function viewportOffset(forElement) {
+    element = $(element);
+    var valueT = 0, valueL = 0, docBody = document.body;
+
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == docBody &&
+        Element.getStyle(element, 'position') == 'absolute') break;
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (element != docBody) {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+      }
+    } while (element = element.parentNode);
+    return new Element.Offset(valueL, valueT);
+  }
+
+  function absolutize(element) {
+    element = $(element);
+
+    if (Element.getStyle(element, 'position') === 'absolute') {
+      return element;
+    }
+
+    var offsetParent = getOffsetParent(element);
+    var eOffset = element.viewportOffset(),
+     pOffset = offsetParent.viewportOffset();
+
+    var offset = eOffset.relativeTo(pOffset);
+    var layout = element.getLayout();
+
+    element.store('prototype_absolutize_original_styles', {
+      left:   element.getStyle('left'),
+      top:    element.getStyle('top'),
+      width:  element.getStyle('width'),
+      height: element.getStyle('height')
+    });
+
+    element.setStyle({
+      position: 'absolute',
+      top:    offset.top + 'px',
+      left:   offset.left + 'px',
+      width:  layout.get('width') + 'px',
+      height: layout.get('height') + 'px'
+    });
+
+    return element;
+  }
+
+  function relativize(element) {
+    element = $(element);
+    if (Element.getStyle(element, 'position') === 'relative') {
+      return element;
+    }
+
+    var originalStyles =
+     element.retrieve('prototype_absolutize_original_styles');
+
+    if (originalStyles) element.setStyle(originalStyles);
+    return element;
+  }
+
+  if (Prototype.Browser.IE) {
+    getOffsetParent = getOffsetParent.wrap(
+      function(proceed, element) {
+        element = $(element);
+
+        if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
+          return $(document.body);
+
+        var position = element.getStyle('position');
+        if (position !== 'static') return proceed(element);
+
+        element.setStyle({ position: 'relative' });
+        var value = proceed(element);
+        element.setStyle({ position: position });
+        return value;
+      }
+    );
+
+    positionedOffset = positionedOffset.wrap(function(proceed, element) {
+      element = $(element);
+      if (!element.parentNode) return new Element.Offset(0, 0);
+      var position = element.getStyle('position');
+      if (position !== 'static') return proceed(element);
+
+      var offsetParent = element.getOffsetParent();
+      if (offsetParent && offsetParent.getStyle('position') === 'fixed')
+        hasLayout(offsetParent);
+
+      element.setStyle({ position: 'relative' });
+      var value = proceed(element);
+      element.setStyle({ position: position });
+      return value;
+    });
+  } else if (Prototype.Browser.Webkit) {
+    cumulativeOffset = function(element) {
+      element = $(element);
+      var valueT = 0, valueL = 0;
+      do {
+        valueT += element.offsetTop  || 0;
+        valueL += element.offsetLeft || 0;
+        if (element.offsetParent == document.body)
+          if (Element.getStyle(element, 'position') == 'absolute') break;
+
+        element = element.offsetParent;
+      } while (element);
+
+      return new Element.Offset(valueL, valueT);
+    };
+  }
+
+
+  Element.addMethods({
+    getLayout:              getLayout,
+    measure:                measure,
+    getDimensions:          getDimensions,
+    getOffsetParent:        getOffsetParent,
+    cumulativeOffset:       cumulativeOffset,
+    positionedOffset:       positionedOffset,
+    cumulativeScrollOffset: cumulativeScrollOffset,
+    viewportOffset:         viewportOffset,
+    absolutize:             absolutize,
+    relativize:             relativize
+  });
+
+  function isBody(element) {
+    return element.nodeName.toUpperCase() === 'BODY';
+  }
+
+  function isHtml(element) {
+    return element.nodeName.toUpperCase() === 'HTML';
+  }
+
+  function isDocument(element) {
+    return element.nodeType === Node.DOCUMENT_NODE;
+  }
+
+  function isDetached(element) {
+    return element !== document.body &&
+     !Element.descendantOf(element, document.body);
+  }
+
+  if ('getBoundingClientRect' in document.documentElement) {
+    Element.addMethods({
+      viewportOffset: function(element) {
+        element = $(element);
+        if (isDetached(element)) return new Element.Offset(0, 0);
+
+        var rect = element.getBoundingClientRect(),
+         docEl = document.documentElement;
+        return new Element.Offset(rect.left - docEl.clientLeft,
+         rect.top - docEl.clientTop);
+      }
+    });
+  }
+})();
+window.$$ = function() {
+  var expression = $A(arguments).join(', ');
+  return Prototype.Selector.select(expression, document);
+};
+
+Prototype.Selector = (function() {
+
+  function select() {
+    throw new Error('Method "Prototype.Selector.select" must be defined.');
+  }
+
+  function match() {
+    throw new Error('Method "Prototype.Selector.match" must be defined.');
+  }
+
+  function find(elements, expression, index) {
+    index = index || 0;
+    var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i;
+
+    for (i = 0; i < length; i++) {
+      if (match(elements[i], expression) && index == matchIndex++) {
+        return Element.extend(elements[i]);
+      }
+    }
+  }
+
+  function extendElements(elements) {
+    for (var i = 0, length = elements.length; i < length; i++) {
+      Element.extend(elements[i]);
+    }
+    return elements;
+  }
+
+
+  var K = Prototype.K;
+
+  return {
+    select: select,
+    match: match,
+    find: find,
+    extendElements: (Element.extend === K) ? K : extendElements,
+    extendElement: Element.extend
+  };
+})();
+/*!
+ * Sizzle CSS Selector Engine - v1.0
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+       done = 0,
+       toString = Object.prototype.toString,
+       hasDuplicate = false,
+       baseHasDuplicate = true;
+
+[0, 0].sort(function(){
+       baseHasDuplicate = false;
+       return 0;
+});
+
+var Sizzle = function(selector, context, results, seed) {
+       results = results || [];
+       var origContext = context = context || document;
+
+       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+               return [];
+       }
+
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context),
+               soFar = selector;
+
+       while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
+               soFar = m[3];
+
+               parts.push( m[1] );
+
+               if ( m[2] ) {
+                       extra = m[3];
+                       break;
+               }
+       }
+
+       if ( parts.length > 1 && origPOS.exec( selector ) ) {
+               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+                       set = posProcess( parts[0] + parts[1], context );
+               } else {
+                       set = Expr.relative[ parts[0] ] ?
+                               [ context ] :
+                               Sizzle( parts.shift(), context );
+
+                       while ( parts.length ) {
+                               selector = parts.shift();
+
+                               if ( Expr.relative[ selector ] )
+                                       selector += parts.shift();
+
+                               set = posProcess( selector, set );
+                       }
+               }
+       } else {
+               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+                               Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+                       var ret = Sizzle.find( parts.shift(), context, contextXML );
+                       context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
+               }
+
+               if ( context ) {
+                       var ret = seed ?
+                               { expr: parts.pop(), set: makeArray(seed) } :
+                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+                       set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
+
+                       if ( parts.length > 0 ) {
+                               checkSet = makeArray(set);
+                       } else {
+                               prune = false;
+                       }
+
+                       while ( parts.length ) {
+                               var cur = parts.pop(), pop = cur;
+
+                               if ( !Expr.relative[ cur ] ) {
+                                       cur = "";
+                               } else {
+                                       pop = parts.pop();
+                               }
+
+                               if ( pop == null ) {
+                                       pop = context;
+                               }
+
+                               Expr.relative[ cur ]( checkSet, pop, contextXML );
+                       }
+               } else {
+                       checkSet = parts = [];
+               }
+       }
+
+       if ( !checkSet ) {
+               checkSet = set;
+       }
+
+       if ( !checkSet ) {
+               throw "Syntax error, unrecognized expression: " + (cur || selector);
+       }
+
+       if ( toString.call(checkSet) === "[object Array]" ) {
+               if ( !prune ) {
+                       results.push.apply( results, checkSet );
+               } else if ( context && context.nodeType === 1 ) {
+                       for ( var i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
+                                       results.push( set[i] );
+                               }
+                       }
+               } else {
+                       for ( var i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+                                       results.push( set[i] );
+                               }
+                       }
+               }
+       } else {
+               makeArray( checkSet, results );
+       }
+
+       if ( extra ) {
+               Sizzle( extra, origContext, results, seed );
+               Sizzle.uniqueSort( results );
+       }
+
+       return results;
+};
+
+Sizzle.uniqueSort = function(results){
+       if ( sortOrder ) {
+               hasDuplicate = baseHasDuplicate;
+               results.sort(sortOrder);
+
+               if ( hasDuplicate ) {
+                       for ( var i = 1; i < results.length; i++ ) {
+                               if ( results[i] === results[i-1] ) {
+                                       results.splice(i--, 1);
+                               }
+                       }
+               }
+       }
+
+       return results;
+};
+
+Sizzle.matches = function(expr, set){
+       return Sizzle(expr, null, null, set);
+};
+
+Sizzle.find = function(expr, context, isXML){
+       var set, match;
+
+       if ( !expr ) {
+               return [];
+       }
+
+       for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+               var type = Expr.order[i], match;
+
+               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+                       var left = match[1];
+                       match.splice(1,1);
+
+                       if ( left.substr( left.length - 1 ) !== "\\" ) {
+                               match[1] = (match[1] || "").replace(/\\/g, "");
+                               set = Expr.find[ type ]( match, context, isXML );
+                               if ( set != null ) {
+                                       expr = expr.replace( Expr.match[ type ], "" );
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       if ( !set ) {
+               set = context.getElementsByTagName("*");
+       }
+
+       return {set: set, expr: expr};
+};
+
+Sizzle.filter = function(expr, set, inplace, not){
+       var old = expr, result = [], curLoop = set, match, anyFound,
+               isXMLFilter = set && set[0] && isXML(set[0]);
+
+       while ( expr && set.length ) {
+               for ( var type in Expr.filter ) {
+                       if ( (match = Expr.match[ type ].exec( expr )) != null ) {
+                               var filter = Expr.filter[ type ], found, item;
+                               anyFound = false;
+
+                               if ( curLoop == result ) {
+                                       result = [];
+                               }
+
+                               if ( Expr.preFilter[ type ] ) {
+                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+                                       if ( !match ) {
+                                               anyFound = found = true;
+                                       } else if ( match === true ) {
+                                               continue;
+                                       }
+                               }
+
+                               if ( match ) {
+                                       for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+                                               if ( item ) {
+                                                       found = filter( item, match, i, curLoop );
+                                                       var pass = not ^ !!found;
+
+                                                       if ( inplace && found != null ) {
+                                                               if ( pass ) {
+                                                                       anyFound = true;
+                                                               } else {
+                                                                       curLoop[i] = false;
+                                                               }
+                                                       } else if ( pass ) {
+                                                               result.push( item );
+                                                               anyFound = true;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               if ( found !== undefined ) {
+                                       if ( !inplace ) {
+                                               curLoop = result;
+                                       }
+
+                                       expr = expr.replace( Expr.match[ type ], "" );
+
+                                       if ( !anyFound ) {
+                                               return [];
+                                       }
+
+                                       break;
+                               }
+                       }
+               }
+
+               if ( expr == old ) {
+                       if ( anyFound == null ) {
+                               throw "Syntax error, unrecognized expression: " + expr;
+                       } else {
+                               break;
+                       }
+               }
+
+               old = expr;
+       }
+
+       return curLoop;
+};
+
+var Expr = Sizzle.selectors = {
+       order: [ "ID", "NAME", "TAG" ],
+       match: {
+               ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+               CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
+               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
+               TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
+               CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
+               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
+               PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
+       },
+       leftMatch: {},
+       attrMap: {
+               "class": "className",
+               "for": "htmlFor"
+       },
+       attrHandle: {
+               href: function(elem){
+                       return elem.getAttribute("href");
+               }
+       },
+       relative: {
+               "+": function(checkSet, part, isXML){
+                       var isPartStr = typeof part === "string",
+                               isTag = isPartStr && !/\W/.test(part),
+                               isPartStrNotTag = isPartStr && !isTag;
+
+                       if ( isTag && !isXML ) {
+                               part = part.toUpperCase();
+                       }
+
+                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+                               if ( (elem = checkSet[i]) ) {
+                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
+                                               elem || false :
+                                               elem === part;
+                               }
+                       }
+
+                       if ( isPartStrNotTag ) {
+                               Sizzle.filter( part, checkSet, true );
+                       }
+               },
+               ">": function(checkSet, part, isXML){
+                       var isPartStr = typeof part === "string";
+
+                       if ( isPartStr && !/\W/.test(part) ) {
+                               part = isXML ? part : part.toUpperCase();
+
+                               for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+                                       var elem = checkSet[i];
+                                       if ( elem ) {
+                                               var parent = elem.parentNode;
+                                               checkSet[i] = parent.nodeName === part ? parent : false;
+                                       }
+                               }
+                       } else {
+                               for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+                                       var elem = checkSet[i];
+                                       if ( elem ) {
+                                               checkSet[i] = isPartStr ?
+                                                       elem.parentNode :
+                                                       elem.parentNode === part;
+                                       }
+                               }
+
+                               if ( isPartStr ) {
+                                       Sizzle.filter( part, checkSet, true );
+                               }
+                       }
+               },
+               "": function(checkSet, part, isXML){
+                       var doneName = done++, checkFn = dirCheck;
+
+                       if ( !/\W/.test(part) ) {
+                               var nodeCheck = part = isXML ? part : part.toUpperCase();
+                               checkFn = dirNodeCheck;
+                       }
+
+                       checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
+               },
+               "~": function(checkSet, part, isXML){
+                       var doneName = done++, checkFn = dirCheck;
+
+                       if ( typeof part === "string" && !/\W/.test(part) ) {
+                               var nodeCheck = part = isXML ? part : part.toUpperCase();
+                               checkFn = dirNodeCheck;
+                       }
+
+                       checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
+               }
+       },
+       find: {
+               ID: function(match, context, isXML){
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
+                               return m ? [m] : [];
+                       }
+               },
+               NAME: function(match, context, isXML){
+                       if ( typeof context.getElementsByName !== "undefined" ) {
+                               var ret = [], results = context.getElementsByName(match[1]);
+
+                               for ( var i = 0, l = results.length; i < l; i++ ) {
+                                       if ( results[i].getAttribute("name") === match[1] ) {
+                                               ret.push( results[i] );
+                                       }
+                               }
+
+                               return ret.length === 0 ? null : ret;
+                       }
+               },
+               TAG: function(match, context){
+                       return context.getElementsByTagName(match[1]);
+               }
+       },
+       preFilter: {
+               CLASS: function(match, curLoop, inplace, result, not, isXML){
+                       match = " " + match[1].replace(/\\/g, "") + " ";
+
+                       if ( isXML ) {
+                               return match;
+                       }
+
+                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+                               if ( elem ) {
+                                       if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
+                                               if ( !inplace )
+                                                       result.push( elem );
+                                       } else if ( inplace ) {
+                                               curLoop[i] = false;
+                                       }
+                               }
+                       }
+
+                       return false;
+               },
+               ID: function(match){
+                       return match[1].replace(/\\/g, "");
+               },
+               TAG: function(match, curLoop){
+                       for ( var i = 0; curLoop[i] === false; i++ ){}
+                       return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
+               },
+               CHILD: function(match){
+                       if ( match[1] == "nth" ) {
+                               var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+                                       match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
+                                       !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+                               match[2] = (test[1] + (test[2] || 1)) - 0;
+                               match[3] = test[3] - 0;
+                       }
+
+                       match[0] = done++;
+
+                       return match;
+               },
+               ATTR: function(match, curLoop, inplace, result, not, isXML){
+                       var name = match[1].replace(/\\/g, "");
+
+                       if ( !isXML && Expr.attrMap[name] ) {
+                               match[1] = Expr.attrMap[name];
+                       }
+
+                       if ( match[2] === "~=" ) {
+                               match[4] = " " + match[4] + " ";
+                       }
+
+                       return match;
+               },
+               PSEUDO: function(match, curLoop, inplace, result, not){
+                       if ( match[1] === "not" ) {
+                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+                                       match[3] = Sizzle(match[3], null, null, curLoop);
+                               } else {
+                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+                                       if ( !inplace ) {
+                                               result.push.apply( result, ret );
+                                       }
+                                       return false;
+                               }
+                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+                               return true;
+                       }
+
+                       return match;
+               },
+               POS: function(match){
+                       match.unshift( true );
+                       return match;
+               }
+       },
+       filters: {
+               enabled: function(elem){
+                       return elem.disabled === false && elem.type !== "hidden";
+               },
+               disabled: function(elem){
+                       return elem.disabled === true;
+               },
+               checked: function(elem){
+                       return elem.checked === true;
+               },
+               selected: function(elem){
+                       elem.parentNode.selectedIndex;
+                       return elem.selected === true;
+               },
+               parent: function(elem){
+                       return !!elem.firstChild;
+               },
+               empty: function(elem){
+                       return !elem.firstChild;
+               },
+               has: function(elem, i, match){
+                       return !!Sizzle( match[3], elem ).length;
+               },
+               header: function(elem){
+                       return /h\d/i.test( elem.nodeName );
+               },
+               text: function(elem){
+                       return "text" === elem.type;
+               },
+               radio: function(elem){
+                       return "radio" === elem.type;
+               },
+               checkbox: function(elem){
+                       return "checkbox" === elem.type;
+               },
+               file: function(elem){
+                       return "file" === elem.type;
+               },
+               password: function(elem){
+                       return "password" === elem.type;
+               },
+               submit: function(elem){
+                       return "submit" === elem.type;
+               },
+               image: function(elem){
+                       return "image" === elem.type;
+               },
+               reset: function(elem){
+                       return "reset" === elem.type;
+               },
+               button: function(elem){
+                       return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
+               },
+               input: function(elem){
+                       return /input|select|textarea|button/i.test(elem.nodeName);
+               }
+       },
+       setFilters: {
+               first: function(elem, i){
+                       return i === 0;
+               },
+               last: function(elem, i, match, array){
+                       return i === array.length - 1;
+               },
+               even: function(elem, i){
+                       return i % 2 === 0;
+               },
+               odd: function(elem, i){
+                       return i % 2 === 1;
+               },
+               lt: function(elem, i, match){
+                       return i < match[3] - 0;
+               },
+               gt: function(elem, i, match){
+                       return i > match[3] - 0;
+               },
+               nth: function(elem, i, match){
+                       return match[3] - 0 == i;
+               },
+               eq: function(elem, i, match){
+                       return match[3] - 0 == i;
+               }
+       },
+       filter: {
+               PSEUDO: function(elem, match, i, array){
+                       var name = match[1], filter = Expr.filters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+                       } else if ( name === "contains" ) {
+                               return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
+                       } else if ( name === "not" ) {
+                               var not = match[3];
+
+                               for ( var i = 0, l = not.length; i < l; i++ ) {
+                                       if ( not[i] === elem ) {
+                                               return false;
+                                       }
+                               }
+
+                               return true;
+                       }
+               },
+               CHILD: function(elem, match){
+                       var type = match[1], node = elem;
+                       switch (type) {
+                               case 'only':
+                               case 'first':
+                                       while ( (node = node.previousSibling) )  {
+                                               if ( node.nodeType === 1 ) return false;
+                                       }
+                                       if ( type == 'first') return true;
+                                       node = elem;
+                               case 'last':
+                                       while ( (node = node.nextSibling) )  {
+                                               if ( node.nodeType === 1 ) return false;
+                                       }
+                                       return true;
+                               case 'nth':
+                                       var first = match[2], last = match[3];
+
+                                       if ( first == 1 && last == 0 ) {
+                                               return true;
+                                       }
+
+                                       var doneName = match[0],
+                                               parent = elem.parentNode;
+
+                                       if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+                                               var count = 0;
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
+                                                       if ( node.nodeType === 1 ) {
+                                                               node.nodeIndex = ++count;
+                                                       }
+                                               }
+                                               parent.sizcache = doneName;
+                                       }
+
+                                       var diff = elem.nodeIndex - last;
+                                       if ( first == 0 ) {
+                                               return diff == 0;
+                                       } else {
+                                               return ( diff % first == 0 && diff / first >= 0 );
+                                       }
+                       }
+               },
+               ID: function(elem, match){
+                       return elem.nodeType === 1 && elem.getAttribute("id") === match;
+               },
+               TAG: function(elem, match){
+                       return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
+               },
+               CLASS: function(elem, match){
+                       return (" " + (elem.className || elem.getAttribute("class")) + " ")
+                               .indexOf( match ) > -1;
+               },
+               ATTR: function(elem, match){
+                       var name = match[1],
+                               result = Expr.attrHandle[ name ] ?
+                                       Expr.attrHandle[ name ]( elem ) :
+                                       elem[ name ] != null ?
+                                               elem[ name ] :
+                                               elem.getAttribute( name ),
+                               value = result + "",
+                               type = match[2],
+                               check = match[4];
+
+                       return result == null ?
+                               type === "!=" :
+                               type === "=" ?
+                               value === check :
+                               type === "*=" ?
+                               value.indexOf(check) >= 0 :
+                               type === "~=" ?
+                               (" " + value + " ").indexOf(check) >= 0 :
+                               !check ?
+                               value && result !== false :
+                               type === "!=" ?
+                               value != check :
+                               type === "^=" ?
+                               value.indexOf(check) === 0 :
+                               type === "$=" ?
+                               value.substr(value.length - check.length) === check :
+                               type === "|=" ?
+                               value === check || value.substr(0, check.length + 1) === check + "-" :
+                               false;
+               },
+               POS: function(elem, match, i, array){
+                       var name = match[2], filter = Expr.setFilters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+                       }
+               }
+       }
+};
+
+var origPOS = Expr.match.POS;
+
+for ( var type in Expr.match ) {
+       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source );
+}
+
+var makeArray = function(array, results) {
+       array = Array.prototype.slice.call( array, 0 );
+
+       if ( results ) {
+               results.push.apply( results, array );
+               return results;
+       }
+
+       return array;
+};
+
+try {
+       Array.prototype.slice.call( document.documentElement.childNodes, 0 );
+
+} catch(e){
+       makeArray = function(array, results) {
+               var ret = results || [];
+
+               if ( toString.call(array) === "[object Array]" ) {
+                       Array.prototype.push.apply( ret, array );
+               } else {
+                       if ( typeof array.length === "number" ) {
+                               for ( var i = 0, l = array.length; i < l; i++ ) {
+                                       ret.push( array[i] );
+                               }
+                       } else {
+                               for ( var i = 0; array[i]; i++ ) {
+                                       ret.push( array[i] );
+                               }
+                       }
+               }
+
+               return ret;
+       };
+}
+
+var sortOrder;
+
+if ( document.documentElement.compareDocumentPosition ) {
+       sortOrder = function( a, b ) {
+               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+                       if ( a == b ) {
+                               hasDuplicate = true;
+                       }
+                       return 0;
+               }
+
+               var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
+               if ( ret === 0 ) {
+                       hasDuplicate = true;
+               }
+               return ret;
+       };
+} else if ( "sourceIndex" in document.documentElement ) {
+       sortOrder = function( a, b ) {
+               if ( !a.sourceIndex || !b.sourceIndex ) {
+                       if ( a == b ) {
+                               hasDuplicate = true;
+                       }
+                       return 0;
+               }
+
+               var ret = a.sourceIndex - b.sourceIndex;
+               if ( ret === 0 ) {
+                       hasDuplicate = true;
+               }
+               return ret;
+       };
+} else if ( document.createRange ) {
+       sortOrder = function( a, b ) {
+               if ( !a.ownerDocument || !b.ownerDocument ) {
+                       if ( a == b ) {
+                               hasDuplicate = true;
+                       }
+                       return 0;
+               }
+
+               var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
+               aRange.setStart(a, 0);
+               aRange.setEnd(a, 0);
+               bRange.setStart(b, 0);
+               bRange.setEnd(b, 0);
+               var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
+               if ( ret === 0 ) {
+                       hasDuplicate = true;
+               }
+               return ret;
+       };
+}
+
+(function(){
+       var form = document.createElement("div"),
+               id = "script" + (new Date).getTime();
+       form.innerHTML = "<a name='" + id + "'/>";
+
+       var root = document.documentElement;
+       root.insertBefore( form, root.firstChild );
+
+       if ( !!document.getElementById( id ) ) {
+               Expr.find.ID = function(match, context, isXML){
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
+                               return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
+                       }
+               };
+
+               Expr.filter.ID = function(elem, match){
+                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+                       return elem.nodeType === 1 && node && node.nodeValue === match;
+               };
+       }
+
+       root.removeChild( form );
+       root = form = null; // release memory in IE
+})();
+
+(function(){
+
+       var div = document.createElement("div");
+       div.appendChild( document.createComment("") );
+
+       if ( div.getElementsByTagName("*").length > 0 ) {
+               Expr.find.TAG = function(match, context){
+                       var results = context.getElementsByTagName(match[1]);
+
+                       if ( match[1] === "*" ) {
+                               var tmp = [];
+
+                               for ( var i = 0; results[i]; i++ ) {
+                                       if ( results[i].nodeType === 1 ) {
+                                               tmp.push( results[i] );
+                                       }
+                               }
+
+                               results = tmp;
+                       }
+
+                       return results;
+               };
+       }
+
+       div.innerHTML = "<a href='#'></a>";
+       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+                       div.firstChild.getAttribute("href") !== "#" ) {
+               Expr.attrHandle.href = function(elem){
+                       return elem.getAttribute("href", 2);
+               };
+       }
+
+       div = null; // release memory in IE
+})();
+
+if ( document.querySelectorAll ) (function(){
+       var oldSizzle = Sizzle, div = document.createElement("div");
+       div.innerHTML = "<p class='TEST'></p>";
+
+       if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+               return;
+       }
+
+       Sizzle = function(query, context, extra, seed){
+               context = context || document;
+
+               if ( !seed && context.nodeType === 9 && !isXML(context) ) {
+                       try {
+                               return makeArray( context.querySelectorAll(query), extra );
+                       } catch(e){}
+               }
+
+               return oldSizzle(query, context, extra, seed);
+       };
+
+       for ( var prop in oldSizzle ) {
+               Sizzle[ prop ] = oldSizzle[ prop ];
+       }
+
+       div = null; // release memory in IE
+})();
+
+if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
+       var div = document.createElement("div");
+       div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+       if ( div.getElementsByClassName("e").length === 0 )
+               return;
+
+       div.lastChild.className = "e";
+
+       if ( div.getElementsByClassName("e").length === 1 )
+               return;
+
+       Expr.order.splice(1, 0, "CLASS");
+       Expr.find.CLASS = function(match, context, isXML) {
+               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+                       return context.getElementsByClassName(match[1]);
+               }
+       };
+
+       div = null; // release memory in IE
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       var sibDir = dir == "previousSibling" && !isXML;
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
+               if ( elem ) {
+                       if ( sibDir && elem.nodeType === 1 ){
+                               elem.sizcache = doneName;
+                               elem.sizset = i;
+                       }
+                       elem = elem[dir];
+                       var match = false;
+
+                       while ( elem ) {
+                               if ( elem.sizcache === doneName ) {
+                                       match = checkSet[elem.sizset];
+                                       break;
+                               }
+
+                               if ( elem.nodeType === 1 && !isXML ){
+                                       elem.sizcache = doneName;
+                                       elem.sizset = i;
+                               }
+
+                               if ( elem.nodeName === cur ) {
+                                       match = elem;
+                                       break;
+                               }
+
+                               elem = elem[dir];
+                       }
+
+                       checkSet[i] = match;
+               }
+       }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       var sibDir = dir == "previousSibling" && !isXML;
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
+               if ( elem ) {
+                       if ( sibDir && elem.nodeType === 1 ) {
+                               elem.sizcache = doneName;
+                               elem.sizset = i;
+                       }
+                       elem = elem[dir];
+                       var match = false;
+
+                       while ( elem ) {
+                               if ( elem.sizcache === doneName ) {
+                                       match = checkSet[elem.sizset];
+                                       break;
+                               }
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !isXML ) {
+                                               elem.sizcache = doneName;
+                                               elem.sizset = i;
+                                       }
+                                       if ( typeof cur !== "string" ) {
+                                               if ( elem === cur ) {
+                                                       match = true;
+                                                       break;
+                                               }
+
+                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+                                               match = elem;
+                                               break;
+                                       }
+                               }
+
+                               elem = elem[dir];
+                       }
+
+                       checkSet[i] = match;
+               }
+       }
+}
+
+var contains = document.compareDocumentPosition ?  function(a, b){
+       return a.compareDocumentPosition(b) & 16;
+} : function(a, b){
+       return a !== b && (a.contains ? a.contains(b) : true);
+};
+
+var isXML = function(elem){
+       return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
+               !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";
+};
+
+var posProcess = function(selector, context){
+       var tmpSet = [], later = "", match,
+               root = context.nodeType ? [context] : context;
+
+       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+               later += match[0];
+               selector = selector.replace( Expr.match.PSEUDO, "" );
+       }
+
+       selector = Expr.relative[selector] ? selector + "*" : selector;
+
+       for ( var i = 0, l = root.length; i < l; i++ ) {
+               Sizzle( selector, root[i], tmpSet );
+       }
+
+       return Sizzle.filter( later, tmpSet );
+};
+
+
+window.Sizzle = Sizzle;
+
+})();
+
+Prototype._original_property = window.Sizzle;
+
+;(function(engine) {
+  var extendElements = Prototype.Selector.extendElements;
+
+  function select(selector, scope) {
+    return extendElements(engine(selector, scope || document));
+  }
+
+  function match(element, selector) {
+    return engine.matches(selector, [element]).length == 1;
+  }
+
+  Prototype.Selector.engine = engine;
+  Prototype.Selector.select = select;
+  Prototype.Selector.match = match;
+})(Sizzle);
+
+window.Sizzle = Prototype._original_property;
+delete Prototype._original_property;
+
+var Form = {
+  reset: function(form) {
+    form = $(form);
+    form.reset();
+    return form;
+  },
+
+  serializeElements: function(elements, options) {
+    if (typeof options != 'object') options = { hash: !!options };
+    else if (Object.isUndefined(options.hash)) options.hash = true;
+    var key, value, submitted = false, submit = options.submit, accumulator, initial;
+
+    if (options.hash) {
+      initial = {};
+      accumulator = function(result, key, value) {
+        if (key in result) {
+          if (!Object.isArray(result[key])) result[key] = [result[key]];
+          result[key].push(value);
+        } else result[key] = value;
+        return result;
+      };
+    } else {
+      initial = '';
+      accumulator = function(result, key, value) {
+        return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value);
+      }
+    }
+
+    return elements.inject(initial, function(result, element) {
+      if (!element.disabled && element.name) {
+        key = element.name; value = $(element).getValue();
+        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
+            submit !== false && (!submit || key == submit) && (submitted = true)))) {
+          result = accumulator(result, key, value);
+        }
+      }
+      return result;
+    });
+  }
+};
+
+Form.Methods = {
+  serialize: function(form, options) {
+    return Form.serializeElements(Form.getElements(form), options);
+  },
+
+  getElements: function(form) {
+    var elements = $(form).getElementsByTagName('*'),
+        element,
+        arr = [ ],
+        serializers = Form.Element.Serializers;
+    for (var i = 0; element = elements[i]; i++) {
+      arr.push(element);
+    }
+    return arr.inject([], function(elements, child) {
+      if (serializers[child.tagName.toLowerCase()])
+        elements.push(Element.extend(child));
+      return elements;
+    })
+  },
+
+  getInputs: function(form, typeName, name) {
+    form = $(form);
+    var inputs = form.getElementsByTagName('input');
+
+    if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) || (name && input.name != name))
+        continue;
+      matchingInputs.push(Element.extend(input));
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    form = $(form);
+    Form.getElements(form).invoke('disable');
+    return form;
+  },
+
+  enable: function(form) {
+    form = $(form);
+    Form.getElements(form).invoke('enable');
+    return form;
+  },
+
+  findFirstElement: function(form) {
+    var elements = $(form).getElements().findAll(function(element) {
+      return 'hidden' != element.type && !element.disabled;
+    });
+    var firstByIndex = elements.findAll(function(element) {
+      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
+    }).sortBy(function(element) { return element.tabIndex }).first();
+
+    return firstByIndex ? firstByIndex : elements.find(function(element) {
+      return /^(?:input|select|textarea)$/i.test(element.tagName);
+    });
+  },
+
+  focusFirstElement: function(form) {
+    form = $(form);
+    var element = form.findFirstElement();
+    if (element) element.activate();
+    return form;
+  },
+
+  request: function(form, options) {
+    form = $(form), options = Object.clone(options || { });
+
+    var params = options.parameters, action = form.readAttribute('action') || '';
+    if (action.blank()) action = window.location.href;
+    options.parameters = form.serialize(true);
+
+    if (params) {
+      if (Object.isString(params)) params = params.toQueryParams();
+      Object.extend(options.parameters, params);
+    }
+
+    if (form.hasAttribute('method') && !options.method)
+      options.method = form.method;
+
+    return new Ajax.Request(action, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+
+Form.Element = {
+  focus: function(element) {
+    $(element).focus();
+    return element;
+  },
+
+  select: function(element) {
+    $(element).select();
+    return element;
+  }
+};
+
+Form.Element.Methods = {
+
+  serialize: function(element) {
+    element = $(element);
+    if (!element.disabled && element.name) {
+      var value = element.getValue();
+      if (value != undefined) {
+        var pair = { };
+        pair[element.name] = value;
+        return Object.toQueryString(pair);
+      }
+    }
+    return '';
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    return Form.Element.Serializers[method](element);
+  },
+
+  setValue: function(element, value) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    Form.Element.Serializers[method](element, value);
+    return element;
+  },
+
+  clear: function(element) {
+    $(element).value = '';
+    return element;
+  },
+
+  present: function(element) {
+    return $(element).value != '';
+  },
+
+  activate: function(element) {
+    element = $(element);
+    try {
+      element.focus();
+      if (element.select && (element.tagName.toLowerCase() != 'input' ||
+          !(/^(?:button|reset|submit)$/i.test(element.type))))
+        element.select();
+    } catch (e) { }
+    return element;
+  },
+
+  disable: function(element) {
+    element = $(element);
+    element.disabled = true;
+    return element;
+  },
+
+  enable: function(element) {
+    element = $(element);
+    element.disabled = false;
+    return element;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Field = Form.Element;
+
+var $F = Form.Element.Methods.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = (function() {
+  function input(element, value) {
+    switch (element.type.toLowerCase()) {
+      case 'checkbox':
+      case 'radio':
+        return inputSelector(element, value);
+      default:
+        return valueSelector(element, value);
+    }
+  }
+
+  function inputSelector(element, value) {
+    if (Object.isUndefined(value))
+      return element.checked ? element.value : null;
+    else element.checked = !!value;
+  }
+
+  function valueSelector(element, value) {
+    if (Object.isUndefined(value)) return element.value;
+    else element.value = value;
+  }
+
+  function select(element, value) {
+    if (Object.isUndefined(value))
+      return (element.type === 'select-one' ? selectOne : selectMany)(element);
+
+    var opt, currentValue, single = !Object.isArray(value);
+    for (var i = 0, length = element.length; i < length; i++) {
+      opt = element.options[i];
+      currentValue = this.optionValue(opt);
+      if (single) {
+        if (currentValue == value) {
+          opt.selected = true;
+          return;
+        }
+      }
+      else opt.selected = value.include(currentValue);
+    }
+  }
+
+  function selectOne(element) {
+    var index = element.selectedIndex;
+    return index >= 0 ? optionValue(element.options[index]) : null;
+  }
+
+  function selectMany(element) {
+    var values, length = element.length;
+    if (!length) return null;
+
+    for (var i = 0, values = []; i < length; i++) {
+      var opt = element.options[i];
+      if (opt.selected) values.push(optionValue(opt));
+    }
+    return values;
+  }
+
+  function optionValue(opt) {
+    return Element.hasAttribute(opt, 'value') ? opt.value : opt.text;
+  }
+
+  return {
+    input:         input,
+    inputSelector: inputSelector,
+    textarea:      valueSelector,
+    select:        select,
+    selectOne:     selectOne,
+    selectMany:    selectMany,
+    optionValue:   optionValue,
+    button:        valueSelector
+  };
+})();
+
+/*--------------------------------------------------------------------------*/
+
+
+Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
+  initialize: function($super, element, frequency, callback) {
+    $super(callback, frequency);
+    this.element   = $(element);
+    this.lastValue = this.getValue();
+  },
+
+  execute: function() {
+    var value = this.getValue();
+    if (Object.isString(this.lastValue) && Object.isString(value) ?
+        this.lastValue != value : String(this.lastValue) != String(value)) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+});
+
+Form.Element.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = Class.create({
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+
+  registerFormCallbacks: function() {
+    Form.getElements(this.element).each(this.registerCallback, this);
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
+  }
+});
+
+Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+(function() {
+
+  var Event = {
+    KEY_BACKSPACE: 8,
+    KEY_TAB:       9,
+    KEY_RETURN:   13,
+    KEY_ESC:      27,
+    KEY_LEFT:     37,
+    KEY_UP:       38,
+    KEY_RIGHT:    39,
+    KEY_DOWN:     40,
+    KEY_DELETE:   46,
+    KEY_HOME:     36,
+    KEY_END:      35,
+    KEY_PAGEUP:   33,
+    KEY_PAGEDOWN: 34,
+    KEY_INSERT:   45,
+
+    cache: {}
+  };
+
+  var docEl = document.documentElement;
+  var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl
+    && 'onmouseleave' in docEl;
+
+
+
+  var isIELegacyEvent = function(event) { return false; };
+
+  if (window.attachEvent) {
+    if (window.addEventListener) {
+      isIELegacyEvent = function(event) {
+        return !(event instanceof window.Event);
+      };
+    } else {
+      isIELegacyEvent = function(event) { return true; };
+    }
+  }
+
+  var _isButton;
+
+  function _isButtonForDOMEvents(event, code) {
+    return event.which ? (event.which === code + 1) : (event.button === code);
+  }
+
+  var legacyButtonMap = { 0: 1, 1: 4, 2: 2 };
+  function _isButtonForLegacyEvents(event, code) {
+    return event.button === legacyButtonMap[code];
+  }
+
+  function _isButtonForWebKit(event, code) {
+    switch (code) {
+      case 0: return event.which == 1 && !event.metaKey;
+      case 1: return event.which == 2 || (event.which == 1 && event.metaKey);
+      case 2: return event.which == 3;
+      default: return false;
+    }
+  }
+
+  if (window.attachEvent) {
+    if (!window.addEventListener) {
+      _isButton = _isButtonForLegacyEvents;
+    } else {
+      _isButton = function(event, code) {
+        return isIELegacyEvent(event) ? _isButtonForLegacyEvents(event, code) :
+         _isButtonForDOMEvents(event, code);
+      }
+    }
+  } else if (Prototype.Browser.WebKit) {
+    _isButton = _isButtonForWebKit;
+  } else {
+    _isButton = _isButtonForDOMEvents;
+  }
+
+  function isLeftClick(event)   { return _isButton(event, 0) }
+
+  function isMiddleClick(event) { return _isButton(event, 1) }
+
+  function isRightClick(event)  { return _isButton(event, 2) }
+
+  function element(event) {
+    event = Event.extend(event);
+
+    var node = event.target, type = event.type,
+     currentTarget = event.currentTarget;
+
+    if (currentTarget && currentTarget.tagName) {
+      if (type === 'load' || type === 'error' ||
+        (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
+          && currentTarget.type === 'radio'))
+            node = currentTarget;
+    }
+
+    if (node.nodeType == Node.TEXT_NODE)
+      node = node.parentNode;
+
+    return Element.extend(node);
+  }
+
+  function findElement(event, expression) {
+    var element = Event.element(event);
+
+    if (!expression) return element;
+    while (element) {
+      if (Object.isElement(element) && Prototype.Selector.match(element, expression)) {
+        return Element.extend(element);
+      }
+      element = element.parentNode;
+    }
+  }
+
+  function pointer(event) {
+    return { x: pointerX(event), y: pointerY(event) };
+  }
+
+  function pointerX(event) {
+    var docElement = document.documentElement,
+     body = document.body || { scrollLeft: 0 };
+
+    return event.pageX || (event.clientX +
+      (docElement.scrollLeft || body.scrollLeft) -
+      (docElement.clientLeft || 0));
+  }
+
+  function pointerY(event) {
+    var docElement = document.documentElement,
+     body = document.body || { scrollTop: 0 };
+
+    return  event.pageY || (event.clientY +
+       (docElement.scrollTop || body.scrollTop) -
+       (docElement.clientTop || 0));
+  }
+
+
+  function stop(event) {
+    Event.extend(event);
+    event.preventDefault();
+    event.stopPropagation();
+
+    event.stopped = true;
+  }
+
+
+  Event.Methods = {
+    isLeftClick:   isLeftClick,
+    isMiddleClick: isMiddleClick,
+    isRightClick:  isRightClick,
+
+    element:     element,
+    findElement: findElement,
+
+    pointer:  pointer,
+    pointerX: pointerX,
+    pointerY: pointerY,
+
+    stop: stop
+  };
+
+  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
+    m[name] = Event.Methods[name].methodize();
+    return m;
+  });
+
+  if (window.attachEvent) {
+    function _relatedTarget(event) {
+      var element;
+      switch (event.type) {
+        case 'mouseover':
+        case 'mouseenter':
+          element = event.fromElement;
+          break;
+        case 'mouseout':
+        case 'mouseleave':
+          element = event.toElement;
+          break;
+        default:
+          return null;
+      }
+      return Element.extend(element);
+    }
+
+    var additionalMethods = {
+      stopPropagation: function() { this.cancelBubble = true },
+      preventDefault:  function() { this.returnValue = false },
+      inspect: function() { return '[object Event]' }
+    };
+
+    Event.extend = function(event, element) {
+      if (!event) return false;
+
+      if (!isIELegacyEvent(event)) return event;
+
+      if (event._extendedByPrototype) return event;
+      event._extendedByPrototype = Prototype.emptyFunction;
+
+      var pointer = Event.pointer(event);
+
+      Object.extend(event, {
+        target: event.srcElement || element,
+        relatedTarget: _relatedTarget(event),
+        pageX:  pointer.x,
+        pageY:  pointer.y
+      });
+
+      Object.extend(event, methods);
+      Object.extend(event, additionalMethods);
+
+      return event;
+    };
+  } else {
+    Event.extend = Prototype.K;
+  }
+
+  if (window.addEventListener) {
+    Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__;
+    Object.extend(Event.prototype, methods);
+  }
+
+  function _createResponder(element, eventName, handler) {
+    var registry = Element.retrieve(element, 'prototype_event_registry');
+
+    if (Object.isUndefined(registry)) {
+      CACHE.push(element);
+      registry = Element.retrieve(element, 'prototype_event_registry', $H());
+    }
+
+    var respondersForEvent = registry.get(eventName);
+    if (Object.isUndefined(respondersForEvent)) {
+      respondersForEvent = [];
+      registry.set(eventName, respondersForEvent);
+    }
+
+    if (respondersForEvent.pluck('handler').include(handler)) return false;
+
+    var responder;
+    if (eventName.include(":")) {
+      responder = function(event) {
+        if (Object.isUndefined(event.eventName))
+          return false;
+
+        if (event.eventName !== eventName)
+          return false;
+
+        Event.extend(event, element);
+        handler.call(element, event);
+      };
+    } else {
+      if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED &&
+       (eventName === "mouseenter" || eventName === "mouseleave")) {
+        if (eventName === "mouseenter" || eventName === "mouseleave") {
+          responder = function(event) {
+            Event.extend(event, element);
+
+            var parent = event.relatedTarget;
+            while (parent && parent !== element) {
+              try { parent = parent.parentNode; }
+              catch(e) { parent = element; }
+            }
+
+            if (parent === element) return;
+
+            handler.call(element, event);
+          };
+        }
+      } else {
+        responder = function(event) {
+          Event.extend(event, element);
+          handler.call(element, event);
+        };
+      }
+    }
+
+    responder.handler = handler;
+    respondersForEvent.push(responder);
+    return responder;
+  }
+
+  function _destroyCache() {
+    for (var i = 0, length = CACHE.length; i < length; i++) {
+      Event.stopObserving(CACHE[i]);
+      CACHE[i] = null;
+    }
+  }
+
+  var CACHE = [];
+
+  if (Prototype.Browser.IE)
+    window.attachEvent('onunload', _destroyCache);
+
+  if (Prototype.Browser.WebKit)
+    window.addEventListener('unload', Prototype.emptyFunction, false);
+
+
+  var _getDOMEventName = Prototype.K,
+      translations = { mouseenter: "mouseover", mouseleave: "mouseout" };
+
+  if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) {
+    _getDOMEventName = function(eventName) {
+      return (translations[eventName] || eventName);
+    };
+  }
+
+  function observe(element, eventName, handler) {
+    element = $(element);
+
+    var responder = _createResponder(element, eventName, handler);
+
+    if (!responder) return element;
+
+    if (eventName.include(':')) {
+      if (element.addEventListener)
+        element.addEventListener("dataavailable", responder, false);
+      else {
+        element.attachEvent("ondataavailable", responder);
+        element.attachEvent("onlosecapture", responder);
+      }
+    } else {
+      var actualEventName = _getDOMEventName(eventName);
+
+      if (element.addEventListener)
+        element.addEventListener(actualEventName, responder, false);
+      else
+        element.attachEvent("on" + actualEventName, responder);
+    }
+
+    return element;
+  }
+
+  function stopObserving(element, eventName, handler) {
+    element = $(element);
+
+    var registry = Element.retrieve(element, 'prototype_event_registry');
+    if (!registry) return element;
+
+    if (!eventName) {
+      registry.each( function(pair) {
+        var eventName = pair.key;
+        stopObserving(element, eventName);
+      });
+      return element;
+    }
+
+    var responders = registry.get(eventName);
+    if (!responders) return element;
+
+    if (!handler) {
+      responders.each(function(r) {
+        stopObserving(element, eventName, r.handler);
+      });
+      return element;
+    }
+
+    var i = responders.length, responder;
+    while (i--) {
+      if (responders[i].handler === handler) {
+        responder = responders[i];
+        break;
+      }
+    }
+    if (!responder) return element;
+
+    if (eventName.include(':')) {
+      if (element.removeEventListener)
+        element.removeEventListener("dataavailable", responder, false);
+      else {
+        element.detachEvent("ondataavailable", responder);
+        element.detachEvent("onlosecapture", responder);
+      }
+    } else {
+      var actualEventName = _getDOMEventName(eventName);
+      if (element.removeEventListener)
+        element.removeEventListener(actualEventName, responder, false);
+      else
+        element.detachEvent('on' + actualEventName, responder);
+    }
+
+    registry.set(eventName, responders.without(responder));
+
+    return element;
+  }
+
+  function fire(element, eventName, memo, bubble) {
+    element = $(element);
+
+    if (Object.isUndefined(bubble))
+      bubble = true;
+
+    if (element == document && document.createEvent && !element.dispatchEvent)
+      element = document.documentElement;
+
+    var event;
+    if (document.createEvent) {
+      event = document.createEvent('HTMLEvents');
+      event.initEvent('dataavailable', bubble, true);
+    } else {
+      event = document.createEventObject();
+      event.eventType = bubble ? 'ondataavailable' : 'onlosecapture';
+    }
+
+    event.eventName = eventName;
+    event.memo = memo || { };
+
+    if (document.createEvent)
+      element.dispatchEvent(event);
+    else
+      element.fireEvent(event.eventType, event);
+
+    return Event.extend(event);
+  }
+
+  Event.Handler = Class.create({
+    initialize: function(element, eventName, selector, callback) {
+      this.element   = $(element);
+      this.eventName = eventName;
+      this.selector  = selector;
+      this.callback  = callback;
+      this.handler   = this.handleEvent.bind(this);
+    },
+
+    start: function() {
+      Event.observe(this.element, this.eventName, this.handler);
+      return this;
+    },
+
+    stop: function() {
+      Event.stopObserving(this.element, this.eventName, this.handler);
+      return this;
+    },
+
+    handleEvent: function(event) {
+      var element = Event.findElement(event, this.selector);
+      if (element) this.callback.call(this.element, event, element);
+    }
+  });
+
+  function on(element, eventName, selector, callback) {
+    element = $(element);
+    if (Object.isFunction(selector) && Object.isUndefined(callback)) {
+      callback = selector, selector = null;
+    }
+
+    return new Event.Handler(element, eventName, selector, callback).start();
+  }
+
+  Object.extend(Event, Event.Methods);
+
+  Object.extend(Event, {
+    fire:          fire,
+    observe:       observe,
+    stopObserving: stopObserving,
+    on:            on
+  });
+
+  Element.addMethods({
+    fire:          fire,
+
+    observe:       observe,
+
+    stopObserving: stopObserving,
+
+    on:            on
+  });
+
+  Object.extend(document, {
+    fire:          fire.methodize(),
+
+    observe:       observe.methodize(),
+
+    stopObserving: stopObserving.methodize(),
+
+    on:            on.methodize(),
+
+    loaded:        false
+  });
+
+  if (window.Event) Object.extend(window.Event, Event);
+  else window.Event = Event;
+})();
+
+(function() {
+  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
+     Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */
+
+  var timer;
+
+  function fireContentLoadedEvent() {
+    if (document.loaded) return;
+    if (timer) window.clearTimeout(timer);
+    document.loaded = true;
+    document.fire('dom:loaded');
+  }
+
+  function checkReadyState() {
+    if (document.readyState === 'complete') {
+      document.stopObserving('readystatechange', checkReadyState);
+      fireContentLoadedEvent();
+    }
+  }
+
+  function pollDoScroll() {
+    try { document.documentElement.doScroll('left'); }
+    catch(e) {
+      timer = pollDoScroll.defer();
+      return;
+    }
+    fireContentLoadedEvent();
+  }
+
+  if (document.addEventListener) {
+    document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
+  } else {
+    document.observe('readystatechange', checkReadyState);
+    if (window == top)
+      timer = pollDoScroll.defer();
+  }
+
+  Event.observe(window, 'load', fireContentLoadedEvent);
+})();
+
+
+Element.addMethods();
+/*------------------------------- DEPRECATED -------------------------------*/
+
+Hash.toQueryString = Object.toQueryString;
+
+var Toggle = { display: Element.toggle };
+
+Element.Methods.childOf = Element.Methods.descendantOf;
+
+var Insertion = {
+  Before: function(element, content) {
+    return Element.insert(element, {before:content});
+  },
+
+  Top: function(element, content) {
+    return Element.insert(element, {top:content});
+  },
+
+  Bottom: function(element, content) {
+    return Element.insert(element, {bottom:content});
+  },
+
+  After: function(element, content) {
+    return Element.insert(element, {after:content});
+  }
+};
+
+var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
+
+var Position = {
+  includeScrollOffsets: false,
+
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = Element.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = Element.cumulativeScrollOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = Element.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+
+  cumulativeOffset: Element.Methods.cumulativeOffset,
+
+  positionedOffset: Element.Methods.positionedOffset,
+
+  absolutize: function(element) {
+    Position.prepare();
+    return Element.absolutize(element);
+  },
+
+  relativize: function(element) {
+    Position.prepare();
+    return Element.relativize(element);
+  },
+
+  realOffset: Element.Methods.cumulativeScrollOffset,
+
+  offsetParent: Element.Methods.getOffsetParent,
+
+  page: Element.Methods.viewportOffset,
+
+  clone: function(source, target, options) {
+    options = options || { };
+    return Element.clonePosition(target, source, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
+  function iter(name) {
+    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
+  }
+
+  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
+  function(element, className) {
+    className = className.toString().strip();
+    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
+    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
+  } : function(element, className) {
+    className = className.toString().strip();
+    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
+    if (!classNames && !className) return elements;
+
+    var nodes = $(element).getElementsByTagName('*');
+    className = ' ' + className + ' ';
+
+    for (var i = 0, child, cn; child = nodes[i]; i++) {
+      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
+          (classNames && classNames.all(function(name) {
+            return !name.toString().blank() && cn.include(' ' + name + ' ');
+          }))))
+        elements.push(Element.extend(child));
+    }
+    return elements;
+  };
+
+  return function(className, parentElement) {
+    return $(parentElement || document.body).getElementsByClassName(className);
+  };
+}(Element.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
+
+  toString: function() {
+    return $A(this).join(' ');
+  }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+
+/*--------------------------------------------------------------------------*/
+
+(function() {
+  window.Selector = Class.create({
+    initialize: function(expression) {
+      this.expression = expression.strip();
+    },
+
+    findElements: function(rootElement) {
+      return Prototype.Selector.select(this.expression, rootElement);
+    },
+
+    match: function(element) {
+      return Prototype.Selector.match(element, this.expression);
+    },
+
+    toString: function() {
+      return this.expression;
+    },
+
+    inspect: function() {
+      return "#<Selector: " + this.expression + ">";
+    }
+  });
+
+  Object.extend(Selector, {
+    matchElements: function(elements, expression) {
+      var match = Prototype.Selector.match,
+          results = [];
+
+      for (var i = 0, length = elements.length; i < length; i++) {
+        var element = elements[i];
+        if (match(element, expression)) {
+          results.push(Element.extend(element));
+        }
+      }
+      return results;
+    },
+
+    findElement: function(elements, expression, index) {
+      index = index || 0;
+      var matchIndex = 0, element;
+      for (var i = 0, length = elements.length; i < length; i++) {
+        element = elements[i];
+        if (Prototype.Selector.match(element, expression) && index === matchIndex++) {
+          return Element.extend(element);
+        }
+      }
+    },
+
+    findChildElements: function(element, expressions) {
+      var selector = expressions.toArray().join(', ');
+      return Prototype.Selector.select(selector, element || document);
+    }
+  });
+})();
diff --git a/webcit/static/roomchat_unload.html b/webcit/static/roomchat_unload.html
new file mode 100644 (file)
index 0000000..aa613c4
--- /dev/null
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <title>End Chat</title>
+      <script type="text/javascript" src="prototype.js"></script>
+      <script type="text/javascript">
+        function do_roomchat_unload() {
+          new Ajax.Request(
+            '../chat_exit', {
+              method: 'get'
+            }
+          );
+        }
+      </script>
+  </head>
+  <body onUnload="do_roomchat_unload();">
+   ugly hack to enable an onUnload event
+  </body>
+</html>
diff --git a/webcit/static/roomops.js b/webcit/static/roomops.js
new file mode 100644 (file)
index 0000000..d9c6c5c
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * Copyright 1998 - 2009 The Citadel Team
+ * Licensed under the GPL V3
+ */
+
+// ROOM list vars:
+var rooms = null;
+
+// FLOOR list
+var floors = null;
+
+var roomsForFloors = [];
+/* STRUCT KEYS */
+/* LKRN etc. */
+var RN_ROOM_NAME = 0;
+var RN_ROOM_FLAG = 1;
+var RN_FLOOR_NUM = 2;
+var RN_LIST_ORDER = 3;
+var RN_ACCESS_CONTROL = 4;
+var RN_CUR_VIEW = 5;
+var RN_DEF_VIEW = 6;
+var RN_LAST_CHANGE = 7;
+var RN_RAFLAGS = 8;
+
+var QR_PRIVATE = 4;
+var QR_MAILBOX = 16384;
+
+var UA_KNOWN = 2;
+var UA_GOTOALLOWED = 4;
+var UA_HASNEWMSGS = 8;
+var UA_ZAPPED = 16;
+
+var VIEW_BBS = 0;
+var VIEW_MAILBOX = 1;
+var VIEW_ADDRESSBOOK = 2;
+var VIEW_CALENDAR = 3;
+var VIEW_TASKS = 4;
+var VIEW_NOTES = 5;
+var VIEW_WIKI = 6;
+var VIEW_CALBRIEF = 7;
+var VIEW_JOURNAL = 8;
+
+function fillRooms(callback) {
+  var roomFlr = new Ajax.Request("json_roomflr?SortBy=byfloorroom?SortOrder=1", {method: 'get', onSuccess: function(transport) { ProcessRoomFlr(transport); callback.call(); }});
+}
+function ProcessRoomFlr(transport) {
+  var data = eval('('+transport.responseText+')');
+  floors = data["floors"];
+  rooms = data["rooms"];
+}
+function GetRoomsByFloorNum(flnum) {
+  var roomsForFloor = new Array();
+  var x=0;
+  for(var i=0; i<rooms.length; i++) {
+    var room = rooms[i];
+    var floornum = room[RN_FLOOR_NUM];
+    var flag = room[RN_ROOM_FLAG];
+    if (flnum == floornum && ((flag & QR_MAILBOX) != QR_MAILBOX)) {
+      roomsForFloor[x] = room;
+      x++;
+    }
+  }
+  return roomsForFloor;
+}
+function getMailboxRooms() {
+  var roomsForFloor = new Array();
+  var x=0;
+  for(var i=0; i<rooms.length; i++) {
+    var room = rooms[i];
+    var floornum = room[RN_FLOOR_NUM];
+    var flag = room[RN_ROOM_FLAG];
+    if (floornum == -1) {
+      roomsForFloor[x] = room;
+      x++;
+    }
+  }
+  return roomsForFloor;
+}
+
+/*
+ * function to delete a comment from a blog post
+ */
+function DeleteBlogComment(msgnum) {
+       cmd = encodeURI("g_cmd=DELE " + msgnum);
+       new Ajax.Request("ajax_servcmd", { 
+               parameters: cmd,
+               method: 'post',
+               onSuccess: function(transport) {
+               Effect.BlindUp('blog_comment_' + msgnum);
+               }
+       });
+}
+
+function GenericTreeRoomList(roomlist) {
+  var currentExpanded = ctdlLocalPrefs.readPref("rooms_expanded");
+  var curRoomName = "";
+  if (document.getElementById("rmname")) {
+    curRoomName = getTextContent(document.getElementById("rmname"));
+  }
+  currentDropTargets = [];
+  var iconbar = document.getElementById("iconbar");
+  var ul = document.createElement("ul");
+  roomlist.appendChild(ul);
+  // Add mailbox, because they are special
+  var mailboxLI = document.createElement("li");
+  ul.appendChild(mailboxLI);
+  var mailboxSPAN = document.createElement("span");
+  var _mailbox = getTextContent(document.getElementById("mbox_template"));
+  mailboxSPAN.appendChild(document.createTextNode(_mailbox));
+  $(mailboxSPAN).observe('click', expandFloorEvent);
+  mailboxLI.appendChild(mailboxSPAN);
+  mailboxLI.className = "floor";
+  var mailboxUL = document.createElement("ul");
+  mailboxLI.appendChild(mailboxUL);
+  var mailboxRooms = getMailboxRooms();
+  for(var i=0; i<mailboxRooms.length; i++) {
+         var room = mailboxRooms[i];
+         currentDropTargets.push(addRoomToList(mailboxUL, room, curRoomName));
+  }
+  if (currentExpanded !== null && currentExpanded === _mailbox ) {
+         expandFloor(mailboxSPAN);
+  }
+    for(var a=0; a<floors.length; a++) {
+       var floor = floors[a];
+       var floornum = floor[0];
+       
+       if (floornum !== -1)
+       {
+
+           var name = floor[1];
+           var floorLI = document.createElement("li");
+           ul.appendChild(floorLI);
+           var floorSPAN = document.createElement("span");
+           floorSPAN.appendChild(document.createTextNode(name));
+           $(floorSPAN).observe('click', expandFloorEvent);
+           floorLI.appendChild(floorSPAN);
+           floorLI.className = "floor";
+           var floorUL = document.createElement("ul");
+           floorLI.appendChild(floorUL);
+           var roomsForFloor = GetRoomsByFloorNum(floornum);
+           for(var b=0; b<roomsForFloor.length; b++) {
+               var oneRoom = roomsForFloor[b];
+               currentDropTargets.push(addRoomToList(floorUL, oneRoom, curRoomName));
+           }
+           if (currentExpanded !== null && currentExpanded === name) {
+               expandFloor(floorSPAN);
+           }
+       }
+    }
+}
+function iconBarRoomList() {
+  roomlist = document.getElementById("roomlist");
+  GenericTreeRoomList(roomlist);
+}
+function knRoomsRoomList() {
+  roomlist = document.getElementById("roomlist_knrooms");
+  GenericTreeRoomList(roomlist);
+}
+
+function addRoomToList(floorUL,room, roomToEmphasize) {
+  var roomName = room[RN_ROOM_NAME];
+  var flag = room[RN_ROOM_FLAG];
+  var curView = room[RN_CUR_VIEW];
+  var view = room[RN_DEF_VIEW];
+  var raflags = room[RN_RAFLAGS];
+  var isMailBox = ((flag & QR_MAILBOX) === QR_MAILBOX);
+  var hasNewMsgs = ((raflags & UA_HASNEWMSGS) === UA_HASNEWMSGS);
+  var roomLI = document.createElement("li");
+  var roomA = document.createElement("a");
+  roomA.setAttribute("href","dotgoto?room="+encodeURIComponent(roomName));
+  roomA.appendChild(document.createTextNode(roomName));
+  roomLI.appendChild(roomA);
+  floorUL.appendChild(roomLI);
+  var className = "room ";
+  if (view === VIEW_MAILBOX) {
+    className += "room-private";
+  } else if (view === VIEW_ADDRESSBOOK) {
+    className += "room-addr";
+  } else if (view === VIEW_CALENDAR || view === VIEW_CALBRIEF) {
+    className += "room-cal";
+  } else if (view === VIEW_TASKS) {
+    className += "room-tasks";
+  } else if (view === VIEW_NOTES) {
+    className += "room-notes";
+  } else {
+    className += "room-chat";
+  }
+  if (hasNewMsgs) {
+    className += " room-newmsgs";
+  }
+  if (roomName === roomToEmphasize) {
+    className += " room-emphasized";
+  }
+  roomLI.setAttribute("class", className);
+  roomA.dropTarget = true;
+  roomA.dropHandler = roomListDropHandler;
+  return roomLI;
+}
+
+function roomListDropHandler(target, dropped) {
+  var mvCommand;
+  if (dropped.getAttribute("citadel:msgid")) {
+      var room = getTextContent(target);
+      var msgIds = "";
+      for(var msgId in currentlyMarkedRows) {
+         if (currentlyMarkedRows.hasOwnProperty(msgId)) { //defined in summaryview.js
+             msgIds += ","+msgId;
+             if (msgIds.length > 800) {
+                 mvCommand = "g_cmd=MOVE%20" + msgIds + "|"+encodeURIComponent(room)+"|0";
+                 new Ajax.Request("ajax_servcmd", {
+                     parameters: mvCommand,
+                     method: 'post',
+                 });
+                 msgIds = "";
+             }
+         }
+
+      }
+      mvCommand = "g_cmd=MOVE%20" + msgIds + "|"+encodeURIComponent(room)+"|0";
+      new Ajax.Request('ajax_servcmd', {
+         method: 'post',
+         parameters: mvCommand,
+         onComplete: deleteAllMarkedRows()});
+  }
+}
+function expandFloorEvent(event) {
+  expandFloor(event.target);
+}
+function expandFloor(target) {
+  if (target.nodeName.toLowerCase() !== "span") {
+    return; // ignore clicks on child UL
+  }
+  ctdlLocalPrefs.setPref("rooms_expanded", target.firstChild.nodeValue);
+  var parentUL = target.parentNode;
+  if (currentlyExpandedFloor !== null) {
+    currentlyExpandedFloor.className = currentlyExpandedFloor.className.replace("floor-expanded","");
+  }
+  parentUL.className = parentUL.className + " floor-expanded";
+  currentlyExpandedFloor = parentUL;
+}
diff --git a/webcit/static/scriptaculous.js b/webcit/static/scriptaculous.js
new file mode 100644 (file)
index 0000000..0ea5c44
--- /dev/null
@@ -0,0 +1,68 @@
+// script.aculo.us scriptaculous.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Scriptaculous = {
+  Version: '1.9.0',
+  require: function(libraryName) {
+    try{
+      // inserting via DOM fails in Safari 2.0, so brute force approach
+      document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');
+    } catch(e) {
+      // for xhtml+xml served content, fall back to DOM methods
+      var script = document.createElement('script');
+      script.type = 'text/javascript';
+      script.src = libraryName;
+      document.getElementsByTagName('head')[0].appendChild(script);
+    }
+  },
+  REQUIRED_PROTOTYPE: '1.6.0.3',
+  load: function() {
+    function convertVersionString(versionString) {
+      var v = versionString.replace(/_.*|\./g, '');
+      v = parseInt(v + '0'.times(4-v.length));
+      return versionString.indexOf('_') > -1 ? v-1 : v;
+    }
+
+    if((typeof Prototype=='undefined') ||
+       (typeof Element == 'undefined') ||
+       (typeof Element.Methods=='undefined') ||
+       (convertVersionString(Prototype.Version) <
+        convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
+       throw("script.aculo.us requires the Prototype JavaScript framework >= " +
+        Scriptaculous.REQUIRED_PROTOTYPE);
+
+    var js = /scriptaculous\.js(\?.*)?$/;
+    $$('script[src]').findAll(function(s) {
+      return s.src.match(js);
+    }).each(function(s) {
+      var path = s.src.replace(js, ''),
+      includes = s.src.match(/\?.*load=([a-z,]*)/);
+      (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
+       function(include) { Scriptaculous.require(path+include+'.js') });
+    });
+  }
+};
+
+Scriptaculous.load();
\ No newline at end of file
diff --git a/webcit/static/slider.js b/webcit/static/slider.js
new file mode 100644 (file)
index 0000000..438e689
--- /dev/null
@@ -0,0 +1,275 @@
+// script.aculo.us slider.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Marty Haught, Thomas Fuchs
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+if (!Control) var Control = { };
+
+// options:
+//  axis: 'vertical', or 'horizontal' (default)
+//
+// callbacks:
+//  onChange(value)
+//  onSlide(value)
+Control.Slider = Class.create({
+  initialize: function(handle, track, options) {
+    var slider = this;
+
+    if (Object.isArray(handle)) {
+      this.handles = handle.collect( function(e) { return $(e) });
+    } else {
+      this.handles = [$(handle)];
+    }
+
+    this.track   = $(track);
+    this.options = options || { };
+
+    this.axis      = this.options.axis || 'horizontal';
+    this.increment = this.options.increment || 1;
+    this.step      = parseInt(this.options.step || '1');
+    this.range     = this.options.range || $R(0,1);
+
+    this.value     = 0; // assure backwards compat
+    this.values    = this.handles.map( function() { return 0 });
+    this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
+    this.options.startSpan = $(this.options.startSpan || null);
+    this.options.endSpan   = $(this.options.endSpan || null);
+
+    this.restricted = this.options.restricted || false;
+
+    this.maximum   = this.options.maximum || this.range.end;
+    this.minimum   = this.options.minimum || this.range.start;
+
+    // Will be used to align the handle onto the track, if necessary
+    this.alignX = parseInt(this.options.alignX || '0');
+    this.alignY = parseInt(this.options.alignY || '0');
+
+    this.trackLength = this.maximumOffset() - this.minimumOffset();
+
+    this.handleLength = this.isVertical() ?
+      (this.handles[0].offsetHeight != 0 ?
+        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
+      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
+        this.handles[0].style.width.replace(/px$/,""));
+
+    this.active   = false;
+    this.dragging = false;
+    this.disabled = false;
+
+    if (this.options.disabled) this.setDisabled();
+
+    // Allowed values array
+    this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
+    if (this.allowedValues) {
+      this.minimum = this.allowedValues.min();
+      this.maximum = this.allowedValues.max();
+    }
+
+    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
+    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
+    this.eventMouseMove = this.update.bindAsEventListener(this);
+
+    // Initialize handles in reverse (make sure first handle is active)
+    this.handles.each( function(h,i) {
+      i = slider.handles.length-1-i;
+      slider.setValue(parseFloat(
+        (Object.isArray(slider.options.sliderValue) ?
+          slider.options.sliderValue[i] : slider.options.sliderValue) ||
+         slider.range.start), i);
+      h.makePositioned().observe("mousedown", slider.eventMouseDown);
+    });
+
+    this.track.observe("mousedown", this.eventMouseDown);
+    document.observe("mouseup", this.eventMouseUp);
+    document.observe("mousemove", this.eventMouseMove);
+
+    this.initialized = true;
+  },
+  dispose: function() {
+    var slider = this;
+    Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
+    Event.stopObserving(document, "mouseup", this.eventMouseUp);
+    Event.stopObserving(document, "mousemove", this.eventMouseMove);
+    this.handles.each( function(h) {
+      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
+    });
+  },
+  setDisabled: function(){
+    this.disabled = true;
+  },
+  setEnabled: function(){
+    this.disabled = false;
+  },
+  getNearestValue: function(value){
+    if (this.allowedValues){
+      if (value >= this.allowedValues.max()) return(this.allowedValues.max());
+      if (value <= this.allowedValues.min()) return(this.allowedValues.min());
+
+      var offset = Math.abs(this.allowedValues[0] - value);
+      var newValue = this.allowedValues[0];
+      this.allowedValues.each( function(v) {
+        var currentOffset = Math.abs(v - value);
+        if (currentOffset <= offset){
+          newValue = v;
+          offset = currentOffset;
+        }
+      });
+      return newValue;
+    }
+    if (value > this.range.end) return this.range.end;
+    if (value < this.range.start) return this.range.start;
+    return value;
+  },
+  setValue: function(sliderValue, handleIdx){
+    if (!this.active) {
+      this.activeHandleIdx = handleIdx || 0;
+      this.activeHandle    = this.handles[this.activeHandleIdx];
+      this.updateStyles();
+    }
+    handleIdx = handleIdx || this.activeHandleIdx || 0;
+    if (this.initialized && this.restricted) {
+      if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
+        sliderValue = this.values[handleIdx-1];
+      if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
+        sliderValue = this.values[handleIdx+1];
+    }
+    sliderValue = this.getNearestValue(sliderValue);
+    this.values[handleIdx] = sliderValue;
+    this.value = this.values[0]; // assure backwards compat
+
+    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
+      this.translateToPx(sliderValue);
+
+    this.drawSpans();
+    if (!this.dragging || !this.event) this.updateFinished();
+  },
+  setValueBy: function(delta, handleIdx) {
+    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
+      handleIdx || this.activeHandleIdx || 0);
+  },
+  translateToPx: function(value) {
+    return Math.round(
+      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
+      (value - this.range.start)) + "px";
+  },
+  translateToValue: function(offset) {
+    return ((offset/(this.trackLength-this.handleLength) *
+      (this.range.end-this.range.start)) + this.range.start);
+  },
+  getRange: function(range) {
+    var v = this.values.sortBy(Prototype.K);
+    range = range || 0;
+    return $R(v[range],v[range+1]);
+  },
+  minimumOffset: function(){
+    return(this.isVertical() ? this.alignY : this.alignX);
+  },
+  maximumOffset: function(){
+    return(this.isVertical() ?
+      (this.track.offsetHeight != 0 ? this.track.offsetHeight :
+        this.track.style.height.replace(/px$/,"")) - this.alignY :
+      (this.track.offsetWidth != 0 ? this.track.offsetWidth :
+        this.track.style.width.replace(/px$/,"")) - this.alignX);
+  },
+  isVertical:  function(){
+    return (this.axis == 'vertical');
+  },
+  drawSpans: function() {
+    var slider = this;
+    if (this.spans)
+      $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
+    if (this.options.startSpan)
+      this.setSpan(this.options.startSpan,
+        $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
+    if (this.options.endSpan)
+      this.setSpan(this.options.endSpan,
+        $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
+  },
+  setSpan: function(span, range) {
+    if (this.isVertical()) {
+      span.style.top = this.translateToPx(range.start);
+      span.style.height = this.translateToPx(range.end - range.start + this.range.start);
+    } else {
+      span.style.left = this.translateToPx(range.start);
+      span.style.width = this.translateToPx(range.end - range.start + this.range.start);
+    }
+  },
+  updateStyles: function() {
+    this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
+    Element.addClassName(this.activeHandle, 'selected');
+  },
+  startDrag: function(event) {
+    if (Event.isLeftClick(event)) {
+      if (!this.disabled){
+        this.active = true;
+
+        var handle = Event.element(event);
+        var pointer  = [Event.pointerX(event), Event.pointerY(event)];
+        var track = handle;
+        if (track==this.track) {
+          var offsets  = this.track.cumulativeOffset();
+          this.event = event;
+          this.setValue(this.translateToValue(
+           (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
+          ));
+          var offsets  = this.activeHandle.cumulativeOffset();
+          this.offsetX = (pointer[0] - offsets[0]);
+          this.offsetY = (pointer[1] - offsets[1]);
+        } else {
+          // find the handle (prevents issues with Safari)
+          while((this.handles.indexOf(handle) == -1) && handle.parentNode)
+            handle = handle.parentNode;
+
+          if (this.handles.indexOf(handle)!=-1) {
+            this.activeHandle    = handle;
+            this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
+            this.updateStyles();
+
+            var offsets  = this.activeHandle.cumulativeOffset();
+            this.offsetX = (pointer[0] - offsets[0]);
+            this.offsetY = (pointer[1] - offsets[1]);
+          }
+        }
+      }
+      Event.stop(event);
+    }
+  },
+  update: function(event) {
+   if (this.active) {
+      if (!this.dragging) this.dragging = true;
+      this.draw(event);
+      if (Prototype.Browser.WebKit) window.scrollBy(0,0);
+      Event.stop(event);
+   }
+  },
+  draw: function(event) {
+    var pointer = [Event.pointerX(event), Event.pointerY(event)];
+    var offsets = this.track.cumulativeOffset();
+    pointer[0] -= this.offsetX + offsets[0];
+    pointer[1] -= this.offsetY + offsets[1];
+    this.event = event;
+    this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
+    if (this.initialized && this.options.onSlide)
+      this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
+  },
+  endDrag: function(event) {
+    if (this.active && this.dragging) {
+      this.finishDrag(event, true);
+      Event.stop(event);
+    }
+    this.active = false;
+    this.dragging = false;
+  },
+  finishDrag: function(event, success) {
+    this.active = false;
+    this.dragging = false;
+    this.updateFinished();
+  },
+  updateFinished: function() {
+    if (this.initialized && this.options.onChange)
+      this.options.onChange(this.values.length>1 ? this.values : this.value, this);
+    this.event = null;
+  }
+});
\ No newline at end of file
diff --git a/webcit/static/sound.js b/webcit/static/sound.js
new file mode 100644 (file)
index 0000000..d3f8464
--- /dev/null
@@ -0,0 +1,59 @@
+// script.aculo.us sound.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// Based on code created by Jules Gravinese (http://www.webveteran.com/)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+Sound = {
+  tracks: {},
+  _enabled: true,
+  template:
+    new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'),
+  enable: function(){
+    Sound._enabled = true;
+  },
+  disable: function(){
+    Sound._enabled = false;
+  },
+  play: function(url){
+    if(!Sound._enabled) return;
+    var options = Object.extend({
+      track: 'global', url: url, replace: false
+    }, arguments[1] || {});
+
+    if(options.replace && this.tracks[options.track]) {
+      $R(0, this.tracks[options.track].id).each(function(id){
+        var sound = $('sound_'+options.track+'_'+id);
+        sound.Stop && sound.Stop();
+        sound.remove();
+      });
+      this.tracks[options.track] = null;
+    }
+
+    if(!this.tracks[options.track])
+      this.tracks[options.track] = { id: 0 };
+    else
+      this.tracks[options.track].id++;
+
+    options.id = this.tracks[options.track].id;
+    $$('body')[0].insert(
+      Prototype.Browser.IE ? new Element('bgsound',{
+        id: 'sound_'+options.track+'_'+options.id,
+        src: options.url, loop: 1, autostart: true
+      }) : Sound.template.evaluate(options));
+  }
+};
+
+if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){
+  if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 }))
+    Sound.template = new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>');
+  else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('Windows Media') != -1 }))
+    Sound.template = new Template('<object id="sound_#{track}_#{id}" type="application/x-mplayer2" data="#{url}"></object>');
+  else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('RealPlayer') != -1 }))
+    Sound.template = new Template('<embed type="audio/x-pn-realaudio-plugin" style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>');
+  else
+    Sound.play = function(){};
+} 
\ No newline at end of file
diff --git a/webcit/static/styles/PIE.htc b/webcit/static/styles/PIE.htc
new file mode 100644 (file)
index 0000000..b39af01
--- /dev/null
@@ -0,0 +1,81 @@
+<!--
+PIE: CSS3 rendering for IE
+Version 1.0beta4
+http://css3pie.com
+Dual-licensed for use under the Apache License Version 2.0 or the General Public License (GPL) Version 2.
+-->
+<PUBLIC:COMPONENT lightWeight="true">
+<PUBLIC:ATTACH EVENT="oncontentready" FOR="element" ONEVENT="init()" />
+<PUBLIC:ATTACH EVENT="ondocumentready" FOR="element" ONEVENT="init()" />
+<PUBLIC:ATTACH EVENT="ondetach" FOR="element" ONEVENT="cleanup()" />
+
+<script type="text/javascript">
+var doc = element.document;var g=window.PIE;
+if(!g){g=window.PIE={F:"-pie-",Sa:"Pie",Pa:"pie_",Jb:{TD:1,TH:1}};try{doc.execCommand("BackgroundImageCache",false,true)}catch(L){}g.J=function(){for(var a=4,b=doc.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="<!--[if gt IE "+ ++a+"]><i></i><![endif]--\>",c[0];);return a}();if(g.J===6)g.F=g.F.replace(/^-/,"");g.Ab=doc.documentMode||g.J;(function(){var a,b=0,c={};g.p={Ga:function(e){if(!a){a=doc.createDocumentFragment();a.namespaces.add("css3vml","urn:schemas-microsoft-com:vml")}return a.createElement("css3vml:"+e)},
+ta:function(e){return e&&e._pieId||(e._pieId=++b)},fb:function(e){var f,h,j,d,i=arguments;f=1;for(h=i.length;f<h;f++){d=i[f];for(j in d)if(d.hasOwnProperty(j))e[j]=d[j]}return e},Pb:function(e,f,h){var j=c[e],d,i;if(j)Object.prototype.toString.call(j)==="[object Array]"?j.push([f,h]):f.call(h,j);else{i=c[e]=[[f,h]];d=new Image;d.onload=function(){j=c[e]={i:d.width,f:d.height};for(var k=0,m=i.length;k<m;k++)i[k][0].call(i[k][1],j);d.onload=null};d.src=e}}}})();g.ia=function(){this.hb=[];this.Db={}};
+g.ia.prototype={aa:function(a){var b=g.p.ta(a),c=this.Db,e=this.hb;if(!(b in c)){c[b]=e.length;e.push(a)}},Ma:function(a){a=g.p.ta(a);var b=this.Db;if(a&&a in b){delete this.hb[b[a]];delete b[a]}},Ia:function(){for(var a=this.hb,b=a.length;b--;)a[b]&&a[b]()}};g.ya=new g.ia;g.ya.Tc=function(){var a=this;if(!a.Uc){setInterval(function(){a.Ia()},250);a.Uc=1}};g.G=new g.ia;window.attachEvent("onbeforeunload",function(){g.G.Ia()});g.G.Ea=function(a,b,c){a.attachEvent(b,c);this.aa(function(){a.detachEvent(b,
+c)})};(function(){function a(){g.za.Ia()}g.za=new g.ia;g.G.Ea(window,"onresize",a)})();(function(){function a(){g.Ra.Ia()}g.Ra=new g.ia;g.G.Ea(window,"onscroll",a);g.za.aa(a)})();(function(){function a(){c=g.Qa.wc()}function b(){if(c){for(var e=0,f=c.length;e<f;e++)g.attach(c[e]);c=0}}var c;g.G.Ea(window,"onbeforeprint",a);g.G.Ea(window,"onafterprint",b)})();g.hd=function(){function a(i){this.V=i}var b=doc.createElement("length-calc"),c=doc.documentElement,e=b.style,f={},h=["mm","cm","in","pt","pc"],
+j=h.length,d={};e.position="absolute";e.top=e.left="-9999px";for(c.appendChild(b);j--;){b.style.width="100"+h[j];f[h[j]]=b.offsetWidth/100}c.removeChild(b);a.prototype={ib:/(px|em|ex|mm|cm|in|pt|pc|%)$/,vb:function(){var i=this.Lc;if(i===void 0)i=this.Lc=parseFloat(this.V);return i},ab:function(){var i=this.ad;if(!i)i=this.ad=(i=this.V.match(this.ib))&&i[0]||"px";return i},a:function(i,k){var m=this.vb(),l=this.ab();switch(l){case "px":return m;case "%":return m*(typeof k==="function"?k():k)/100;
+case "em":return m*this.tb(i);case "ex":return m*this.tb(i)/2;default:return m*f[l]}},tb:function(i){var k=i.currentStyle.fontSize;if(k.indexOf("px")>0)return parseFloat(k);else{b.style.width="1em";i.appendChild(b);k=b.offsetWidth;b.parentNode===i&&i.removeChild(b);return k}}};g.k=function(i){return d[i]||(d[i]=new a(i))};return a}();g.Na=function(){function a(f){this.U=f}var b=g.k("50%"),c={top:1,center:1,bottom:1},e={left:1,center:1,right:1};a.prototype={Dc:function(){if(!this.sb){var f=this.U,
+h=f.length,j=g.u,d=j.ja,i=g.k("0");d=d.fa;i=["left",i,"top",i];if(h===1){f.push(new j.Ta(d,"center"));h++}if(h===2){d&(f[0].h|f[1].h)&&f[0].d in c&&f[1].d in e&&f.push(f.shift());if(f[0].h&d)if(f[0].d==="center")i[1]=b;else i[0]=f[0].d;else if(f[0].Y())i[1]=g.k(f[0].d);if(f[1].h&d)if(f[1].d==="center")i[3]=b;else i[2]=f[1].d;else if(f[1].Y())i[3]=g.k(f[1].d)}this.sb=i}return this.sb},coords:function(f,h,j){var d=this.Dc(),i=d[1].a(f,h);f=d[3].a(f,j);return{x:d[0]==="right"?h-i:i,y:d[2]==="bottom"?
+j-f:f}}};return a}();g.Rb=function(){function a(b){this.V=b}a.prototype={ib:/[a-z]+$/i,ab:function(){return this.lc||(this.lc=this.V.match(this.ib)[0].toLowerCase())},vc:function(){var b=this.fc,c;if(b===undefined){b=this.ab();c=parseFloat(this.V,10);b=this.fc=b==="deg"?c:b==="rad"?c/Math.PI*180:b==="grad"?c/400*360:b==="turn"?c*360:0}return b}};return a}();g.$b=function(){function a(c){this.V=c}var b={};a.Sc=/\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d+|\d*\.\d+)\s*\)\s*/;a.gb=
+{aliceblue:"F0F8FF",antiquewhite:"FAEBD7",aqua:"0FF",aquamarine:"7FFFD4",azure:"F0FFFF",beige:"F5F5DC",bisque:"FFE4C4",black:"000",blanchedalmond:"FFEBCD",blue:"00F",blueviolet:"8A2BE2",brown:"A52A2A",burlywood:"DEB887",cadetblue:"5F9EA0",chartreuse:"7FFF00",chocolate:"D2691E",coral:"FF7F50",cornflowerblue:"6495ED",cornsilk:"FFF8DC",crimson:"DC143C",cyan:"0FF",darkblue:"00008B",darkcyan:"008B8B",darkgoldenrod:"B8860B",darkgray:"A9A9A9",darkgreen:"006400",darkkhaki:"BDB76B",darkmagenta:"8B008B",darkolivegreen:"556B2F",
+darkorange:"FF8C00",darkorchid:"9932CC",darkred:"8B0000",darksalmon:"E9967A",darkseagreen:"8FBC8F",darkslateblue:"483D8B",darkslategray:"2F4F4F",darkturquoise:"00CED1",darkviolet:"9400D3",deeppink:"FF1493",deepskyblue:"00BFFF",dimgray:"696969",dodgerblue:"1E90FF",firebrick:"B22222",floralwhite:"FFFAF0",forestgreen:"228B22",fuchsia:"F0F",gainsboro:"DCDCDC",ghostwhite:"F8F8FF",gold:"FFD700",goldenrod:"DAA520",gray:"808080",green:"008000",greenyellow:"ADFF2F",honeydew:"F0FFF0",hotpink:"FF69B4",indianred:"CD5C5C",
+indigo:"4B0082",ivory:"FFFFF0",khaki:"F0E68C",lavender:"E6E6FA",lavenderblush:"FFF0F5",lawngreen:"7CFC00",lemonchiffon:"FFFACD",lightblue:"ADD8E6",lightcoral:"F08080",lightcyan:"E0FFFF",lightgoldenrodyellow:"FAFAD2",lightgreen:"90EE90",lightgrey:"D3D3D3",lightpink:"FFB6C1",lightsalmon:"FFA07A",lightseagreen:"20B2AA",lightskyblue:"87CEFA",lightslategray:"789",lightsteelblue:"B0C4DE",lightyellow:"FFFFE0",lime:"0F0",limegreen:"32CD32",linen:"FAF0E6",magenta:"F0F",maroon:"800000",mediumauqamarine:"66CDAA",
+mediumblue:"0000CD",mediumorchid:"BA55D3",mediumpurple:"9370D8",mediumseagreen:"3CB371",mediumslateblue:"7B68EE",mediumspringgreen:"00FA9A",mediumturquoise:"48D1CC",mediumvioletred:"C71585",midnightblue:"191970",mintcream:"F5FFFA",mistyrose:"FFE4E1",moccasin:"FFE4B5",navajowhite:"FFDEAD",navy:"000080",oldlace:"FDF5E6",olive:"808000",olivedrab:"688E23",orange:"FFA500",orangered:"FF4500",orchid:"DA70D6",palegoldenrod:"EEE8AA",palegreen:"98FB98",paleturquoise:"AFEEEE",palevioletred:"D87093",papayawhip:"FFEFD5",
+peachpuff:"FFDAB9",peru:"CD853F",pink:"FFC0CB",plum:"DDA0DD",powderblue:"B0E0E6",purple:"800080",red:"F00",rosybrown:"BC8F8F",royalblue:"4169E1",saddlebrown:"8B4513",salmon:"FA8072",sandybrown:"F4A460",seagreen:"2E8B57",seashell:"FFF5EE",sienna:"A0522D",silver:"C0C0C0",skyblue:"87CEEB",slateblue:"6A5ACD",slategray:"708090",snow:"FFFAFA",springgreen:"00FF7F",steelblue:"4682B4",tan:"D2B48C",teal:"008080",thistle:"D8BFD8",tomato:"FF6347",turquoise:"40E0D0",violet:"EE82EE",wheat:"F5DEB3",white:"FFF",
+whitesmoke:"F5F5F5",yellow:"FF0",yellowgreen:"9ACD32"};a.prototype={parse:function(){if(!this.Ca){var c=this.V,e;if(e=c.match(a.Sc)){this.Ca="rgb("+e[1]+","+e[2]+","+e[3]+")";this.qb=parseFloat(e[4])}else{if((e=c.toLowerCase())in a.gb)c="#"+a.gb[e];this.Ca=c;this.qb=c==="transparent"?0:1}}},O:function(c){this.parse();return this.Ca==="currentColor"?c.currentStyle.color:this.Ca},la:function(){this.parse();return this.qb}};g.pa=function(c){return b[c]||(b[c]=new a(c))};return a}();g.u=function(){function a(c){this.Ha=
+c;this.ch=0;this.U=[];this.wa=0}var b=a.ja={xa:1,ob:2,ea:4,ac:8,pb:16,fa:32,A:64,ga:128,ha:256,Aa:512,dc:1024,URL:2048};a.Ta=function(c,e){this.h=c;this.d=e};a.Ta.prototype={db:function(){return this.h&b.A||this.h&b.ga&&this.d==="0"},Y:function(){return this.db()||this.h&b.Aa}};a.prototype={dd:/\s/,Mc:/^[\+\-]?(\d*\.)?\d+/,url:/^url\(\s*("([^"]*)"|'([^']*)'|([!#$%&*-~]*))\s*\)/i,zb:/^\-?[_a-z][\w-]*/i,Yc:/^("([^"]*)"|'([^']*)')/,Fc:/^#([\da-f]{6}|[\da-f]{3})/i,bd:{px:b.A,em:b.A,ex:b.A,mm:b.A,cm:b.A,
+"in":b.A,pt:b.A,pc:b.A,deg:b.xa,rad:b.xa,grad:b.xa},sc:{rgb:1,rgba:1,hsl:1,hsla:1},next:function(c){function e(t,n){t=new a.Ta(t,n);if(!c){k.U.push(t);k.wa++}return t}function f(){k.wa++;return null}var h,j,d,i,k=this;if(this.wa<this.U.length)return this.U[this.wa++];for(;this.dd.test(this.Ha.charAt(this.ch));)this.ch++;if(this.ch>=this.Ha.length)return f();j=this.ch;h=this.Ha.substring(this.ch);d=h.charAt(0);switch(d){case "#":if(i=h.match(this.Fc)){this.ch+=i[0].length;return e(b.ea,i[0])}break;
+case '"':case "'":if(i=h.match(this.Yc)){this.ch+=i[0].length;return e(b.dc,i[2]||i[3]||"")}break;case "/":case ",":this.ch++;return e(b.ha,d);case "u":if(i=h.match(this.url)){this.ch+=i[0].length;return e(b.URL,i[2]||i[3]||i[4]||"")}}if(i=h.match(this.Mc)){d=i[0];this.ch+=d.length;if(h.charAt(d.length)==="%"){this.ch++;return e(b.Aa,d+"%")}if(i=h.substring(d.length).match(this.zb)){d+=i[0];this.ch+=i[0].length;return e(this.bd[i[0].toLowerCase()]||b.ac,d)}return e(b.ga,d)}if(i=h.match(this.zb)){d=
+i[0];this.ch+=d.length;if(d.toLowerCase()in g.$b.gb||d==="currentColor")return e(b.ea,d);if(h.charAt(d.length)==="("){this.ch++;if(d.toLowerCase()in this.sc){h=function(t){return t&&t.h&b.ga};i=function(t){return t&&t.h&(b.ga|b.Aa)};var m=function(t,n){return t&&t.d===n},l=function(){return k.next(1)};if((d.charAt(0)==="r"?i(l()):h(l()))&&m(l(),",")&&i(l())&&m(l(),",")&&i(l())&&(d==="rgb"||d==="hsa"||m(l(),",")&&h(l()))&&m(l(),")"))return e(b.ea,this.Ha.substring(j,this.ch));return f()}return e(b.pb,
+d)}return e(b.fa,d)}this.ch++;return e(b.ob,d)},z:function(){return this.U[this.wa-- -2]},all:function(){for(;this.next(););return this.U},da:function(c,e){for(var f=[],h,j;h=this.next();){if(c(h)){j=true;this.z();break}f.push(h)}return e&&!j?null:f}};return a}();var M=function(a){this.e=a};M.prototype={K:0,Qc:function(){var a=this.Ua,b;return!a||(b=this.o())&&(a.x!==b.x||a.y!==b.y)},Vc:function(){var a=this.Ua,b;return!a||(b=this.o())&&(a.i!==b.i||a.f!==b.f)},ub:function(){var a=this.e.getBoundingClientRect();
+return{x:a.left,y:a.top,i:a.right-a.left,f:a.bottom-a.top}},o:function(){return this.K?this.Da||(this.Da=this.ub()):this.ub()},Ec:function(){return!!this.Ua},Ja:function(){++this.K},La:function(){if(!--this.K){if(this.Da)this.Ua=this.Da;this.Da=null}}};(function(){function a(b){var c=g.p.ta(b);return function(){if(this.K){var e=this.rb||(this.rb={});return c in e?e[c]:(e[c]=b.call(this))}else return b.call(this)}}g.s={K:0,$:function(b){function c(e){this.e=e}g.p.fb(c.prototype,g.s,b);c.kc={};return c},
+m:function(){var b=this.qa(),c=this.constructor.kc;return b?b in c?c[b]:(c[b]=this.ba(b)):null},qa:a(function(){var b=this.e,c=this.constructor,e=b.style;b=b.currentStyle;var f=this.na,h=this.va,j=c.ic||(c.ic=g.F+f);c=c.jc||(c.jc=g.Sa+h.charAt(0).toUpperCase()+h.substring(1));return e[c]||b.getAttribute(j)||e[h]||b.getAttribute(f)}),g:a(function(){return!!this.m()}),D:a(function(){var b=this.qa(),c=b!==this.gc;this.gc=b;return c}),ma:a,Ja:function(){++this.K},La:function(){--this.K||delete this.rb}}})();
+g.Tb=g.s.$({na:g.F+"background",va:g.Sa+"Background",nc:{scroll:1,fixed:1,local:1},Ka:{"repeat-x":1,"repeat-y":1,repeat:1,"no-repeat":1},Nc:{"padding-box":1,"border-box":1,"content-box":1},rc:{"padding-box":1,"border-box":1},Rc:{top:1,right:1,bottom:1,left:1,center:1},Wc:{contain:1,cover:1},ba:function(a){function b(u){return u.Y()||u.h&i&&u.d in t}function c(u){return u.Y()&&g.k(u.d)||u.d==="auto"&&"auto"}var e=this.e.currentStyle,f,h,j=g.u.ja,d=j.ha,i=j.fa,k=j.ea,m,l,t=this.Rc,n,p,s=null;if(this.$a()){a=
+new g.u(a);s={M:[]};for(h={};f=a.next();){m=f.h;l=f.d;if(!h.P&&m&j.pb&&l==="linear-gradient"){n={ca:[],P:l};for(p={};f=a.next();){m=f.h;l=f.d;if(m&j.ob&&l===")"){p.color&&n.ca.push(p);n.ca.length>1&&g.p.fb(h,n);break}if(m&k){if(n.Xa||n.bb){f=a.z();if(f.h!==d)break;a.next()}p={color:g.pa(l)};f=a.next();if(f.Y())p.Fb=g.k(f.d);else a.z()}else if(m&j.xa&&!n.Xa&&!p.color&&!n.ca.length)n.Xa=new g.Rb(f.d);else if(b(f)&&!n.bb&&!p.color&&!n.ca.length){a.z();n.bb=new g.Na(a.da(function(u){return!b(u)},false))}else if(m&
+d&&l===","){if(p.color){n.ca.push(p);p={}}}else break}}else if(!h.P&&m&j.URL){h.Cb=l;h.P="image"}else if(b(f)&&!h.size){a.z();h.Ya=new g.Na(a.da(function(u){return!b(u)},false))}else if(m&i)if(l in this.Ka)h.Bb=l;else if(l in this.Nc){h.kd=l;if(l in this.rc)h.clip=l}else{if(l in this.nc)h.jd=l}else if(m&k&&!s.color)s.color=g.pa(l);else if(m&d)if(l==="/"){f=a.next();m=f.h;l=f.d;if(m&i&&l in this.Wc)h.size=l;else if(l=c(f))h.size={i:l,f:c(a.next())||a.z()&&l}}else{if(l===","&&h.P){s.M.push(h);h={}}}else return null}h.P&&
+s.M.push(h)}else this.Nb(function(){var u=e.backgroundPositionX,w=e.backgroundPositionY,r=e.backgroundImage,o=e.backgroundColor;s={};if(o!=="transparent")s.color=g.pa(o);if(r!=="none")s.M=[{P:"image",Cb:(new g.u(r)).next().d,Bb:e.backgroundRepeat,Ya:new g.Na((new g.u(u+" "+w)).all())}]});return s&&(s.color||s.M&&s.M[0])?s:null},Nb:function(a){var b=this.e.runtimeStyle,c=b.backgroundImage,e=b.backgroundColor;if(c)b.backgroundImage="";if(e)b.backgroundColor="";a=a.call(this);if(c)b.backgroundImage=
+c;if(e)b.backgroundColor=e;return a},qa:g.s.ma(function(){return this.$a()||this.Nb(function(){var a=this.e.currentStyle;return a.backgroundColor+" "+a.backgroundImage+" "+a.backgroundRepeat+" "+a.backgroundPositionX+" "+a.backgroundPositionY})}),$a:g.s.ma(function(){var a=this.e;return a.style[this.va]||a.currentStyle.getAttribute(this.na)}),Eb:function(){var a=0;if(g.J<7){a=this.e;a=""+(a.style[g.Sa+"PngFix"]||a.currentStyle.getAttribute(g.F+"png-fix"))==="true"}return a},g:g.s.ma(function(){return(this.$a()||
+this.Eb())&&!!this.m()})});g.Xb=g.s.$({Ib:["Top","Right","Bottom","Left"],Kc:{thin:"1px",medium:"3px",thick:"5px"},ba:function(){var a={},b={},c={},e=false,f=true,h=true,j=true;this.Ob(function(){for(var d=this.e.currentStyle,i=0,k,m,l,t,n,p,s;i<4;i++){l=this.Ib[i];s=l.charAt(0).toLowerCase();k=b[s]=d["border"+l+"Style"];m=d["border"+l+"Color"];l=d["border"+l+"Width"];if(i>0){if(k!==t)h=false;if(m!==n)f=false;if(l!==p)j=false}t=k;n=m;p=l;c[s]=g.pa(m);l=a[s]=g.k(b[s]==="none"?"0":this.Kc[l]||l);if(l.a(this.e)>
+0)e=true}});return e?{nb:a,Zc:b,tc:c,ed:j,uc:f,$c:h}:null},qa:g.s.ma(function(){var a=this.e,b=a.currentStyle,c;a.tagName in g.Jb&&a.offsetParent.currentStyle.borderCollapse==="collapse"||this.Ob(function(){c=b.borderWidth+"|"+b.borderStyle+"|"+b.borderColor});return c}),Ob:function(a){var b=this.e.runtimeStyle,c=b.borderWidth,e=b.borderColor;if(c)b.borderWidth="";if(e)b.borderColor="";a=a.call(this);if(c)b.borderWidth=c;if(e)b.borderColor=e;return a}});(function(){g.Oa=g.s.$({na:"border-radius",
+va:"borderRadius",ba:function(b){var c=null,e,f,h,j,d=false;if(b){f=new g.u(b);var i=function(){for(var k=[],m;(h=f.next())&&h.Y();){j=g.k(h.d);m=j.vb();if(m<0)return null;if(m>0)d=true;k.push(j)}return k.length>0&&k.length<5?{tl:k[0],tr:k[1]||k[0],br:k[2]||k[0],bl:k[3]||k[1]||k[0]}:null};if(b=i()){if(h){if(h.h&g.u.ja.ha&&h.d==="/")e=i()}else e=b;if(d&&b&&e)c={x:b,y:e}}}return c}});var a=g.k("0");a={tl:a,tr:a,br:a,bl:a};g.Oa.Qb={x:a,y:a}})();g.Vb=g.s.$({na:"border-image",va:"borderImage",Ka:{stretch:1,
+round:1,repeat:1,space:1},ba:function(a){var b=null,c,e,f,h,j,d,i=0,k,m=g.u.ja,l=m.fa,t=m.ga,n=m.A,p=m.Aa;if(a){c=new g.u(a);b={};for(var s=function(r){return r&&r.h&m.ha&&r.d==="/"},u=function(r){return r&&r.h&l&&r.d==="fill"},w=function(){h=c.da(function(r){return!(r.h&(t|p))});if(u(c.next())&&!b.fill)b.fill=true;else c.z();if(s(c.next())){i++;j=c.da(function(){return!(e.h&(t|p|n))&&!(e.h&l&&e.d==="auto")});if(s(c.next())){i++;d=c.da(function(){return!(e.h&(t|n))})}}else c.z()};e=c.next();){a=e.h;
+f=e.d;if(a&(t|p)&&!h){c.z();w()}else if(u(e)&&!b.fill){b.fill=true;w()}else if(a&l&&this.Ka[f]&&!b.repeat){b.repeat={f:f};if(e=c.next())if(e.h&l&&this.Ka[e.d])b.repeat.kb=e.d;else c.z()}else if(a&m.URL&&!b.src)b.src=f;else return null}if(!b.src||!h||h.length<1||h.length>4||j&&j.length>4||i===1&&j.length<1||d&&d.length>4||i===2&&d.length<1)return null;if(!b.repeat)b.repeat={f:"stretch"};if(!b.repeat.kb)b.repeat.kb=b.repeat.f;a=function(r,o){return{T:o(r[0]),S:o(r[1]||r[0]),L:o(r[2]||r[0]),Q:o(r[3]||
+r[1]||r[0])}};b.slice=a(h,function(r){return g.k(r.h&t?r.d+"px":r.d)});b.width=j&&j.length>0?a(j,function(r){return r.h&(n|p)?g.k(r.d):r.d}):(k=this.e.currentStyle)&&{T:g.k(k.borderTopWidth),S:g.k(k.borderRightWidth),L:g.k(k.borderBottomWidth),Q:g.k(k.borderLeftWidth)};b.ua=a(d||[0],function(r){return r.h&n?g.k(r.d):r.d})}return b}});g.Zb=g.s.$({na:"box-shadow",va:"boxShadow",ba:function(a){var b,c=g.k,e=g.u.ja,f;if(a){f=new g.u(a);b={ua:[],cb:[]};for(a=function(){for(var h,j,d,i,k,m;h=f.next();){d=
+h.d;j=h.h;if(j&e.ha&&d===",")break;else if(h.db()&&!k){f.z();k=f.da(function(l){return!l.db()})}else if(j&e.ea&&!i)i=d;else if(j&e.fa&&d==="inset"&&!m)m=true;else return false}h=k&&k.length;if(h>1&&h<5){(m?b.cb:b.ua).push({fd:c(k[0].d),gd:c(k[1].d),blur:c(k[2]?k[2].d:"0"),Xc:c(k[3]?k[3].d:"0"),color:g.pa(i||"currentColor")});return true}return false};a(););}return b&&(b.cb.length||b.ua.length)?b:null}});g.ec=g.s.$({qa:g.s.ma(function(){var a=this.e.currentStyle;return a.visibility+"|"+a.display}),
+ba:function(){var a=this.e,b=a.runtimeStyle;a=a.currentStyle;var c=b.visibility,e;b.visibility="";e=a.visibility;b.visibility=c;return{cd:e!=="hidden",xc:a.display!=="none"}},g:function(){return false}});g.B={Z:function(a){function b(c,e,f,h){this.e=c;this.q=e;this.j=f;this.parent=h}g.p.fb(b.prototype,g.B,a);return b},eb:false,R:function(){return false},Kb:function(){this.n();this.g()&&this.X()},jb:function(){this.eb=true},Lb:function(){this.g()?this.X():this.n()},Wa:function(a,b){this.Hb(a);for(var c=
+this.ka||(this.ka=[]),e=a+1,f=c.length,h;e<f;e++)if(h=c[e])break;c[a]=b;this.w().insertBefore(b,h||null)},ra:function(a){var b=this.ka;return b&&b[a]||null},Hb:function(a){var b=this.ra(a),c=this.Ba;if(b&&c){c.removeChild(b);this.ka[a]=null}},sa:function(a,b,c,e){var f=this.Va||(this.Va={}),h=f[a];if(!h){h=f[a]=g.p.Ga("shape");if(b)h.appendChild(h[b]=g.p.Ga(b));if(e){c=this.ra(e);if(!c){this.Wa(e,doc.createElement("group"+e));c=this.ra(e)}}c.appendChild(h);a=h.style;a.position="absolute";a.left=a.top=
+0;a.behavior="url(#default#VML)"}return h},Za:function(a){var b=this.Va,c=b&&b[a];if(c){c.parentNode.removeChild(c);delete b[a]}return!!c},xb:function(a){var b=this.e,c=this.q.o(),e=c.i,f=c.f,h,j,d,i,k,m;c=a.x.tl.a(b,e);h=a.y.tl.a(b,f);j=a.x.tr.a(b,e);d=a.y.tr.a(b,f);i=a.x.br.a(b,e);k=a.y.br.a(b,f);m=a.x.bl.a(b,e);a=a.y.bl.a(b,f);e=Math.min(e/(c+j),f/(d+k),e/(m+i),f/(h+a));if(e<1){c*=e;h*=e;j*=e;d*=e;i*=e;k*=e;m*=e;a*=e}return{x:{tl:c,tr:j,br:i,bl:m},y:{tl:h,tr:d,br:k,bl:a}}},oa:function(a,b,c){b=
+b||1;var e,f,h=this.q.o();f=h.i*b;h=h.f*b;var j=this.j.v,d=Math.floor,i=Math.ceil,k=a?a.T*b:0,m=a?a.S*b:0,l=a?a.L*b:0;a=a?a.Q*b:0;var t,n,p,s,u;if(c||j.g()){e=this.xb(c||j.m());c=e.x.tl*b;j=e.y.tl*b;t=e.x.tr*b;n=e.y.tr*b;p=e.x.br*b;s=e.y.br*b;u=e.x.bl*b;b=e.y.bl*b;f="m"+d(a)+","+d(j)+"qy"+d(c)+","+d(k)+"l"+i(f-t)+","+d(k)+"qx"+i(f-m)+","+d(n)+"l"+i(f-m)+","+i(h-s)+"qy"+i(f-p)+","+i(h-l)+"l"+d(u)+","+i(h-l)+"qx"+d(a)+","+i(h-b)+" x e"}else f="m"+d(a)+","+d(k)+"l"+i(f-m)+","+d(k)+"l"+i(f-m)+","+i(h-
+l)+"l"+d(a)+","+i(h-l)+"xe";return f},w:function(){var a=this.parent.ra(this.C),b;if(!a){a=doc.createElement(this.Fa);b=a.style;b.position="absolute";b.top=b.left=0;this.parent.Wa(this.C,a)}return a},n:function(){this.parent.Hb(this.C);delete this.Va;delete this.ka}};g.cc=g.B.Z({g:function(){var a=this.oc;for(var b in a)if(a.hasOwnProperty(b)&&a[b].g())return true;return false},R:function(){return this.j.lb.D()},jb:function(){if(this.g()){var a=this.wb(),b=a,c;a=a.currentStyle;var e=a.position,f=
+this.w().style,h=0,j=0;j=this.q.o();if(e==="fixed"&&g.J>6){h=j.x;j=j.y;b=e}else{do b=b.offsetParent;while(b&&b.currentStyle.position==="static");if(b){c=b.getBoundingClientRect();b=b.currentStyle;h=j.x-c.left-(parseFloat(b.borderLeftWidth)||0);j=j.y-c.top-(parseFloat(b.borderTopWidth)||0)}else{b=doc.documentElement;h=j.x+b.scrollLeft-b.clientLeft;j=j.y+b.scrollTop-b.clientTop}b="absolute"}f.position=b;f.left=h;f.top=j;f.zIndex=e==="static"?-1:a.zIndex;this.eb=true}},Lb:function(){},Mb:function(){var a=
+this.j.lb.m();this.w().style.display=a.cd&&a.xc?"":"none"},Kb:function(){this.g()?this.Mb():this.n()},wb:function(){var a=this.e;return a.tagName in g.Jb?a.offsetParent:a},w:function(){var a=this.Ba,b;if(!a){b=this.wb();a=this.Ba=doc.createElement("css3-container");a.style.direction="ltr";this.Mb();b.parentNode.insertBefore(a,b)}return a},n:function(){var a=this.Ba,b;if(a&&(b=a.parentNode))b.removeChild(a);delete this.Ba;delete this.ka}});g.Sb=g.B.Z({C:2,Fa:"background",R:function(){var a=this.j;
+return a.H.D()||a.v.D()},g:function(){var a=this.j;return a.N.g()||a.v.g()||a.H.g()||a.W.g()&&a.W.m().cb},X:function(){var a=this.q.o();if(a.i&&a.f){this.yc();this.zc()}},yc:function(){var a=this.j.H.m(),b=this.q.o(),c=this.e,e=a&&a.color,f,h;if(e&&e.la()>0){this.yb();a=this.sa("bgColor","fill",this.w(),1);f=b.i;b=b.f;a.stroked=false;a.coordsize=f*2+","+b*2;a.coordorigin="1,1";a.path=this.oa(null,2);h=a.style;h.width=f;h.height=b;a.fill.color=e.O(c);c=e.la();if(c<1)a.fill.opacity=c}else this.Za("bgColor")},
+zc:function(){var a=this.j.H.m(),b=this.q.o();a=a&&a.M;var c,e,f,h,j;if(a){this.yb();e=b.i;f=b.f;for(j=a.length;j--;){b=a[j];c=this.sa("bgImage"+j,"fill",this.w(),2);c.stroked=false;c.fill.type="tile";c.fillcolor="none";c.coordsize=e*2+","+f*2;c.coordorigin="1,1";c.path=this.oa(0,2);h=c.style;h.width=e;h.height=f;if(b.P==="linear-gradient")this.mc(c,b);else{c.fill.src=b.Cb;this.Pc(c,j)}}}for(j=a?a.length:0;this.Za("bgImage"+j++););},Pc:function(a,b){g.p.Pb(a.fill.src,function(c){var e=a.fill,f=this.e,
+h=this.q.o(),j=h.i;h=h.f;var d=this.j,i=d.I.m(),k=i&&i.nb;i=k?k.t.a(f):0;var m=k?k.r.a(f):0,l=k?k.b.a(f):0;k=k?k.l.a(f):0;d=d.H.m().M[b];f=d.Ya?d.Ya.coords(f,j-c.i-k-m,h-c.f-i-l):{x:0,y:0};d=d.Bb;l=m=0;var t=j+1,n=h+1,p=g.J===8?0:1;k=Math.round(f.x)+k+0.5;i=Math.round(f.y)+i+0.5;e.position=k/j+","+i/h;if(d&&d!=="repeat"){if(d==="repeat-x"||d==="no-repeat"){m=i+1;n=i+c.f+p}if(d==="repeat-y"||d==="no-repeat"){l=k+1;t=k+c.i+p}a.style.clip="rect("+m+"px,"+t+"px,"+n+"px,"+l+"px)"}},this)},mc:function(a,
+b){function c(B,C,z,F,H){if(z===0||z===180)return[F,C];else if(z===90||z===270)return[B,H];else{z=Math.tan(-z*t/180);B=z*B-C;C=-1/z;F=C*F-H;H=C-z;return[(F-B)/H,(z*F-C*B)/H]}}function e(){w=m>=90&&m<270?i:0;r=m<180?k:0;o=i-w;x=k-r}function f(){for(;m<0;)m+=360;m%=360}function h(B,C){var z=C[0]-B[0];B=C[1]-B[1];return Math.abs(z===0?B:B===0?z:Math.sqrt(z*z+B*B))}var j=this.e,d=this.q.o(),i=d.i,k=d.f;a=a.fill;var m=b.Xa,l=b.bb;b=b.ca;d=b.length;var t=Math.PI,n,p,s,u,w,r,o,x,q,y,A,D;if(l){l=l.coords(j,
+i,k);n=l.x;p=l.y}if(m){m=m.vc();f();e();if(!l){n=w;p=r}l=c(n,p,m,o,x);s=l[0];u=l[1]}else if(l){s=i-n;u=k-p}else{n=p=s=0;u=k}l=s-n;q=u-p;if(m===void 0){m=!l?q<0?90:270:!q?l<0?180:0:-Math.atan2(q,l)/t*180;f();e()}l=m%90?Math.atan2(l*i/k,q)/t*180:m+90;l+=180;l%=360;y=h([n,p],[s,u]);s=h([w,r],c(w,r,m,o,x));u=[];p=h([n,p],c(n,p,m,w,r))/s*100;n=[];for(q=0;q<d;q++)n.push(b[q].Fb?b[q].Fb.a(j,y):q===0?0:q===d-1?y:null);for(q=1;q<d;q++){if(n[q]===null){A=n[q-1];y=q;do D=n[++y];while(D===null);n[q]=A+(D-A)/
+(y-q+1)}n[q]=Math.max(n[q],n[q-1])}for(q=0;q<d;q++)u.push(p+n[q]/s*100+"% "+b[q].color.O(j));a.angle=l;a.type="gradient";a.method="sigma";a.color=b[0].color.O(j);a.color2=b[d-1].color.O(j);a.colors.value=u.join(",")},yb:function(){var a=this.e.runtimeStyle;a.backgroundImage="url(about:blank)";a.backgroundColor="transparent"},n:function(){g.B.n.call(this);var a=this.e.runtimeStyle;a.backgroundImage=a.backgroundColor=""}});g.Wb=g.B.Z({C:4,Fa:"border",qc:{TABLE:1,INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,
+IMG:1,HR:1,FIELDSET:1},Jc:{submit:1,button:1,reset:1},R:function(){var a=this.j;return a.I.D()||a.v.D()},g:function(){var a=this.j;return(a.N.g()||a.v.g()||a.H.g())&&a.I.g()},X:function(){var a=this.e,b=this.j.I.m(),c=this.q.o(),e=c.i;c=c.f;var f,h,j,d,i;if(b){this.Hc();b=this.Bc(2);d=0;for(i=b.length;d<i;d++){j=b[d];f=this.sa("borderPiece"+d,j.stroke?"stroke":"fill",this.w());f.coordsize=e*2+","+c*2;f.coordorigin="1,1";f.path=j.path;h=f.style;h.width=e;h.height=c;f.filled=!!j.fill;f.stroked=!!j.stroke;
+if(j.stroke){f=f.stroke;f.weight=j.mb+"px";f.color=j.color.O(a);f.dashstyle=j.stroke==="dashed"?"2 2":j.stroke==="dotted"?"1 1":"solid";f.linestyle=j.stroke==="double"&&j.mb>2?"ThinThin":"Single"}else f.fill.color=j.fill.O(a)}for(;this.Za("borderPiece"+d++););}},Hc:function(){var a=this.e,b=a.currentStyle,c=a.runtimeStyle,e=a.tagName,f=g.J===6,h;if(f&&e in this.qc||e==="BUTTON"||e==="INPUT"&&a.type in this.Jc){c.borderWidth="";e=this.j.I.Ib;for(h=e.length;h--;){f=e[h];c["padding"+f]="";c["padding"+
+f]=g.k(b["padding"+f]).a(a)+g.k(b["border"+f+"Width"]).a(a)+(!g.J===8&&h%2?1:0)}c.borderWidth=0}else if(f){if(a.childNodes.length!==1||a.firstChild.tagName!=="ie6-mask"){b=doc.createElement("ie6-mask");e=b.style;e.visibility="visible";for(e.zoom=1;e=a.firstChild;)b.appendChild(e);a.appendChild(b);c.visibility="hidden"}}else c.borderColor="transparent"},Bc:function(a){var b=this.e,c,e,f,h=this.j.I,j=[],d,i,k,m,l=Math.round,t,n,p;if(h.g()){c=h.m();h=c.nb;n=c.Zc;p=c.tc;if(c.ed&&c.$c&&c.uc){if(p.t.la()>
+0){c=h.t.a(b);k=c/2;j.push({path:this.oa({T:k,S:k,L:k,Q:k},a),stroke:n.t,color:p.t,mb:c})}}else{a=a||1;c=this.q.o();e=c.i;f=c.f;c=l(h.t.a(b));k=l(h.r.a(b));m=l(h.b.a(b));b=l(h.l.a(b));var s={t:c,r:k,b:m,l:b};b=this.j.v;if(b.g())t=this.xb(b.m());d=Math.floor;i=Math.ceil;var u=function(o,x){return t?t[o][x]:0},w=function(o,x,q,y,A,D){var B=u("x",o),C=u("y",o),z=o.charAt(1)==="r";o=o.charAt(0)==="b";return B>0&&C>0?(D?"al":"ae")+(z?i(e-B):d(B))*a+","+(o?i(f-C):d(C))*a+","+(d(B)-x)*a+","+(d(C)-q)*a+","+
+y*65535+","+2949075*(A?1:-1):(D?"m":"l")+(z?e-x:x)*a+","+(o?f-q:q)*a},r=function(o,x,q,y){var A=o==="t"?d(u("x","tl"))*a+","+i(x)*a:o==="r"?i(e-x)*a+","+d(u("y","tr"))*a:o==="b"?i(e-u("x","br"))*a+","+d(f-x)*a:d(x)*a+","+i(f-u("y","bl"))*a;o=o==="t"?i(e-u("x","tr"))*a+","+i(x)*a:o==="r"?i(e-x)*a+","+i(f-u("y","br"))*a:o==="b"?d(u("x","bl"))*a+","+d(f-x)*a:d(x)*a+","+d(u("y","tl"))*a;return q?(y?"m"+o:"")+"l"+A:(y?"m"+A:"")+"l"+o};b=function(o,x,q,y,A,D){var B=o==="l"||o==="r",C=s[o],z,F;if(C>0&&n[o]!==
+"none"&&p[o].la()>0){z=s[B?o:x];x=s[B?x:o];F=s[B?o:q];q=s[B?q:o];if(n[o]==="dashed"||n[o]==="dotted"){j.push({path:w(y,z,x,D+45,0,1)+w(y,0,0,D,1,0),fill:p[o]});j.push({path:r(o,C/2,0,1),stroke:n[o],mb:C,color:p[o]});j.push({path:w(A,F,q,D,0,1)+w(A,0,0,D-45,1,0),fill:p[o]})}else j.push({path:w(y,z,x,D+45,0,1)+r(o,C,0,0)+w(A,F,q,D,0,0)+(n[o]==="double"&&C>2?w(A,F-d(F/3),q-d(q/3),D-45,1,0)+r(o,i(C/3*2),1,0)+w(y,z-d(z/3),x-d(x/3),D,1,0)+"x "+w(y,d(z/3),d(x/3),D+45,0,1)+r(o,d(C/3),1,0)+w(A,d(F/3),d(q/
+3),D,0,0):"")+w(A,0,0,D-45,1,0)+r(o,0,1,0)+w(y,0,0,D,1,0),fill:p[o]})}};b("t","l","r","tl","tr",90);b("r","t","b","tr","br",0);b("b","r","l","br","bl",-90);b("l","b","t","bl","tl",-180)}}return j},n:function(){g.B.n.call(this);this.e.runtimeStyle.borderColor=""}});g.Ub=g.B.Z({C:5,Oc:["t","tr","r","br","b","bl","l","tl","c"],R:function(){return this.j.N.D()},g:function(){return this.j.N.g()},X:function(){this.w();var a=this.j.N.m(),b=this.q.o(),c=this.e,e=this.Gb;g.p.Pb(a.src,function(f){function h(w,
+r,o,x,q){w=e[w].style;var y=Math.max;w.width=y(r,0);w.height=y(o,0);w.left=x;w.top=q}function j(w,r,o){for(var x=0,q=w.length;x<q;x++)e[w[x]].imagedata[r]=o}var d=b.i,i=b.f,k=a.width,m=k.T.a(c),l=k.S.a(c),t=k.L.a(c);k=k.Q.a(c);var n=a.slice,p=n.T.a(c),s=n.S.a(c),u=n.L.a(c);n=n.Q.a(c);h("tl",k,m,0,0);h("t",d-k-l,m,k,0);h("tr",l,m,d-l,0);h("r",l,i-m-t,d-l,m);h("br",l,t,d-l,i-t);h("b",d-k-l,t,k,i-t);h("bl",k,t,0,i-t);h("l",k,i-m-t,0,m);h("c",d-k-l,i-m-t,k,m);j(["tl","t","tr"],"cropBottom",(f.f-p)/f.f);
+j(["tl","l","bl"],"cropRight",(f.i-n)/f.i);j(["bl","b","br"],"cropTop",(f.f-u)/f.f);j(["tr","r","br"],"cropLeft",(f.i-s)/f.i);if(a.repeat.kb==="stretch"){j(["l","r","c"],"cropTop",p/f.f);j(["l","r","c"],"cropBottom",u/f.f)}if(a.repeat.f==="stretch"){j(["t","b","c"],"cropLeft",n/f.i);j(["t","b","c"],"cropRight",s/f.i)}e.c.style.display=a.fill?"":"none"},this)},w:function(){var a=this.parent.ra(this.C),b,c,e,f=this.Oc,h=f.length;if(!a){a=doc.createElement("border-image");b=a.style;b.position="absolute";
+this.Gb={};for(e=0;e<h;e++){c=this.Gb[f[e]]=g.p.Ga("rect");c.appendChild(g.p.Ga("imagedata"));b=c.style;b.behavior="url(#default#VML)";b.position="absolute";b.top=b.left=0;c.imagedata.src=this.j.N.m().src;c.stroked=false;c.filled=false;a.appendChild(c)}this.parent.Wa(this.C,a)}return a}});g.Yb=g.B.Z({C:1,Fa:"outset-box-shadow",R:function(){var a=this.j;return a.W.D()||a.v.D()},g:function(){var a=this.j.W;return a.g()&&a.m().ua[0]},X:function(){function a(z,F,H,K,J,v,E){z=b.sa("shadow"+z+F,"fill",
+e,j-z);F=z.fill;z.coordsize=m*2+","+l*2;z.coordorigin="1,1";z.stroked=false;z.filled=true;F.color=J.O(c);if(v){F.type="gradienttitle";F.color2=F.color;F.opacity=0}z.path=E;u=z.style;u.left=H;u.top=K;u.width=m;u.height=l;return z}var b=this,c=this.e,e=this.w(),f=this.j,h=f.W.m().ua;f=f.v.m();var j=h.length,d=j,i,k=this.q.o(),m=k.i,l=k.f;k=g.J===8?1:0;for(var t=["tl","tr","br","bl"],n,p,s,u,w,r,o,x,q,y,A,D,B,C;d--;){p=h[d];w=p.fd.a(c);r=p.gd.a(c);i=p.Xc.a(c);o=p.blur.a(c);p=p.color;x=-i-o;if(!f&&o)f=
+g.Oa.Qb;x=this.oa({T:x,S:x,L:x,Q:x},2,f);if(o){q=(i+o)*2+m;y=(i+o)*2+l;A=o*2/q;D=o*2/y;if(o-i>m/2||o-i>l/2)for(i=4;i--;){n=t[i];B=n.charAt(0)==="b";C=n.charAt(1)==="r";n=a(d,n,w,r,p,o,x);s=n.fill;s.focusposition=(C?1-A:A)+","+(B?1-D:D);s.focussize="0,0";n.style.clip="rect("+((B?y/2:0)+k)+"px,"+(C?q:q/2)+"px,"+(B?y:y/2)+"px,"+((C?q/2:0)+k)+"px)"}else{n=a(d,"",w,r,p,o,x);s=n.fill;s.focusposition=A+","+D;s.focussize=1-A*2+","+(1-D*2)}}else{n=a(d,"",w,r,p,o,x);w=p.la();if(w<1)n.fill.opacity=w}}}});g.bc=
+g.B.Z({C:6,Fa:"imgEl",R:function(){var a=this.j;return this.e.src!==this.hc||a.v.D()},g:function(){var a=this.j;return a.v.g()||a.H.Eb()},X:function(){this.hc=j;this.Gc();var a=this.sa("img","fill",this.w()),b=a.fill,c=this.q.o(),e=c.i;c=c.f;var f=this.j.I.m();f=f&&f.nb;var h=this.e,j=h.src,d=Math.round;a.stroked=false;b.type="frame";b.src=j;b.position=(e?0.5/e:0)+","+(c?0.5/c:0);a.coordsize=e*2+","+c*2;a.coordorigin="1,1";a.path=this.oa(f?{T:d(f.t.a(h)),S:d(f.r.a(h)),L:d(f.b.a(h)),Q:d(f.l.a(h))}:
+0,2);a=a.style;a.width=e;a.height=c},Gc:function(){this.e.runtimeStyle.filter="alpha(opacity=0)"},n:function(){g.B.n.call(this);this.e.runtimeStyle.filter=""}});g.Qa=function(){function a(d){function i(){if(!z){var v,E,G=d.currentStyle,I=G.getAttribute(c)==="true";J=G.getAttribute(e);J=g.Ab===8?J!=="false":J==="true";if(!C){C=1;d.runtimeStyle.zoom=1;G=d;for(var O=1;G=G.previousSibling;)if(G.nodeType===1){O=0;break}if(O)d.className+=" "+g.Pa+"first-child"}y.Ja();if(I&&(E=y.o())&&(v=doc.documentElement||
+doc.body)&&(E.y>v.clientHeight||E.x>v.clientWidth||E.y+E.f<0||E.x+E.i<0)){if(!H){H=1;g.Ra.aa(i)}}else{z=1;H=C=0;g.Ra.Ma(i);A={H:new g.Tb(d),I:new g.Xb(d),N:new g.Vb(d),v:new g.Oa(d),W:new g.Zb(d),lb:new g.ec(d)};D=[A.H,A.I,A.N,A.v,A.W,A.lb];v=new g.cc(d,y,A);E=[new g.Yb(d,y,A,v),new g.Sb(d,y,A,v),new g.Wb(d,y,A,v),new g.Ub(d,y,A,v)];d.tagName==="IMG"&&E.push(new g.bc(d,y,A,v));v.oc=E;q=[v].concat(E);if(v=d.currentStyle.getAttribute(g.F+"watch-ancestors")){B=[];v=parseInt(v,10);E=0;for(I=d.parentNode;I&&
+(v==="NaN"||E++<v);){B.push(I);I.attachEvent("onpropertychange",u);I.attachEvent("onmouseenter",p);I.attachEvent("onmouseleave",s);I=I.parentNode}}if(J){g.ya.aa(m);g.ya.Tc()}m(1)}if(!F){F=1;d.attachEvent("onmove",k);d.attachEvent("onresize",k);d.attachEvent("onpropertychange",l);d.attachEvent("onmouseenter",p);d.attachEvent("onmouseleave",s);g.za.aa(k);g.G.aa(o)}y.La()}}function k(){y&&y.Ec()&&m()}function m(v){if(!K)if(z){var E,G;w();if(v||y.Qc()){E=0;for(G=q.length;E<G;E++)q[E].jb()}if(v||y.Vc()){E=
+0;for(G=q.length;E<G;E++)q[E].Lb()}r()}else C||i()}function l(){var v,E,G;v=event;if(!K&&!(v&&v.propertyName in j))if(z){w();v=0;for(E=q.length;v<E;v++){G=q[v];G.eb||G.jb();G.R()&&G.Kb()}r()}else C||i()}function t(){if(d)d.className+=f}function n(){if(d)d.className=d.className.replace(h,"")}function p(){setTimeout(t,0)}function s(){setTimeout(n,0)}function u(){var v=event.propertyName;if(v==="className"||v==="id")l()}function w(){y.Ja();for(var v=D.length;v--;)D[v].Ja()}function r(){for(var v=D.length;v--;)D[v].La();
+y.La()}function o(){if(F){if(B)for(var v=0,E=B.length,G;v<E;v++){G=B[v];G.detachEvent("onpropertychange",u);G.detachEvent("onmouseenter",p);G.detachEvent("onmouseleave",s)}d.detachEvent("onmove",m);d.detachEvent("onresize",m);d.detachEvent("onpropertychange",l);d.detachEvent("onmouseenter",p);d.detachEvent("onmouseleave",s);g.G.Ma(o);F=0}}function x(){if(!K){var v,E;o();K=1;if(q){v=0;for(E=q.length;v<E;v++)q[v].n()}J&&g.ya.Ma(m);g.za.Ma(m);q=y=A=D=B=d=null}}var q,y=new M(d),A,D,B,C,z,F,H,K,J;this.Ic=
+i;this.update=m;this.n=x;this.Ac=d}var b={},c=g.F+"lazy-init",e=g.F+"poll",f=" "+g.Pa+"hover",h=new RegExp("\\b"+g.Pa+"hover\\b","g"),j={background:1,bgColor:1,display:1};a.Cc=function(d){var i=g.p.ta(d);return b[i]||(b[i]=new a(d))};a.n=function(d){d=g.p.ta(d);var i=b[d];if(i){i.n();delete b[d]}};a.wc=function(){var d=[],i;if(b){for(var k in b)if(b.hasOwnProperty(k)){i=b[k];d.push(i.Ac);i.n()}b={}}return d};return a}();g.attach=function(a){g.Ab<9&&g.Qa.Cc(a).Ic()};g.detach=function(a){g.Qa.n(a)}};
+var N=window.PIE,P=element;function init(){N&&doc.media!=="print"&&N.attach(P)}function cleanup(){if(N){N.detach(P);N=P=0}}P.readyState==="complete"&&init();
+</script>
+</PUBLIC:COMPONENT>
diff --git a/webcit/static/styles/banner.css b/webcit/static/styles/banner.css
new file mode 100644 (file)
index 0000000..4d43716
--- /dev/null
@@ -0,0 +1,128 @@
+#banner {
+       background: #4D555C;
+       background: -webkit-gradient(linear, 0 0, 0 bottom, from(#4D555C), to(#7D858C));
+       background: -moz-linear-gradient(#4D555C, #7D858C);
+       background: linear-gradient(#4D555C, #7D858C);
+       -pie-background: linear-gradient(#4D555C, #7D858C);
+       behavior: url(/static/styles/PIE.htc);
+        border-bottom: 2px solid #424b52;
+       color: #f0feff;
+       margin: 0;
+       padding: 0;
+       top: 0;
+       height: 100px;          /* when changing this, also change #content */
+       position: fixed;
+       width: 84%;             /* when changing this, also change #iconbar and #content */
+       left: 16%;              /* when changing this, also change #iconbar and #content */
+       z-index: 3;                                                
+       overflow: hidden;
+}
+
+#banner table { width: 100% }
+
+#banner a { color: #f0feff }
+
+#banner h1 {
+       font-size: 160%;
+       font-weight: 700;
+}
+
+#banner #rmname { white-space: nowrap; }
+
+#banner h2 { font-weight: 700}
+
+#banner h2, #banner .titlebar { font-size: 130% }
+
+#banner ul.room_actions li.start_page a {
+       background-color: #5C646B;
+       color: #FEFFFC;
+       border: 1px solid black;
+}
+
+#banner .banner {}
+
+/* style for the rooom picture */
+#banner td img {
+       padding: 0;
+       margin: 0.5em;
+       max-height: 64px;
+       float: left;
+}
+
+#banner h1, #banner h2 {
+       padding: 0;
+       margin: 0;
+}
+
+#banner .banner p {
+       padding: 0;
+       margin: 0;
+}
+
+/* style for the feed, file, etc picture */
+#banner .banner td  a > img {
+       clear: both;
+       padding: 0;
+       margin: 0 0.3em;
+       border: none;
+}
+
+#banner .infos{ margin: 0.5em }
+
+#room_infos {
+       position: absolute;
+       top: 0;
+       left: 50%;
+       width: 45%;
+       z-index: 10;
+       cursor: pointer;
+       text-align: left;
+       padding: 10px 2px 2px 2px;
+}
+
+#room_infos img.close_infos { float: right }
+
+#actiondiv {
+       float: right;
+       margin: 0;
+       padding: 0;
+       text-align: right;
+       font-size: 70%;
+       font-weight: bold;
+}
+
+#banner ul.room_actions {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+}
+#banner ul.room_actions li {
+       white-space: nowrap;
+}
+#banner ul.room_actions li form {
+       margin: 0;
+       padding: 0;
+}
+
+#banner ul.room_actions li select, #banner ul.room_actions li input {
+       margin-top: 2px;
+       margin-right: 2px;
+}
+
+#room_banner_override {
+       display: none;
+}
+
+#nummsgs, #numfiles { 
+       font-size: 75%;
+       margin-left: 0.5em;
+}
+
+#selectpage.hidden { display: none !important }
+
+
+.banner .infos { cursor: help }
+
+.room_actions form select { cursor: pointer }
+
+.start_page { font-size: 50% }
diff --git a/webcit/static/styles/blog.css b/webcit/static/styles/blog.css
new file mode 100644 (file)
index 0000000..ad36131
--- /dev/null
@@ -0,0 +1,77 @@
+.blog_post {
+        margin: 0.5em;
+        width: 38em;
+}
+
+.blog_post hr {
+       margin: 1em 0.25em;
+       padding: 0 0.25em;
+       border: 1px dotted #5C646B;
+}
+
+.blog_post_title a:link, .blog_post_title a:visited, .blog_post_title a:active {
+       font-size: 150%;
+       font-weight: bold;
+       color: #000;
+}
+
+.blog_post_title a:hover {
+        color: #0E73E3;
+}
+
+       
+.blog_post_header a:link, .blog_comment_header a:link { 
+       font-style: italic;
+       color: #000;
+ }
+
+.blog_post_header {
+       margin: 0 1em; /* adjust with .blog_show_comments_link */
+       font-size: smaller;
+}
+
+.blog_post_content, .blog_comment_content {
+       font-family: serif;
+       font-size: 90%;
+}
+
+a.blog_show_comments_link:link, a.blog_show_comments_link:active, a.blog_show_comments_link:visited {
+       margin-left: 1em;
+       color: #000;
+       font-size: smaller;
+}
+
+.blog_permalink_link {
+       font-size: smaller;
+}
+
+.blog_comment {
+       margin: 0.5em;
+       padding: 0.5em 0.25em 0.25em;
+       width: 35em;
+       border-top: 1px dotted grey;
+       background-color: #EDEDE0;
+}
+
+.blog_comment_unread {
+       margin: 0.5em;
+       padding: 0.5em 0.25em 0.25em;
+       width: 35em;
+       border-top: 1px dotted grey;
+       background-color: #EFEFE0;
+}
+
+.blog_comment_header {
+       font-size: smaller;
+}
+
+.blog_comment_date {float:right}
+
+.blog_comment_content {
+       margin: 0.25em;
+}
+                     
+.post_a_comment_title {
+        font-size: 120%;
+}
+
diff --git a/webcit/static/styles/box.css b/webcit/static/styles/box.css
new file mode 100644 (file)
index 0000000..cb15082
--- /dev/null
@@ -0,0 +1,43 @@
+.box {
+       background-color: transparent;
+       width: 100%;
+       padding: 0;
+       margin: 0;
+}
+
+#content .box {
+       text-align: center;
+}
+
+.boxlabel, .boxcontent { margin: 0 }
+
+#content .boxlabel, #global .boxlabel {
+       padding: 0;
+       width: 100%;
+       text-align: center;
+}
+
+.boxlabel {
+       background-color: #5C646B;
+       color: #FEFFFC;
+       font-weight: 700;
+       text-align: center;
+       padding: 0;
+       border-radius: 8px 8px 0 0;
+       -webkit-border-radius: 8px 8px 0 0;
+       -moz-border-radius: 8px 8px 0 0;
+}
+
+.boxcontent {
+       text-align: left;
+       padding: 5px;
+       background-color: #FEFFFC;
+       color: #000;
+       border: 2px solid #5C646B;
+       border-radius: 0 0 8px 8px;
+       -webkit-border-radius: 0 0 8px 8px;
+       -moz-border-radius: 0 0 8px 8px; 
+       -webkit-box-shadow: #666 0px 1px 2px;
+       -moz-box-shadow: #666 0px 2px 3px;
+       box-shadow: #666 0px 2px 3px;
+}
diff --git a/webcit/static/styles/content.css b/webcit/static/styles/content.css
new file mode 100644 (file)
index 0000000..01e70b3
--- /dev/null
@@ -0,0 +1,69 @@
+#content {
+       position: fixed;
+       top: 100px;             /* when changing this, also change #banner and #iconbar */
+       left: 16%;              /* when changing this, also change #banner and #iconbar */
+       bottom: 0;
+       width: 84%;             /* when changing this, also change #banner and #iconbar */
+       background: #F3F6F2;
+       color: #000;
+       z-index: 2;
+       overflow-y: auto;
+       padding-top: 0.5em;
+}
+
+.boxcontent table {
+       margin: 0;
+       padding: 0;
+}
+
+#content table .box {
+       margin: 0;
+       width: 100%;
+       text-align: left;
+}
+
+.service, .who_is_online {
+       text-align: center;
+       width: 100%;
+}
+
+.service table {
+       margin: 0 auto 0 auto;
+       width: 100%;
+       text-align: left;
+}
+
+.instructions {
+       text-align: center;
+}
+
+.moreprompt {
+       margin: 0 1em;
+       text-align: center;
+       font-size: small;
+       background-color: #4d555c;
+       color: #ddd;
+       border: 2px solid #4d555c; /*in order to make the hover effect pop out nice */
+       /*border-radius: 5px;
+       -webkit-border-radius: 5px;
+       -moz-border-radius: 5px; */
+}
+.moreprompt_link {
+       color: #ddd;
+       font-weight: bold;
+}
+.moreprompt_link:hover {
+       background-color: #ddd;
+       color: #4d555c;
+       border: 0px solid #5c646b;
+       border-radius: 5px;
+       -webkit-border-radius: 5px;
+       -moz-border-radius: 5px;
+}
+
+/* a > div.moreprompt { 
+       border: none;
+       border-radius: 0; } */
+
diff --git a/webcit/static/styles/datepicker.css b/webcit/static/styles/datepicker.css
new file mode 100644 (file)
index 0000000..ec5d2b2
--- /dev/null
@@ -0,0 +1,88 @@
+/**
+ * DatePicker widget using Prototype and Scriptaculous.
+ * (c) 2007 Mathieu Jondet <mathieu@eulerian.com>
+ * Eulerian Technologies
+ *
+ * DatePicker is freely distributable under the same terms as Prototype.
+ *
+ */
+
+div.datepicker {
+ position: absolute;
+ text-align: center;
+ border: 1px #C4D5E3 solid;
+ font-family: arial;
+ background: #FFFFFF;
+ font-size: 10px;
+ padding: 0px;
+ z-index: 4;
+}
+div.datepicker table {
+ font-size: 10px;
+ margin: 0px;
+ padding: 0px;
+ text-align: center;
+ width: 180px;
+}
+div.datepicker table thead tr th {
+ font-size: 12px;
+ font-weight: bold;
+ background: #e9eff4;
+ border-bottom:1px solid #c4d5e3;
+ padding: 0px;
+ margin: 0px;
+}
+div.datepicker table tbody tr {
+ border: 1px white solid;
+ margin: 0px;
+ padding: 0px;
+}
+div.datepicker table tbody tr td {
+ border: 1px #eaeaea solid;
+ margin: 0px;
+ padding: 0px;
+ text-align: center;
+}
+div.datepicker table tbody tr td:hover,
+div.datepicker table tbody tr td.outbound:hover,
+div.datepicker table tbody tr td.today:hover {
+ border: 1px #c4d5e3 solid;
+ background: #e9eff4;
+ cursor: pointer;
+}
+div.datepicker table tbody tr td.wday {
+ border: 1px #ffffff solid;
+ background: #ffffff;
+ cursor: text;
+}
+div.datepicker table tbody tr td.outbound {
+ background: #e8e4e4;
+}
+div.datepicker table tbody tr td.today {
+ border: 1px #16518e solid;
+ background: #c4d5e3;
+}
+div.datepicker table tbody tr td.nclick,
+div.datepicker table tbody tr td.nclick_outbound {
+ cursor:default; color:#aaa;
+}
+div.datepicker table tbody tr td.nclick_outbound {
+ background:#E8E4E4;
+}
+div.datepicker table tbody tr td.nclick:hover,
+div.datepicker table tbody tr td.nclick_outbound:hover {
+ border: 1px #eaeaea solid;
+ background: #FFF;
+}
+div.datepicker table tbody tr td.nclick_outbound:hover {
+ background:#E8E4E4;
+}
+div.datepicker table tfoot {
+ font-size: 10px;
+ background: #e9eff4;
+ border-top:1px solid #c4d5e3;
+ cursor: pointer;
+ text-align: center;
+ padding: 0px;
+}
+
diff --git a/webcit/static/styles/fineuploader.css b/webcit/static/styles/fineuploader.css
new file mode 100644 (file)
index 0000000..f153f78
--- /dev/null
@@ -0,0 +1,205 @@
+/*!
+* Fine Uploader
+*
+* Copyright 2013, Widen Enterprises, Inc. info@fineuploader.com
+*
+* Version: 4.2.1
+*
+* Homepage: http://fineuploader.com
+*
+* Repository: git://github.com/Widen/fine-uploader.git
+*
+* Licensed under GNU GPL v3, see LICENSE
+*/ 
+
+
+.qq-uploader {
+    position: relative;
+    width: 100%;
+}
+.qq-upload-button {
+    display: block;
+    width: 105px;
+    padding: 7px 0;
+    text-align: center;
+    background: #880000;
+    border-bottom: 1px solid #DDD;
+    color: #FFF;
+}
+.qq-upload-button-hover {
+    background: #CC0000;
+}
+.qq-upload-button-focus {
+    outline: 1px dotted #000000;
+}
+.qq-upload-drop-area, .qq-upload-extra-drop-area {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    min-height: 30px;
+    z-index: 2;
+    background: #FF9797;
+    text-align: center;
+}
+.qq-upload-drop-area span {
+    display: block;
+    position: absolute;
+    top: 50%;
+    width: 100%;
+    margin-top: -8px;
+    font-size: 16px;
+}
+.qq-upload-extra-drop-area {
+    position: relative;
+    margin-top: 50px;
+    font-size: 16px;
+    padding-top: 30px;
+    height: 20px;
+    min-height: 40px;
+}
+.qq-upload-drop-area-active {
+    background: #FF7171;
+}
+.qq-upload-list {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+.qq-upload-list li {
+    margin: 0;
+    padding: 9px;
+    line-height: 15px;
+    font-size: 16px;
+    background-color: #FFF0BD;
+}
+.qq-upload-file, .qq-upload-spinner, .qq-upload-size,
+.qq-upload-cancel, .qq-upload-retry, .qq-upload-failed-text,
+.qq-upload-delete, .qq-upload-pause, .qq-upload-continue {
+    margin-right: 12px;
+    display: inline;
+}
+.qq-upload-file {
+}
+.qq-upload-spinner {
+    display: inline-block;
+    background: url("loading.gif");
+    width: 15px;
+    height: 15px;
+    vertical-align: text-bottom;
+}
+.qq-drop-processing {
+    display: block;
+}
+.qq-drop-processing-spinner {
+    display: inline-block;
+    background: url("processing.gif");
+    width: 24px;
+    height: 24px;
+    vertical-align: text-bottom;
+}
+
+.qq-upload-delete, .qq-upload-pause, .qq-upload-continue {
+    display: inline;
+}
+
+.qq-upload-retry, .qq-upload-delete, .qq-upload-cancel,
+.qq-upload-pause, .qq-upload-continue {
+    color: #000000;
+}
+
+.qq-upload-retryable .qq-upload-retry {
+    display: inline;
+}
+.qq-upload-size, .qq-upload-cancel, .qq-upload-retry,
+.qq-upload-delete, .qq-upload-pause, .qq-upload-continue {
+    font-size: 12px;
+    font-weight: normal;
+}
+.qq-upload-failed-text {
+    display: none;
+    font-style: italic;
+    font-weight: bold;
+}
+.qq-upload-failed-icon {
+    display:none;
+    width:15px;
+    height:15px;
+    vertical-align:text-bottom;
+}
+.qq-upload-fail .qq-upload-failed-text {
+    display: inline;
+}
+.qq-upload-retrying .qq-upload-failed-text {
+    display: inline;
+    color: #D60000;
+}
+.qq-upload-list li.qq-upload-success {
+    background-color: #5DA30C;
+    color: #FFFFFF;
+}
+.qq-upload-list li.qq-upload-fail {
+    background-color: #D60000;
+    color: #FFFFFF;
+}
+.qq-progress-bar {
+    display: block;
+    background: -moz-linear-gradient(top,  rgba(30,87,153,1) 0%, rgba(41,137,216,1) 50%, rgba(32,124,202,1) 51%, rgba(125,185,232,1) 100%); /* FF3.6+ */
+    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(30,87,153,1)), color-stop(50%,rgba(41,137,216,1)), color-stop(51%,rgba(32,124,202,1)), color-stop(100%,rgba(125,185,232,1))); /* Chrome,Safari4+ */
+    background: -webkit-linear-gradient(top,  rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Chrome10+,Safari5.1+ */
+    background: -o-linear-gradient(top,  rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Opera 11.10+ */
+    background: -ms-linear-gradient(top,  rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* IE10+ */
+    background: linear-gradient(to bottom,  rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* W3C */
+    width: 0%;
+    height: 15px;
+    border-radius: 6px;
+    margin-bottom: 3px;
+}
+
+INPUT.qq-edit-filename {
+    position: absolute;
+    opacity: 0;
+    filter: alpha(opacity=0);
+    z-index: -1;
+    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
+}
+
+.qq-upload-file.qq-editable {
+    cursor: pointer;
+}
+
+.qq-edit-filename-icon.qq-editable {
+    display: inline-block;
+    cursor: pointer;
+}
+
+INPUT.qq-edit-filename.qq-editing {
+    position: static;
+    margin-top: -5px;
+    margin-right: 10px;
+    margin-bottom: -5px;
+
+    opacity: 1;
+    filter: alpha(opacity=100);
+    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+}
+
+.qq-edit-filename-icon {
+    display: none;
+    background: url("edit.gif");
+    width: 15px;
+    height: 15px;
+    vertical-align: text-bottom;
+    margin-right: 5px;
+}
+
+INPUT.qq-edit-filename.qq-editing ~ .qq-upload-cancel {
+    display: none;
+}
+
+.qq-hide {
+    display: none;
+}
+
+/*! 2014-01-19 */
diff --git a/webcit/static/styles/global.css b/webcit/static/styles/global.css
new file mode 100644 (file)
index 0000000..8e72d86
--- /dev/null
@@ -0,0 +1,12 @@
+#global {
+       margin-left: 0;
+       padding: 0;
+       position: absolute;
+       bottom: 0;
+       top: 0;
+       right: 0;
+       left: 0;
+       overflow-y: hidden;
+}
+
+#global center { width: 80% }
diff --git a/webcit/static/styles/iconbar.css b/webcit/static/styles/iconbar.css
new file mode 100644 (file)
index 0000000..38c8408
--- /dev/null
@@ -0,0 +1,156 @@
+#iconbar {
+       position: absolute;
+       top: 0;
+       left: 0;
+       bottom: 0;
+       width: 16%;             /* when changing this, also change #banner width */
+       z-index: 0;
+       overflow: auto;
+       overflow-x: hidden !important;
+}
+
+#iconbar_container {}
+
+#citlogo { 
+       height: 76px;
+        background: #4D555C;
+        background: -webkit-gradient(linear, 0 0, 0 bottom, from(#4D555C), to(#7D858C));
+        background: -moz-linear-gradient(#4D555C, #7D858C);
+        background: linear-gradient(#4D555C, #7D858C);
+        -pie-background: linear-gradient(#4D555C, #7D858C);
+        behavior: url(/static/styles/PIE.htc);
+}
+
+.logo_citadel, li.ib_button a img {
+       border: none;
+}
+
+.logo_citadel img{
+       padding: 3px;
+       margin-top: 16px;
+       background-color: #edede0;
+       border: 2px solid #edede0;
+       -khtml-border-radius: 8px;
+        -moz-border-radius: 8px;
+        border-radius: 8px;
+        behavior: url(/static/styles/PIE.htc);
+} 
+
+.iconbar_text {        
+       height: 22px;
+       font-size: 70%;
+       font-weight: bold;
+       color: #fff;
+       background-color: #7d858c;
+       border-top-color: #424b52;
+       border-top-style: solid;
+       border-top-width: 2px;
+       border-bottom-color: #424b52;
+       border-bottom-style: solid;
+       border-bottom-width: 2px;
+}
+
+.iconbar_text > span {         cursor: pointer }
+
+div.iconbar_text select { border: 1px solid #424b52; }
+
+#iconbar_menu {}
+
+#iconbar #button {
+       padding: 0;
+       margin: 5px 0;
+       border: none;
+       list-style: none;
+}
+
+
+.ib_button_link, .ib_button_link:visited, .ib_button_link:link, #online_users a {
+       display: block;
+       text-decoration: none;
+       color: #F0FEFF;
+}
+
+.ib_button, .floor {
+       margin: 0.2em;
+       display: block;
+       font-size: 90%;
+       background-color: #4d555c;
+       color: #F0FEFF;
+       font-weight: bold;
+       -khtml-border-radius: 5px;
+       -moz-border-radius: 5px;
+       border-radius: 5px;
+ }
+
+.logo, #citlogo, .iconbar_text, #online_users li {
+       text-align: center;
+}
+
+#button li:hover, #ib_logoff:hover, #ib_login:hover {
+       background-color: #5c646b;
+}
+
+#online_users {
+       display: none; /* Hide by default */
+       border: 0;
+       max-height: 200px;
+       overflow: auto;
+       padding-left: 0;
+       padding-bottom: 5px;
+} 
+
+#online_users li {
+       list-style: none;
+       margin: 0;
+       padding: 2px;
+       white-space: nowrap;
+       border: none;
+       border-top: 1px solid #777277;
+}
+
+#online_users li a { font-size: 80% !important }
+
+#online_users li.inactiveuser { background-color: #9c959d; }
+#online_users li.activeuser { background-color: #4d555c; }
+#online_users li:hover { /* separate in order for override */ }
+
+
+.ib_roomlist_floor, .ib_roomlist_new, .ib_roomlist_old {
+       margin: 4px;
+       padding: 0;
+}
+
+.ib_roomlist_floor, .ib_roomlist_new, .ib_roomlist_old {
+       cursor: pointer;
+}
+
+.ib_roomlist_floor, .roomlist_new, .ib_roomlist_new {
+       font-weight: 700;
+}
+
+.ib_roomlist_floor {}
+
+.ib_roomlist_new {
+       color: #800;
+}
+
+.ib_roomlist_old {
+       color: #008;
+}
+
+#iconbar_container #customize {
+       margin: 0 9px;
+       border: 2px solid #424b52;
+       -khtml-border-radius: 8px;
+       -moz-border-radius: 8px;
+       border-radius: 8px;
+       behavior: url(/static/styles/PIE.htc);
+}
+
+#iconbar_container #customize a:active, #iconbar_container #customize a:link, #iconbar_container #customize a:visited {
+        color: #fff;
+       line-height:2em;
+       display: block;
+}
diff --git a/webcit/static/styles/iconbaricns.css b/webcit/static/styles/iconbaricns.css
new file mode 100644 (file)
index 0000000..35f2d6c
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2005 - 2009 The Citadel Team
+ * Licensed under the GPL V3
+ *
+ * Styles for the WebCit Iconbar.
+ */
+
+.ib_button {
+    min-height: 38px;
+    background-repeat: no-repeat !important;
+    background-position: 7px 3px;
+    vertical-align: middle;
+}
+.ib_button_link {
+    padding-top: 0.8em;
+    padding-left: 48px;
+    height: 100%;
+    min-height: 25px; /* Makes all of the 'button' to be clickable */
+}
+#ib_summary {
+    background-image: url("/static/webcit_icons/essen/32x32/summary.png");
+}
+#ib_inbox {
+    background-image: url("/static/webcit_icons/essen/32x32/email.png");
+}
+#ib_calendar {
+    background-image: url("/static/webcit_icons/essen/32x32/calendar.png");
+}
+#ib_contacts {
+    background-image: url("/static/webcit_icons/essen/32x32/contact.png");
+}
+#ib_notes {
+    background-image: url("/static/webcit_icons/essen/32x32/note.png");
+}
+#ib_tasks {
+    background-image: url("/static/webcit_icons/essen/32x32/task.png");
+}
+#ib_rooms {
+    background-image: url("/static/webcit_icons/essen/32x32/room.png");
+}
+#ib_users {
+    background-image: url("/static/webcit_icons/essen/32x32/user.png");
+}
+#ib_chat {
+    background-image: url("/static/webcit_icons/essen/32x32/chat.png");
+}
+#ib_advanced, #ib_admin {
+    background-image: url("/static/webcit_icons/essen/32x32/config.png");
+}
+#ib_aide {
+    background-image: url("/static/webcit_icons/essen/32x32/config.png");
+}
+#ib_logoff {
+    background-image: url("/static/webcit_icons/essen/32x32/logout.png");
+}
+#ib_login {
+    background-image: url("/static/webcit_icons/essen/32x32/login.png");
+}
+#citlogo {
+    display: block !important;
+}
diff --git a/webcit/static/styles/iconbarpiconly.css b/webcit/static/styles/iconbarpiconly.css
new file mode 100644 (file)
index 0000000..69f083f
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2005 - 2011 The Citadel Team
+ * Licensed under the GPL V3
+ *
+ * Styles for the WebCit Iconbar in pics only mode.
+ */
+
+@import url("/static/styles/iconbaricns.css");
+
+.ib_button {
+    width: 35px;
+}
+.ib_button_link {
+    padding-left: 0;
+}
+.ib_button_link span {
+    display: none;
+}
diff --git a/webcit/static/styles/ie_lte8.css b/webcit/static/styles/ie_lte8.css
new file mode 100644 (file)
index 0000000..3664967
--- /dev/null
@@ -0,0 +1,8 @@
+.message, .box {
+       zoom: 1;
+       filter:
+       progid:DXImageTransform.Microsoft.Shadow(color='#666666', Direction=135, Strength=4)
+       progid:DXImageTransform.Microsoft.Shadow(color='#666666', Direction=180, Strength=5)
+       progid:DXImageTransform.Microsoft.Shadow(color='#666666', Direction=225, Strength=2)
+       progid:DXImageTransform.Microsoft.Shadow(color='#666666', Direction=260, Strength=1);
+}
diff --git a/webcit/static/styles/login.css b/webcit/static/styles/login.css
new file mode 100644 (file)
index 0000000..f3630b1
--- /dev/null
@@ -0,0 +1,96 @@
+#login_screen, #logout_screen {
+       position: fixed;
+       left: 0;
+       right: 0;
+       margin: 5em auto;
+       width: 42em;
+       overflow: auto;
+}
+
+/*because our current layout is a little complicated, we need this: */
+#login_screen .box, #logout_screen .box {
+       width: 40em;
+       padding: 1em 0;
+}
+
+#login_screen .login_message, .login_hello, #login_screen #login_form {
+       display: block;
+       margin: 5px auto 5px auto;
+}
+
+#login_screen .login_message, .login_hello { width: 80% }
+
+#login_screen .login_image { 
+       width: 135px;
+       margin: 0 auto;
+}
+
+#login_screen .login_image img { 
+       margin: 0 auto;
+}
+
+#login_screen #login_form {
+       padding: 10px;
+       width: 330px;
+}
+
+#login_form input, #login_form label, #login_form select {
+       display: block;
+       float: left;
+       margin: 6pt;
+}
+#login_form label, #pname, #uname {
+       width: 130px;
+       text-align: left;
+}
+#login_form br { clear: left }
+
+.login_infos {
+       bottom: 0;
+       display: block;
+       margin: 20px auto 0 auto;
+       width: 80%;
+       text-align: left;
+}
+
+
+#convlogin { text-align: center }
+
+#login_form{ background-color: #CCC}
+
+.login_message {
+       color: #AD1C00;
+       font-weight: 700;
+       text-transform: uppercase;
+}
+
+#login_form #uname, #login_form #pname {
+       background-color: #fbf4ca !important; /* needed for li.activeuser */
+       border: 1px solid #999;
+       color: #333;
+}
+
+.logbuttons input {
+       cursor: pointer;
+       text-align: center;
+       font-weight: bold;
+}
+
+.logbuttons, .registernow {
+       width: 50%;
+        margin: 1em auto;
+        text-align: center;
+        display: block;
+       height: 2em;
+       line-height: 2em;
+        background-color: #4d555c;
+        font-weight: bold;
+        -khtml-border-radius: 5px;
+        -moz-border-radius: 5px;
+        border-radius: 5px;
+        behavior: url(static/styles/PIE.htc);
+}
+
+.logbuttons a:link, .registernow a:link { color: #f0feff; }
diff --git a/webcit/static/styles/message.css b/webcit/static/styles/message.css
new file mode 100644 (file)
index 0000000..875a7e1
--- /dev/null
@@ -0,0 +1,106 @@
+.message, .entmsg{
+       background-color: #deded0;
+       margin: 0.5em 1em;
+/*     border: 1px solid #5C646B; */
+       -webkit-box-shadow: #666 0px 2px 3px;
+       -moz-box-shadow: #666 0px 2px 3px;
+       box-shadow: #666 0px 2px 3px;
+/*     behavior: url(/static/styles/PIE.htc);*/
+}
+
+.entmsg { height: 95%; }
+
+.message_header {
+       font-size: x-small;
+       padding: 0.5em;
+}
+
+.message_content {
+       background-color: #fff;
+       padding: 0.5em;
+       clear: both;
+}
+
+
+.message_subject {
+       font-size: medium;
+       font-style: italic;
+       float: left;
+}
+
+.message_header span, .message_header a { font-weight: bold; }
+
+.message_header p {
+        margin: 3px 0;
+        padding: 0;
+}
+
+
+.message_content > div > div { text-align: justify !important }
+
+.message form div label, .entmsg form div label {
+       display: block;
+       float: left;
+       margin: 0.3em;
+       width: 9em;
+       text-align: right;
+}
+.message form div input, .message form div select, .entmsg form div input, .entmsg form div select {
+       margin: 0.3em;
+}
+
+.msgbuttons {
+       float: right;
+       font-size: 80%;
+       line-height: 2em;
+}
+
+.msgbuttons a {
+       font-size: x-small;
+       display: inline-block;
+       margin-left: 0.3em;
+}
+
+/* Blockquotes in messages need to be distingushable */
+/* there is a lot of cascading happen io order to make it look beautiful */
+/* if you make changes here, port them to WEBCIT-TINYMCE.css! */
+.message_content blockquote {
+       /*border: 1px solid #5C646B;*/
+       padding: 0.2em;
+       margin: 0.3em 0.5em;
+}
+
+.message_content blockquote .message_header span {
+       display: inline-block;
+}
+
+.message_content blockquote .message_header span.message_subject {
+       display: block;
+       float: none;
+}
+
+/*top border of message headerrs in a blockquote need to be transparent*/
+blockquote .message_header {          
+       padding: 0;
+       background-color: #deded0;
+}
+
+/*make bottom border of content inside of a blockquote rounded, so it fits the blockquote*/
+blockquote .message_content {
+       padding: 0;
+       background-color: transparent;
+       margin: 0.3em;
+}
+/* --- End of blockquoting block --- */
+
+
+.message img {
+       max-width: 700px;
+       padding: 10px;
+       background-color: #fff;
+       border: 1px solid #5C646B;
+       box-shadow: #666 0px 2px 3px;
+       -webkit-box-shadow: #666 0px 1px 2px;
+       -moz-box-shadow: #666 0px 2px 3px;
+}
diff --git a/webcit/static/styles/mobile.css b/webcit/static/styles/mobile.css
new file mode 100644 (file)
index 0000000..41da559
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2005 - 2009 The Citadel Team
+ * Licensed under the GPL V3
+ * styles for mobile clients
+ */
+body {
+}
+#button li {
+       display: inline; 
+       padding-right: 5px;
+}
+#button li img {
+       display: none;
+}
+img {
+       border: none;
+       text-decoration: none;
+}
+#message_list div div {
+       border-bottom: 1px dotted black;
+       padding: 5px 5px 5px 5px;
+       /* background-color: white; */
+}
+.subject {
+       color: gray;
+}
+body[orient="portrait"] {
+       max-width: 320px;
+}
+body {
+       font-family: sans-serif;
+       font-size: 11px;
+}
+.msgview {
+       display: none;
+       background-color: white !important;
+}
+.message_content {
+    background-color: white;
+}
+#login_form label, #login_form input, #login_form select, #login_form div{
+       display: list-item;
+       text-align: center !important;
+       margin: 0px auto;
+}
+#navbar ul li {
+       display: inline;
+       padding-right: 5px;
+}
+#navbar ul li img {
+       vertical-align: middle;
+}
+#navbar ul li a {
+       text-decoration: none;
+}
+.sticky {
+    background-color: gray;
+    border: 1px solid black;
+    width: 100%;
+}
+#vcontent {
+}
+.roomname {
+       background-color: #022750;
+       color: white;
+       border-radius: 5px;
+}
+.roomname img{
+       vertical-align: middle;
+}
diff --git a/webcit/static/styles/modal.css b/webcit/static/styles/modal.css
new file mode 100644 (file)
index 0000000..e0fc396
--- /dev/null
@@ -0,0 +1,75 @@
+.md-overlay-decorator {
+       background: #222;
+       height: 100%;
+       width: 100%;
+       position: absolute;
+       top:0;
+       left:0;
+       opacity:0.8;
+       z-index:2000;
+       *display:none;
+}
+
+.md-overlay-wrap {
+       height:100%;
+       width:100%;
+       display:block;
+       position:absolute;
+       top:0;
+       left:0;
+       z-index:2001;
+       overflow:auto;
+       *overflow-x:hidden;
+       *zoom:1;
+       /* (0.8 * 255).toString(16) = cc */
+       *filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#cc222222,endColorstr=#cc222222);
+       *background:transparent url(../pixel.gif);
+}
+
+.md-overlay {
+       z-index:2001;
+       position:relative;
+       margin:0 auto;
+       display:table;
+       height:100%;
+       vertical-align:middle;
+       width:80%;
+       z-index:9999;
+       *width:100%;
+       *text-align:center;
+       *position:static;
+       *display:block;
+}
+
+.md-dialog-wrap {
+       display:table-cell;
+       vertical-align:middle;
+       *width:80%;
+       *text-align:left;
+       *zoom:1;
+       *display:inline;
+}
+
+.md-dialog-decorator {
+       display:none;
+       *vertical-align:middle;
+       *zoom:1;
+       *display:inline;
+       *height:100%;
+       *width:0;
+       *background:#022750;
+}
+
+#modal {
+       display:none;
+}
+
+.modal #modal {
+       display:block;
+}
+
+.md-dialog {
+       background: white;
+       border: 2px solid #022750;
+       padding: 10px;
+}
diff --git a/webcit/static/styles/navbar.css b/webcit/static/styles/navbar.css
new file mode 100644 (file)
index 0000000..9a15d1b
--- /dev/null
@@ -0,0 +1,52 @@
+#navbar {
+       font-size: 70%;
+       font-weight: bold;
+       height: 2em;
+       position: absolute;
+       bottom: 0;
+       width: 100%;
+       background-color: #7D858C;
+       border-top: 2px solid #424b52;
+       color: #FFF;
+}
+
+#navbar ul, .selector_top, .selector_bottom {
+       width: 100%;
+       margin: 0 auto 0 auto;
+       white-space: nowrap;
+       text-align: center;
+       vertical-align: middle;
+}
+
+#navbar ul li {
+       display: inline;
+       list-style: none;
+       vertical-align: middle;
+       padding: 0 0.2em;
+}
+
+#navbar ul li a {
+       padding: 0.3em;
+       display: inline-block;
+       white-space: nowrap;
+}
+
+#navbar ul li a:hover {
+       padding: 0.3em;
+       background-color: #5c646b;
+       border: 0px solid #5c646b;
+        border-radius: 5px;
+        -webkit-border-radius: 5px;
+        -moz-border-radius: 5px;
+}
+
+#navbar ul li img {
+       float: none;
+       margin: 0 2px;
+}
+
+#navbar ul li a img {
+      vertical-align: middle;
+      border: none;
+}
+
diff --git a/webcit/static/styles/rss_browser.css b/webcit/static/styles/rss_browser.css
new file mode 100644 (file)
index 0000000..5858a02
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2005 - 2009 The Citadel Team
+ * Licensed under the GPL V3
+ */
+
+* {
+display: block;
+}
+
+:root {
+margin: 50px;
+}
+
+channel > title {
+font-size: x-large;
+text-align: center;
+}
+
+channel > title:after {
+display: block;
+padding: 50px;
+content: "This is an RSS feed, designed to be read in an RSS application.";
+background-color: grey;
+color: white;
+}
+
+item {
+margin: 25px 0 20px 0;
+}
+
+item > title {
+font-size: medium;
+margin-bottom: 20px;
+}
+
+item > link {
+font-size: small;
+margin-top: 6px;
+margin-bottom: 6px;
+}
+
+item > description {
+font-size: small;
+}
+
+item > pubDate {
+font-size: small;
+}
+
+channel > link,
+channel > copyright, 
+channel > lastBuildDate, 
+channel > generator, 
+channel > docs,
+language,
+lastBuildDate,
+ttl,
+guid,
+category {
+display: none;
+}
diff --git a/webcit/static/styles/rte.css b/webcit/static/styles/rte.css
new file mode 100644 (file)
index 0000000..40511e8
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2005 - 2009 The Citadel Team
+ * Licensed under the GPL V3
+ */
+
+.rteImage {
+       background: #D3D3D3;
+       border: 1px solid #D3D3D3;
+       cursor: pointer;
+       cursor: hand;
+}
+
+.rteImageRaised {
+       background: #D3D3D3;
+       border: 1px outset;
+       cursor: pointer;
+       cursor: hand;
+}
+
+.rteImageLowered {
+       background: #D3D3D3;
+       border: 1px inset;
+       cursor: pointer;
+       cursor: hand;
+}
+
+.rteVertSep {
+       margin: 0 4px 0 4px;
+}
+
+.rteBack {
+       background: #D3D3D3;
+       border: 1px outset;
+       letter-spacing: 0;
+       padding: 2px;
+}
+
+.rteBack tbody tr td, .rteBack tr td {
+       background: #D3D3D3;
+       padding: 0;
+}
diff --git a/webcit/static/styles/service.css b/webcit/static/styles/service.css
new file mode 100644 (file)
index 0000000..cea1754
--- /dev/null
@@ -0,0 +1,64 @@
+.service {}
+
+.service .edit_col, .service .host_col { display: none }
+
+.bio table {
+       margin-top: 0.5em;
+       padding: 0 0.5em;
+       width: 95%;
+       font-family: monospace;
+       background-color: #fff;
+       border: 1px solid #5C646B;
+       -webkit-box-shadow: #666 0px 1px 2px;
+       -moz-box-shadow: #666 0px 2px 3px;
+       box-shadow: #666 0px 2px 3px;
+       behavior: url(/static/styles/PIE.htc);
+}
+
+.bio table table {
+       border: 0;
+       padding: 0;
+       margin: 0.5em 0;
+       box-shadow: none;
+       -moz-box-shadow: none;
+       -webkit-box-shadow: none;
+}
+
+.bio table table img {
+        max-width: 250px;
+       padding: 0.2em;
+       background-color: #f0feff;
+       border: 1px solid #5C646B;
+       box-shadow: none;
+       -moz-box-shadow: none;
+       -webkit-box-shadow: none;
+}
+
+.bio h1 { float: right; }
+
+.who_is_online tr { 
+       height: 1.5em;
+       padding: 0;
+       margin: 0;
+}
+
+.who_is_online td {
+       padding: 0 0.3em;
+}
+
+.who_is_online td img { 
+       border: none;
+       margin: 0 auto;
+}
+
+.who_is_online .edit_col {}
+
+.who_is_online .host_col { 
+       font-family: monospace;
+       font-size: 90%;
+}
+
+div#who_inner th.host_col { 
+       font-family: sans-serif;
+       font-size: 100%;
+}
diff --git a/webcit/static/styles/webcit-tinymce.css b/webcit/static/styles/webcit-tinymce.css
new file mode 100644 (file)
index 0000000..70cecf0
--- /dev/null
@@ -0,0 +1,99 @@
+/* styles applied to the TinyMCE editor component when used in WebCit */
+body {font-size: 12px;}
+
+blockquote{
+       background-color: #deded0;
+}
+
+.message_header {
+       font-size: x-small;
+       padding: 0.5em;
+}
+
+.message_content {
+       background-color: #fff;
+       padding: 0.5em;
+       clear: both;
+}
+
+
+.message_subject {
+       font-size: medium;
+       font-style: italic;
+       float: left;
+}
+
+.message_header span, .message_header a { font-weight: bold; }
+
+.message_header p {
+        margin: 3px 0;
+        padding: 0;
+}
+
+
+.message_content > div > div { text-align: justify !important }
+
+.message form div label, .entmsg form div label {
+       display: block;
+       float: left;
+       margin: 0.3em;
+       width: 9em;
+       text-align: right;
+}
+.message form div input, .message form div select, .entmsg form div input, .entmsg form div select {
+       margin: 0.3em
+}
+
+/* make blockquotes in messages distingushable */
+/* there is a lot of cascading happen io order to make it look beautiful */
+.message_content blockquote {
+       padding: 0.2em;
+       margin: 0.3em 0.5em;
+}
+
+blockquote .message_header {          
+       padding: 0;
+       background-color: #deded0;
+}
+
+.message_content blockquote .message_header span {
+       display: inline-block;
+}
+
+.message_content blockquote .message_header span.message_subject {
+       display: block;
+       float: none;
+}
+
+blockquote .message_content {
+       padding: 0;
+       background-color: transparent;
+}
+
+blockquote {
+       background-color: #f0f0f0 !important;
+       color: navy !important;
+}
+
+blockquote blockquote {
+       background-color: #ebebeb !important;
+       color: maroon !important;
+}
+blockquote blockquote blockquote {
+       background-color: #e1e1e1 !important;
+       color: green !important;
+}
+
+blockquote blockquote blockquote blockquote {
+       background-color: #d7d7d7 !important;
+       color: purple !important;
+}
+.message img {
+       max-width: 700px;
+       padding: 10px;
+       background-color: #fff;
+       border: 1px solid #5C646B;
+}
diff --git a/webcit/static/styles/webcit.css b/webcit/static/styles/webcit.css
new file mode 100644 (file)
index 0000000..9d90675
--- /dev/null
@@ -0,0 +1,1266 @@
+/*
+ * Copyright 2005 - 2011 The Citadel Team
+ * Licensed under the GPL V3
+ */
+
+/* These stylesheets were split from this one for convenience */
+
+@import url("login.css");
+@import url("global.css");
+@import url("iconbar.css");
+@import url("banner.css");
+@import url("navbar.css");
+@import url("content.css");
+@import url("box.css");
+@import url("message.css");
+@import url("modal.css");
+@import url("service.css");
+@import url("blog.css");
+
+@media print {
+       input#toggler, .toolbar { display: none }
+}
+
+html, body {
+       font-size: 100%;
+       height:100%;
+       width:100%;
+       margin:0;
+       padding:0;
+       overflow:hidden;
+}
+
+.address_book_popup_title { font-size: 130% }
+
+#button, #content .button_link a, input#delbutton,.attachfile, .buttons input, .buttons a, .customize, .menubar_link, #banner ul.room_actions li, .selector_top, .selector_bottom, .banner .infos,li.search,li.view, .room_actions form select option, .selectbox, ul.adminitems li span, #message_list tr > td {
+       font-size: 100%;
+}
+
+#message_list_hdr table { font-size: 80% }
+
+.mailbox_summary { font-size: 80% }
+
+/* Color */
+
+body {
+       background-color: #F3F6F2;
+       font-family: sans-serif;
+}
+
+.marked_row { 
+       color: white;
+       background-color: #69aaff !important;
+}
+
+.service form div,table.altern .odd, #message_list, #roomlist_div,.editednode,.mailbox_summary, .auth_validate, .event_background, .calendar_background, .calendar_view_background, .graphics_background, .messages_background, .paging_background, .preferences_background, .roomops_background, .sieve_background, .siteconfig_background, .smtpqueue_background, .tabs_background, .useredit_background, .userlist_background, .wiki_history_background, .wiki_pagelist_background, .downloads_background, .vcard_edit_background, div.auto_complete, div.auto_complete ul, #summary_view {
+       background-color: #FFF;
+       color: #000;
+}
+
+#message_list_hdr table, #resize_msglist, .vcard_edit_background_alt,.roomops_background_alt {
+       background-color: #CCC;
+}
+
+#room_infos, #address_book_popup, .roomops_cell, .roomops_cell_edit, .mimepart {
+       background-color: #deded0;
+       color: #5C646B;
+} 
+
+#room_infos, #address_book_popup, .mimepart, .room_actions form select {
+       border: 1px solid #5C646B;
+       overflow: scroll;
+}
+
+.buttons a,.tablabel,.treetitle {
+       color: #000;
+       font-weight: 700;
+}
+
+.mimepart div,.required { font-weight: 700 }
+
+.selector_top,.selector_bottom {
+       background-color: #022750;
+       border-top: 1px solid black;
+       border-bottom: 1px solid black;
+       color: #FFF;
+}
+
+#message_list_hdr form input { border: 0 }
+
+#message_list_hdr select {
+       background-color: #3E65AF;
+       color: #F1BD22;
+       border: 1px solid #6C91A6;
+}
+
+#message_list_hdr table { font-style: italic }
+
+#resize_msglist {
+       background-image: url(/static/webcit_icons/resizegrippy.gif);
+       background-position: center;
+       background-repeat: no-repeat; 
+}
+
+#resize_msglist hr {
+       background-color: #999;
+       border: 0;
+       color: #999;
+       height: 3px;
+}
+
+.adminlist { list-style: none }
+
+.customize {
+       background-color: #DDC;
+       color: #004;
+       font-style: italic;
+}
+
+.default {
+       font-style: normal;
+       text-decoration: underline;
+}
+
+.editednodeinput {
+       background-color: #FFF;
+       border: 1px solid #000;
+       color: #000;
+       height: 17px;
+       width: 150px;
+}
+
+.error a:link, .error a:visited, .error a:active {
+       background: none;
+       color: #DC143C;
+       text-decoration: underline;
+}
+
+.error strong {
+       background: #FFD700;
+       color: #DC143C;
+       text-decoration: none;
+}
+
+.error strong a:link,.error strong a:visited,.error strong a:active {
+       background: #FFD700;
+       color: #DC143C;
+}
+
+.errormsg {
+       background: none;
+       color: #A00;
+       font-style: italic;
+       font-weight: 700;
+}
+
+.floors_config, .roomops_zap {
+       background-color: #700;
+       border: 0;
+}
+
+.imsg {
+       background: none;
+       color: #EEE;
+       font-style: italic;
+       font-weight: 700;
+       text-align: center;
+}
+
+.menubar_bg { background-color: red }
+
+.mimepart div span {
+       display: block;
+       font-style: italic;
+}
+
+.mimepart dl dd, .mimepart dl dt {
+       border-top: 1px solid #AAA;
+}
+
+.mailbox_summary td {
+       /* border-top: 1px solid #AAA; */
+       white-space: nowrap;
+       overflow: hidden;
+}
+
+.mimepart dl dt { font-weight: 700 }
+
+.roomops_cell_label, .tab_cell_label {
+       background-color: #424b52;
+       color: #EABB3A;
+       font-size: 80%;
+       font-weight: bold;
+       border-radius: 8px 8px 0 0;
+       -webkit-border-radius: 8px 8px 0 0;
+       -moz-border-radius: 8px 8px 0 0;
+}
+
+.selectbox {
+       background-color: #FF8000;
+}
+
+.tab_cell, .tab_cell_edit {
+       background-color: #5c646b;
+       color: #F9FDFB;
+       font-size: 80%;
+       font-weight: bold;
+       border-radius: 8px 8px 0 0;
+       -webkit-border-radius: 8px 8px 0 0;
+       -moz-border-radius: 8px 8px 0 0;
+}
+
+.tabcontent {
+       background-color: #FEFFFC;
+       border: 2px solid #424B52;
+}
+
+.treetitleselectedblured {
+       background-color: menu;
+       color: windowtext;
+}
+
+.treetitleselectedfocused {
+       background-color: highlight;
+       color: highlighttext;
+}
+
+.warning a:link, .warning a:visited, .warning a:active, .warning {
+       background: none;
+       color: #FF4500;
+}
+
+.warning, .warning strong { text-decoration: none }
+
+.warning a:link,.warning a:visited,.warning a:active {
+       text-decoration: underline;
+}
+
+.warning strong {
+       background: #FFD700;
+       color: #FF4500;
+}
+
+.warning strong a:link,.warning strong a:visited,.warning strong a:active {
+       background: #FFD700;
+       color: #FF4500;
+}
+
+blockquote {
+       background-color: #f5f5f5 !important;
+       color: navy !important;
+}
+
+blockquote blockquote {
+       background-color: #ebebeb !important;
+       color: maroon !important;
+}
+
+blockquote blockquote blockquote {
+       background-color: #e1e1e1 !important;
+       color: green !important;
+}
+
+blockquote blockquote blockquote blockquote {
+       background-color: #d7d7d7 !important;
+       color: purple !important;
+}
+
+blockquote blockquote blockquote blockquote blockquote {
+       background-color: #cdcdcd !important;
+       color: teal !important;
+}
+
+blockquote pre {
+       margin-left: 1%;
+       margin-right: 1%;
+}
+
+div.auto_complete ul {
+       background: #fff;
+       border: 1px solid #888;
+       list-style-type: none;
+}
+
+div.auto_complete ul li.selected {
+       background-color: #ffc;
+}
+
+div.auto_complete ul strong.highlight { color: #800 }
+
+table.altern {
+       border-bottom: solid 2px #AAA;
+       border-top: solid 2px #AAA;
+}
+
+table.altern .even {
+       background-color: #DDD;
+}
+
+td li.frameset,.elements li.frameset {
+       background: none;
+       color: gray;
+       font-weight: lighter;
+}
+
+td li.transitional,.elements li.transitional {
+       background: none;
+       color: #696969;
+       font-weight: lighter;
+}
+
+ul.adminitems {
+       list-style-type: disc;
+       padding: 0;
+}
+
+ul.adminitems li { font-weight: 700 }
+
+ul.adminitems li span {        color: #666 }
+
+var sub { font-style: normal }
+
+.week_of_year {
+       background-color: #e1e1e1;
+       font-size: 70%; 
+}
+
+.day { font-weight: 700 }
+
+.calout { background-color: #DDDDDD }
+
+.calday { background-color: #FFFFFF }
+
+.calweekend { background-color: #EEEECC }
+
+.caltoday { background-color: #EEEEFF }
+
+.current_sort_mode { background-color: white }
+
+#loading { background-color: white }
+
+/* Message list in mailbox/summaryview */
+.table-row { background-color: white }
+
+.table-alt-row { background-color: #DDDDDD }
+
+/* Links */
+
+a { text-decoration: none }
+
+a:link, .calendar a:visited { color: #0e73e3 } /*color: #2F65DD;*/
+
+a:active { color: #3E65AF }
+
+a:visited { color: #70342e }
+
+.roomlist_old { color: #424b52 }
+
+.roomlist_new { color: #ef7114 }
+
+.roomlist_new, .roomlist_old {
+       font-size: medium;
+       font-weight: bold;
+       padding: 0.1em 0.3em;
+}
+
+.roomlist_new:hover, .roomlist_old:hover{
+       outline: 1px solid #7d858c;
+       outline-radius: 5px;
+       -khtml-outline-radius: 5px;
+       -moz-outline-radius: 5px;
+       behavior: url(/static/styles/PIE.htc);
+}
+
+#customize a:active, #customize a:link, #customize a:visited {
+       color: black;
+}
+
+input, select, .room_actions form select, .room_actions li.search input, .address_book_popup_title {
+       background-color: #efefe0; /*#fbf4ca;*/
+       border: 2px solid #5c646b;
+       color: #333;
+}
+
+.buttons a:hover { background-color: #5c646b; }
+.button_link a, input#delbutton,.attachfile, .buttons input {
+       background-color: #4d555c;
+}
+.button_link a, input#delbutton,.attachfile, .buttons input {
+       border: 2px solid #5c646b;
+       color: #F0FEFF;
+}
+
+
+.button_link a, input#delbutton,.attachfile, .buttons input {
+       cursor: pointer;
+       -webkit-border-radius: 8px;
+       -moz-border-radius: 8px;
+       border-radius: 8px;
+       behavior: url(/static/styles/PIE.htc);
+       text-align: center;
+}
+
+.button_link a, .attachfile,.buttons input {
+       font-weight: bold;
+}
+
+input#delbutton { font-weight: normal }
+
+/* Layout */
+
+* html { overflow: hidden }
+
+html { overflow: auto }
+
+body {
+       height: 100%;
+       overflow: hidden;
+       text-align: center;
+       margin-left: 0;
+       padding: 0;
+}
+
+#important_message {
+       background-color: #3E65AF;
+       color: #FFF;
+       position: absolute;
+       top: 25px; 
+       z-index: 4;
+       padding: 3px;
+       margin: 0px auto;
+}
+
+#hellomsg, .fmout, .nomsgs {
+       text-align: center;
+}
+
+#validate { text-align: center }
+
+#iconbar, #banner, #content, #message_list_hdr, #message_list, #preview_pane  { text-align: left }
+
+/* Please avoid setting heights for any of the mailbox view elements (except summary_view
+ * and resize). In particular, do NOT set any for message_list_hdr as its not good feng shui
+ */
+#message_listview th {
+       border-right: 0.2em solid #fff;
+}
+#message_listview td {
+       padding-left: 1em;
+}
+
+#message_list_hdr {
+       display: block;
+       padding-bottom: 0;
+       margin-bottom: 0;
+       background-color: #CCCCCC;
+}
+
+#summary_view {
+       overflow-y: scroll;
+       overflow-x: hidden;
+       cursor: pointer;
+}
+
+#summary_headers {
+       background-color: white;
+       table-layout: fixed;
+}
+
+#summary_headers tr td {
+       overflow-y: hidden;
+       overflow-x: hidden; /* stop long subjects overflowing */
+}
+
+#message_listview .col1 { width: 66% }
+
+#message_listview .col2 { width: 22% }
+
+#message_listview .col3 { width: 12% }
+
+.col1, .col2, .col3 {
+       cursor: pointer;
+       text-overflow: ellipsis;
+       -o-text-overflow: ellipsis;
+}
+
+.new_message { font-weight: bold !important }
+
+#loading { text-align: center}
+
+#resize_msglist {
+       width: 100%;
+       overflow: hidden;
+       cursor: s-resize;
+       height: 6px;
+}
+
+#preview_pane { overflow: auto }
+
+.ctdlTemplate { display: none }
+
+#ctdlContextMenu {
+       position: fixed;
+       background-color: white;
+       border: 1px solid black;
+}
+
+.draganddrop {
+       position: fixed;
+       display: block;
+       border: 1px solid black;
+       z-index: 65535;
+       background-color: white;
+       text-align: left;
+       opacity: 0.9;
+}
+
+.draganddrop > ul {
+       list-style: none;
+       padding-left: 0;
+       margin-left: 0;
+}
+
+.hidden { display: none }
+
+.floor { margin-left: 0px }
+
+.floor > ul { display: none }
+
+.floor-expanded > ul{ display: block !important }
+
+#roomlist > ul {
+       margin: 0;
+       padding: 0;
+}
+
+#roomlist > div > ul > li {
+       margin: 0;
+       padding: 0;
+}
+
+/* Override to disable list-style-image" */
+.room a, .room a, .room a:visited, .room a:link { color: #f0feff }
+
+.room-private { list-style-image: url("/static/webcit_icons/essen/16x16/email.png") }
+
+.room-addr { list-style-image: url("/static/webcit_icons/essen/16x16/contact.png") }
+
+.room-cal { list-style-image: url("/static/webcit_icons/essen/16x16/calendar.png") }
+
+.room-tasks { list-style-image: url("/static/webcit_icons/essen/16x16/task.png") }
+
+.room-notes { list-style-image: url("/static/webcit_icons/essen/16x16/note.png") }
+
+.room-chat { list-style-image: url("/static/webcit_icons/essen/16x16/room.png") }
+
+.room-newmsgs { font-weight: bold }
+
+.room-emphasized { text-decoration: underline }
+
+#message_list_hdr table { width: 100% }
+
+.selector_top, .selector_bottom { text-align: center }
+
+.selector_top p,.selector_bottom p {
+       margin: 0;
+       padding: 2px;
+}
+
+.button_link a, .attachfile, .buttons input .logbutton {
+       margin: 3px;
+       padding: 2px 4px 2px 4px;
+}
+
+input#delbutton {
+       margin: 0 3px 0 3px;
+       padding: 2px 4px 2px 4px;
+}
+
+
+.mimepart {
+       margin-top: 15px;
+       margin-bottom: 15px;
+       margin-left: 15%;
+       width: 70%;
+       padding: 0;
+}
+
+.mimepart img {
+       vertical-align: middle;
+       float: left;
+}
+
+.mimepart div {
+       vertical-align: middle;
+       margin: 0 0 15px 0 ;
+       padding: 5px;
+}
+
+.mimepart div span { vertical-align: top }
+
+.mimepart dl {
+       width: 100%;
+       margin-left: 5px;
+       padding: 5px;
+}
+
+.mimepart dl dt {
+       width: 30%;
+       float: left;
+       margin: 0 0 0 0;
+       padding: .5em;
+}
+
+.mimepart dl dd {
+       float: left;
+       width: 62%;
+       margin: 0;
+       padding: .5em;
+}
+
+.mimepart p {
+       margin-top: 1em;
+       margin-bottom: 0;
+       clear: both;
+}
+
+.buttons a { text-align: center }
+
+.imgedit {
+       vertical-align: middle
+}
+
+.edit_msg_table th {
+       text-align: right;
+       padding: 0px;
+       padding-right: 5px;
+       color: #333;
+       width: 20%;
+}
+
+.edit_msg_table td {
+       padding: 0px;
+}
+
+.edit_msg_table #recp_id, .edit_msg_table #cc_id, .edit_msg_table #bcc_id, .edit_msg_table #subject_id  {
+       width: 98%;
+}
+
+.note {
+       font-size: 85%;
+       margin-left: 10%;
+}
+
+.toolbar { text-align: center }
+
+.toolbar img { float: right }
+
+
+colgroup.entity { text-align: center }
+
+div.auto_complete ul {
+       margin: 0;
+       padding: 0;
+       width: 100%;
+}
+
+div.auto_complete ul li {
+       margin: 0;
+       padding: 3px;
+}
+
+div.auto_complete ul strong.highlight {
+       margin: 0;
+       padding: 0;
+}
+
+.auth_validate, .event_background, .calendar_background, .calendar_view_background, .graphics_background, .messages_background, .paging_background, .preferences_background, .roomops_background, .sieve_background, .siteconfig_background, .smtpqueue_background, .tabs_background, .useredit_background, .userlist_background, .downloads_background, .vcard_edit_background, .vcard_edit_background_alt, .roomops_background_alt, .floors_config, .roomops_zap {
+       width: 100%;
+}
+
+#address_book_popup {
+       position: absolute;
+       top: 100px;
+       right: 25px;
+       width: 320px;
+       height: auto;
+       z-index: 100;
+       display: none;
+       -webkit-box-shadow: #666 0px 2px 3px;
+       -moz-box-shadow: #666 0px 2px 3px;
+       box-shadow: #666 0px 2px 3px;
+}
+
+#address_book_popup_container_div {
+       position: relative;
+       width: 100%;
+       height: 100%;
+}
+
+#address_book_popup_middle_div { position: relative }
+
+#address_book_inner_div { margin: 5px }
+
+#address_book_inner_div select { width: 100% }
+
+#address_book_inner_div input { margin: 4px 5px 0 5px }
+
+#citlogo { display: none; /* Overriden later */ }
+
+.sort_ascending, .sort_descending {
+       background-repeat: no-repeat;
+       background-position: center right;
+}
+
+.sort_ascending { background-image: url("/static/webcit_icons/down_pointer.gif") }
+
+.sort_descending { background-image: url("/static/webcit_icons/up_pointer.gif") }
+
+#message_list_hdr > table { border-collapse: collapse }
+
+#summary_view > table { border-collapse: collapse }
+
+/* System Administration Menu */
+
+ul.adminitems {
+       margin: 15px;
+       padding: 0;
+}
+
+ul.adminitems li {
+       margin: 0.5em;
+       padding: 0;
+}
+
+ul.adminitems li span {        display: block }
+
+/* Mailq */
+table.mailstatus {background-color: lightgray }
+td.mailstatus_0 {background-color: gray }
+td.mailstatus_1 {background-color: gray }
+td.mailstatus_2 {background-color: green }
+td.mailstatus_3 {background-color: orange }
+td.mailstatus_4 {background-color: yellow }
+td.mailstatus_5 {background-color: red }
+
+/* Room list - Tree Node */
+
+.treetitle, .editednode, .treetitleselectedfocused, .treetitleselectedblured {
+       padding: 2px;
+       cursor: default;
+}
+
+table.altern {
+       margin: 0 auto 0 auto;
+       width: 98%
+} 
+
+table.altern tr td {
+       height: 2em;    
+} 
+
+/* Advanced menu */
+
+table.advanced {
+       margin: 0 auto 0 auto;
+       width: 96%;
+       border-collapse: separate;
+       border-spacing: 15px;
+} 
+
+.advanced .boxcontent ul { margin-left: 4em }
+
+.advanced .boxcontent .col1, .advanced .boxcontent .col2 { 
+       float: left;
+       width: 33%;
+}
+
+.advanced .boxcontent .col2, .advanced .boxcontent .lastcol {
+       margin-left: 0;
+       margin-bottom: 4em;
+}
+
+/* Site configuration */
+
+.tabs_background { margin-top: 0 }
+
+/* Links and buttons */
+
+.buttons {
+       margin: 2px auto 2px auto;
+       width: 96%;
+       text-align: center;
+}
+
+/* Tabs */
+
+#TheTabs {
+       margin: 3% auto 0 auto;
+       width: 94%;
+}
+
+ul.tabbed_dialog {
+       list-style: none;
+       margin: 3% auto 0 auto;
+       width: 96%;
+       padding: 0;
+       white-space: nowrap;
+       text-align: center;
+       vertical-align: middle;
+}
+
+ul.tabbed_dialog li {
+       margin: 0 3% 0 3%;
+       padding: 4px;
+       float: left;
+}
+
+.tabcontent {
+       margin: 0 auto 0 auto;
+       width: 96%;
+       padding: 10px;
+       clear: both;
+}
+
+.tabcontent_submit {
+       margin: 0 auto 0 auto;
+       width: 96%;
+       padding: 10px;
+       text-align: center;
+}
+
+
+/* Calendar view */
+
+.calendar {
+       background-color: #424b52;
+       margin: 0 auto;
+       width: 98%;
+       height: 302px;
+       border-radius: 8px;
+        -webkit-border-radius: 8px;
+        -moz-border-radius: 8px;
+        behavior: url(/static/styles/PIE.htc);
+}
+
+.calendar th { 
+       background-color: #424b52;
+       border-color: #424b52; }
+
+#inner_day { padding: 0.1em; }
+
+td.events_of_the_day { width: 50% }
+
+.events_of_the_day dl {
+       margin: 0;
+/*     padding: 0;
+       position: absolute;
+       top: 0;
+       left:0; */
+       width: 100%;
+}
+
+.events_of_the_day dl dt {
+       background-color: #FFFFFF;
+       margin: 0;
+       width: 500px;
+       border: 1px solid #CCC;
+}
+
+.events_of_the_day dl dt.hour {
+       /* font-size: 160%; commenting out because we need to line it up with the actual size */
+}
+
+.events_of_the_day dl dt.extrahour {
+       /* font-size: 80%; commenting out because we need to line it up with the actual size */
+}
+
+.hour_label, .extra_events dl dt {
+       background-color: #CCCCDD;
+       vertical-align: middle;
+       text-align: left;       
+}
+
+.hour_events, .extra_events {
+       background-color: #FFFFFF;
+       vertical-align: top;
+       text-align: left;       
+}
+
+.extra_events { border: 1px solid #ccc }
+
+.extra_events ul {
+       list-style: none;
+       padding: 0;
+       margin: 0;
+}
+
+.extra_events ul li { margin: 4px }
+
+.calday, .calout, .calweekend, .caltoday {
+       width: 14%;
+       height: 60px;
+       text-align: left;
+       vertical-align: top;
+}
+
+.event_framed_unread {
+       -webkit-border-radius: 8px;
+       -moz-border-radius: 8px;
+       border-radius: 8px;
+       behavior: url(/static/styles/PIE.htc);
+       border: solid 1px red;
+       background-color: yellow;
+       z-index: 10;
+       padding: 0 4px 0 4px; 
+}
+
+li.event_framed_unread span, a.event_title { font-size: 100% }
+
+.event_framed_read {
+       -webkit-border-radius: 8px;
+       -moz-border-radius: 8px;
+       border-radius: 8px;
+       behavior: url(/static/styles/PIE.htc);
+       border: solid 1px red;
+       background-color: yellow;
+       z-index: 10;
+       padding: 0 4px 0 4px; 
+}
+
+li.event_framed_read span, a.event_title { font-size: 100% }
+
+.event_read {}
+
+li.event_read span, a.event_read_title { font-size: 100% }
+
+.event_unread {}
+
+li.event_unread span, a.event_read_title { font-size: 100% }
+
+.mini_calendar { color: #fff }
+
+.mini_calendar a { color: #fff }
+
+.mini_calendar a:link,.mini_calendar a:visited { color: #fff }
+
+.mini_calendar a:hover,.mini_calendar a:active {
+   color: #3E65AF;
+   background-color: #3E65AF;
+}
+
+.mini_calendar td a { color: #fff }
+
+.mini_calendar td a:link,.mini_calendar td a:visited { color: #fff }
+
+.mini_calendar td a:hover,.mini_calendar td a:active {
+   color: #3E65AF;
+   background-color: #3E65AF;
+
+}
+
+.menudesc {
+       margin: 4px;
+       padding: 4px;
+}
+
+.roompic { border: none; }
+
+.table-row, .table-alt-row { width: 100% }
+
+.stickynote_outer {
+       position: absolute;
+       width: 200px;
+       height: 200px;
+       border: 1px solid #333;
+       background-color: #ffff00;
+       overflow: hidden;
+       -webkit-box-shadow: #666 0px 2px 3px;
+       -moz-box-shadow: #666 0px 2px 3px;
+       box-shadow: #666 0px 2px 3px;
+       behavior: url(/static/styles/PIE.htc);
+}
+
+.stickynote_titlebar {
+       position: relative;
+       width: 100%;
+       height: 16px;
+       top: 0px;
+       left: 0px;
+       background-color: #888800;
+       font-size: 60%;     
+}
+
+.stickynote_body {
+       position: relative;
+       font-family: "Comic Sans MS", sans-serif;
+}
+
+.stickynote_resize {
+       position: absolute;
+       background-image: url('resizecorner.png');
+       height: 16px;
+       width: 16px;
+       right: -1px;
+       bottom: -1px;
+}
+
+.stickynote_palette {
+       position: absolute;
+       width: 48px;
+       height: 48px;
+       top: 16px;
+       left: 0px;
+       background-color: #ffffff;
+       border: 1px solid #333;
+       display: none;
+}
+
+.stickynote_palette table {
+       margin: 0;
+       padding: 0;
+}
+
+.stickynote_palette td {
+       width: 16px;
+       height: 16px;
+}
+
+.conftitle {
+       font-size: 140%;
+       font-weight: bold;
+       text-align: center;
+}
+
+.confdescr {
+       font-size: 110%;
+       text-align: center;
+}
+
+#noscript_warning {
+       position: fixed;
+       z-index: 999;
+       top: 0;
+       right: 0;
+       background-color: #FF0000;
+       color: #FFFFFF;
+       font-size: 120%;
+       border: 2px solid #FF0000;
+}
+
+.chatrecv_history_class {
+       position: absolute;
+       top: 0.5em;
+       left: 0.5%;
+       width: 700px;
+       height: 70%;
+       background-color: #edede0;
+       overflow: auto;
+       border: 2px solid #424d52;
+       border-radius: 8px;
+       -khtml-border-radius: 8px;
+       -moz-border-radius: 8px;
+       behavior: url(/static/styles/PIE.htc);
+       -webkit-box-shadow: #666 0px 1px 2px;
+       -moz-box-shadow: #666 0px 2px 3px;
+       box-shadow: #666 0px 2px 3px;
+       padding: 0.5em;
+}
+
+.chat_userlist_class {
+       position: absolute;
+       top: 0.5em;
+       right: 0.5%;
+       width: 110px;
+       height: 92%;
+       background-color: #edede0;
+       overflow: auto;
+       border: 2px solid #424d52;
+       border-radius: 8px;
+       -khtml-border-radius: 8px;
+       -moz-border-radius: 8px;
+        box-shadow: #666 0px 2px 3px;
+       -webkit-box-shadow: #666 0px 1px 2px;
+        -moz-box-shadow: #666 0px 2px 3px;
+       behavior: url(/static/styles/PIE.htc);
+       padding: 0.5em;
+}
+
+.chatrecv_class { display: none }
+
+.chatsend_class {
+       position: absolute;
+       left: 0.5%;
+       bottom: 3%;
+       height: 95px;
+       width: 700px;
+       border: 2px solid #424d52;
+       border-radius: 8px; 
+       -khtml-border-radius: 8px;
+       -moz-border-radius: 8px;
+       box-shadow: #666 0px 2px 3px;
+       -webkit-box-shadow: #666 0px 1px 2px;
+       -moz-box-shadow: #666 0px 2px 3px;
+       behavior: url(/static/styles/PIE.htc);
+       background-color: #7d858c;
+       padding: 0.5em;
+}
+
+.chat_myname_class {
+       font-weight: bold;
+       color: #ff0000;
+}
+
+.chat_notmyname_class {
+       font-weight: bold;
+       color: #0000ff;
+}
+
+.chat_text_class {}
+
+/*---------- bubble tooltips start -----------*/
+
+a.event_title, a.event_unread, a.event_read {
+       position:relative;
+       z-index:24;
+}
+
+a.event_title span, a.event_unread span, a.event_read span {
+       display: none;
+}
+
+/* background:; ie hack, something must be changed in a for ie to execute it */
+
+a.event_title:hover, a.event_unread:hover, a.event_read:hover {
+       z-index:25;
+}
+
+a.event_title:hover span.tooltip, a.event_unread:hover span.tooltip, a.event_read:hover span.tooltip {
+       display:block;
+       position:absolute;
+       top:0px; left:0;
+       padding: 15px 0 0 0;
+       width:200px;
+       text-align: center;
+}
+
+a.event_title:hover span.btttop, a.event_unread:hover span.btttop, a.event_read:hover span.btttop {
+       display: block;
+       padding: 30px 8px 0;
+       background: url(/static/webcit_icons/bubble.gif) no-repeat top;
+}
+
+/* different middle bg for stretch */
+a.event_title:hover span.bttmiddle, a.event_unread:hover span.bttmiddle, a.event_read:hover span.bttmiddle {
+       display: block;
+       padding: 0 8px; 
+       background: url(/static/webcit_icons/bubble_filler.gif) repeat bottom; 
+       color: #022750;
+       font-size: 10px;
+}
+
+a.event_title:hover span.bttbottom, a.event_unread:hover span.bttbottom, a.event_read:hover span.bttbottom {
+       display: block;
+       padding:3px 8px 10px;
+       background: url(/static/webcit_icons/bubble.gif) no-repeat bottom;
+}
+
+/*---------- styles for the attachments form -----------*/
+
+#attachments_form {
+       display:none;
+       position:absolute;
+       top:5%;
+       bottom:5%;
+       right:5%;
+       left:5%;
+       z-index: 10;
+       padding: 5px;
+       border-width: 1px;
+       border-style: solid;
+       border-color: #022750;
+       -webkit-border-radius: 10px;
+       -moz-border-radius: 10px;
+       border-radius: 10px;
+       background: #FFFFFF;
+       background: -webkit-gradient(linear, 0 0, 0 bottom, from(#FFFFFF), to(#DDDDEE));
+       background: -moz-linear-gradient(#FFFFFF, #DDDDEE);
+       background: linear-gradient(#FFFFFF, #DDDDEE);
+       -pie-background: linear-gradient(#FFFFFF, #DDDDEE);
+       -webkit-box-shadow: #666 0px 2px 3px;
+       -moz-box-shadow: #666 0px 2px 3px;
+       box-shadow: #666 0px 2px 3px;
+}
+
+/*---------- styles for the login modal box -----------*/
+
+#loginbox_topline_container {
+       position: relative;
+       font-size: 110%;
+       color: white;
+}
+
+#loginbox_title {
+       float: left;
+       width: 75%;
+       text-align: center;
+       background-color: #022750;
+       border: 3px solid #022750;
+}
+
+#loginbox_closebutton {
+       float: right;
+       width: 23%;
+       text-align: right;
+       background-color: #ddd;
+       border: 3px solid #ddd;
+}
+
+#auth_container {
+       position: relative;
+       border: 1px solid #777;
+}
+
+#authbar {
+       top: 0;
+       left: 0;
+       width: 23%;
+       z-index: 0;
+       overflow: auto;
+       overflow-x: hidden !important;
+}
+
+#authbar ul {
+       margin-top: 1px;
+       margin-bottom: 0;
+}
+
+.authbox {
+       text-align: center;
+       position: absolute;
+       top: 0;
+       right: 0;
+       width: 75%;
+       height: 100%;
+       z-index: 0;
+       overflow: auto;
+       overflow-x: hidden !important;
+       background-color: #ddd;
+}
+
+#ajax_username_password_form, #ajax_newuser_form {
+       margin: auto;
+       width: 20em;
+}
+
+#ajax_username_password_form label, #ajax_newuser_form label {
+       float: left;
+       width: 10em;
+}
+
+.openid_urlarea {
+        background: url('../webcit_icons/openid-small.gif') no-repeat scroll 0pt 50%;
+        padding-left: 18px;
+}
diff --git a/webcit/static/summaryview.js b/webcit/static/summaryview.js
new file mode 100644 (file)
index 0000000..109b3fd
--- /dev/null
@@ -0,0 +1,654 @@
+/*
+ * Webcit Summary View v2
+ * All comments, flowers and death threats to Mathew McBride
+ * <matt@mcbridematt.dhs.org> / <matt@comalies>
+ * Copyright 2009 The Citadel Team
+ * Licensed under the GPL V3
+ *
+ * QA reminders: because I keep forgetting / get cursed.
+ * After changing anything in here, make sure that you still can:
+ * 1. Resort messages in both normal and paged view.
+ * 2. Select a range with shift-click 
+ * 3. Select messages with ctrl-click
+ * 4. Normal click will deselect everything done above
+ * 5. Move messages, and they will disappear
+ */
+
+document.observe("dom:loaded", createMessageView);
+
+var msgs = null;
+var message_view = null;
+var loadingMsg = null;
+var rowArray = null;
+var currentSortMode = null;
+
+// Header elements
+var mlh_date = null;
+var mlh_subject = null;
+var mlh_from = null;
+var currentSorterToggle = null;
+var query = "";
+var currentlyMarkedRows = new Object();
+var markedRowIndex = null;
+var currentlyHasRowsSelected = false;
+
+var mouseDownEvent = null;
+var exitedMouseDown = false;
+
+var originalMarkedRow = null;
+var previousFinish = 0;
+var markedFrom = 0;
+var trTemplate = new Array(11);
+trTemplate[0] = "<tr id=\"";
+trTemplate[2] = "\" citadel:dropenabled=\"dropenabled\" class=\"";
+trTemplate[4] = "\" citadel:dndelement=\"summaryViewDragAndDropHandler\" citadel:msgid=\"";
+trTemplate[6] = "\" citadel:ctdlrowid=\"";
+trTemplate[8] = "\"><td class=\"col1\">";
+trTemplate[10] = "</td><td class=\"col2\">";
+trTemplate[12] = "</td><td class=\"col3\">";
+trTemplate[14] = "</td></tr>";
+
+
+var currentPage = 0;
+var sortModes = {
+       "rdate" : sortRowsByDateDescending,
+       "date" : sortRowsByDateAscending,
+       "subj" : sortRowsBySubjectAscending,
+       "rsubj" : sortRowsBySubjectDescending,
+       "sender": sortRowsByFromAscending,
+       "rsender" : sortRowsByFromDescending
+};
+var toggles = {};
+
+var nummsgs = 0;
+var startmsg = 0;
+var newmsgs = 0;
+
+function refreshMessageCounter() {
+    var templStr = document.getElementById("nummsgs_template").innerHTML;
+    templStr = templStr.replace(/UNREADMSGS/, newmsgs);
+    templStr = templStr.replace(/TOTALMSGS/,  nummsgs);
+    document.getElementById("nummsgs").innerHTML = templStr;
+}
+
+function createMessageView() {
+       message_view = document.getElementById("message_list_body");
+       loadingMsg = document.getElementById("loading");
+       getMessages();
+       mlh_date = $("mlh_date");
+       mlh_subject = $('mlh_subject');
+       mlh_from = $('mlh_from');
+       toggles["rdate"] = mlh_date;
+       toggles["date"] = mlh_date;
+       toggles["subj"] = mlh_subject;
+       toggles["rsubj"] = mlh_subject;
+       toggles["sender"] = mlh_from;
+       toggles["rsender"] = mlh_from;
+       mlh_date.observe('click',ApplySort);
+       mlh_subject.observe('click',ApplySort);
+       mlh_from.observe('click',ApplySort);
+       $(document).observe('keyup',CtdlMessageListKeyUp,false);
+       $('resize_msglist').observe('mousedown', CtdlResizeMouseDown);
+       $('m_refresh').observe('click', getMessages);
+       document.getElementById('m_refresh').setAttribute("href","#");
+       Event.observe(document.onresize ? document : window, "resize", normalizeHeaderTable);
+       Event.observe(document.onresize ? document : window, "resize", sizePreviewPane);
+       if ( $('summpage') ) {
+               $('summpage').observe('change', getPage);
+       }
+       else {
+               alert('error: summpage does not exist');
+       }
+       takeOverSearchOMatic();
+       setupDragDrop(); // here for now
+}
+
+function getMessages() {
+       if (loadingMsg.parentNode == null) {
+               message_view.innerHTML = "";
+               message_view.appendChild(loadingMsg);
+       }
+       roomName = getTextContent(document.getElementById("rmname"));
+       var parameters = {'room':roomName, 'startmsg': startmsg, 'stopmsg': -1};
+       if (is_safe_mode) {
+               parameters['stopmsg'] = parseInt(startmsg)+499;
+               //parameters['maxmsgs'] = 500;
+               if (currentSortMode != null) {
+                       var SortBy = currentSortMode[0];
+                       if (SortBy.charAt(0) == 'r') {
+                               SortBy = SortBy.substr(1);
+                               parameters["SortOrder"] = "0";
+                       }
+                       parameters["SortBy"] = SortBy;
+               }
+       } 
+       if (query.length > 0) {
+               parameters["query"] = query;
+       }
+       new Ajax.Request("roommsgs", {
+               method: 'get',
+                               onSuccess: loadMessages,
+                               parameters: parameters,
+                               sanitize: false,
+                               evalJSON: false,
+                               onFailure: function(e) { alert("Failure: " + e);}
+       });
+}
+
+function evalJSON(data) {
+       var jsonData = null;
+       if (typeof(JSON) === 'object' && typeof(JSON.parse) === 'function') {
+               try {
+                       jsonData = JSON.parse(data);
+               } catch (e) {
+                       // ignore
+               }
+       }
+       if (jsonData == null) {
+               jsonData = eval('('+data+')');
+       }
+       return jsonData;
+}
+function loadMessages(transport) {
+       try {
+               var data = evalJSON(transport.responseText);
+               if (!!data && transport.responseText.length < 2) {
+                       alert("Message loading failed");
+               } 
+               nummsgs = data['nummsgs'];
+               newmsgs =  data['newmsgs'];
+               msgs = data['msgs'];
+               var length = msgs.length;
+               rowArray = new Array(length); // store so they can be sorted
+               wCLog("Row array length: "+rowArray.length);
+       } catch (e) {
+               //window.alert(e+"|"+e.description);
+       }
+       if (currentSortMode == null) {
+               if (sortmode.length < 1) {
+                       sortmode = "rdate";
+               }
+               currentSortMode = [sortmode, sortModes[sortmode]];
+               currentSorterToggle = toggles[sortmode];
+       }
+       if (!is_safe_mode) {
+               resortAndDisplay(currentSortMode[1]);
+       } else {
+               setupPageSelector();
+               resortAndDisplay(null);
+       }
+       if (loadingMsg.parentNode != null) {
+               loadingMsg.parentNode.removeChild(loadingMsg);
+       }
+       sizePreviewPane();
+        refreshMessageCounter();
+}
+function resortAndDisplay(sortMode) {
+       wCLog("Begin resortAndDisplay");
+  
+       /* We used to try and clear out the message_view element,
+          but stupid IE doesn't even do that properly */
+       var message_view_parent = message_view.parentNode;
+       message_view_parent.removeChild(message_view);
+       var startSort = new Date();
+       try {
+               if (sortMode != null) {
+                       msgs.sort(sortMode);
+               }
+       } catch (e) {
+               wCLog("Sort error: " + e);
+       }
+       var endSort = new Date();
+       wCLog("Sort rowArray in " + (endSort-startSort));
+       var start = new Date();
+       var length = msgs.length;
+       var compiled = new Array(length+2);
+       compiled[0] = "<table class=\"mailbox_summary\" id=\"summary_headers\" \"cellspacing=0\" style=\"width:100%;-moz-user-select:none;\">";
+       for(var x=0; x<length; ++x) {
+               try {
+                       var currentRow = msgs[x];
+                       trTemplate[1] = "msg_"+currentRow[0];
+                       var className = "";
+                       if (((x-1) % 2) == 0) {
+                               className += "table-alt-row";
+                       } else {
+                               className += "table-row";
+                       }
+                       if (currentRow[5]) {
+                               className += " new_message";
+                       }
+                       trTemplate[3] = className;
+                       trTemplate[5] = currentRow[0];
+                       trTemplate[7] = x;
+                       trTemplate[9] = currentRow[1];
+                       trTemplate[11] = currentRow[2];
+                       trTemplate[13] = currentRow[4];
+                       var i = x+1;
+                       compiled[i] = trTemplate.join("");
+               } catch (e) {
+                       wCLog("Exception on row " +  x + ":" + e);
+               }
+       }
+       compiled[length+2] = "</table>";
+       var end = new Date();
+       wCLog("iterate: " + (end-start));
+       var compile = compiled.join("");
+       start = new Date();
+       $(message_view_parent).update(compile);
+       message_view_parent.observe('click', CtdlMessageListClick);
+       message_view = message_view_parent.firstChild;
+       end = new Date();
+       var delta = end.getTime() - start.getTime();
+       wCLog("append: " + delta);
+       ApplySorterToggle();
+       normalizeHeaderTable();
+}
+function sortRowsByDateAscending(a, b) {
+       var dateOne = a[3];
+       var dateTwo = b[3];
+       return (dateOne - dateTwo);
+};
+function sortRowsByDateDescending(a, b) {
+       var dateOne = a[3];
+       var dateTwo = b[3];
+       return (dateTwo - dateOne);
+};
+function sortRowsBySubjectAscending(a, b) {
+       var subjectOne = a[1];
+       var subjectTwo = b[1];
+       return strcmp(subjectOne, subjectTwo);
+};
+function sortRowsBySubjectDescending(a, b) {
+       var subjectOne = a[1];
+       var subjectTwo = b[1];
+       return strcmp(subjectTwo, subjectOne);
+};
+function sortRowsByFromAscending(a, b) {
+       var fromOne = a[2];
+       var fromTwo = b[2];
+       return strcmp(fromOne, fromTwo);
+};
+function sortRowsByFromDescending(a, b) {
+       var fromOne = a[2];
+       var fromTwo = b[2];
+       return strcmp(fromTwo, fromOne);
+};
+function CtdlMessageListClick(evt) {
+    /* Since element.onload is used here, test to see if evt is defined */
+    var event = evt ? evt : window.event; 
+    var target = event.target ? event.target: event.srcElement; // and again..
+    var parent = target.parentNode;
+    var msgId = parent.getAttribute("citadel:msgid");
+    var is_shift_pressed = event.shiftKey;
+    var is_ctrl_pressed = event.ctrlKey;
+    var rowclass = parent.getAttribute("class");
+    var msgUnseen = rowclass.search("new_message") >= 0;
+
+    /* debugging
+       str = '.';
+       if (is_shift_pressed) {
+       str = str + 'S';
+       }
+       str = str + '.';
+       if (is_ctrl_pressed) {
+       str = str + 'C';
+       }
+       str = str + '.';
+       $('ib_summary').innerHTML = str;
+    */
+
+    // If the ctrl key modifier wasn't used, unmark all rows and load the message
+    if (!is_shift_pressed && !is_ctrl_pressed) {
+       previousFinish = 0;
+       markedFrom = 0;
+       unmarkAllRows();
+       markedRowIndex = parent.rowIndex;
+       originalMarkedRow = parent;
+       document.getElementById("preview_pane").innerHTML = "";
+       new Ajax.Updater('preview_pane', 'msg/'+msgId, {method: 'get'});
+       markRow(parent);
+
+       if (msgUnseen) {
+           var p = encodeURI('g_cmd=SEEN ' + msgId + '|1');
+           new Ajax.Request('ajax_servcmd', {
+               method: 'post',
+               parameters: p,
+               onComplete: CtdlMarkRowAsRead(parent)
+           });
+       }
+       // If the shift key modifier is used, mark a range...
+    } else if (event.button != 2 && is_shift_pressed) {
+       if (originalMarkedRow == null) {
+           originalMarkedRow = parent;
+           markRow(parent);
+       } else {
+           unmarkAllRows();
+           markRow(parent);
+           markRow(originalMarkedRow);
+       }
+       var rowIndex = parent.rowIndex;
+       if (markedFrom == 0) {
+           markedFrom = rowIndex;
+       }
+       var startMarkingFrom = 0;
+       var finish = 0;
+       if (markedRowIndex === null) {
+           startMarkingFrom = 0;
+           finish = rowIndex;
+       }
+       else if (rowIndex > markedRowIndex) {
+           startMarkingFrom = markedRowIndex+1;
+           finish = rowIndex;
+       } else if (rowIndex < markedRowIndex) {
+           startMarkingFrom = rowIndex+1;
+           finish = markedRowIndex;
+       }
+       previousFinish = finish;
+       wCLog('startMarkingFrom=' + startMarkingFrom + ', finish=' + finish);
+       for(var x = startMarkingFrom; x<finish; x++) {
+           wCLog("Marking row " + x);
+           markRow(parent.parentNode.rows[x]);
+       }
+       // If the ctrl key modifier is used, toggle one message
+    } else if (event.button != 2 && is_ctrl_pressed) {
+       if (parent.getAttribute("citadel:marked")) {
+           unmarkRow(parent);
+       }
+       else {
+           markRow(parent);
+       }
+    }
+}
+function CtdlMarkRowAsRead(rowElement) {
+       var classes = rowElement.className;
+       classes = classes.replace("new_message","");
+       rowElement.className = classes;
+        newmsgs--;
+       refreshMessageCounter();
+}
+function ApplySort(event) {
+       var target = event.target;
+       var sortId = target.id;
+       removeOldSortClass();
+       currentSorterToggle = target;
+       var sortModes = getSortMode(target); // returns [[key, func],[key,func]]
+       var sortModeToUse = null;
+       if (currentSortMode[0] == sortModes[0][0]) {
+               sortModeToUse = sortModes[1];
+       } else {
+               sortModeToUse = sortModes[0];
+       }
+       currentSortMode = sortModeToUse;
+       if (is_safe_mode) {
+               getMessages(); // in safe mode, we load from server already sorted
+       } else {
+               resortAndDisplay(sortModeToUse[1]);
+       }
+}
+function getSortMode(toggleElem) {
+       var forward = null;
+       var reverse = null;
+       for(var key in toggles) {
+               var kr = (key.charAt(0) == 'r');
+               if (toggles[key] == toggleElem && !kr) {
+                       forward = [key, sortModes[key]];
+               } else if (toggles[key] == toggleElem && kr) {
+                       reverse = [key, sortModes[key]];
+               }
+       }
+       return [forward, reverse];
+}
+function removeOldSortClass() {
+       if (currentSorterToggle) {
+               var classes = currentSorterToggle.className;
+               classes = classes.replace("current_sort_mode","");
+               classes = classes.replace("sort_ascending","");
+               classes = classes.replace("sort_descending","");
+               currentSorterToggle.className = classes;
+       }
+}
+function markRow(row) {
+       var msgId = row.getAttribute("citadel:msgid");
+       row.className = row.className += " marked_row";
+       row.setAttribute("citadel:marked","marked");
+       currentlyMarkedRows[msgId] = row;
+}
+function unmarkRow(row) {
+       var msgId = row.getAttribute("citadel:msgid");
+       row.className = row.className.replace("marked_row","");
+       row.removeAttribute("citadel:marked");
+       delete currentlyMarkedRows[msgId];
+}
+function unmarkAllRows() {
+       for(msgId in currentlyMarkedRows) {
+               unmarkRow(currentlyMarkedRows[msgId]);
+       }
+}
+function deleteAllMarkedRows() {
+       for(msgId in currentlyMarkedRows) {
+               var row = currentlyMarkedRows[msgId];
+               var rowclass = row.getAttribute("class");
+               var msgUnseen = rowclass.search("new_message") >= 0;
+
+               var rowArrayId = row.getAttribute("citadel:ctdlrowid");
+               row.parentNode.removeChild(row);
+               delete currentlyMarkedRows[msgId];
+               delete msgs[rowArrayId];
+               if (msgUnseen)
+                   newmsgs--;
+               nummsgs--;
+       }
+       // Now we have to reconstruct rowarray as the array length has changed */
+       var newMsgs = new Array(msgs.length-1);
+       var x=0;
+       for(var i=0; i<rowArray.length; i++) {
+               var currentRow = msgs[i];
+               if (currentRow != null) {
+                       newMsgs[x] = currentRow;
+                       x++;
+               }
+       }
+       msgs = newMsgs;
+       resortAndDisplay(null);
+       refreshMessageCounter();
+}
+function deleteAllSelectedMessages() {
+    var mvCommand = "";
+    var msgIds = "";
+    for(msgId in currentlyMarkedRows) {
+       msgIds += ","+msgId;
+
+       if (msgIds.length > 800) {
+           if (!room_is_trash) {
+               mvCommand = encodeURI("g_cmd=MOVE " + msgIds + "|_TRASH_|0");
+           }
+           else {
+               mvCommand = encodeURI("g_cmd=DELE " + msgIds);
+           }
+           new Ajax.Request("ajax_servcmd", {
+               parameters: mvCommand,
+               method: 'post',
+               onSuccess: function(transport) {
+                   wCLog(transport.responseText);
+               }
+           });
+           msgIds = "";
+       }
+    }
+
+    if (!room_is_trash) {
+       mvCommand = encodeURI("g_cmd=MOVE " + msgIds + "|_TRASH_|0");
+    }
+    else {
+       mvCommand = encodeURI("g_cmd=DELE " + msgIds);
+    }
+    new Ajax.Request("ajax_servcmd", {
+       parameters: mvCommand,
+       method: 'post',
+       onSuccess: function(transport) {
+           wCLog(transport.responseText);
+       }
+    });
+
+    document.getElementById("preview_pane").innerHTML = "";
+    deleteAllMarkedRows();
+}
+
+
+function CtdlMessageListKeyUp(event) {
+       var key = event.which || event.keyCode;
+
+       if (key == 46) {                                /* DELETE */
+               deleteAllSelectedMessages();
+       }
+}
+
+function clearMessage(msgId) {
+       var row = document.getElementById('msg_'+msgId);
+       row.parentNode.removeChild(row);
+       delete currentlyMarkedRows[msgId];
+}
+
+function summaryViewContextMenu() {
+       if (!exitedMouseDown) {
+               var contextSource = document.getElementById("listViewContextMenu");
+               CtdlSpawnContextMenu(mouseDownEvent, contextSource);
+       }
+}
+
+function summaryViewDragAndDropHandler() {
+       var element = document.createElement("div");
+       var msgList = document.createElement("ul");
+       element.appendChild(msgList);
+       for(msgId in currentlyMarkedRows) {
+               msgRow = currentlyMarkedRows[msgId];
+               var subject = getTextContent(msgRow.getElementsByTagName("td")[0]);
+               var li = document.createElement("li");
+               msgList.appendChild(li);
+               setTextContent(li, subject);
+               li.ctdlMsgId = msgId;
+       }
+       return element;
+}
+
+var saved_y = 0;
+function CtdlResizeMouseDown(event) {
+       $(document).observe('mousemove', CtdlResizeMouseMove);
+       $(document).observe('mouseup', CtdlResizeMouseUp);
+       saved_y = event.clientY;
+}
+
+function sizePreviewPane() {
+       var preview_pane = document.getElementById("preview_pane");
+       var summary_view = document.getElementById("summary_view");
+       var banner = document.getElementById("banner");
+       var message_list_hdr = document.getElementById("message_list_hdr");
+       var content = $('global');  // we'd like to use prototype methods here
+       var childElements = content.childElements();
+       var sizeOfElementsAbove = 0;
+       var heightOfViewPort = document.viewport.getHeight() // prototypejs method
+               var bannerHeight = banner.offsetHeight;
+       var contentViewPortHeight = heightOfViewPort-banner.offsetHeight-message_list_hdr.offsetHeight;
+       contentViewPortHeight = 0.95 * contentViewPortHeight; // leave some error (especially for FF3!!)
+       // Set summary_view to 20%;
+       var summary_height = ctdlLocalPrefs.readPref("svheight");
+       if (summary_height == null) {
+               summary_height = 0.20 * contentViewPortHeight;
+       }
+       // Set preview_pane to the remainder
+       var preview_height = contentViewPortHeight - summary_height;
+  
+       summary_view.style.height = (summary_height)+"px";
+       preview_pane.style.height = (preview_height)+"px";
+}
+function CtdlResizeMouseMove(event) {
+       var clientX = event.clientX;
+       var clientY = event.clientY;
+       var summary_view = document.getElementById("summary_view");
+       var summaryViewHeight = summary_view.offsetHeight;
+       var increment = clientY-saved_y;
+       var summary_view_height = increment+summaryViewHeight;
+       summary_view.style.height = (summary_view_height)+"px";
+       // store summary view height 
+       ctdlLocalPrefs.setPref("svheight",summary_view_height);
+       var msglist = document.getElementById("preview_pane");
+       var msgListHeight = msglist.offsetHeight;
+       msglist.style.height = (msgListHeight-increment)+"px";
+       saved_y = clientY;
+       /* For some reason the grippy doesn't work without position: absolute
+          so we need to set its top pos manually all the time */
+       var resize = document.getElementById("resize_msglist");
+       var resizePos = resize.offsetTop;
+       resize.style.top = (resizePos+increment)+"px";
+}
+function CtdlResizeMouseUp(event) {
+       $(document).stopObserving('mousemove', CtdlResizeMouseMove);
+       $(document).stopObserving('mouseup', CtdlResizeMouseUp);
+}
+function ApplySorterToggle() {
+       var className = currentSorterToggle.className;
+       className += " current_sort_mode";
+       if (currentSortMode[1] == sortRowsByDateDescending ||
+           currentSortMode[1] == sortRowsBySubjectDescending ||
+           currentSortMode[1] == sortRowsByFromDescending) {
+               className += " sort_descending";
+       } else {
+               className += " sort_ascending";
+       }
+       currentSorterToggle.className = className;
+}
+
+/* Hack to make the header table line up with the data */
+function normalizeHeaderTable() {
+       var message_list_hdr = document.getElementById("message_list_hdr");
+       var summary_view = document.getElementById("summary_view");
+       var resize_msglist = document.getElementById("resize_msglist");
+       var headerTable = message_list_hdr.getElementsByTagName("table")[0];
+       var dataTable = summary_view.getElementsByTagName("table")[0];
+       var dataTableWidth = dataTable.offsetWidth;
+       headerTable.style.width = dataTableWidth+"px";
+}
+
+function setupPageSelector() {
+       var summpage = document.getElementById("summpage");
+       var select_page = document.getElementById("selectpage");
+       summpage.innerHTML = "";
+       if (is_safe_mode) {
+               wCLog("unhiding parent page");
+               select_page.className = "";
+       } else {
+               return;
+       }
+       var pages = nummsgs / 499;
+       for(var i=0; i<pages; i++) {
+               var opt = document.createElement("option");
+               var startmsg = i * 499;
+               opt.setAttribute("value",startmsg);
+               if (currentPage == i) {
+                       opt.setAttribute("selected","selected");
+               }
+               opt.appendChild(document.createTextNode((i+1)));
+               summpage.appendChild(opt);
+       }
+}
+
+function getPage(event) {
+       var target = event.target;
+       startmsg = target.options.item(target.selectedIndex).value;
+       currentPage = target.selectedIndex;
+       //query = ""; // We are getting a page from the _entire_ msg list, don't query
+       getMessages();
+}
+
+function takeOverSearchOMatic() {
+       var searchForm = document.getElementById("searchomatic").getElementsByTagName("form")[0];
+       // First disable the form post
+       searchForm.setAttribute("action","javascript:void();");
+       searchForm.removeAttribute("method");
+       $(searchForm).observe('submit', doSearch);
+}
+function doSearch() {
+       query = document.getElementById("srchquery").value;
+       getMessages();
+       return false;
+}
diff --git a/webcit/static/t/addressbook/list.html b/webcit/static/t/addressbook/list.html
new file mode 100644 (file)
index 0000000..055f6ef
--- /dev/null
@@ -0,0 +1,17 @@
+<table border=0 width='100%'>
+  <tr valign=middle>
+    <td align=left><img src="static/webcit_icons/essen/32x32/contact.png"></td>
+    <td align=center>
+      <form>
+       <select class="address_book_popup_title" size=1 id="which_addr_book"  onChange="PopulateAddressBookInnerDiv($('which_addr_book').value,'<?BSTR("target_input", "X")>')">
+         <option value="__LOCAL_USERS__" ><?SERV:HUMANNODE("X")></option>
+               <?ITERATE("LKRA", ="addressbook_list_entry")>
+       </select>
+      </form>
+    </td>
+    <td align='right' onclick="javascript:$('address_book_popup').style.display='none';" >
+      <img src="static/webcit_icons/closewindow.gif">
+    </td>
+  </tr>
+</table>
+<script type="text/javascript">PopulateAddressBookInnerDiv($('which_addr_book').value,'<?BSTR("target_input", "X")>');</script>
diff --git a/webcit/static/t/addressbook/list_entry.html b/webcit/static/t/addressbook/list_entry.html
new file mode 100644 (file)
index 0000000..d37fe4d
--- /dev/null
@@ -0,0 +1 @@
+<?!("COND:ROOM:INFO:TYPE_IS", 1, #"VIEW_ADDRESSBOOK")> <option value="<?ROOM:INFO:NAME("X")>" <?%("COND:ROOM:INFO:NAME_IS", 2, 0, ."defaddrbook", "selected", "")>><?ROOM:INFO:NAME("X")></option><??("X", 1)>
diff --git a/webcit/static/t/addressbook/namelist.html b/webcit/static/t/addressbook/namelist.html
new file mode 100644 (file)
index 0000000..c651bb2
--- /dev/null
@@ -0,0 +1,6 @@
+<div align=center><form onSubmit="return false;"><select multiple name="whichaddr" id="whichaddr" size="15">
+<?ITERATE("ITERATE:ABNAMES", ="addressbook_namelist_entry")>
+</select>
+<?_("Add:")>
+<?ITERATE("ITERATE:BSTR:PAIR", ="addressbook_namelist_button", "target_input")>
+</form></div>
diff --git a/webcit/static/t/addressbook/namelist_button.html b/webcit/static/t/addressbook/namelist_button.html
new file mode 100644 (file)
index 0000000..9dbd731
--- /dev/null
@@ -0,0 +1 @@
+<INPUT TYPE="submit" NAME="select_button" VALUE="<?BSTR:PAIR:Y("U")>" onClick="AddContactsToTarget($('<?BSTR:PAIR:X("X")>'),$('whichaddr'));">
diff --git a/webcit/static/t/addressbook/namelist_entry.html b/webcit/static/t/addressbook/namelist_entry.html
new file mode 100644 (file)
index 0000000..7ec939f
--- /dev/null
@@ -0,0 +1 @@
+<option value="<?CONTEXTSTR("X")>"><?CONTEXTSTR("X")></option>
diff --git a/webcit/static/t/addressbook/popup.html b/webcit/static/t/addressbook/popup.html
new file mode 100644 (file)
index 0000000..557d7e6
--- /dev/null
@@ -0,0 +1,6 @@
+<div id="address_book_popup" style="display:none;">
+  <div id="address_book_popup_container_div">
+    <div id="address_book_popup_middle_div"></div>
+    <div id="address_book_inner_div"></div>
+  </div>
+</div>
diff --git a/webcit/static/t/aide/display_aliases.html b/webcit/static/t/aide/display_aliases.html
new file mode 100644 (file)
index 0000000..8ed9d80
--- /dev/null
@@ -0,0 +1,99 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<h1><a href="javascript:load_aliases()">&#8635;</a>
+<?_("Global email aliases")></h1>
+</div>
+<div id="content" class="service">
+<?!("COND:AIDE", 1)><?_("You need to be aide to view this.")><?!("X", 1)>
+<??("COND:AIDE", 2)>
+
+<div id="wc_easterbunny77">
+</div>
+
+<form method="POST" action="do_generic">
+       <input type="hidden" name="return_to" value="do_template?template=aide_display_menu">
+       <input type="hidden" name="g_cmd" value="conf putsys|global_alias_table">
+       <textarea name="g_input" id="g_input" rows="20" cols="80"  VALUE="" style="display:none;"></textarea>
+       <br><center>
+       <input type="submit" name="ok_button" onClick="javascript:add_alias();" value="<?_("Save")>">
+       <input type="submit" name="cancel_button" value="<?_("Cancel")>"></center>
+</form>
+
+<script type="text/javascript">
+
+load_aliases = async() => {
+       response = await fetch("ajax_servcmd?g_cmd=conf getsys|global_alias_table");
+       data = await(response.text());
+       populate_aliases(data);
+};
+
+function delete_alias(rowid) {
+       var row = document.getElementById(rowid);
+       row.parentNode.removeChild(row);
+       repopulate_the_box();
+}
+
+function populate_aliases(data) {
+       var a = "<table id=killo9867>";
+       lines = data.split("\n");
+       for (var i=1; i<lines.length && lines[i] != "000"; ++i) {
+               config_line = lines[i].split("|");
+               lineid = randomString(10);
+               a +=    "<tr id=" + lineid + ">" +
+                       "<td><a href=\"javascript:delete_alias('" + lineid + "');\">" +
+                       "<font color=\"#FF0000\">&#10060;</font></a></td>" +
+                       "<td>" + config_line[0] + "</td>" +
+                       "<td>" + config_line[1] + "</td>" +
+                       "</tr>";
+       }
+       a +=    "<tr id=\"newentry\">" +
+               "<td><a href=\"javascript:add_alias();\">" +
+               "<font color=\"#FF0000\">&#9989;</font></a></td>" +
+               "<td><input id=\"newalias1\" name=\"newalias1\" width=\"40\"></td>" +
+               "<td><input id=\"newalias2\" name=\"newalias2\" width=\"80\"></td>" +
+               "</tr>";
+       a += "</table>";
+       document.getElementById("wc_easterbunny77").innerHTML = a;
+       repopulate_the_box();
+}
+
+function add_alias() {
+       a = document.getElementById("g_input").innerHTML;
+       if (a != "") {
+               a += "\n";
+       }
+       a += document.getElementById("newentry").cells[1].firstChild.value + "|";
+       a += document.getElementById("newentry").cells[2].firstChild.value;
+       document.getElementById("g_input").innerHTML = a;
+       document.getElementById("newentry").cells[1].firstChild.value = "";
+       document.getElementById("newentry").cells[2].firstChild.value = "";
+       populate_aliases("100 \n" + a);
+       return true;
+}
+
+function repopulate_the_box() {
+       newbox = "";
+       t = document.getElementById("killo9867");
+       for (row of t.rows) {
+               if (    (row.cells[1].innerHTML.trim() != "")
+                       && (row.cells[2].innerHTML.trim() != "")
+                       && (row.id != "newentry")
+               ) {
+                       if (newbox != "") {
+                               newbox += "\n";
+                       }
+                       newbox += row.cells[1].innerHTML.trim() + "|" + row.cells[2].innerHTML.trim();
+               }
+       }
+       document.getElementById("g_input").innerHTML = newbox;
+}
+
+load_aliases();
+
+</script>
+
+
+<??("X", 2)>
+</div>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_generic_cmd.html b/webcit/static/t/aide/display_generic_cmd.html
new file mode 100644 (file)
index 0000000..261972c
--- /dev/null
@@ -0,0 +1,30 @@
+<?=("head")>
+<div id="banner">
+  <h1>
+    <?_("Enter a server command")>
+  </h1>
+</div>
+
+<div id="content" class="service">
+    <??("COND:AIDE", 1)>
+    <table class="mainmenu_background"><tr><td>
+
+         <center><?_("This screen allows you to enter Citadel server commands which are not supported by WebCit.  If you do not know what that means, then this screen will not be of much use to you.")><br>
+           <form method="post" action="do_generic">
+             <input type="hidden" name="nonce" value="<?NONCE>">
+             <?_("Enter command:")><br>
+             <input type="text" name="g_cmd" size=80 maxlength="250"><br>
+             <?_("Command input (if requesting SEND_LISTING transfer mode):")><br>
+             <textarea name="g_input" rows=10 cols=80 width=80></textarea><br>
+             <font size=-2>
+               <?_("Detected host header is ")><?DAV:HOSTNAME>
+             </font>
+             <input type="submit" name="sc_button" value="<?_("Send command")>">&nbsp;
+             <input type="submit" name="cancel_button" value="<?_("Cancel")>"><br>
+           </form>
+         </center>
+       </td>
+      </tr>
+    </table>
+    <??("X", 1)>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_generic_result.html b/webcit/static/t/aide/display_generic_result.html
new file mode 100644 (file)
index 0000000..82e024f
--- /dev/null
@@ -0,0 +1,23 @@
+<?=("head")>
+<?=("box_begin_1")><?_("Server command results")><?=("box_begin_2")>
+
+</td><td valign=top> 
+
+
+<table border=0><tr><td>Command:</td><td><tt>
+
+<?BSTR("g_cmd")>
+
+</tt></td></tr><tr><td>Result:</td><td><tt>
+
+<?CONTEXTSTR("H")>
+       
+<br>
+</tt></td></tr></table><br>
+<hr />
+<a href="do_template?template=aide_display_generic_cmd"><?_("Enter another command")></a><br>
+<a href="display_advanced"><?_("Return to menu")></a>
+
+<?=("box_end")><br>
+
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_ignetconf.html b/webcit/static/t/aide/display_ignetconf.html
new file mode 100644 (file)
index 0000000..ba199e0
--- /dev/null
@@ -0,0 +1,21 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+  <h1><?_("Network configuration")></h1>
+</div>
+
+<div id="content" class="service">
+
+<center>
+<a href="do_template?template=aide_ignetconf_add"><?_("Add a new node")></a><br>
+</center>
+
+<table class="netconf_banner"><tr><td>
+<span class="titlebar"><?_("Currently configured nodes")></span>
+</td></tr></table>
+
+<center><table border=0>
+<?ITERATE("NODECONFIG", ="aide_ignetconf_section")>
+</table></center>
+
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_inetconf.html b/webcit/static/t/aide/display_inetconf.html
new file mode 100644 (file)
index 0000000..9ab3788
--- /dev/null
@@ -0,0 +1,30 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<h1>
+<??("COND:AIDE", 1)><?_("System Administration Menu")><??("X", 1)>
+<?!("COND:AIDE", 2)><?_("Room Admin Menu")><?!("X", 2)>
+</h1>
+</div>
+<div id="content" class="service">
+<table border="0" width="100%" cellspacing="10" cellpadding="10">
+<tr><td valign="top" width="50%">
+
+
+<?DOBOXED("aide_inet_aliases", _("Local host aliases"))><br>
+<?DOBOXED("aide_inet_smarthosts", _("Smart hosts"))><br>
+<?DOBOXED("aide_inet_notify", _("Notification hosts"))>
+
+</td><td valign="top" width="50%">
+
+<?DOBOXED("aide_inet_rbldns", _("RBL hosts"))><br>
+<?DOBOXED("aide_inet_spamass", _("SpamAssassin hosts"))><br>
+<?DOBOXED("aide_inet_clamav", _("ClamAV clamd hosts"))><br>
+<?DOBOXED("aide_inet_masqdomains", _("Masqueradable domains"))>
+
+
+</td></tr></table>
+</div>
+<?SERVCFG:FLUSHINETCFG>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_logstatus.html b/webcit/static/t/aide/display_logstatus.html
new file mode 100644 (file)
index 0000000..5507ddd
--- /dev/null
@@ -0,0 +1,24 @@
+<?=("head")>
+<div id="banner">
+  <h1>
+    <?_("Temporarily enable debug logging for components")>
+  </h1>
+</div>
+
+<div id="content" class="service">
+  <??("COND:AIDE", 1)>
+  <form method="post" action="do_generic">
+    <table border="0" cellspacing="2" cellpadding="2" class="altern">
+      <tr><td colspan=2>
+         <center><?_("This screen allows you to enable debug logging of components of the current citserver process. The setting is non-restart permanent. If you want it to be enabled permanently add it to the CITADEL_LOGDEBUG environment variable in your init script.")><br>
+         </center>
+       </td>
+      </tr>
+      <?ITERATE("SERVCFG:LOGENABLE", ="aide_display_logstatus_line")>
+    </table>
+  </form>
+</div>
+
+</div>
+  <??("X", 1)>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_logstatus_line.html b/webcit/static/t/aide/display_logstatus_line.html
new file mode 100644 (file)
index 0000000..3fbd0cb
--- /dev/null
@@ -0,0 +1,8 @@
+<tr class='<?ITERATE:ODDEVEN>'>
+  <td><?SERVCFG:LOGNAME("X")></td>
+  <td><input type="checkbox" 
+            id="<?SERVCFG:LOGNAME("U")>" 
+            onclick="ToggleLogEnable('<?SERVCFG:LOGNAME("U")>')"
+            <?%("COND:SERVCFG:THISLOGENABLE",  1, 1, 1, "checked", "")> >
+</td>
+</tr>
diff --git a/webcit/static/t/aide/display_menu.html b/webcit/static/t/aide/display_menu.html
new file mode 100644 (file)
index 0000000..b1a6071
--- /dev/null
@@ -0,0 +1,20 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<h1>
+<??("COND:AIDE", 1)><?_("System Administration Menu")><??("X", 1)>
+<?!("COND:AIDE", 2)><?_("Room Admin Menu")><?!("X", 2)>
+</h1>
+</div>
+<div id="content" class="service">
+<table>
+<tr valign=top><td width=50% valign="top">
+<??("COND:AIDE", 3)><?DOBOXED("aide_global_config", _("Global Configuration"))><??("X", 3)>
+</td><td width=50% valign="top">
+<??("COND:AIDE", 4)><?DOBOXED("aide_usermanagement", _("User account management"))><??("X", 4)>
+</td></tr><tr><td width=50% valign="top">
+<??("COND:AIDE", 5)><?DOBOXED("aide_restart", _("Shutdown Citadel"))><??("X", 5)>
+</td><td width=50% valign="top">
+<?DOBOXED("aide_floorconfig", _("Rooms and Floors"))>
+</td></tr></table>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_serverrestart.html b/webcit/static/t/aide/display_serverrestart.html
new file mode 100644 (file)
index 0000000..a2c5753
--- /dev/null
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+       <head>
+               <title><?CURRENT_USER> - <?SERV:HUMANNODE></title>
+               <meta name="keywords" content="groupware messaging collaboration" >
+               <link href="static/styles/webcit.css" rel="stylesheet" type="text/css">
+               <link href="static/styles/datepicker.css" rel="stylesheet" type="text/css">
+               <?CSSLOCAL>
+
+               <script type="text/javascript" src="static/prototype.js"></script>
+               <script type="text/javascript" src="static/scriptaculous.js"></script>
+               <script type="text/javascript" src="static/BubbleTooltips.js"></script>
+               <script type="text/javascript" src="static/datepicker-dev.js"></script>
+               <script type="text/javascript" src="static/table.js"></script>
+               <script type="text/javascript" src="static/wclib.js"></script>
+               <script type="text/javascript" src="static/authmethods.js"></script>
+               <meta http-equiv="refresh" content="15; URL=do_template?template=aide_display_menu"/>
+       </head>
+<body>
+<div id="global">
+       
+       <div id="content" class="service">
+               <table><td width=50% valign="top"><tr>
+                       <?DOBOXED(="aide_serverrestart_box", _("Restart Citadel"))>
+               </td></tr></table>
+       </div>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_serverrestart_page.html b/webcit/static/t/aide/display_serverrestart_page.html
new file mode 100644 (file)
index 0000000..a6c4146
--- /dev/null
@@ -0,0 +1,6 @@
+<?=("head")>
+
+<div id="resatrt_page">
+<?DOBOXED("box_serverrestartpage", _("Message to your Users:"))>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_serverrestart_page_do.html b/webcit/static/t/aide/display_serverrestart_page_do.html
new file mode 100644 (file)
index 0000000..58cc3cb
--- /dev/null
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+        "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+       <head>
+               <title><?CURRENT_USER> - <?SERV:HUMANNODE></title>
+               <meta name="keywords" content="groupware messaging collaboration" >
+               <link href="static/styles/webcit.css" rel="stylesheet" type="text/css">
+               <link href="static/styles/datepicker.css" rel="stylesheet" type="text/css">
+               <?CSSLOCAL>
+
+               <script type="text/javascript" src="static/prototype.js"></script>
+               <script type="text/javascript" src="static/scriptaculous.js"></script>
+               <script type="text/javascript" src="static/BubbleTooltips.js"></script>
+               <script type="text/javascript" src="static/datepicker-dev.js"></script>
+               <script type="text/javascript" src="static/table.js"></script>
+               <script type="text/javascript" src="static/wclib.js"></script>
+               <script type="text/javascript" src="static/authmethods.js"></script>
+               <meta http-equiv="refresh" content="40; URL=server_shutdown?when=now"/>
+       </head>
+<body>
+       <div id="global">
+               
+               <div id="content" class="service">
+                       <table><td width=50% valign="top"><tr>
+                               <?DOBOXED("box_serverrestartpagedo")>
+                       </td></tr></table>
+               </div>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/display_sitewide_config.html b/webcit/static/t/aide/display_sitewide_config.html
new file mode 100644 (file)
index 0000000..4d9a6d7
--- /dev/null
@@ -0,0 +1,27 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<h1><?_("Site configuration")></h1>
+</div>
+<div id="content" class="service">
+<?!("COND:AIDE", 1)><?_("You need to be aide to view this.")><?!("X", 1)>
+<??("COND:AIDE", 2)>
+<table border="0" cellspacing="0" cellpadding="0" ><tr><td>
+<form method="post" action="siteconfig">
+<input type="hidden" name="nonce" value= '<?NONCE>'>
+<?DOTABBED(
+       _("General"),                   ="aide_siteconfig_tab_general",
+       _("Settings"),                  ="aide_siteconfig_tab_setting",
+       _("SMTP"),                      ="aide_siteconfig_tab_smtp", 
+       _("IMAP4"),                     ="aide_siteconfig_tab_imap", 
+       _("Pop3"),                      ="aide_siteconfig_tab_pop3", 
+       _("Indexing/Journaling"),       ="aide_siteconfig_tab_indexing",
+       _("Access"),                    ="aide_siteconfig_tab_access",
+       _("Directory"),                 ="aide_siteconfig_tab_directory",
+       _("Auto-purger"),               ="aide_siteconfig_tab_autopurger",
+        "", ="aide_siteconfig_submit")>
+</form>
+</td></tr></table>
+<??("X", 2)>
+</div>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/edituser/add.html b/webcit/static/t/aide/edituser/add.html
new file mode 100644 (file)
index 0000000..d4ffa91
--- /dev/null
@@ -0,0 +1,8 @@
+<?_("To create a new user account, enter the desired user name in the box below and click 'Create'.")>
+<br /><br />
+ <center><form method="POST" action="create_user">
+ <input type="hidden" name="nonce" value="<?NONCE>">
+   <?_("New user: ")>
+  <input type="text" name="username"><br />
+  <input type="submit" name="create_button" value="<?_("Create")>">
+</form></center>
diff --git a/webcit/static/t/aide/edituser/box_select.html b/webcit/static/t/aide/edituser/box_select.html
new file mode 100644 (file)
index 0000000..d77a8ad
--- /dev/null
@@ -0,0 +1,16 @@
+<?_("To edit an existing user account, select the user name from the list and click 'Edit'.")>
+<br /><br />
+<center>
+  <form method="POST" action="display_edituser">
+   <input type="hidden" name="nonce" value="<?NONCE>">
+   <input type="hidden" name="suppress_email" value="1">
+   <select name="username" size=10 style="width:100%">
+<?ITERATE("USERLIST", ="aide_edituser_section")>
+</select><br />
+<input type="submit" name="edit_config_button" value="<?_("Edit configuration")>">
+<input type="submit" name="edit_abe_button" value="<?_("Edit address book entry")>">
+<input type="submit" name="delete_button" value="<?_("Delete user")>"
+       onClick="return confirm('<?_("Delete this user?")>');">
+</form></center>
diff --git a/webcit/static/t/aide/edituser/detailview.html b/webcit/static/t/aide/edituser/detailview.html
new file mode 100644 (file)
index 0000000..b5695dd
--- /dev/null
@@ -0,0 +1,86 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+  <h1><?_("Edit user account: ")><?USERLIST:USERNAME("X")></h1>
+</div>
+<div id="content" class="service">
+<table class="useredit_background">
+  <tr>
+    <td>
+      <form method="POST" action="edituser">
+      <input type="hidden" name="username" value="<?USERLIST:USERNAME("X")>">
+      <input type="hidden" name="is_new" value="<?BSTR("is_new")>">
+      <input type="hidden" name="usernum" value="<?USERLIST:UID>">
+      <input type="hidden" name="nonce" value="<?NONCE>"> 
+      <input type="hidden" name="flags" value="<?USERLIST:FLAGS>">
+      <center>
+      
+        <table>
+          <tr>
+            <td><?_("User name:")></td>
+            <td><input type="text" name="newname" value="<?USERLIST:USERNAME("X")>" maxlength="63"></td>
+          </tr>
+          <tr>
+            <td><?_("Password")></td>
+            <td><input type="password" name="password" value="<?USERLIST:PASSWD("X")>" maxlength="20"></td>
+          </tr>
+          <tr>
+            <td><?_("Permission to send Internet mail")></td>
+            <td><input type="checkbox" name="inetmail" value="yes" <?%("COND:USERLIST:FLAG:USE_INTERNET", 1, 1, 1, "checked", "")>></td>
+          </tr>
+          <tr>
+            <td><?_("Primary Internet e-mail address")></td>
+            <td><input type="text" name="primaryemail" value="<?USERLIST:PRIMARYEMAIL("X")>" maxlength="63"></td>
+          </tr>
+          <tr>
+            <td><?_("Internet e-mail aliases")></td>
+            <td><input type="text" name="otheremails" value="<?USERLIST:OTHEREMAILS("X")>" maxlength="512"></td>
+          </tr>
+          <tr>
+            <td><?_("Number of logins")></td>
+            <td><input type="text" name="timescalled" value="<?USERLIST:NLOGONS>" maxlength="6"></td>
+          </tr>
+          <tr>
+            <td><?_("Messages submitted")></td>
+            <td><input type="text" name="msgsposted" value="<?USERLIST:NPOSTS>" maxlength="6"></td>
+          </tr>
+          <tr>
+            <td><?_("Access level")></td>
+            <td>
+              <select name="axlevel">
+                <option <?%("COND:USERACCESS", 1, 1, #"AxDeleted", 'selected="selected"', "")> value="0">0 - <?_("Deleted")></option>
+                <option <?%("COND:USERACCESS", 1, 1, #"AxNewU", 'selected="selected"', "")> value="1">1 - <?_("New User")></option>
+                <option <?%("COND:USERACCESS", 1, 1, #"AxProbU", 'selected="selected"', "")> value="2">2 - <?_("Problem User")></option>
+                <option <?%("COND:USERACCESS", 1, 1, #"AxLocU", 'selected="selected"', "")> value="3">3 - <?_("Local User")></option>
+                <option <?%("COND:USERACCESS", 1, 1, #"AxNetU", 'selected="selected"', "")> value="4">4 - <?_("Network User")></option>
+                <option <?%("COND:USERACCESS", 1, 1, #"AxPrefU", 'selected="selected"', "")> value="5">5 - <?_("Preferred User")></option>
+                <option <?%("COND:USERACCESS", 1, 1, #"AxAideU", 'selected="selected"', "")> value="6">6 - <?_("Admin")></option>
+              </select>
+             </td>
+          </tr>
+          <tr>
+            <td><?_("User ID number")></td>
+            <td><input type="text" name="usernum" value="<?USERLIST:UID>" maxlength="7"></td>
+          </tr>
+          <tr>
+            <td><?_("Date and time of last login")></td>
+            <td>
+              <select name="lastcall">
+              <option selected value="<?USERLIST:LASTLOGON:NO>"><?USERLIST:LASTLOGON:STR></option>
+              <option value="<?DATE:NOW:NO>"><?DATE:NOW:STR></option>
+              </select>
+            </td>
+          </tr>
+          
+          <tr>
+            <td><?_("Auto-purge after this many days")></td>
+            <td><input type="text" name="purgedays" value="<?USERLIST:DAYSTILLPURGE>" maxlength="5"></td>
+          </tr>
+          </table>
+    
+        <input type="submit" name="ok_button" value="<?_("Save changes")>">&nbsp; <input type="submit" name="cancel" value="<?_("Cancel")>"><br /><br /></form>
+      </center>
+    </td>
+  </tr>
+</table>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/edituser/section.html b/webcit/static/t/aide/edituser/section.html
new file mode 100644 (file)
index 0000000..593cade
--- /dev/null
@@ -0,0 +1 @@
+<option "<?USERLIST:USERNAME("U")>"<?%("COND:USERNAME", 1, 1, 1, " selected", "")>><?USERLIST:USERNAME("X")></option>
diff --git a/webcit/static/t/aide/edituser/select.html b/webcit/static/t/aide/edituser/select.html
new file mode 100644 (file)
index 0000000..e6e92bb
--- /dev/null
@@ -0,0 +1,25 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+       <img src="static/webcit_icons/essen/32x32/account.png">
+       <h1><??("COND:AIDE", 1)><?_("Edit or delete users")><??("X", 1)></h1>
+</div>
+
+<div id="content" class="service"> 
+       <?!("COND:AIDE", 1)><?_("You need to be aide to view this.")><?!("X", 1)>
+       <??("COND:AIDE", 2)>
+       <!--- TODO if (message != NULL) message); -->
+
+               <table border=0 cellspacing=10>
+                       <tr valign=top>
+                               <td>
+                                       <?DOBOXED(="aide_edituser_add", _("Add users"))>
+                               </td>
+                               <td>
+                                       <?DOBOXED(="aide_edituser_box_select", _("Edit or Delete users"))>
+                               </td>
+                       </tr>
+               </table>
+       <??("X", 2)>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/floorconfig.html b/webcit/static/t/aide/floorconfig.html
new file mode 100644 (file)
index 0000000..c699b3b
--- /dev/null
@@ -0,0 +1,3 @@
+<ul class="adminitems">
+<li><a href="do_template?template=floors"><?_("Add, change, or delete floors")></a></li>
+</ul>
diff --git a/webcit/static/t/aide/global_config.html b/webcit/static/t/aide/global_config.html
new file mode 100644 (file)
index 0000000..80106a1
--- /dev/null
@@ -0,0 +1,6 @@
+<ul class="adminitems">
+<li><a href="do_template?template=aide_display_sitewide_config"><?_("Edit site-wide configuration")></a></li>
+<li><a href="do_template?template=aide_display_inetconf"><?_("Domain names and Internet mail configuration")></a></li>
+<li><a href="dotskip?room=__CitadelSMTPspoolout__&view=11"><?_("View the outbound SMTP queue")></a></li>
+<li><a href="do_template?template=aide_display_aliases"><?_("Global email aliases")></a></li>
+</ul>
diff --git a/webcit/static/t/aide/ignetconf/add.html b/webcit/static/t/aide/ignetconf/add.html
new file mode 100644 (file)
index 0000000..2d1cb3b
--- /dev/null
@@ -0,0 +1,28 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<h1>
+<?_("Add a new node")>
+</h1>
+</div>
+
+<div id="content" class="service">
+<form method="POST" action="aide_ignetconf_edit_node">
+<input type="hidden" name="nonce" value="<?NONCE>">
+<input type="hidden" name="template" value="aide_display_ignetconf">
+<input type="hidden" name="index" value="-1">
+<center><table border=0>
+<tr><td><?_("Node name")></td>
+<td><input type="text" name="node" maxlength="16"></td></tr>
+<tr><td><?_("Shared secret")></td>
+<td><input type="password" name="secret" maxlength="18"></td></tr>
+<tr><td><?_("Host or IP address")></td>
+<td><input type="text" name="host" maxlength="64"></td></tr>
+<tr><td><?_("Port number")></td>
+<td><input type="text" name="port" value="504" maxlength="8"></td></tr>
+</table><br />
+<input type="submit" name="ok_button" value="<?_("Add node?")>">
+&nbsp;
+<input type="submit" name="cancel_button" value="<?_("Cancel")>">
+</center></form>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/ignetconf/display_confirm_delete.html b/webcit/static/t/aide/ignetconf/display_confirm_delete.html
new file mode 100644 (file)
index 0000000..bb608ab
--- /dev/null
@@ -0,0 +1,17 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<h1>
+<?_("Confirm delete")> <?BSTR("node")>
+</h1>
+</div>
+
+<div id="content" class="service">
+<center>
+<?_("Are you sure you want to delete ")>
+<font SIZE=+1><?BSTR("node")></font>
+</center>
+<a href="delete_node?template=aide_display_ignetconf&node=<?BSTR("node", "X")>&index=<?BSTR("index")>"><?_("Yes")></a>
+&nbsp;&nbsp;&nbsp;
+<a href="do_template?template=aide_display_ignetconf"><?_("No")></a><br />
+<?=("trailing")>
diff --git a/webcit/static/t/aide/ignetconf/edit_node.html b/webcit/static/t/aide/ignetconf/edit_node.html
new file mode 100644 (file)
index 0000000..c7012c2
--- /dev/null
@@ -0,0 +1,28 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<h1>
+<?_("Add a new node")>
+</h1>
+</div>
+
+<div id="content" class="service">
+<form method="POST" action="aide_ignetconf_edit_node">
+<input type="hidden" name="nonce" value="<?NONCE>">
+<input type="hidden" name="template" value="aide_display_ignetconf">
+<input type="hidden" name="index" value='<?BSTR("index")>'>
+<center><table border=0>
+<tr><td><?_("Node name")></td>
+<td><input type="text" name="node" maxlength="16" value='<?CFG:IGNET:NODE>'></td></tr>
+<tr><td><?_("Shared secret")></td>
+<td><input type="password" name="secret" maxlength="18" value='<?CFG:IGNET:SECRET>'></td></tr>
+<tr><td><?_("Host or IP address")></td>
+<td><input type="text" name="host" maxlength="64" value='<?CFG:IGNET:HOST>'></td></tr>
+<tr><td><?_("Port number")></td>
+<td><input type="text" name="port" value='<?CFG:IGNET:PORT>' maxlength="8"></td></tr>
+</table><br />
+<input type="submit" name="ok_button" value="<?_("Save changes?")>">
+&nbsp;
+<input type="submit" name="cancel_button" value="<?_("Cancel")>">
+</center></form>
+<?=("trailing")>
diff --git a/webcit/static/t/aide/ignetconf/section.html b/webcit/static/t/aide/ignetconf/section.html
new file mode 100644 (file)
index 0000000..b67b733
--- /dev/null
@@ -0,0 +1,6 @@
+<tr><td><font SIZE=+1>
+<?CFG:IGNET:NODE("X")>
+</font></td>
+<td><a href="display_edit_node?template=aide_ignetconf_edit_node&node=<?CFG:IGNET:NODE>&index=<?ITERATE:KEY>"><?_("(Edit)")></a></td>
+<td><a href="do_template?template=aide_ignetconf_display_confirm_delete&node=<?CFG:IGNET:NODE("X")>&index=<?ITERATE:KEY>"><?_("(Delete)")></a></td>
+</tr>
diff --git a/webcit/static/t/aide/inet/aliases.html b/webcit/static/t/aide/inet/aliases.html
new file mode 100644 (file)
index 0000000..99c6c69
--- /dev/null
@@ -0,0 +1,14 @@
+<span class="menudesc">
+<?_("(domains for which this host receives mail)")>
+</span><br />
+<form method="post" action="save_inetconf">
+<input type="hidden" name="nonce" value='<?NONCE>'>
+<table border="0" cellspacing="2" cellpadding="2" width="94%" class="altern" >
+<?ITERATE("SERVCFG:INET", ="aide_inet_section", 0, 0, -1, "localhost")>
+<tr><td>
+<input type="text" name="ename" maxlength="64">
+<input type="hidden" name="etype" VALUE="localhost">
+</td><td align=left>
+<input type="submit" name="oper" value="Add">
+<input type="hidden" name="template" value="aide_display_inetconf">
+</td></tr></table></form>
diff --git a/webcit/static/t/aide/inet/clamav.html b/webcit/static/t/aide/inet/clamav.html
new file mode 100644 (file)
index 0000000..8ba87ba
--- /dev/null
@@ -0,0 +1,14 @@
+<span class="menudesc">
+<?_("(hosts running the ClamAV clamd service)")>
+</span><br />
+<form method="post" action="save_inetconf">
+<input type="hidden" name="nonce" value='<?NONCE>'>
+<table border="0" cellspacing="2px" cellpadding="2px" width="94%" class="altern" >
+<?ITERATE("SERVCFG:INET", ="aide_inet_section", 0, 0, -1, "clamav")>
+<tr><td>
+<input type="text" name="ename" maxlength="64">
+<input type="hidden" name="etype" VALUE="clamav">
+</td><td align=left>
+<input type="submit" name="oper" value="Add">
+<input type="hidden" name="template" value="aide_display_inetconf">
+</td></tr></table></form>
diff --git a/webcit/static/t/aide/inet/dirnames.html b/webcit/static/t/aide/inet/dirnames.html
new file mode 100644 (file)
index 0000000..64636e6
--- /dev/null
@@ -0,0 +1,14 @@
+<span class="menudesc">
+<?_("(domains mapped with the Global Address Book)")>
+</span><br />
+<form method="post" action="save_inetconf">
+<input type="hidden" name="nonce" value='<?NONCE>'>
+<table border="0" cellspacing="2" cellpadding="2" width="94%" class="altern" >
+<?ITERATE("SERVCFG:INET", ="aide_inet_section", 0, 0, -1, "directory")>
+<tr><td>
+<input type="text" name="ename" maxlength="64">
+<input type="hidden" name="etype" VALUE="directory">
+</td><td align=left>
+<input type="submit" name="oper" value="Add">
+<input type="hidden" name="template" value="aide_display_inetconf">
+</td></tr></table></form>
diff --git a/webcit/static/t/aide/inet/fallbackhosts.html b/webcit/static/t/aide/inet/fallbackhosts.html
new file mode 100644 (file)
index 0000000..d40d7c8
--- /dev/null
@@ -0,0 +1,14 @@
+<span class="menudesc">
+<?_("(send outbound mail to these hosts only when direct delivery fails)")>
+</span><br />
+<form method="post" action="save_inetconf">
+<input type="hidden" name="nonce" value='<?NONCE>'>
+<table border="0" cellspacing="2" cellpadding="2" width="94%" class="altern" >
+<?ITERATE("SERVCFG:INET", ="aide_inet_section", 0, 0, -1, "fallbackhost")>
+<tr><td>
+<input type="text" name="ename" maxlength="64">
+<input type="hidden" name="etype" VALUE="fallbackhost">
+</td><td align=left>
+<input type="submit" name="oper" value="Add">
+<input type="hidden" name="template" value="aide_display_inetconf">
+</td></tr></table></form>
diff --git a/webcit/static/t/aide/inet/masqdomains.html b/webcit/static/t/aide/inet/masqdomains.html
new file mode 100644 (file)
index 0000000..a4db40f
--- /dev/null
@@ -0,0 +1,14 @@
+<span class="menudesc">
+<?_("(Domains as which users are allowed to masquerade)")>
+</span><br />
+<form method="post" action="save_inetconf">
+<input type="hidden" name="nonce" value='<?NONCE>'>
+<table border="0" cellspacing="2" cellpadding="2" width="94%" class="altern" >
+<?ITERATE("SERVCFG:INET", ="aide_inet_section", 0, 0, -1, "masqdomain")>
+<tr><td>
+<input type="text" name="ename" maxlength="64">
+<input type="hidden" name="etype" VALUE="masqdomain">
+</td><td align=left>
+<input type="submit" name="oper" value="Add">
+<input type="hidden" name="template" value="aide_display_inetconf">
+</td></tr></table></form>
diff --git a/webcit/static/t/aide/inet/notify.html b/webcit/static/t/aide/inet/notify.html
new file mode 100644 (file)
index 0000000..0e53141
--- /dev/null
@@ -0,0 +1,14 @@
+<span class="menudesc">
+<?_("(URLS for notifications when users receive new mails; )")> <?_("Syntax: Notificationtemplatename:http[s]://user:password@hostname/path")>
+</span><br />
+<form method="post" action="save_inetconf">
+<input type="hidden" name="nonce" value='<?NONCE>'>
+<table border="0" cellspacing="2" cellpadding="2" width="94%" class="altern" >
+<?ITERATE("SERVCFG:INET", ="aide_inet_section", 0, 0, -1, "notify")>
+<tr><td>
+<input type="text" name="ename" maxlength="256">
+<input type="hidden" name="etype" VALUE="notify">
+</td><td align=left>
+<input type="submit" name="oper" value="Add">
+<input type="hidden" name="template" value="aide_display_inetconf">
+</td></tr></table></form>
diff --git a/webcit/static/t/aide/inet/rbldns.html b/webcit/static/t/aide/inet/rbldns.html
new file mode 100644 (file)
index 0000000..0eb139d
--- /dev/null
@@ -0,0 +1,14 @@
+<span class="menudesc">
+<?_("(hosts running a Realtime Blackhole List)")>
+</span><br />
+<form method="post" action="save_inetconf">
+<input type="hidden" name="nonce" value='<?NONCE>'>
+<table border="0" cellspacing="2" cellpadding="2" width="94%" class="altern" >
+<?ITERATE("SERVCFG:INET", ="aide_inet_section", 0, 0, -1, "rbl")>
+<tr><td>
+<input type="text" name="ename" maxlength="64">
+<input type="hidden" name="etype" VALUE="rbl">
+</td><td align=left>
+<input type="submit" name="oper" value="Add">
+<input type="hidden" name="template" value="aide_display_inetconf">
+</td></tr></table></form>
diff --git a/webcit/static/t/aide/inet/section.html b/webcit/static/t/aide/inet/section.html
new file mode 100644 (file)
index 0000000..3cd4e5d
--- /dev/null
@@ -0,0 +1,5 @@
+<tr class='<?ITERATE:ODDEVEN>'>
+<td align=left><?CONTEXTSTR("X")></td><td align=left>
+<span class="button_link">
+<a href='save_inetconf?template=aide_display_inetconf?oper=delete?ename=<?ITERATE:KEY>?etype=<?BSTR("__SERVCFG:INET:TYPE")>' onClick="return confirm('<?_("Delete this entry?")>')" >
+<?_("Delete")> </a></span></td></tr>
diff --git a/webcit/static/t/aide/inet/smarthosts.html b/webcit/static/t/aide/inet/smarthosts.html
new file mode 100644 (file)
index 0000000..4e34612
--- /dev/null
@@ -0,0 +1,14 @@
+<span class="menudesc">
+<?_("(if present, forward all outbound mail to one of these hosts)")>
+</span><br />
+<form method="post" action="save_inetconf">
+<input type="hidden" name="nonce" value='<?NONCE>'>
+<table border="0" cellspacing="2" cellpadding="2" width="94%" class="altern" >
+<?ITERATE("SERVCFG:INET", ="aide_inet_section", 0, 0, -1, "smarthost")>
+<tr><td>
+<input type="text" name="ename" maxlength="256">
+<input type="hidden" name="etype" VALUE="smarthost">
+</td><td align="left">
+<input type="submit" name="oper" value="Add">
+<input type="hidden" name="template" value="aide_display_inetconf">
+</td></tr></table></form>
diff --git a/webcit/static/t/aide/inet/spamass.html b/webcit/static/t/aide/inet/spamass.html
new file mode 100644 (file)
index 0000000..fed2864
--- /dev/null
@@ -0,0 +1,14 @@
+<span class="menudesc">
+<?_("(hosts running the SpamAssassin service)")>
+</span><br />
+<form method="post" action="save_inetconf">
+<input type="hidden" name="nonce" value='<?NONCE>'>
+<table border="0" cellspacing="2" cellpadding="2" width="94%" class="altern" >
+<?ITERATE("SERVCFG:INET", ="aide_inet_section", 0, 0, -1, "spamassassin")>
+<tr><td>
+<input type="text" name="ename" maxlength="64">
+<input type="hidden" name="etype" VALUE="spamassassin">
+</td><td align=left>
+<input type="submit" name="oper" value="Add">
+<input type="hidden" name="template" value="aide_display_inetconf">
+</td></tr></table></form>
diff --git a/webcit/static/t/aide/restart.html b/webcit/static/t/aide/restart.html
new file mode 100644 (file)
index 0000000..f960503
--- /dev/null
@@ -0,0 +1,5 @@
+<ul class="adminitems">
+<li><a href="server_shutdown?when=now"><?_("Restart Now")></a></li>
+<li><a href="server_shutdown?when=page"><?_("Restart after paging users")></a></li>
+<li><a href="server_shutdown?when=idle"><?_("Restart when all users are idle")></a></li>
+</ul>
diff --git a/webcit/static/t/aide/serverrestart/box.html b/webcit/static/t/aide/serverrestart/box.html
new file mode 100644 (file)
index 0000000..b9baf85
--- /dev/null
@@ -0,0 +1,6 @@
+<img src="static/webcit_icons/throbber.gif" /> 
+<font color="#AAAAAA">
+ <?_("Please wait while the Citadel server is restarted... ")>
+</font>
+
+
diff --git a/webcit/static/t/aide/serverrestart/box_page.html b/webcit/static/t/aide/serverrestart/box_page.html
new file mode 100644 (file)
index 0000000..c6ffba0
--- /dev/null
@@ -0,0 +1,24 @@
+<div align=CENTER>
+<form action="server_shutdown">
+<br />
+<br />
+<br />
+<input type="hidden" name="when" value="page">
+<input type="text" cols="40" rows="5" name="message" value='<?_("The citadel server has to be restarted. It will be back in a minute.")>'>
+
+<br />
+<br />
+<br />
+<br />
+
+<hr>
+<br />
+<br />
+<div class="buttons"> <span class="button_link"><input type="submit" value="go"></span></div>
+</form>
+<br />
+<br />
+<br />
+<br />
+
+</div>
diff --git a/webcit/static/t/aide/serverrestart/box_page_do.html b/webcit/static/t/aide/serverrestart/box_page_do.html
new file mode 100644 (file)
index 0000000..258975a
--- /dev/null
@@ -0,0 +1,15 @@
+<img src="static/webcit_icons/throbber.gif" /> 
+<font color="#AAAAAA">
+ <?_("Please wait while your users are being paged, the citadel server will be restarted after that... ")>
+</font>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webcit/static/t/aide/siteconfig/submit.html b/webcit/static/t/aide/siteconfig/submit.html
new file mode 100644 (file)
index 0000000..75e896e
--- /dev/null
@@ -0,0 +1,3 @@
+<input type="submit" NAME="ok_button" VALUE='<?_("Save changes")>'>
+&nbsp;
+<input type="submit" NAME="cancel_button" VALUE='<?_("Cancel")>'>
diff --git a/webcit/static/t/aide/siteconfig/tab_access.html b/webcit/static/t/aide/siteconfig/tab_access.html
new file mode 100644 (file)
index 0000000..c334a3b
--- /dev/null
@@ -0,0 +1,72 @@
+<div class="conftitle"><?_("Access controls and site policy settings")></div>
+<hr>
+<table border="0">
+
+<tr><td><?_("Allow aides to zap (forget) rooms")></td><td>
+<input type="checkbox" NAME="c_aide_zap" VALUE="yes" <?%("COND:SERVCFG", 1, "c_aide_zap", 1, "CHECKED", "")>></td></tr>
+
+
+<tr><td><?_("Quarantine messages from problem users")></td><td>
+<input type="checkbox" name="c_twitdetect" value="yes" <?%("COND:SERVCFG", 1, "c_twitdetect", 1, "CHECKED", "")>></td></tr>
+
+<tr><td><?_("Name of quarantine room")></td><td>
+<input type="text" name="c_twitroom" maxlength="63" value='<?SERV:CFG("c_twitroom")>'></td></tr>
+
+
+
+<tr><td><?_("Name of room to log pages")></td><td>
+<input type="text" name="c_logpages" maxlength="63" value='<?SERV:CFG("c_logpages")>'></td></tr>
+
+<tr><td colspan=2><hr></td></tr>
+
+<tr><td><?_("Authentication mode")></td><td>
+<select name="c_auth_mode" size="1">
+       <option <?%("COND:SERVCFG", 1, "c_auth_mode", 0, 'selected="selected"', "")> value="0"><?_("Self contained")></option>
+       <option <?%("COND:SERVCFG", 1, "c_auth_mode", 1, 'selected="selected"', "")> value="1"><?_("Host based")></option>
+       <option <?%("COND:SERVCFG", 1, "c_auth_mode", 2, 'selected="selected"', "")> value="2"><?_("LDAP (RFC2307)")></option>
+       <option <?%("COND:SERVCFG", 1, "c_auth_mode", 3, 'selected="selected"', "")> value="3"><?_("LDAP (Active Directory)")></option>
+</select></td></tr>
+
+<tr><td><?_("Allow anonymous guest access")></td><td>
+<input type="checkbox" NAME="c_guest_logins" VALUE="yes" <?%("COND:SERVCFG", 1, "c_guest_logins", 1, "CHECKED", "")>></td></tr>
+
+<tr><td><?_("Initial access level for new users")></td><td>
+<select name="c_initax" size="1">
+       <option <?%("COND:SERVCFG", 1, "c_initax", 0, 'selected="selected"', "")> value="0">0 - <?_("Deleted")></option>
+       <option <?%("COND:SERVCFG", 1, "c_initax", 1, 'selected="selected"', "")> value="1">1 - <?_("New User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_initax", 2, 'selected="selected"', "")> value="2">2 - <?_("Problem User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_initax", 3, 'selected="selected"', "")> value="3">3 - <?_("Local User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_initax", 4, 'selected="selected"', "")> value="4">4 - <?_("Network User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_initax", 5, 'selected="selected"', "")> value="5">5 - <?_("Preferred User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_initax", 6, 'selected="selected"', "")> value="6">6 - <?_("Admin")></option>
+</select></td></tr>
+
+<tr><td><?_("Access level required to create rooms")></td><td>
+<select name="c_createax" size="1">
+       <option <?%("COND:SERVCFG", 1, "c_createax", 0, 'selected="selected"', "")> value="0">0 - <?_("Deleted")></option>
+       <option <?%("COND:SERVCFG", 1, "c_createax", 1, 'selected="selected"', "")> value="1">1 - <?_("New User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_createax", 2, 'selected="selected"', "")> value="2">2 - <?_("Problem User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_createax", 3, 'selected="selected"', "")> value="3">3 - <?_("Local User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_createax", 4, 'selected="selected"', "")> value="4">4 - <?_("Network User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_createax", 5, 'selected="selected"', "")> value="5">5 - <?_("Preferred User")></option>
+       <option <?%("COND:SERVCFG", 1, "c_createax", 6, 'selected="selected"', "")> value="6">6 - <?_("Admin")></option>
+</select></td></tr>
+
+<tr><td><?_("Automatically grant room-aide status to users who create private rooms")></td><td>
+<input type="checkbox" name="c_creataide" value="yes" <?%("COND:SERVCFG", 1, "c_creataide", 1, "CHECKED", "")>></td></tr>
+
+<tr><td><?_("Automatically grant room-aide status to users who create BLOG rooms")></td><td>
+<input DISABLED type="checkbox" name="c_creataide_blog" value="yes" CHECKED></td></tr>
+
+<tr><td><?_("Restrict access to Internet mail")></td><td>
+<input type="checkbox" name="c_restrict" value="yes" <?%("COND:SERVCFG", 1, "c_restrict", 1, "CHECKED", "")>></td></tr>
+
+<tr><td colspan=2><hr></td></tr>
+
+<tr><td><?_("Disable self-service user account creation")>; <?_("Hint: do not select both!")></td><td>
+<input type="checkbox" NAME="c_disable_newu" VALUE="yes" <?%("COND:SERVCFG", 1, "c_disable_newu", 1, "CHECKED", "")>></td></tr>
+
+<tr><td><?_("Require registration for new users")></td><td>
+<input type="checkbox" name="c_regiscall" value="yes" <?%("COND:SERVCFG", 1, "c_regiscall", 1, "CHECKED", "")>></td></tr>
+
+</table>
diff --git a/webcit/static/t/aide/siteconfig/tab_autopurger.html b/webcit/static/t/aide/siteconfig/tab_autopurger.html
new file mode 100644 (file)
index 0000000..90d5e89
--- /dev/null
@@ -0,0 +1,108 @@
+<div class="conftitle"><?_("Configure automatic expiry of old messages")></div>
+<div class="confdescr"><?_("These settings may be overridden on a per-floor or per-room basis.")></div>
+<hr>
+<table border="0">
+
+<tr><td><?_("Hour to run database auto-purge")></td><td>
+<select NAME="c_purge_hour" SIZE="1">
+<?!("COND:PREF", 1, "calhourformat", 24)>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 0,  'selected="selected"', "")> VALUE='00'> 0:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 1,  'selected="selected"', "")> VALUE='01'> 1:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 2,  'selected="selected"', "")> VALUE='02'> 2:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 3,  'selected="selected"', "")> VALUE='03'> 3:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 4,  'selected="selected"', "")> VALUE='04'> 4:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 5,  'selected="selected"', "")> VALUE='05'> 5:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 6,  'selected="selected"', "")> VALUE='06'> 6:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 7,  'selected="selected"', "")> VALUE='07'> 7:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 8,  'selected="selected"', "")> VALUE='08'> 8:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 9,  'selected="selected"', "")> VALUE='09'> 9:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 10, 'selected="selected"', "")> VALUE='10'>10:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 11, 'selected="selected"', "")> VALUE='11'>11:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 12, 'selected="selected"', "")> VALUE='12'>12:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 13, 'selected="selected"', "")> VALUE='13'>13:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 14, 'selected="selected"', "")> VALUE='14'>14:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 15, 'selected="selected"', "")> VALUE='15'>15:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 16, 'selected="selected"', "")> VALUE='16'>16:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 17, 'selected="selected"', "")> VALUE='17'>17:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 18, 'selected="selected"', "")> VALUE='18'>18:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 19, 'selected="selected"', "")> VALUE='19'>19:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 20, 'selected="selected"', "")> VALUE='20'>20:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 21, 'selected="selected"', "")> VALUE='21'>21:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 22, 'selected="selected"', "")> VALUE='22'>22:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 23, 'selected="selected"', "")> VALUE='23'>23:00</OPTION>
+<?!("X", 1)>
+<??("COND:PREF", 2, "calhourformat", 24)>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 0,  'selected="selected"', "")> VALUE='00'>12:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 1,  'selected="selected"', "")> VALUE='01'> 1:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 2,  'selected="selected"', "")> VALUE='02'> 2:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 3,  'selected="selected"', "")> VALUE='03'> 3:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 4,  'selected="selected"', "")> VALUE='04'> 4:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 5,  'selected="selected"', "")> VALUE='05'> 5:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 6,  'selected="selected"', "")> VALUE='06'> 6:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 7,  'selected="selected"', "")> VALUE='07'> 7:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 8,  'selected="selected"', "")> VALUE='08'> 8:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 9,  'selected="selected"', "")> VALUE='08'> 9:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 10, 'selected="selected"', "")> VALUE='10'>10:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 11, 'selected="selected"', "")> VALUE='11'>11:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 12, 'selected="selected"', "")> VALUE='12'>12:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 13, 'selected="selected"', "")> VALUE='13'> 1:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 14, 'selected="selected"', "")> VALUE='14'> 2:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 15, 'selected="selected"', "")> VALUE='15'> 3:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 16, 'selected="selected"', "")> VALUE='16'> 4:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 17, 'selected="selected"', "")> VALUE='17'> 5:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 18, 'selected="selected"', "")> VALUE='18'> 6:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 19, 'selected="selected"', "")> VALUE='19'> 7:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 20, 'selected="selected"', "")> VALUE='20'> 8:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 21, 'selected="selected"', "")> VALUE='21'> 9:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 22, 'selected="selected"', "")> VALUE='22'>10:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "c_purge_hour", 23, 'selected="selected"', "")> VALUE='23'>11:00 pm</OPTION>
+<??("X", 2)>
+</select></td></tr>
+
+<tr><td COLSPAN=2>
+<hr />
+</td></tr>
+
+<tr><td><?_("Default message expire policy for public rooms")></td><td>
+<input type="radio" NAME="sitepolicy" VALUE="<?DEF:VAL(#"EXPIRE_MANUAL")>" <?%("COND:EXPIRE:MODE", 1, #"sitepolicy", #"EXPIRE_MANUAL", "CHECKED", "")>>
+<?_("Never automatically expire messages")>
+<br />
+<input type="radio" NAME="sitepolicy" VALUE="<?DEF:VAL(#"EXPIRE_NUMMSGS")>" <?%("COND:EXPIRE:MODE", 1, #"sitepolicy", #"EXPIRE_NUMMSGS", "CHECKED", "")>>
+<?_("Expire by message count")><br />
+<input type="radio" NAME="sitepolicy" VALUE="<?DEF:VAL(#"EXPIRE_AGE")>" <?%("COND:EXPIRE:MODE", 1, #"sitepolicy", #"EXPIRE_AGE", "CHECKED", "")>>
+<?_("Expire by message age")>
+<br />
+<?_("Number of messages or days: ")>
+<input type="text" NAME="sitepolicy_value" MAXLENGTH="5" VALUE='<?EXPIRE:VALUE(#"sitepolicy")>'>
+</td></tr>
+
+<tr><td COLSPAN=2><hr /></td></tr>
+
+<tr><td><?_("Default message expire policy for private mailboxes")></td><td>
+<input type="radio" NAME="mailboxespolicy" VALUE="<?DEF:VAL(#"EXPIRE_NEXTLEVEL")>" <?%("COND:EXPIRE:MODE", 1, #"mailboxespolicy", #"EXPIRE_NEXTLEVEL", "CHECKED", "")>>
+<?_("Same policy as public rooms")>
+<br />
+<input type="radio" NAME="mailboxespolicy" VALUE="<?DEF:VAL(#"EXPIRE_MANUAL")>" <?%("COND:EXPIRE:MODE", 1, #"mailboxespolicy", #"EXPIRE_MANUAL", "CHECKED", "")>>
+<?_("Never automatically expire messages")>
+<br />
+<input type="radio" NAME="mailboxespolicy" VALUE="<?DEF:VAL(#"EXPIRE_NUMMSGS")>" <?%("COND:EXPIRE:MODE", 1, #"mailboxespolicy", #"EXPIRE_NUMMSGS", "CHECKED", "")>>
+<?_("Expire by message count")>
+<br />
+<input type="radio" NAME="mailboxespolicy" VALUE="<?DEF:VAL( #"EXPIRE_AGE")>" <?%("COND:SERVCFG", 1, #"mailboxespolicy", #"EXPIRE_AGE", "CHECKED", "")>>
+<?_("Expire by message age")>
+<br />
+<?_("Number of messages or days: ")>
+<input type="text" NAME="mailboxespolicy_value" MAXLENGTH="5" VALUE='<?EXPIRE:VALUE(#"mailboxespolicy")>'>
+</td></tr>
+<tr><td colspan=2><hr></td></tr>
+
+<tr><td><?_("Default user purge time (days)")></td><td>
+<input type="text" name="c_userpurge" maxlength="5" value='<?SERV:CFG("c_userpurge")>'></td></tr>
+
+<tr><td><?_("Default room purge time (days)")></td><td>
+<input type="text" name="c_roompurge" maxlength="5" value='<?SERV:CFG("c_roompurge")>'></td></tr>
+
+
+<tr><td COLSPAN=2><hr /></td></tr>
+
+</table>
diff --git a/webcit/static/t/aide/siteconfig/tab_directory.html b/webcit/static/t/aide/siteconfig/tab_directory.html
new file mode 100644 (file)
index 0000000..b3b10e1
--- /dev/null
@@ -0,0 +1,26 @@
+<div class="conftitle"><?_("Configure the LDAP connector for Citadel")></div>
+
+<??("COND:SERV:LDAP_ENABLED", 1)><div class="confdescr"><?_("Changes made on this screen will not take effect until you restart the Citadel server.")></div><??("X", 1)>
+<?!("COND:SERV:LDAP_ENABLED", 2)><div class="confdescr"><?_("NOTE: This Citadel server has been built without LDAP support.  These options will have no effect.")></div><??("X", 2)>
+
+<hr>
+<table border="0">
+
+<tr><td><?_("Host name of LDAP server (blank to disable)")></td><td>
+<input type="text" NAME="c_ldap_host" MAXLENGTH="127" VALUE='<?SERV:CFG("c_ldap_host")>'></td></tr>
+
+
+<tr><td><?_("Port number of LDAP server (blank to disable)")></td><td>
+<input type="text" NAME="c_ldap_port" MAXLENGTH="127" VALUE='<?SERV:CFG("c_ldap_port")>'></td></tr>
+
+<tr><td><?_("Base DN")></td><td>
+<input type="text" NAME="c_ldap_base_dn" MAXLENGTH="255" VALUE='<?SERV:CFG("c_ldap_base_dn")>'></td></tr>
+
+<tr><td><?_("Bind DN")></td><td>
+<input type="text" NAME="c_ldap_bind_dn" MAXLENGTH="255" VALUE='<?SERV:CFG("c_ldap_bind_dn")>'></td></tr>
+
+<tr><td><?_("Password for bind DN")></td><td>
+<input type="password" NAME="c_ldap_bind_pw" MAXLENGTH="255" VALUE='<?SERV:CFG("c_ldap_bind_pw")>'></td></tr>
+
+
+</table>
diff --git a/webcit/static/t/aide/siteconfig/tab_general.html b/webcit/static/t/aide/siteconfig/tab_general.html
new file mode 100644 (file)
index 0000000..65995e5
--- /dev/null
@@ -0,0 +1,37 @@
+<div class="conftitle"><?_("General site configuration items")></div>
+<hr>
+<table border="0">
+
+<tr><td><a href="display_edithello"> <?_("Change Login Logo")> </a></td>
+<td><a href="display_editgoodbye"> <?_("Change Logout Logo")> </a></td></tr>
+
+<tr><td><?_("Node name")></td><td>
+<input type="text" name="c_nodename" maxlength="15" value='<?SERV:CFG("c_nodename")>'></td></tr>
+
+<tr><td><?_("Fully qualified domain name")></td><td>
+<input type="text" name="c_fqdn" maxlength="63" value='<?SERV:CFG("c_fqdn")>'></td></tr>
+
+<tr><td><?_("Human-readable node name")></td><td>
+<input type="text" name="c_humannode" maxlength="20" value='<?SERV:CFG("c_humannode")>'></td></tr>
+
+<!--
+<tr><td><?_("Telephone number")></td><td>
+<input type="text" name="c_phonenum" maxlength="15" value='<?SERV:CFG("c_phonenum")>'></td></tr>
+-->
+
+<tr><td><?_("Paginator prompt (for text mode clients)")></td><td>
+<input type="text" name="c_moreprompt" maxlength="79" value='<?SERV:CFG("c_moreprompt")>'></td></tr>
+
+<tr><td><?_("Geographic location of this system")></td><td>
+<input type="text" name="c_bbs_city" maxlength="31" value='<?SERV:CFG("c_bbs_city")>'></td></tr>
+
+<tr><td><?_("Name of system administrator")></td><td>
+<input type="text" name="c_sysadm" MAXLENGTH="25" VALUE='<?SERV:CFG("c_sysadm")>'></td></tr>
+
+<tr><td><?_("Default timezone for unzoned calendar items")></td><td>
+<select name="c_default_cal_zone" size="1">
+<?ITERATE("PREF:ZONE", ="aide_siteconfig_tzsection")>
+</select>
+</td></tr>
+
+</table>
diff --git a/webcit/static/t/aide/siteconfig/tab_imap.html b/webcit/static/t/aide/siteconfig/tab_imap.html
new file mode 100644 (file)
index 0000000..a064cc6
--- /dev/null
@@ -0,0 +1,14 @@
+<div class="conftitle"><?_("IMAP")></div>
+<div class="confdescr"><?_("Changes made on this screen will not take effect until you restart the Citadel server.")></div>
+<hr>
+<table border="0">
+<tr><td><?_("IMAP listener port (-1 to disable)")></td><td>
+<input type="text" NAME="c_imap_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_imap_port")>'></td></tr>
+
+<tr><td><?_("IMAP over SSL port (-1 to disable)")></td><td>
+<input type="text" NAME="c_imaps_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_imaps_port")>'></td></tr>
+
+<tr><td><?_("Keep original from headers in IMAP")></td><td>
+<input type="checkbox" NAME="c_imap_keep_from" VALUE="yes" <?%("COND:SERVCFG", 1, "c_imap_keep_from", 1, "CHECKED", "")>></td></tr>
+
+</table>
diff --git a/webcit/static/t/aide/siteconfig/tab_indexing.html b/webcit/static/t/aide/siteconfig/tab_indexing.html
new file mode 100644 (file)
index 0000000..6485cf1
--- /dev/null
@@ -0,0 +1,19 @@
+<div class="conftitle"><?_("Indexing and Journaling")></div>
+<div class="confdescr"><?_("Warning: these facilities are resource intensive.")></div>
+<hr>
+<table border="0">
+               
+<tr><td><?_("Enable full text index")></td><td>
+<input type="checkbox" NAME="c_enable_fulltext" VALUE="yes" <?%("COND:SERVCFG", 1, "c_enable_fulltext", 1, "CHECKED", "")>></td></tr>
+
+<tr><td><?_("Perform journaling of email messages")></td><td>
+<input type="checkbox" NAME="c_journal_email" VALUE="yes" <?%("COND:SERVCFG", 1, "c_journal_email", 1, "CHECKED", "")>></td></tr>
+<tr><td><?_("Perform journaling of non-email messages")></td><td>
+<input type="checkbox" NAME="c_journal_pubmsgs" VALUE="yes" <?%("COND:SERVCFG", 1, "c_journal_pubmsgs", 1, "CHECKED", "")>></td></tr>
+<tr><td><?_("Email destination of journalized messages")></td><td>
+<input type="text" NAME="c_journal_dest" MAXLENGTH="127" VALUE='<?SERV:CFG("c_journal_dest")>'></td></tr>
+
+</table>
diff --git a/webcit/static/t/aide/siteconfig/tab_pop3.html b/webcit/static/t/aide/siteconfig/tab_pop3.html
new file mode 100644 (file)
index 0000000..51162c3
--- /dev/null
@@ -0,0 +1,18 @@
+<div class="conftitle"><?_("POP3")></div>
+<hr>
+
+<table border="0">
+
+<tr><td><?_("POP3 listener port (-1 to disable)")></td><td>
+<input type="text" name="c_pop3_port" maxlength="5" value='<?SERV:CFG("c_pop3_port")>'></td></tr>
+
+<tr><td><?_("POP3 over SSL port (-1 to disable)")></td><td>
+<input type="text" NAME="c_pop3s_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_pop3s_port")>'></td></tr>
+
+<tr><td><?_("POP3 fetch frequency in seconds")></td><td>
+<input type="text" name="c_pop3_fetch" MAXLENGTH="5" value='<?SERV:CFG("c_pop3_fetch")>'></td></tr>
+
+<tr><td><?_("POP3 fastest fetch frequency in seconds")></td><td>
+<input type="text" name="c_pop3_fastest" MAXLENGTH="5" value='<?SERV:CFG("c_pop3_fastest")>'></td></tr>
+
+</table>       
diff --git a/webcit/static/t/aide/siteconfig/tab_pushmail.html b/webcit/static/t/aide/siteconfig/tab_pushmail.html
new file mode 100644 (file)
index 0000000..5608bf4
--- /dev/null
@@ -0,0 +1,20 @@
+<div class="conftitle"><?_("Push Email")></div>
+<hr>
+<table border="0">
+
+<tr><td><?_("Funambol server host (blank to disable)")></td><td>
+<input type="text" NAME="c_funambol_host" MAXLENGTH="255" VALUE='<?SERV:CFG("c_funambol_host")>'></td></tr>
+
+<tr><td><?_("Funambol server port ")></td><td>
+<input type="text" NAME="c_funambol_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_funambol_port")>'></td></tr>
+
+<tr><td><?_("Funambol sync source")></td><td>
+<input type="text" NAME="c_funambol_source" MAXLENGTH="255" VALUE='<?SERV:CFG("c_funambol_source")>'></td></tr>
+
+<tr><td><?_("Funambol auth details (user:pass)")></td><td>
+<input type="text" NAME="c_funambol_auth" MAXLENGTH="255" VALUE='<?SERV:CFG("c_funambol_auth")>'></td></tr>
+
+<tr><td><?_("External pager tool (blank to disable)")></td><td>
+<input type="text" NAME="c_pager_program" MAXLENGTH="255" VALUE='<?SERV:CFG("c_pager_program")>'></td></tr>
+
+</table>
diff --git a/webcit/static/t/aide/siteconfig/tab_setting.html b/webcit/static/t/aide/siteconfig/tab_setting.html
new file mode 100644 (file)
index 0000000..9a4c6a6
--- /dev/null
@@ -0,0 +1,49 @@
+<div class="confdescr"><?_("Changes made on this screen will not take effect until you restart the Citadel server.")></div>
+<hr>
+<table border="0">
+
+<tr><td colspan=2><div class="conftitle"><?_("Network services")></div></td></tr>
+
+<tr><td><?_("Server IP address (0.0.0.0 for 'any' IPV4, * for all including IPV6)")></td><td>
+<input type="text" NAME="c_ip_addr" MAXLENGTH="15" VALUE='<?SERV:CFG("c_ip_addr")>'></td></tr>
+
+<tr><td><?_("XMPP (Jabber) client to server port (-1 to disable)")></td><td>
+<input type="text" name="c_xmpp_c2s_port" maxlength="5" value='<?SERV:CFG("c_xmpp_c2s_port")>'></td></tr>
+
+<tr><td><?_("XMPP (Jabber) server to server port (-1 to disable)")></td><td>
+<input type="hidden" name="c_xmpp_s2s_port" value='<?SERV:CFG("c_xmpp_s2s_port")>'></td></tr>
+
+<tr><td><?_("NNTP server port (-1 to disable)")></td><td>
+<input type="text" name="c_nntp_port" maxlength="5" value='<?SERV:CFG("c_nntp_port")>'></td></tr>
+
+<tr><td><?_("NNTPS server port (-1 to disable)")></td><td>
+<input type="text" name="c_nntps_port" maxlength="5" value='<?SERV:CFG("c_nntps_port")>'></td></tr>
+
+<tr><td colspan=2><div class="conftitle"><?_("Advanced server fine-tuning controls")></div></td></tr>
+
+<tr><td><?_("Maximum message length")></td><td>
+<input type="text" name="c_maxmsglen" maxlength="20" value='<?SERV:CFG("c_maxmsglen")>'></td></tr>
+
+<tr><td><?_("Server connection idle timeout (in seconds)")></td><td>
+<input type="text" name="c_sleeping" maxlength="15" value='<?SERV:CFG("c_sleeping")>'></td></tr>
+
+<tr><td><?_("Network run frequency (in seconds)")></td><td>
+<input type="text" NAME="c_net_freq" MAXLENGTH="5" VALUE='<?SERV:CFG("c_net_freq")>'></td></tr>
+
+<tr><td><?_("Maximum concurrent sessions (0 = no limit)")></td><td>
+<input type="text" name="c_maxsessions" maxlength="5" value='<?SERV:CFG("c_maxsessions")>'></td></tr>
+
+<tr><td colspan=2><hr></td></tr>
+
+<tr><td><?_("Minimum number of worker threads")></td><td>
+<input type="text" name="c_min_workers" maxlength="5" value='<?SERV:CFG("c_min_workers")>'></td></tr>
+
+<tr><td><?_("Maximum number of worker threads")></td><td>
+<input type="text" name="c_max_workers" maxlength="5" value='<?SERV:CFG("c_max_workers")>'></td></tr>
+
+<tr><td colspan=2><hr></td></tr>
+
+<tr><td><?_("Automatically delete committed database logs")></td><td>
+<input type="checkbox" NAME="c_auto_cull" VALUE="yes" <?%("COND:SERVCFG", 1, "c_auto_cull", 1, "CHECKED", "")>></td></tr>
+
+</table>
diff --git a/webcit/static/t/aide/siteconfig/tab_smtp.html b/webcit/static/t/aide/siteconfig/tab_smtp.html
new file mode 100644 (file)
index 0000000..4c747a6
--- /dev/null
@@ -0,0 +1,49 @@
+<div class="conftitle"><?_("SMTP-Servers")></div>
+<div class="confdescr"><?_("Changes made on this screen will not take effect until you restart the Citadel server.")></div>
+<hr>
+<table border="0">
+<tr><td><?_("SMTP MTA port (-1 to disable)")></td><td>
+<input type="text" NAME="c_smtp_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_smtp_port")>'></td></tr>
+
+<tr><td><?_("SMTP MSA port (-1 to disable)")></td><td>
+<input type="text" NAME="c_msa_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_msa_port")>'></td></tr>
+
+<tr><td><?_("SMTP over SSL port (-1 to disable)")></td><td>
+<input type="text" NAME="c_smtps_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_smtps_port")>'></td></tr>
+
+<tr><td><?_("Perform RBL checks upon connect instead of after RCPT")></td><td>
+<input type="checkbox" NAME="c_rbl_at_greeting" VALUE="yes" <?%("COND:SERVCFG", 1, "c_rbl_at_greeting", 1, "CHECKED", "")>></td></tr>
+
+<tr><td><?_("Flag message as spam, instead of rejecting it")></td><td>
+<input type="checkbox" NAME="c_spam_flag_only" VALUE="yes" <?%("COND:SERVCFG", 1, "c_spam_flag_only", 1, "CHECKED", "")>></td></tr>
+
+<tr><td><?_("Allow unauthenticated SMTP clients to spoof this sites domains")></td><td>
+<input type="checkbox" NAME="c_allow_spoofing" VALUE="yes" <?%("COND:SERVCFG", 1, "c_allow_spoofing", 1, "CHECKED", "")>></td></tr>
+
+<tr><td><?_("Correct forged From: lines during authenticated SMTP")></td><td>
+<ul>
+<li>
+ <input type="radio" NAME="c_rfc822_strict_from" value="<?DEF:VAL(#"CFG_SMTP_FROM_NOFILTER")>"  <?%("COND:SERVCFG", 1, "c_rfc822_strict_from", #"CFG_SMTP_FROM_NOFILTER",  "CHECKED", "")> />
+ <?_("No, allow any address in the From: header")>
+</li><li>
+ <input type="radio" NAME="c_rfc822_strict_from" value="<?DEF:VAL(#"CFG_SMTP_FROM_CORRECT")>"   <?%("COND:SERVCFG", 1, "c_rfc822_strict_from", #"CFG_SMTP_FROM_CORRECT",   "CHECKED", "")> />
+ <?_("Only change the From: header if the address is not valid for the user")>
+</li><li>
+ <input type="radio" NAME="c_rfc822_strict_from" value="<?DEF:VAL(#"CFG_SMTP_FROM_FILTERALL")>" <?%("COND:SERVCFG", 1, "c_rfc822_strict_from", #"CFG_SMTP_FROM_FILTERALL", "CHECKED", "")> />
+  <?_("Yes, always place the user's primary email address in the From: header")>
+</li><li>
+ <input type="radio" NAME="c_rfc822_strict_from" value="<?DEF:VAL(#"CFG_SMTP_FROM_REJECT")>"    <?%("COND:SERVCFG", 1, "c_rfc822_strict_from", #"CFG_SMTP_FROM_REJECT",    "CHECKED", "")> />
+ <?_("No, REJECT messages containing an invalid From: header")>
+</li>
+</ul>
+</td></tr>
+
+<tr><td colspan=2><hr></td></tr>
+
+<tr><td><a href="http://www.postfix.org/tcp_table.5.html"><?_("Postfix TCP Dictionary Port")></a>(<?_("-1 to disable")>)</td><td>
+<input type="text" NAME="c_pftcpdict_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_pftcpdict_port")>'></td></tr>
+
+<tr><td><?_("ManageSieve Port (-1 to disable)")></td><td>
+<input type="text" NAME="c_mgesve_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_mgesve_port")>'></td></tr>
+
+</table>
diff --git a/webcit/static/t/aide/siteconfig/tzsection.html b/webcit/static/t/aide/siteconfig/tzsection.html
new file mode 100644 (file)
index 0000000..29ef26f
--- /dev/null
@@ -0,0 +1 @@
+<OPTION <?%("COND:SERVCFG:CTXSTRBUF", 1, "c_default_cal_zone", "CONTEXTSTR", 'selected="selected"', "")> VALUE='<?CONTEXTSTR>'><?CONTEXTSTR></OPTION>
diff --git a/webcit/static/t/aide/usermanagement.html b/webcit/static/t/aide/usermanagement.html
new file mode 100644 (file)
index 0000000..de19db9
--- /dev/null
@@ -0,0 +1,4 @@
+<ul class="adminitems">
+<li><a href="select_user_to_edit?SortBy=user:name?SortOrder=1"><?_("Add, change, delete user accounts")></a></li>
+<li><a href="validate"><?_("Validate new users")></a></li>
+</ul>
diff --git a/webcit/static/t/authpopup_finished.html b/webcit/static/t/authpopup_finished.html
new file mode 100644 (file)
index 0000000..1e55fd9
--- /dev/null
@@ -0,0 +1,6 @@
+<script type="text/javascript">
+window.close();
+if (window.opener && !window.opener.closed) {
+       window.opener.location = "pop";
+} 
+</script>
diff --git a/webcit/static/t/box/begin.html b/webcit/static/t/box/begin.html
new file mode 100644 (file)
index 0000000..661c15a
--- /dev/null
@@ -0,0 +1,5 @@
+<!-- start box_begin.html-->
+<div class="box">
+<div class="boxlabel"><?CONTEXTSTR("X")></div>
+<div class="boxcontent">
+<!-- end box_begin.html-->
diff --git a/webcit/static/t/box/begin_1.html b/webcit/static/t/box/begin_1.html
new file mode 100644 (file)
index 0000000..2d425d1
--- /dev/null
@@ -0,0 +1,2 @@
+<div class="box">
+<div class="boxlabel">
diff --git a/webcit/static/t/box/begin_2.html b/webcit/static/t/box/begin_2.html
new file mode 100644 (file)
index 0000000..a36b107
--- /dev/null
@@ -0,0 +1,2 @@
+</div>
+<div class="boxcontent">
diff --git a/webcit/static/t/box/begin_nt.html b/webcit/static/t/box/begin_nt.html
new file mode 100644 (file)
index 0000000..adb84e3
--- /dev/null
@@ -0,0 +1,5 @@
+<! start beginbox_nt.html>
+<table border=1 cellspacing=0 cellpadding=0 width=100%><tr><td>
+<table border=0 cellspacing=0 cellpadding=3 width=100%>
+<tr><td bgcolor="#FFFFFF">
+<! end beginbox_nt.html>
diff --git a/webcit/static/t/box/end.html b/webcit/static/t/box/end.html
new file mode 100644 (file)
index 0000000..e04ad1b
--- /dev/null
@@ -0,0 +1 @@
+</div></div>
diff --git a/webcit/static/t/confirmlogoff.html b/webcit/static/t/confirmlogoff.html
new file mode 100644 (file)
index 0000000..fbf525f
--- /dev/null
@@ -0,0 +1,6 @@
+<html>
+       <body><center>
+               <h1><a href="termquit"><img src="static/webcit_icons/essen/32x32/logout.png" border="0">&nbsp;<?_("Log off")></a></h1>
+               <h1><a href="javascript:toggleModal(0);"><img src="static/webcit_icons/essen/32x32/abort.png" border="0">&nbsp;<?_("Cancel")></a></h1>
+       </center></body>
+</html>
diff --git a/webcit/static/t/dav/propfind_groupdav.xml b/webcit/static/t/dav/propfind_groupdav.xml
new file mode 100644 (file)
index 0000000..3671479
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<multistatus xmlns="DAV:" xmlns:G"http://groupdav.org/">"
+<response>
+<href>
+<?DAV:HOSTNAME>/
+</href>
+<propstat>
+<status>HTTP/1.1 200 OK</status>
+<prop>
+<displayname>GroupDAV</displayname>
+<resourcetype><collection/></resourcetype>
+<getlastmodified>
+<?DATE:NOW:STR>
+</getlastmodified>
+</prop>
+</propstat>
+</response>
+</multistatus>
diff --git a/webcit/static/t/dav/propfind_groupdav_floorlist.xml b/webcit/static/t/dav/propfind_groupdav_floorlist.xml
new file mode 100644 (file)
index 0000000..8cb30b2
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<multistatus xmlns="DAV:" xmlns:G="http://groupdav.org/">
+<?=("dav_propfind_upper_dirs")>
+<?ITERATE("LFLR", ="dav_propfind_groupdav_floorlist_onefloor")>
+</multistatus>
diff --git a/webcit/static/t/dav/propfind_groupdav_floorlist_onefloor.xml b/webcit/static/t/dav/propfind_groupdav_floorlist_onefloor.xml
new file mode 100644 (file)
index 0000000..31bf7d4
--- /dev/null
@@ -0,0 +1,11 @@
+<?!("COND:ROOM:REST:ISSUBFLOOR", 1)><response>
+<href><?DAV:HOSTNAME>/groupdav/<?FLOOR:NAME("X")>/</href>
+<propstat>
+<status>HTTP/1.1 200 OK</status>
+<prop>
+<displayname><?FLOOR:NAME></displayname>
+<resourcetype><collection/></resourcetype>
+<getlastmodified><?DATE:NOW:STR></getlastmodified>
+</prop>
+</propstat>
+</response><??("X",1)>
diff --git a/webcit/static/t/dav/propfind_groupdav_roomlist.xml b/webcit/static/t/dav/propfind_groupdav_roomlist.xml
new file mode 100644 (file)
index 0000000..ef1f284
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<multistatus xmlns="DAV:" xmlns:G="http://groupdav.org/">
+<response>
+<href>
+<?DAV:HOSTNAME>/
+</href>
+<propstat>
+<status>HTTP/1.1 200 OK</status>
+<prop>
+<displayname>GroupDAV</displayname>
+<resourcetype><collection/></resourcetype>
+<getlastmodified>
+<?DATE:NOW:STR>
+</getlastmodified>
+</prop>
+</propstat>
+</response>
+<?ITERATE("LKRA", ="dav_propfind_groupdav_roomlist_oneroom")>
+</multistatus>
diff --git a/webcit/static/t/dav/propfind_groupdav_roomlist_oneroom.xml b/webcit/static/t/dav/propfind_groupdav_roomlist_oneroom.xml
new file mode 100644 (file)
index 0000000..82bbae5
--- /dev/null
@@ -0,0 +1,11 @@
+<??("COND:ROOM:DAV_CONTENT", 1)><??("COND:ROOM:REST:ISSUBROOM", 2)><response>
+<href><?DAV:HOSTNAME>/groupdav/<?ROOM:INFO:FLOOR:NAME("X")>/<?THISROOM:NAME("X")>/</href>
+<propstat>
+<status>HTTP/1.1 200 OK</status>
+<prop>
+<displayname><?THISROOM:NAME></displayname>
+<resourcetype><collection/><G:vtodo<?ROOM:INFO:COLLECTIONTYPE>-collection /></resourcetype>
+<getlastmodified><?ROOM:INFO:LASTCHANGE></getlastmodified>
+</prop>
+</propstat>
+</response><??("X", 2)><??("X",1)>
diff --git a/webcit/static/t/dav/propfind_top.xml b/webcit/static/t/dav/propfind_top.xml
new file mode 100644 (file)
index 0000000..c6f36c7
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<multistatus xmlns="DAV:" xmlns:G="http://groupdav.org/">
+<?=("dav_propfind_upper_dirs")>
+</multistatus>
diff --git a/webcit/static/t/dav/propfind_upper_dirs.xml b/webcit/static/t/dav/propfind_upper_dirs.xml
new file mode 100644 (file)
index 0000000..47ac23d
--- /dev/null
@@ -0,0 +1,22 @@
+<response>
+<href><?DAV:HOSTNAME>/</href>
+<propstat>
+<status>HTTP/1.1 200 OK</status>
+<prop>
+<displayname>/</displayname>
+<resourcetype><collection/></resourcetype>
+<getlastmodified><?DATE:NOW:STR></getlastmodified>
+</prop>
+</propstat>
+</response>
+<response>
+<href><?DAV:HOSTNAME>/groupdav</href>
+<propstat>
+<status>HTTP/1.1 200 OK</status>
+<prop>
+<displayname>GroupDAV</displayname>
+<resourcetype><collection/></resourcetype>
+<getlastmodified><?DATE:NOW:STR></getlastmodified>
+</prop>
+</propstat>
+</response>
diff --git a/webcit/static/t/display_main_menu.html b/webcit/static/t/display_main_menu.html
new file mode 100644 (file)
index 0000000..c02ea4d
--- /dev/null
@@ -0,0 +1,21 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+                <script type="text/javascript" src="static/summaryview.js"></script> 
+                <script type="text/javascript" src="static/zapduplicates.js"></script> 
+<?ROOMBANNER>
+<div id="content">
+<table width="100%" cellspacing="10" cellpadding="0">
+<tr><td colspan="2" class="advanced">
+  <?DOBOXED("menu_basic_commands", _("Basic commands"))>
+</td></tr>
+<tr valign=top><td width="50%">
+  <?DOBOXED("menu_your_info", _("Your info"))>
+</td><td width="50%">
+  <?DOBOXED("menu_advanced_roomcommands", _("Advanced room commands"))>
+</td></tr>
+</table>
+</div>
+
+</div>
+
+<?=("trailing")>
diff --git a/webcit/static/t/display_message.html b/webcit/static/t/display_message.html
new file mode 100644 (file)
index 0000000..685be28
--- /dev/null
@@ -0,0 +1,4 @@
+<div class="message"
+onMouseOver=document.getElementById("msg<?MAIL:SUMM:N>").style.visibility="visible"
+onMouseOut=document.getElementById("msg<?MAIL:SUMM:N>").style.visibility="hidden" >
+<div class="message_header">
diff --git a/webcit/static/t/edit/markdown_epic.html b/webcit/static/t/edit/markdown_epic.html
new file mode 100644 (file)
index 0000000..d1cc5cf
--- /dev/null
@@ -0,0 +1,156 @@
+<?=("head")>
+<script type="text/javascript">        
+    console.log('blarg');
+</script>
+               <script type="text/javascript" src="markdown/js/epiceditor.js"></script> 
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<?ROOMBANNER>
+<div id="content">
+
+<div id="attachments_form">
+    <div id="loading">
+      <p><img src="static/webcit_icons/throbber.gif" alt=""></p>
+      <p><?_("Loading")></p>
+    </div>
+</div>
+
+<div class="entmsg" id="entmsg">
+<form id="theenterform" accept-charset="UTF-8" enctype="multipart/form-data" method="POST" action="post">
+<input type="hidden" name="postseq" value="<?DATE:NOW:NO>">
+<input type="hidden" name="return_to" value="<?BSTR("return_to")>">
+<input type="hidden" name="nonce" value="<?NONCE>">
+<input type="hidden" name="force_room" value="<?THISROOM:NAME("X")>">
+<input type="hidden" name="references" value="<?BSTR("references")>">
+<input type="hidden" name="page" value="<?BSTR("page")>">
+<input type="hidden" name="markdown" value="1">
+<textarea style="display:none" name="msgtext" id="submitmsgtext" cols="80" rows="15"><?MAIL:EDITWIKI("edit", "X")></textarea>
+</form>
+
+<div id="Author">
+<select name="display_name" size=1 id="from_id">
+<?ITERATE("PREF:VALID:EMAIL:NAME", ="prefs_section_msg_handle_select")>
+<?!("COND:THISROOM:FLAG:QR", 3, #"QR_ANONOPT")>
+<option <?%("COND:BSTR", 1, "__ANONYMOUS__", "selected", "")> value="__ANONYMOUS__"><?_("Anonymous")></option>
+<?!("X", 3)>
+</select>
+</div>
+
+<div id="epiceditor" />
+
+
+</div>
+</div>
+</div>
+
+<div style="display:none" id="submit-o-matic"><ul>
+<li>
+       <a href="javascript:submit_post('post');">
+               <img src="static/webcit_icons/essen/16x16/check.png" alt="">
+               <span class="navbar_link">
+               <?!("COND:BSTR", 1, "__RCPTREQUIRED")><?_("Send message")><?!("X", 1)>
+               <??("COND:BSTR", 2, "__RCPTREQUIRED")><?_("Post message")><?!("X", 2)>
+               </span>
+       </a>
+</li>
+<li>
+       <a href="javascript:submit_post('draft');">
+               <img src="static/webcit_icons/essen/16x16/draft.png" alt="">
+               <span class="navbar_link">
+               <?_("Save to Drafts")>
+               </span>
+       </a>
+</li>
+<li>
+       <a href="javascript:show_attachments_form();">
+               <img src="static/webcit_icons/essen/16x16/attachement.png" alt="">
+               <span class="navbar_link">
+               <?_("Attachments:")>
+               <span id="num_attachments"><?MSG:NATTACH></span>
+               </span>
+       </a>
+</li>
+<li>
+       <a href="javascript:submit_post('cancel');">
+               <img src="static/webcit_icons/essen/16x16/abort.png" alt="">
+               <span class="navbar_link">
+               <?_("Cancel")>
+               </span>
+       </a>
+</li>
+<?!("COND:BSTR", 1, "__RCPTREQUIRED")><li>
+       <a href="javascript:PopOpenAddressBook('recp_id|<?_("To:")>|cc_id|<?_("CC:")>|bcc_id|<?_("BCC:")>');">
+               <img src="static/webcit_icons/essen/16x16/contact.png" alt="">
+               <span class="navbar_link">
+               <?_("Contacts")>
+               </span>
+       </a>
+</li><?!("X", 1)>
+</ul>
+</div>
+
+<script type="text/javascript">        
+       $("navbar").innerHTML = $("submit-o-matic").innerHTML;
+
+       function submit_post(which_action) {
+           var textarea=document.getElementById('submitmsgtext');
+           textarea.value = editor.exportFile();
+           editor.unload();
+           document.getElementById("theenterform").submit();
+       }
+
+       function hide_attachments_form() {
+               $('attachments_form').style.display = 'none';
+               update_attachment_count();
+       }
+
+       function show_attachments_form() {
+               $('attachments_form').style.display = 'block';
+
+               p = 'template=edit_message_attachments_pane&r=' + ctdlRandomString();
+               new Ajax.Updater(
+                       'attachments_form',
+                       'do_template',
+                       {
+                               method: 'get',
+                               parameters: p,
+                               evalScripts: true
+                       }
+               );
+       }
+
+       function update_attachment_count() {
+               p = 'r=' + ctdlRandomString();
+               new Ajax.Updater(
+                       'num_attachments',
+                       'show_num_attachments',
+                       {
+                               method: 'get',
+                               parameters: p
+                       }
+               );
+       }
+
+       function remove_attachment(which_one) {
+               p = 'which_attachment=' + which_one + '&r=' + ctdlRandomString();
+               new Ajax.Updater(
+                       'gonna_upload_this',
+                       'remove_attachment',
+                       {
+                               method: 'get',
+                               parameters: p,
+                               onComplete: function(){
+                                       show_attachments_form();
+                                       update_attachment_count();
+                               }
+                       }
+               );
+       }
+
+</script>
+
+<script type="text/javascript"> 
+var editor = new EpicEditor().load();
+editor.importFile('CitadelEditBuffer', document.getElementById('submitmsgtext').value);
+</script>
+<?=("addressbook_popup")>
+<?=("trailing")>
diff --git a/webcit/static/t/edit/message.html b/webcit/static/t/edit/message.html
new file mode 100644 (file)
index 0000000..e5c2ea8
--- /dev/null
@@ -0,0 +1,186 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<?ROOMBANNER>
+<div id="content">
+
+<div id="attachments_form" style="display:none">
+<?=("edit_message_attachments_pane")>
+</div>
+
+<div class="entmsg" id="entmsg"><form name="enterform" accept-charset="UTF-8" enctype="multipart/form-data" method="POST" action="post">
+<input type="hidden" name="postseq" value="<?DATE:NOW:NO>">
+<input type="hidden" name="return_to" value="<?BSTR("return_to")>">
+<input type="hidden" name="nonce" value="<?NONCE>">
+<input type="hidden" name="force_room" value="<?THISROOM:NAME("X")>">
+<input type="hidden" name="references" value="<?BSTR("references")>">
+<input type="hidden" name="page" value="<?BSTR("page")>">
+<input type="hidden" name="" value="<?MAIL:SUMM:INREPLYTO()>">
+<input type="hidden" name="submit_action" value="">
+
+<table width="100%" class="edit_msg_table">
+<tr><th><label for="from_id"><i><?_("from")></i></label></th><td>
+
+<??("COND:BSTR", 4, "__RCPTREQUIRED")>
+<select name="display_name" size=1 id="from_id">
+<?ITERATE("PREF:VALID:EMAIL:NAME", ="prefs_section_msg_handle_select")>
+<?!("COND:THISROOM:FLAG:QR", 3, #"QR_ANONOPT")>
+<option <?%("COND:BSTR", 1, "__ANONYMOUS__", "selected", "")> value="__ANONYMOUS__"><?_("Anonymous")></option>
+<?!("X", 3)>
+</select>
+<??("X", 4)>
+
+<?!("COND:BSTR", 5, "__RCPTREQUIRED")>
+<select name="display_name" size=1 id="from_id">
+<?ITERATE("PREF:VALID:EMAIL:NAME", ="prefs_section_msg_sender_name_select")>
+<?!("COND:THISROOM:FLAG:QR", 3, #"QR_ANONOPT")>
+<option <?%("COND:BSTR", 1, "__ANONYMOUS__", "selected", "")> value="__ANONYMOUS__"><?_("Anonymous")></option>
+<?!("X", 3)>
+</select>
+
+<select name="my_email_addr" size=1>
+<?ITERATE("PREF:VALID:EMAIL:ADDR", ="prefs_section_msg_sender_from_select")>
+</select>
+<?!("X", 4)>
+
+ <i><?_("in")></i> <?THISROOM:NAME></td></tr>
+
+<?!("COND:BSTR", 5, "__RCPTREQUIRED")>
+<tr>
+  <th><label for="recp_id"> <?_("To:")></label></th>
+  <td><input autocomplete="off" type="text" name="recp" id="recp_id" value="<?BSTR("recp", "H")>" size=45 maxlength=1000 />
+     <div class="auto_complete" id="recp_name_choices"></div>
+  </td>
+</tr>
+<tr>
+  <th><label for="cc_id"><?_("CC:")></label></th>
+  <td><input autocomplete="off" type="text" name="cc" id="cc_id" value="<?BSTR("cc", "H")>" size=45 maxlength=1000 />
+    <div class="auto_complete" id="cc_name_choices"></div>
+  </td>
+</tr>
+<tr>
+  <th><label for="bcc_id"><?_("BCC:")></label></th>
+  <td><input autocomplete="off" type="text" name="bcc" id="bcc_id" value="<?BSTR("bcc", "H")>" size=45 maxlength=1000 />
+   <div class="auto_complete" id="bcc_name_choices"></div>
+  </td>
+</tr>
+<??("X", 5)>           
+<tr>
+  <th><label for="subject_id" > 
+      <?%("COND:BSTR", 6, "__SUBJREQUIRED", 0, _("Subject (optional):"), _("Subject:")>
+  </label></th>
+  <td>
+    <input type="text" name="subject" id="subject_id" value="<?BSTR("subject", "H")>" size=45 maxlength=70>
+  </td>
+</tr>
+</td></tr>
+</table>
+
+<input type="hidden" name="sig_inserted" value="yes">
+
+<textarea name="msgtext" id="msgtext" cols="80" rows="15">
+<?BSTR("msgtext", "X")><?!("COND:BSTR", 1, "fwdquote")>&lt;br /&gt;
+  &lt;div align=center&gt;
+    &lt;i&gt;
+      <?_("--- forwarded message ---")>
+    &lt;/i&gt;
+  &lt;/div&gt;
+  <?MAIL:QUOTETEXT("fwdquote", "X")>
+&lt;br /&gt;<?!("X", 1)><?!("COND:BSTR", 2, "replyquote")>
+&lt;br /&gt;
+    <?MAIL:QUOTETEXT("replyquote", "X")>
+&lt;br /&gt;<?!("X", 2)><?!("COND:BSTR", 3, "edit")><?MAIL:EDITTEXT("edit", "X")><?!("X", 3)>
+<??("COND:BSTR", 4, "edit")><??("COND:BSTR", 5, "sig_inserted", "yes")><?!("COND:PREF", 6, "use_sig", "yes")>
+&lt;br&gt;&lt;p&gt;--&nbsp;&lt;br&gt;<?PREF:VALUE("signature","H")>
+      &lt;/p&gt;
+<?!("X", 6)><??("X", 5)><?!("X", 4)><?!("COND:ROOM:TYPE_IS", 7, #"VIEW_WIKI")><?MAIL:EDITWIKI("X")><?!("X", 7)>
+</textarea>
+
+<?=("richedit")>
+
+</form>
+
+<div style="display:none" id="submit-o-matic"><ul>
+<li>
+       <a href="javascript:submit_post('post');">
+               <img src="static/webcit_icons/essen/16x16/check.png" alt="">
+               <span class="navbar_link">
+               <?!("COND:BSTR", 1, "__RCPTREQUIRED")><?_("Send message")><?!("X", 1)>
+               <??("COND:BSTR", 2, "__RCPTREQUIRED")><?_("Post message")><?!("X", 2)>
+               </span>
+       </a>
+</li>
+<li>
+       <a href="javascript:submit_post('draft');">
+               <img src="static/webcit_icons/essen/16x16/draft.png" alt="">
+               <span class="navbar_link">
+               <?_("Save to Drafts")>
+               </span>
+       </a>
+</li>
+<li>
+       <a href="javascript:show_attachments_form();">
+               <img src="static/webcit_icons/essen/16x16/attachement.png" alt="">
+               <span class="navbar_link">
+               <?_("Attachments:")>
+               <span id="num_attachments"><?MSG:NATTACH></span>
+               </span>
+       </a>
+</li>
+<li>
+       <a href="javascript:submit_post('cancel');">
+               <img src="static/webcit_icons/essen/16x16/abort.png" alt="">
+               <span class="navbar_link">
+               <?_("Cancel")>
+               </span>
+       </a>
+</li>
+<?!("COND:BSTR", 1, "__RCPTREQUIRED")><li>
+       <a href="javascript:PopOpenAddressBook('recp_id|<?_("To:")>|cc_id|<?_("CC:")>|bcc_id|<?_("BCC:")>');">
+               <img src="static/webcit_icons/essen/16x16/contact.png" alt="">
+               <span class="navbar_link">
+               <?_("Contacts")>
+               </span>
+       </a>
+</li><?!("X", 1)>
+</div>
+<script type="text/javascript">        
+
+       $("navbar").innerHTML = $("submit-o-matic").innerHTML;
+       <?!("COND:BSTR", 1, "__RCPTREQUIRED")>
+               activate_entmsg_autocompleters();
+       <?!("X", 1)>
+
+       function submit_post(which_action) {
+               document.enterform.submit_action.value = which_action;
+               document.enterform.submit();
+       }
+
+       function hide_attachments_form() {
+               $('attachments_form').style.display = 'none';
+               update_attachment_count();
+       }
+
+       function show_attachments_form() {
+               $('attachments_form').style.display = 'block';
+               update_attachment_count();
+       }
+
+       function update_attachment_count() {
+               p = 'r=' + ctdlRandomString();
+               new Ajax.Updater(
+                       'num_attachments',
+                       'show_num_attachments',
+                       {
+                               method: 'get',
+                               parameters: p
+                       }
+               );
+       }
+
+</script>
+</div>
+</div>
+</div>
+<?=("addressbook_popup")>
+
+<?=("trailing")>
diff --git a/webcit/static/t/edit/message/attachments_pane.html b/webcit/static/t/edit/message/attachments_pane.html
new file mode 100644 (file)
index 0000000..334836e
--- /dev/null
@@ -0,0 +1,89 @@
+
+<div align="right">
+
+<a href="javascript:hide_attachments_form();">
+    <?_("Close window")>&nbsp;<img src="static/webcit_icons/closewindow.gif" border="0"></div>
+</a>
+<h2><img src="static/webcit_icons/essen/16x16/attachement.png">&nbsp;<?_("Attachments:")></h2>
+
+<?--("Fine Uploader JS")>
+<script type="text/javascript">
+function createUploader()
+{
+    var uploader = new qq.FineUploader(
+       {
+           session: {
+               endpoint: "do_template?template=edit_message_json_attlist"
+           },
+           callbacks: {
+               onComplete: function (id, xhr, isError) {
+                   console.log("Upload completed for fileid: " + id);
+                   update_attachment_count();
+               },
+               onDeleteComplete: function (id, xhr, isError) {
+                   console.log("Deletion completed for fileid: " + id);
+                   update_attachment_count();
+               }
+           },
+           element: document.getElementById('fine-uploader'),
+           request: {
+               endpoint: 'upload_attachment?nonce=<?NONCE>&template=edit_message_upl_att'
+           },
+           text: {
+               formatProgress: "<?_('{percent}% of {total_size}')>",
+               failUpload: "<?_('Upload failed')>",
+               waitingForResponse: "<?_('Processing...')>",
+               paused: "<?_('Paused')>"
+           },
+           messages: {
+               tooManyFilesError: "<?_('You may only drop one file.')>",
+               unsupportedBrowser: "<?_('Unrecoverable error - the browser does not permit uploading of any kind.')>"
+           },
+           deleteFile: {
+               enabled: true,
+               forceConfirm: true,
+               confirmMessage: "<?_('Are you shure you want to delete {filename}?')>",
+               deletingFailedText: "<?_('failed to delete {filename}!')>",
+               deletingStatusText: "<?_('deleting {filename}')>",
+               endpoint: 'remove_attachment?nonce=<?NONCE>&template=edit_message_upl_att&which_attachment='
+           }
+       });
+}
+
+  window.onload = createUploader;
+</script>
+
+<?--("the ploader will be rendered in this div:")>
+<div id="fine-uploader"></div>
+
+<?--("Fine Uploader template")>
+<script type="text/template" id="qq-template">
+  <div class="qq-uploader-selector qq-uploader">
+    <div class="qq-upload-drop-area-selector qq-upload-drop-area" qq-hide-dropzone>
+      <span><?_("Drop files here to upload")></span>
+    </div>
+    <div class="qq-upload-button-selector qq-upload-button">
+      <div><?_("Attach file")></div>
+    </div>
+    <span class="qq-drop-processing-selector qq-drop-processing">
+      <span><?_("Processing dropped files...")></span>
+      <span class="qq-drop-processing-spinner-selector qq-drop-processing-spinner"></span>
+    </span>
+    <ul class="qq-upload-list-selector qq-upload-list">
+      <li>
+        <div class="qq-progress-bar-container-selector">
+          <div class="qq-progress-bar-selector qq-progress-bar"></div>
+        </div>
+        <span class="qq-upload-spinner-selector qq-upload-spinner"></span>
+        <span class="qq-edit-filename-icon-selector qq-edit-filename-icon"></span>
+        <span class="qq-upload-file-selector qq-upload-file"></span>
+        <input class="qq-edit-filename-selector qq-edit-filename" tabindex="0" type="text">
+        <span class="qq-upload-size-selector qq-upload-size"></span>
+        <a class="qq-upload-cancel-selector qq-upload-cancel" href="#"><?_("Cancel")></a>
+        <a class="qq-upload-retry-selector qq-upload-retry" href="#"><?_("Retry")></a>
+        <a class="qq-upload-delete-selector qq-upload-delete" href="#"><?_("Remove")></a>
+        <span class="qq-upload-status-text-selector qq-upload-status-text"></span>
+      </li>
+    </ul>
+  </div>
+</script>
diff --git a/webcit/static/t/edit/message/json_attlist.js b/webcit/static/t/edit/message/json_attlist.js
new file mode 100644 (file)
index 0000000..2260ab3
--- /dev/null
@@ -0,0 +1,3 @@
+[
+<?ITERATE("MSG:ATTACHNAMES", ="edit_message_section_attach_list")>
+]
\ No newline at end of file
diff --git a/webcit/static/t/edit/message/section_attach_list.js b/webcit/static/t/edit/message/section_attach_list.js
new file mode 100644 (file)
index 0000000..4ea3b6e
--- /dev/null
@@ -0,0 +1,5 @@
+{
+    "name":"<?MAIL:MIME:FILENAME("J")>",
+    "uuid":"<?MAIL:MIME:PARTNUM("J")>",
+    "size": <?MAIL:MIME:LENGTH>
+}<?%("COND:ITERATE:LASTN", 1, 0, 0, "", ",")>
diff --git a/webcit/static/t/edit/message/upl_att.js b/webcit/static/t/edit/message/upl_att.js
new file mode 100644 (file)
index 0000000..cfb6f2c
--- /dev/null
@@ -0,0 +1,9 @@
+{
+<?!("COND:BSTR", 1, "UPLOAD_ERROR")>
+"Error" : true
+<?!("X", 1)>
+<?!("COND:BSTR", 2, "UPLOAD_LENGTH")>
+"success": true,
+"UploadLength": <?BSTR("UPLOAD_LENGTH")>
+<?!("X", 2)>
+}
\ No newline at end of file
diff --git a/webcit/static/t/empty.html b/webcit/static/t/empty.html
new file mode 100644 (file)
index 0000000..5dfd325
--- /dev/null
@@ -0,0 +1,7 @@
+<html>
+<head>
+       <title>Empty Page</title>
+</head>
+<body>
+</body>
+</html>
diff --git a/webcit/static/t/files.html b/webcit/static/t/files.html
new file mode 100644 (file)
index 0000000..7037edc
--- /dev/null
@@ -0,0 +1,37 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+       <h1><?_("Files available for download in")>&nbsp;<?THISROOM:NAME></h1>
+       <?!("COND:THISROOM:FLAG:QR", 2, #"QR_UPLOAD")>
+               <br>
+               <form enctype="multipart/form-data" method="POST" accept-charset="UTF-8" action="upload_file" name="upload_file_form">
+                       <input type="hidden" name="nonce" value="<?NONCE>">
+                       <?_("Upload a file:")>&nbsp;
+                       <input name="filename" size="60" type="file">&nbsp;
+                       <div id="navbar">
+                               <?_("Description:")>&nbsp;
+                               <input type="text" name="description" maxlength="50" size="50">&nbsp;
+                               <input type="submit" name="attach_button" value="<?_("Upload")>">
+                       </div>
+               </form>
+       <??("X", 2)>
+</div>
+
+<script language="javascript" type="text/javascript">
+  document.onkeydown = CtdlMsgListKeyPress;
+  if (document.layers) {
+       document.captureEvents(Event.KEYPRESS);
+  }
+</script>
+
+<div id="content" class="service">
+       <table class="downloads_background altern">
+       <tr>
+         <th><?_("Filename")>&nbsp;<a href="do_template?template=files?SortOrder=<?SORT:ORDER("filename")>&SortBy=<?SORT:NEXT("filename")>"><img border="0" src="<?SORT:ICON("filename")>" /></a> </th>
+         <th><?_("Size")>&nbsp;<a href="do_template?template=files?SortOrder=<?SORT:ORDER("filesize")>&SortBy=<?SORT:NEXT("filesize")>"><img border="0" src="<?SORT:ICON("filesize")>" /></a> </th>
+         <th><?_("Content")>&nbsp;<a href="do_template?template=files?SortOrder=<?SORT:ORDER("filemime")>&SortBy=<?SORT:NEXT("filemime")>"><img border="0" src="<?SORT:ICON("filemime")>" /></a> </th>
+         <th><?_("Description")>&nbsp;<a href="do_template?template=files?SortOrder=<?SORT:ORDER("filesubject")>&SortBy=<?SORT:NEXT("filesubject")>"><img border="0" src="<?SORT:ICON("filesubject")>" /></a> </th>
+       </tr>
+       <?ITERATE("ROOM:FILES", ="files_section_onefile")>
+       </div>
+<?=("trailing")>
diff --git a/webcit/static/t/files/graphicsupload.html b/webcit/static/t/files/graphicsupload.html
new file mode 100644 (file)
index 0000000..2e02e81
--- /dev/null
@@ -0,0 +1,22 @@
+<?=("head")>
+<?=("box_begin_1")><?_("Image upload")> <?BSTR("__PICDESC")><?=("box_begin_2")>
+<form enctype="multipart/form-data" action='<?BSTR("__UPLURL")>' method="post" name="graphicsupload">
+
+<input type="hidden" name="nonce" value="<?NONCE>">
+<input type="hidden" name="which_room" value="<?THISROOM:NAME("U")>"><?_("You can upload an image directly from your computer")>
+<br><br>
+<?_("Please select a file to upload:")>
+<input type="file" name="filename" size="35">
+
+<div class="uploadpic"><img src="image?name=<?BSTR("__WHICHPIC")>"></div>
+
+<div class="buttons">
+  <input type="submit" name="upload_button" value="<?_("Upload")>">
+  &nbsp;
+  <input type="reset" value="<?_("Reset form")>" >
+  &nbsp;
+  <input type="submit" name="cancel_button" value="<?_("Cancel")>">
+</div>
+</form>
+<?=("box_end")>
+<?=("trailing")>
diff --git a/webcit/static/t/files/picview.js b/webcit/static/t/files/picview.js
new file mode 100644 (file)
index 0000000..05d524f
--- /dev/null
@@ -0,0 +1,34 @@
+<??("COND:BSTR", 1, "frame")>
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+
+<div id="banner"><h1><?_("Pictures in")> <?THISROOM:NAME></h1></div>
+<div id="content" class="service">
+       <table class="downloads_background">
+       <tr><td>
+               <script type="text/javascript" language="JavaScript">
+                       <?ITERATE("ROOM:FILES", ="files_section_onefile_picview")>
+               </script>
+       </td></tr>
+       <tr><td>
+               <script type="text/javascript">
+                       start_slideshow(1, $lastfile, 3000);
+    
+                       function start_slideshow(start_frame, end_frame, delay) {
+                               setTimeout(switch_slides(start_frame,start_frame,end_frame, delay), delay);
+                       }
+                            
+                       function switch_slides(frame, start_frame, end_frame, delay) {
+                               return (function() {
+                                       Effect.Fade('slideshow' + frame);
+                                       if (frame == end_frame) { frame = start_frame; } else { frame = frame + 1; }
+                                               setTimeout("Effect.Appear('slideshow" + frame + "');", 850);
+                                               setTimeout(switch_slides(frame, start_frame, end_frame, delay), delay + 850);
+                               })
+                       }
+               </script>
+       </td></tr>
+       <th></th>
+       </table>
+<?=("trailing")>
+<??("X", 1)>
diff --git a/webcit/static/t/files/section_onefile.html b/webcit/static/t/files/section_onefile.html
new file mode 100644 (file)
index 0000000..6d6d04f
--- /dev/null
@@ -0,0 +1,22 @@
+<?!("COND:ITERATE:ISGROUPCHANGE", 1)><?!("COND:BSTR", 2, "SortOrder", "filename")>
+       <tr class="<?ITERATE:ODDEVEN>"><th colspan = 4><?FILE:NAME("U", 1)></th></tr>
+<?!("X", 2)><?!("X", 1)>
+
+<tr class="<?ITERATE:ODDEVEN>">
+       <td>
+        <a href="download_file/<?FILE:NAME("U")>">
+         <img src="display_mime_icon?type=<?FILE:MIMETYPE>" border="0" align="middle" alt="">
+         <?FILE:NAME></a>
+       </td>
+       <td><?FILE:SIZE></td>
+       <td><?FILE:MIMETYPE></td>
+       <td><?FILE:COMMENT("X")></td>
+       <??("COND:AIDE", 4)><td><a href="delete_file?file=<?FILE:NAME("U")>"><img src="static/webcit_icons/essen/16x16/delete.png" alt="<?_("Delete File")>"></a></td><??("X", 4)>
+</tr>
+
+<?!("COND:ITERATE:LASTN", 2)>
+       </table>
+       <?!("COND:FILE:ISPIC", 3)>
+               <div class="buttons"><?=("files_section_onefile_picview")><?_("Slideshow")></a></div>
+       <??("X", 3)>
+<?!("X", 2)>
diff --git a/webcit/static/t/files/section_onefile_picview.html b/webcit/static/t/files/section_onefile_picview.html
new file mode 100644 (file)
index 0000000..37e9a07
--- /dev/null
@@ -0,0 +1,6 @@
+<??("COND:FILE:ISPIC", 2)>
+       <div id="slideshow<?ITERATE:N>" class="slide" style="display: <?%("COND:ITERATE:FIRSTN", 1, 1, 1, "visible", "none")>"><div>download_file/<?FILE:NAME("X")></div></div>
+<??("X", 2)>
+<?!("COND:ITERATE:LASTN", 3)>
+       <script>$lastfile=<?ITERATE:N></script>
+<?!("X", 3)>
diff --git a/webcit/static/t/floors.html b/webcit/static/t/floors.html
new file mode 100644 (file)
index 0000000..ea837cc
--- /dev/null
@@ -0,0 +1,30 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+
+<div id="banner">
+        <h1><?_("Add/change/delete floors")></h1>
+</div>
+
+<div id="content" class="service">
+       <table border="1" width="100%" bgcolor="#ffffff">
+               <tr>
+                       <th><?_("Floor number")></th>
+                       <th><?_("Floor name")></th>
+                       <th><?_("Number of rooms")></th>
+                       <th><?_("Floor CSS")></th>
+               </tr>
+
+               <?ITERATE("LFLR", ="floors_edit_one")>
+
+               <tr>
+                       <td>&nbsp;</td>
+                       <td>
+                               <form method="post" action="create_floor">
+                                       <input type="hidden" name="nonce" value="<?NONCE>">
+                                       <input type="text" name="floorname" maxlength="250">
+                                       <input type="submit" name="sc" value="<?_("Create new floor")>">
+                               </form>
+                       </td>
+                       <td>&nbsp;</td>
+               </tr>
+       </table>
+<?=("trailing")>
diff --git a/webcit/static/t/floors_edit_one.html b/webcit/static/t/floors_edit_one.html
new file mode 100644 (file)
index 0000000..03faeb0
--- /dev/null
@@ -0,0 +1,35 @@
+<?--("Subtemplate to edit a single floor, called as ITERATION by floors.html")>
+<??("COND:FLOOR:ISVIRTUAL", 1)>
+               <tr>
+                       <td>
+                               <table border="0">
+                                       <tr>
+                                               <td><?FLOOR:ID>
+                                       <?!("COND:FLOOR:NROOMS",20,0)>
+                                               </td>
+                                               <td>
+                                                       <a href="delete_floor?floornum=<?FLOOR:ID>" style="font-size: -1"><?_("(delete floor)")></a><br>
+                                       <??("X",20)>
+                                               </td>
+                                       </tr>
+                               </table>
+                       </td>
+                       <td>
+                               <form method="post" action="rename_floor">
+                                       <input type="hidden" name="floornum" value="<?FLOOR:ID>">
+                                       <input type="text" name="floorname" value="<?FLOOR:NAME>" maxlength="250">
+                                       <input type="hidden" name="nonce" value="<?NONCE>">
+                                       <input type="submit" name="sc" value="<?_("Change name")>">
+                               </form>
+                       </td>
+                       <td><?FLOOR:NROOMS></td>
+                       <td>
+                               <form method="post" action="set_floor_css">
+                                       <input type="hidden" name="floornum" value="<?FLOOR:ID>">
+                                       <input type="text" name="floorcss" value="<?FLOOR:NAME>" maxlength="250">
+                                       <input type="hidden" name="nonce" value="<?NONCE>">
+                                       <input type="submit" name="sc" value="<?_("Change CSS")>">
+                               </form>
+                       </td>
+               </tr>
+<??("X", 1)>
diff --git a/webcit/static/t/get_logged_in.html b/webcit/static/t/get_logged_in.html
new file mode 100644 (file)
index 0000000..e7284c7
--- /dev/null
@@ -0,0 +1,117 @@
+<div id="loginbox_topline_container">
+<div id="loginbox_title">
+<?_("You must be logged in to access this page.")>
+</div>
+<div id="loginbox_closebutton">
+<a href="javascript:toggleModal(0);">
+<?_("Close window")>&nbsp;<img src="static/webcit_icons/closewindow.gif" border="0" alt='<?_("Close window")>'></a>
+</div>
+</div>
+<br><br>
+<div class="login_message" id="login_errmsg"></div>
+<div id="auth_container">
+<div id="authbar">
+<ul id="button">
+<li class="ib_button" style='background-image: url("/static/webcit_icons/citadel-button-32x32.gif");'>
+    <a class="ib_button_link" href="javascript:authtoggle('authbox_userpass');" title="<?SERV:HUMANNODE>"><span>
+        <?SERV:HUMANNODE>
+    </span></a>
+</li>
+<?!("COND:SERV:OPENID",1)><li class="ib_button" style='background-image: url("/static/webcit_icons/openid-32x32.gif");'>
+    <a class="ib_button_link" href="javascript:authtoggle('authbox_openid');" title="OpenID"><span>
+        OpenID
+    </span></a>
+</li><??("X", 1)>
+<?!("COND:SERV:OPENID",2)><li class="ib_button" style='background-image: url("/static/webcit_icons/google-32x32.gif");'>
+    <a class="ib_button_link" href="javascript:authtoggle('authbox_google');" title="Google"><span>
+        Google
+    </span></a>
+</li><??("X", 2)>
+<?!("COND:SERV:OPENID",3)><li class="ib_button" style='background-image: url("/static/webcit_icons/yahoo-32x32.gif");'>
+    <a class="ib_button_link" href="javascript:authtoggle('authbox_yahoo');" title="Yahoo"><span>
+        Yahoo
+    </span></a>
+</li><??("X", 3)>
+<?!("COND:SERV:OPENID",4)><li class="ib_button" style='background-image: url("/static/webcit_icons/aol-32x32.gif");'>
+    <a class="ib_button_link" href="javascript:authtoggle('authbox_aol');" title="AOL"><span>
+        AOL/AIM
+    </span></a>
+</li><??("X", 4)>
+<??("COND:SERV:OPENID",5)>
+<li class="ib_button"></li>
+<li class="ib_button"></li>
+<li class="ib_button"></li>
+<li class="ib_button"></li>
+<??("X", 5)>
+<li class="ib_button"></li>
+<li class="ib_button"></li>
+<li class="ib_button"></li>
+</ul>
+</div>
+
+<div class="authbox" id="authbox_userpass" style="display: block">
+<h2><?_("Log in using a user name and password")></h2>
+<form id="ajax_username_password_form" method="POST" action="ajax_login_username_password">
+<label for="uname"><?_("User name:")></label>
+<input type="text" name="name" id="uname" onKeyPress="username_and_password_onkeypress(event);">
+<br><br>
+<label for="pname"><?_("Password:")></label>
+<input type="password" name="pass" id="pname" onKeyPress="username_and_password_onkeypress(event);">
+<br><br>
+</form>
+<div class="logbuttons"><a href="javascript:ajax_try_username_and_password();"><?_("Log in")></a></div>
+<div class="registernow"><a href="javascript:authtoggle('authbox_newuser');"><?_("New user?  Register now")></a></div>
+</div>
+
+<div class="authbox" id="authbox_newuser" style="display: none">
+<h2><?_("New user?  Register now")></h2>
+<?_("enter the name and password you wish to use, and click &quot;New User.&quot; ")><br><br>
+<form id="ajax_newuser_form" method="POST" action="ajax_login_newuser">
+<label for="uname"><?_("User name:")></label>
+<input type="text" name="name" id="uname" onKeyPress="newuser_onkeypress(event);">
+<br><br>
+<label for="pname"><?_("Password:")></label>
+<input type="password" name="pass" id="pname" onKeyPress="newuser_onkeypress(event);">
+<br><br>
+</form>
+<div class="logbuttons"><a href="javascript:ajax_try_newuser();"><?_("New User")></a></div>
+</div>
+
+<div class="authbox" id="authbox_openid" style="display: none">
+<h2><?_("Log in using OpenID")></h2>
+<form id="ajax_openid_form" method="POST" action="ajax_login_openid">
+<?_("OpenID URL:")>
+<input type="text" name="openid_url" id="openid_url" class="openid_urlarea" onKeyPress="return openid_onkeypress(event);">
+</form>
+<div class="logbuttons"><a href="javascript:ajax_try_openid();"><?_("Log in")></a></div>
+</div>
+
+<div class="authbox" id="authbox_google" style="display: none">
+<h2><?_("Log in using Google")></h2>
+<div class="logbuttons"><a href="javascript:ajax_try_google();"><?_("Log in")></a></div>
+</div>
+
+<div class="authbox" id="authbox_yahoo" style="display: none">
+<h2><?_("Log in using Yahoo")></h2>
+<div class="logbuttons"><a href="javascript:ajax_try_yahoo();"><?_("Log in")></a></div>
+</div>
+
+<div class="authbox" id="authbox_aol" style="display: none">
+<h2><?_("Log in using AOL or AIM")></h2>
+<form id="ajax_aol_form" method="POST" action="ajax_login_aol">
+<?_("Enter your AOL or AIM screen name:")>
+<input type="text" name="aol_screenname" id="aol_screenname" class="openid_urlarea" onKeyPress="return aol_onkeypress(event);">
+</form>
+<div class="logbuttons"><a href="javascript:ajax_try_aol();"><?_("Log in")></a></div>
+</div>
+
+<div class="authbox" id="authbox_success" style="display: none">
+       <br><br><br>
+       <div align="center"><h1>
+               <img src="static/webcit_icons/throbber.gif" alt="">
+               &nbsp;
+               <?_("Please wait")>...
+       </h1></div>
+</div>
+
+</div>
diff --git a/webcit/static/t/head.html b/webcit/static/t/head.html
new file mode 100644 (file)
index 0000000..bb19889
--- /dev/null
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+       <head>
+               <title><?THISROOM:NAME> - <?SERV:HUMANNODE></title>
+               <meta http-equiv="X-UA-Compatible" content="IE=8" >
+               <meta name="keywords" content="groupware messaging collaboration" >
+               <link href="static/styles/webcit.css" rel="stylesheet" type="text/css">
+               <link href="static/styles/datepicker.css" rel="stylesheet" type="text/css">
+               <link href="static/styles/fineuploader.css" rel="stylesheet" type="text/css">
+               <?THISROOM:FEED:RSSMETA>
+
+               <link href="do_template?template=iconbar_user" rel="stylesheet" type="text/css">
+               <link href="static/styles/iconbaricns.css" rel="<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_displayas", "", "alternate ")>stylesheet" type="text/css" id="style_iconbar_icns" title="Default iconbar">
+               <link href="static/styles/iconbarpiconly.css" rel="<?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_displayas", "","alternate ")>stylesheet" type="text/css" id="style_iconbar_piconly" title="Iconbar without text">
+               <?CSSLOCAL>
+               <!--[if lte IE 8]>
+                       <style type="text/css">@import url(static/styles/ie_lte8.css);</style>
+               <![endif]-->
+               <script type="text/javascript" src="static/prototype.js"></script> 
+               <script type="text/javascript" src="static/scriptaculous.js"></script> 
+               <script type="text/javascript" src="static/datepicker-dev.js"></script>
+               <script type="text/javascript" src="static/wcpref.js"></script>
+               <script type="text/javascript" src="static/table.js"></script>
+               <script type="text/javascript" src="static/wclib.js"></script>
+               <script type="text/javascript" src="static/authmethods.js"></script>
+               <script type="text/javascript" src="static/roomops.js"></script>
+               <script type="text/javascript" src="static/ctdldragdrop.js"></script>
+               <script type="text/javascript" src="static/modal.js"></script>
+               <script type="text/javascript" src="static/fineuploader.js"></script>
+
+       </head>
+<body>
+<div id="is_logged_in" style="display:none"><?%("COND:LOGGEDIN", 1, 1, 1, "no", "yes")></div>
+<!-- begin modal box -->
+<div id="modal">
+       <div class="md-overlay-decorator">
+       </div>
+       <div class="md-overlay-wrap">
+               <div class="md-overlay">
+                       <div class="md-dialog-decorator">
+                       </div>
+                       <div class="md-dialog-wrap">
+                               <div class="md-dialog" id="dialog">
+                                       <div class="md-content" id="md-content">
+                                         <?!("COND:LOGGEDIN", 1)><?=("get_logged_in")><??("X", 1)>
+                                               <!-- contents of modal box go here -->
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </div>
+</div>
+<!-- end modal box -->
+<?ICONBAR>
+<div id="global">
+<!--("end head.html")-->
diff --git a/webcit/static/t/ical/attachment/display.html b/webcit/static/t/ical/attachment/display.html
new file mode 100644 (file)
index 0000000..55b90c0
--- /dev/null
@@ -0,0 +1,77 @@
+<div class="mimepart">
+
+<div id="rsvp<?BSTR("divname")>_title">
+<img src="static/webcit_icons/essen/32x32/calendar.png">
+<span>
+&nbsp;&nbsp;
+<??("COND:ICAL:METHOD", 1, #"ICAL_METHOD_REQUEST")><??("COND:ICAL:METHOD", 2, #"ICAL_METHOD_REPLY")><??("COND:ICAL:METHOD", 3, #"ICAL_METHOD_PUBLISH")>
+<?_("This is an unknown type of calendar item.")>
+<??("X", 1)><??("X", 2)><??("X", 3)>
+<?!("COND:ICAL:METHOD", 11, #"ICAL_METHOD_REQUEST")>
+<?_("Meeting invitation")>
+<?!("X", 11)>
+<?!("COND:ICAL:METHOD", 12, #"ICAL_METHOD_REPLY")>
+<?_("Attendee's reply to your invitation")>
+<?!("X", 12)>
+<?!("COND:ICAL:METHOD", 13, #"ICAL_METHOD_PUBLISH")>
+<?_("Published event")>
+<?!("X", 13)>
+</span>
+</div>
+
+
+<?--("------------------------------")>
+<div><dl>
+<?!("COND:ICAL:PROPERTY", 44, #"ICAL_SUMMARY_PROPERTY")><dt><?_("Summary:")></dt><dd><?ICAL:PROPERTY:STR("X")></dd><?!("X", 44)>
+<?!("COND:ICAL:PROPERTY", 55, #"ICAL_LOCATION_PROPERTY")><dt><?_("Location:")></dt><dd><?ICAL:PROPERTY:STR("X")></dd><?!("X", 55)>
+
+<?--("------------------------------")>
+<?!("COND:ICAL:IS:A", 66, #"ICAL_VEVENT_COMPONENT")>
+<?!("COND:ICAL:DT:PROPERTY", 67, #"ICAL_DTSTART_PROPERTY")>
+<?!("COND:ICAL:DT:ISDATE", 68)><dt><?_("Date:")></dt><dd><?ICAL:DT:DATE()></dd><?!("X", 68)>
+<??("COND:ICAL:DT:ISDATE", 69)><dt><?_("Starting date/time:")></dt><dd><?ICAL:DT:DATETIME()></dd><??("X", 69)>
+<?!("X", 67)>
+<?!("COND:ICAL:DT:PROPERTY", 77, #"ICAL_DTEND_PROPERTY")><dt><?_("Ending date/time:")></dt><dd><?ICAL:DT:DATETIME()></dd><?!("X", 77)>
+<?!("X", 66)>
+
+
+<?!("COND:ICAL:PROPERTY", 88, #"ICAL_DESCRIPTION_PROPERTY")><dt><?_("Description:")></dt><dd><?ICAL:PROPERTY:STR("X")></dd><?!("X", 88)>
+
+<?--("Unusual string syntax used here in order to re-use existing translations")>
+<?!("COND:ICAL:PROPERTY", 99, #"ICAL_RRULE_PROPERTY")><dt><?_("Recurrence")></dt><dd><?_("This is a recurring event")>.</dd><?!("X", 99)>
+
+
+<?ITERATE("ICAL:ATTENDEES", ="ical_attachment_display_attendees")>
+
+</dl></div>
+
+<?--("If this is a REQUEST, display conflicts and buttons")>
+<?!("COND:ICAL:METHOD", 110, #"ICAL_METHOD_REQUEST")>
+<?ITERATE("ICAL:CONFLICT", ="ical_attachment_display_conflict")>
+<?--("Display the Accept/Decline buttons")>
+<p id="rsvp<?BSTR("divname")>_question">
+<?_("How would you like to respond to this invitation?")>
+&nbsp;&nbsp;&nbsp;<span class="button_link">
+<a href="javascript:RespondToInvitation('rsvp<?BSTR("divname")>_question','rsvp<?BSTR("divname")>_title','<?BSTR("msgnum")>','<?BSTR("cal_partnum")>','Accept');"><?_("Accept")></a>
+</span>&nbsp;&nbsp;&nbsp;<span class="button_link">
+<a href="javascript:RespondToInvitation('rsvp<?BSTR("divname")>_question','rsvp<?BSTR("divname")>_title','<?BSTR("msgnum")>','<?BSTR("cal_partnum")>','Tentative');"><?_("Tentative")></a>
+</span>&nbsp;&nbsp;&nbsp;<span class="button_link">
+<a href="javascript:RespondToInvitation('rsvp<?BSTR("divname")>_question','rsvp<?BSTR("divname")>_title','<?BSTR("msgnum")>','<?BSTR("cal_partnum")>','Decline');"><?_("Decline")></a>
+</span></p>
+<??("X", 110)>
+
+<?--("If this is a REPLY, display update button")>
+<?!("COND:ICAL:METHOD", 120, #"ICAL_METHOD_REPLY")>
+<p id="rsvp<?BSTR("divname")>_question" >
+<?_("Click <i>Update</i> to accept this reply and update your calendar.")>
+&nbsp;&nbsp;&nbsp;<span class="button_link">
+<a href="javascript:HandleRSVP('rsvp<?BSTR("divname")>_question','rsvp<?BSTR("divname")>_title','<?BSTR("msgnum")>','<?BSTR("cal_partnum")>','Update');"><?_("Update")></a>
+</span>&nbsp;&nbsp;&nbsp;<span class="button_link">
+<a href="javascript:HandleRSVP('rsvp<?BSTR("divname")>_question','rsvp<?BSTR("divname")>_title','<?BSTR("msgnum")>','<?BSTR("cal_partnum")>','Ignore');"><?_("Ignore")></a>
+</span></p>
+<?!("X", 120)>
+
+<?--("Trailing HTML for the display of this object")>
+<?--("if (recursion_level == 0) {")>
+<p>&nbsp;</p></div>
+<?--("}")>
diff --git a/webcit/static/t/ical/attachment/display_attendees.html b/webcit/static/t/ical/attachment/display_attendees.html
new file mode 100644 (file)
index 0000000..027292d
--- /dev/null
@@ -0,0 +1,14 @@
+<dt>
+<?_("Attendee:")>
+</dt><dd>
+<?ICAL:ATTENDEE("X")>
+<?!("COND:ICAL:ATTENDEE", 1, #"ICAL_PARTSTAT_X")>(x)<??("X", 1)>
+<?!("COND:ICAL:ATTENDEE", 1, #"ICAL_PARTSTAT_NEEDSACTION")><?_("(needs action)")><??("X", 1)>
+<?!("COND:ICAL:ATTENDEE", 1, #"ICAL_PARTSTAT_ACCEPTED")><?_("(accepted)")><??("X", 1)>
+<?!("COND:ICAL:ATTENDEE", 1, #"ICAL_PARTSTAT_DECLINED")><?_("(declined)")><??("X", 1)>
+<?!("COND:ICAL:ATTENDEE", 1, #"ICAL_PARTSTAT_TENTATIVE")><?_("(tenative)")><??("X", 1)>
+<?!("COND:ICAL:ATTENDEE", 1, #"ICAL_PARTSTAT_DELEGATED")><?_("(delegated)")><??("X", 1)>
+<?!("COND:ICAL:ATTENDEE", 1, #"ICAL_PARTSTAT_COMPLETED")><?_("(completed)")><??("X", 1)>
+<?!("COND:ICAL:ATTENDEE", 1, #"ICAL_PARTSTAT_INPROCESS")><?_("(in process)")><??("X", 1)>
+<?!("COND:ICAL:ATTENDEE", 1, #"ICAL_PARTSTAT_NONE")><?_("(none)")><??("X", 1)>
+</dd>
diff --git a/webcit/static/t/ical/attachment/display_conflict.html b/webcit/static/t/ical/attachment/display_conflict.html
new file mode 100644 (file)
index 0000000..b6e2852
--- /dev/null
@@ -0,0 +1,7 @@
+<dt>
+<?!("ICAL:CONFLICT:IS:UPDATE", 30)><?_("Update:"  )><??("X", 30)>
+<??("ICAL:CONFLICT:IS:UPDATE", 40)><?_("CONFLICT:")><??("X", 40)>
+</dt><dd>
+<?!("ICAL:CONFLICT:IS:UPDATE", 10)><?_("This is an update of"          )> '<?ICAL:CONFLICT:SUMMARY("X")>' <?_("which is already in your calendar.")><??("X", 10)>
+<??("ICAL:CONFLICT:IS:UPDATE", 20)><?_("This event would conflict with")> '<?ICAL:CONFLICT:SUMMARY("X")>' <?_("which is already in your calendar.")><?!("X", 20)>
+</dd>
diff --git a/webcit/static/t/iconbar.html b/webcit/static/t/iconbar.html
new file mode 100644 (file)
index 0000000..0ba06be
--- /dev/null
@@ -0,0 +1,97 @@
+<div id="iconbar">
+       <div id="iconbar_container">
+               <div id="citlogo" class="logo_citadel">
+                       <img src="/static/citadel-logo.gif" alt="<?_("Powered by Citadel")>"  width="120" height="35">
+               </div>
+               <div class="iconbar_text">
+                       <?_("Language:")><?LANG:SELECT>
+               </div>
+               <div id="iconbar_menu">
+                       <ul id="button">
+                               <li id="ib_summary" class="ib_button">
+                                       <a class="ib_button_link" href="summary" title="<?_("Your summary page")>">
+                                               <span><?_("Summary")></span>
+                                       </a>
+                               </li>
+                       <??("COND:LOGGEDIN",3)>
+                               <li id="ib_inbox" class="ib_button">
+                                       <a class="ib_button_link" href="dotgoto?room=_MAIL_" title="<?_("Go to your email inbox")>">
+                                               <span><?_("Mail")></span>
+                                       </a>
+                               </li>
+                               <li id="ib_calendar" class="ib_button">
+                                       <a class="ib_button_link" href="dotgoto?room=_CALENDAR_" title="<?_("Go to your personal calendar")>">
+                                               <span><?_("Calendar")></span>
+                                       </a>
+                               </li>
+                               <li id="ib_contacts" class="ib_button">
+                                       <a class="ib_button_link" href="dotgoto?room=_CONTACTS_" title="<?_("Go to your personal address book")>">
+                                               <span><?_("Contacts")></span>
+                                       </a>
+                               </li>
+                               <li id="ib_notes" class="ib_button">
+                                       <a class="ib_button_link" href="dotgoto?room=_NOTES_" title="<?_("Go to your personal notes")>">
+                                               <span><?_("Notes")></span>
+                                       </a>
+                               </li>
+                               <li id="ib_tasks" class="ib_button">
+                                       <a class="ib_button_link" href="dotgoto?room=_TASKS_" title="<?_("Go to your personal task list")>">
+                                               <span><?_("Tasks")></span>
+                                       </a>
+                               </li>
+                       <??("X",3)>
+                               <li id="ib_rooms" class="ib_button">
+                                       <a class="ib_button_link" href="knrooms?template=knrooms?SortBy=byfloorroom?SortOrder=1" title="<?_("List all your accessible rooms")>">
+                                               <img id="expand_roomlist"
+                                                       src=<?%("COND:ICONBAR:ROOMLISTEXPANDED", 1, 1, 1, '"static/webcit_icons/collapse.gif" alt="-"', '"static/webcit_icons/expand.gif" alt="+"')>
+                                               onClick="return toggle_roomlist();">
+                                               <span><?_("Rooms")></span>
+                                       </a>
+                                       <div id="roomlist"><?_("Loading")></div>
+                               </li>
+                               <li id="ib_users" class="ib_button">
+                                       <a class="ib_button_link" href="do_template?template=who" title="<?_("See who is online right now")>">
+                                               <img id="expand_wholist"
+                                                       src=<?%("COND:ICONBAR:WHOLISTEXPANDED", 1, 1, 1, '"static/webcit_icons/collapse.gif" alt="-"', '"static/webcit_icons/expand.gif" alt="+"')>
+                                               onClick="return toggle_wholist();">
+                                               <span><?_("Online users")></span>
+                                       </a>
+                                       <ul id="online_users"><li><?_("Loading")></li></ul>
+                               </li>
+                       <??("COND:LOGGEDIN",5)>
+                               <li id="ib_chat" class="ib_button"><a class="ib_button_link" href="chat"><span><?_("Chat")></span></a></li>
+                               <li id="ib_advanced" class="ib_button">
+                                       <a class="ib_button_link" href="do_template?template=display_main_menu" title="<?_("Advanced Options Menu: Advanced Room commands, Account Info, and Chat")>">
+                                               <span><?_("Advanced")></span>
+                                       </a>
+                               </li>
+                       <??("X",5)>
+                       <??("COND:AIDE", 1)>
+                               <li id="ib_admin" class="ib_button">
+                                       <a class="ib_button_link" href="do_template?template=aide_display_menu" title="<?_("Room and system administration functions")>">
+                                               <span><?_("Administration")></span>
+                                       </a>
+                               </li>
+                       <??("X",1)>
+                       </ul>
+               </div>
+       <??("COND:LOGGEDIN",2)>
+               <div id="ib_logoff" class="ib_button">
+                       <a class="ib_button_link" href="javascript:ConfirmLogoff()" title="<?_("Log off")>"><span><?_("Log off")></span></a>
+               </div>
+               <div id="customize" class="iconbar_text">
+                       <span><a href="do_template?template=iconbar_edit"><?_("customize this menu")></a></span>
+               </div>
+       <??("X",2)>
+       <?!("COND:LOGGEDIN",4)>
+               <div id="ib_login" class="ib_button">
+                       <a class="ib_button_link" href="javascript:GetLoggedInFirst('do_welcome')" title="<?_("Log in")>"><span><?_("Log in")></span></a>
+               </div>
+       <?!("X",4)>
+               <div class="ctdlTemplate">
+                       <span id="rmlist_template"><?_("switch to room list")></span>
+                       <span id="mnlist_template"><?_("switch to menu")></span>
+                       <span id="mbox_template"><?_("My folders")></span>
+               </div>
+       </div>
+</div>
diff --git a/webcit/static/t/iconbar/edit.html b/webcit/static/t/iconbar/edit.html
new file mode 100644 (file)
index 0000000..26f4044
--- /dev/null
@@ -0,0 +1,96 @@
+<?=("head")>
+
+<div id="banner">
+       <h1><?_("Customize the icon bar")></h1>
+</div>
+<div id="content" class="service">
+       <form method="post" action="commit_iconbar">
+       <input type="hidden" name="nonce" value="<?NONCE>">
+       <table class="altern" >
+               <tr><td></td><td colspan="2">
+                       <b><?_("Display icons as:")></b>
+                       <input type="radio" name="ib_displayas" value="0" <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_displayas", "CHECKED", "")>><?_("pictures and text")></input>
+                       <input type="radio" name="ib_displayas" value="1" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_displayas", "CHECKED", "")>><?_("pictures only")></input>
+                       <input type="radio" name="ib_displayas" value="2" <?%("COND:ICONBAR:ACTIVE", 1, 2, #"ib_displayas", "CHECKED", "")>><?_("text only")></input>
+                       <br>
+                       <?_("Select the icons you would like to see displayed in the 'icon bar' menu on the left side of the screen.")>
+               </td></tr>
+               <tr class="even"><td>
+                       <input type="radio" name="ib_logo" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_logo", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_logo" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_logo", "CHECKED", "")>> <?_("No")> <br>
+                       </td>
+                       <td><img src="image?name=hello" width="120" alt="&nbsp;"></td>
+                       <td><b><?_("Site logo")></b><br><?_("An icon describing this site")></td>
+               </tr>
+               <tr class="odd"><td>
+                       <input type="radio" name="ib_summary" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_summary", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_summary" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_summary", "CHECKED", "")>> <?_("No")> <br>
+                       </td><td><img src="static/webcit_icons/essen/32x32/summary.png" alt="&nbsp;"></td>
+                       <td><b><?_("Summary")></b><br><?_("Your summary page")></td>
+               </tr>
+               <tr class="even"><td>
+                       <input type="radio" name="ib_inbox" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_inbox", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_inbox" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_inbox", "CHECKED", "")>> <?_("No")> <br>
+                       </td>
+                       <td><img src="static/webcit_icons/essen/32x32/email.png" alt="&nbsp;"></td>
+                       <td><b><?_("Mail (inbox)")></b><br><?_("A shortcut to your email Inbox")></td>
+               </tr>
+               <tr class="odd"><td>
+                       <input type="radio" name="ib_contacts" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_contacts", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_contacts" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_contacts", "CHECKED", "")>> <?_("No")> <br>
+                       </td><td><img src="static/webcit_icons/essen/32x32/contact.png" alt="&nbsp;">
+                       </td><td><b><?_("Contacts")></b><br><?_("Your personal address book")></td>
+               </tr>
+               <tr class="even"><td>
+                       <input type="radio" name="ib_notes" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_notes", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_notes" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_notes", "CHECKED", "")>> <?_("No")> <br>
+                       </td>
+                       <td><img src="static/webcit_icons/essen/32x32/note.png" alt="&nbsp;"></td>
+                       <td><b><?_("Notes")></b><br><?_("Your personal notes")></td>
+               </tr>
+               <tr class="odd"><td>
+                       <input type="radio" name="ib_calendar" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_calendar", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_calendar" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_calendar", "CHECKED", "")>> <?_("No")> <br>
+                       </td><td><img src="static/webcit_icons/essen/32x32/calendar.png" alt="&nbsp;"></td>
+                       <td><b><?_("Calendar")></b><br><?_("A shortcut to your personal calendar")></td>
+               </tr>
+               <tr class="even"><td>
+                       <input type="radio" name="ib_tasks" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_tasks", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_tasks" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_tasks", "CHECKED", "")>> <?_("No")> <br>
+                       </td><td><img src="static/webcit_icons/essen/32x32/task.png" alt="&nbsp;"></td>
+                       <td><b><?_("Tasks")></b><br><?_("A shortcut to your personal task list")></td>
+               </tr>
+               <tr class="odd"><td>
+                       <input type="radio" name="ib_rooms" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_rooms", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_rooms" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_rooms", "CHECKED", "")>> <?_("No")> <br>
+                       </td><td><img src="static/webcit_icons/essen/32x32/room.png" alt="&nbsp;"></td>
+                       <td><b><?_("Rooms")></b><br><?_("Clicking this icon displays a list of all accessible rooms (or folders) available.")></td>
+               </tr>
+               <tr class="even"><td>
+                       <input type="radio" name="ib_users" value="yes"     <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_users", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_users" value="no"      <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_users", "CHECKED", "")>> <?_("No")> <br>
+                       </td><td><img src="static/webcit_icons/essen/32x32/user.png" alt="&nbsp;"></td>
+                       <td><b><?_("Who is online?")></b><br><?_("Clicking this icon displays a list of all users currently logged in.")></td>
+               </tr>
+               <tr class="odd"><td>
+                       <input type="radio" name="ib_chat" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_chat", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_chat" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_chat", "CHECKED", "")>> <?_("No")> <br>
+                       </td><td><img src="static/webcit_icons/essen/32x32/chat.png" alt="&nbsp;"></td>
+                       <td><b><?_("Chat")></b><br><?_("Clicking this icon enters real-time chat mode with other users in the same room.")></td>
+               </tr>
+               <tr class="even"><td>
+                       <input type="radio" name="ib_advanced" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_advanced", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_advanced" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_advanced", "CHECKED", "")>> <?_("No")> <br>
+                       </td><td><img src="static/webcit_icons/essen/32x32/config.png" alt="&nbsp;"></td>
+                       <td><b><?_("Advanced options")></b><br><?_("Access to the complete menu of Citadel functions.")></td>
+               </tr>
+               <tr class="odd"><td>
+                       <input type="radio" name="ib_citadel" value="yes" <?%("COND:ICONBAR:ACTIVE", 1, 1, #"ib_citadel", "CHECKED", "")>> <?_("Yes")> &nbsp;&nbsp;&nbsp;
+                       <input type="radio" name="ib_citadel" value="no"  <?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_citadel", "CHECKED", "")>> <?_("No")> <br>
+                       </td><td><img border="0" width="120" height="60" src="static/citadel-logo.gif" alt="&nbsp;"></td>
+                       <td><b><?_("Citadel logo")></b><br><?_("Displays the 'Powered by Citadel' icon")></td>
+               </tr>
+       </table><br>
+       <center><input type="submit" name="ok_button" value="<?_("Save changes")>">&nbsp;<input type="submit" name="cancel_button" value="<?_("Cancel")>"></center>
+</form>
+<?=("trailing")>
diff --git a/webcit/static/t/iconbar/save.html b/webcit/static/t/iconbar/save.html
new file mode 100644 (file)
index 0000000..ce95c49
--- /dev/null
@@ -0,0 +1,14 @@
+<?=("head")>
+
+<div id="banner">
+       <h1><?_("Customize the icon bar")></h1>
+</div>
+<div id="content" class="service">
+       <center>
+               <table border=1 bgcolor="#ffffff"><tr><td>
+                       <img src="static/webcit_icons/essen/32x32/config.png">
+                       &nbsp;
+                       <?_("Your icon bar has been updated. Please select any of its choices to continue.")>(<br><span style="font-weight: bold;"><?_("You may need to force refresh (SHIFT-F5)> in order for changes to take effect")>)</span>
+               </td></tr></table>
+       </center>
+<?=("trailing")>
diff --git a/webcit/static/t/iconbar/user.css b/webcit/static/t/iconbar/user.css
new file mode 100644 (file)
index 0000000..7f4f4a8
--- /dev/null
@@ -0,0 +1,20 @@
+#global { left: 16%; }
+
+# { display: none !important; }
+
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_displayas", "#ib_displayas { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_logo"     , "#ib_logo      { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_summary"  , "#ib_summary   { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_inbox"    , "#ib_inbox     { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_calendar" , "#ib_calendar  { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_contacts" , "#ib_contacts  { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_notes"    , "#ib_notes     { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_tasks"    , "#ib_tasks     { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_rooms"    , "#ib_rooms     { display: none !important; }" , "")>
+
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_users"    , "#ib_users     { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_users"    , "#online_users { display: none !important; }" , "")>
+
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_chat"     , "#ib_chat      { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_advanced" , "#ib_advanced  { display: none !important; }" , "")>
+<?%("COND:ICONBAR:ACTIVE", 1, 0, #"ib_citadel"  , "#ib_citadel   { display: none !important; }" , "")>
diff --git a/webcit/static/t/json/floor.html b/webcit/static/t/json/floor.html
new file mode 100644 (file)
index 0000000..7865f45
--- /dev/null
@@ -0,0 +1 @@
+[<?FLOOR:ID>, "<?FLOOR:NAME("J")>", <?FLOOR:NROOMS>] <?%("COND:ITERATE:LASTN", 1, 1, 0, "", " , ")>
diff --git a/webcit/static/t/json/floors.html b/webcit/static/t/json/floors.html
new file mode 100644 (file)
index 0000000..ea30b44
--- /dev/null
@@ -0,0 +1,3 @@
+[
+<?ITERATE("LFLR", ="json_floor")>
+]
diff --git a/webcit/static/t/json/lkra.html b/webcit/static/t/json/lkra.html
new file mode 100644 (file)
index 0000000..b4cad92
--- /dev/null
@@ -0,0 +1,3 @@
+[
+<?ITERATE("LKRA", ="json_room")>
+]
diff --git a/webcit/static/t/json/room.html b/webcit/static/t/json/room.html
new file mode 100644 (file)
index 0000000..20bba42
--- /dev/null
@@ -0,0 +1 @@
+["<?ROOM:INFO:NAME("J")>", <?ROOM:INFO:QRFLAGS>, <?ROOM:INFO:FLOORID>, <?ROOM:INFO:LISTORDER>,<?ROOM:INFO:ACL("J")>, <?ROOM:INFO:VIEW>, <?ROOM:INFO:DEFVIEW>, <?ROOM:INFO:LASTCHANGE>, <?ROOM:INFO:RAFLAGS> ] <?%("COND:ITERATE:LASTN", 1, 1, 0, "", " ,")>
diff --git a/webcit/static/t/json/roomflr.html b/webcit/static/t/json/roomflr.html
new file mode 100644 (file)
index 0000000..755ac83
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       "floors": <?=("json_floors")>,
+       "rooms": <?=("json_lkra")>
+}
\ No newline at end of file
diff --git a/webcit/static/t/knrooms.html b/webcit/static/t/knrooms.html
new file mode 100644 (file)
index 0000000..9fc8a59
--- /dev/null
@@ -0,0 +1,6 @@
+<div class="service">
+       <table border="0" width="96%" cellpadding="5">
+               <?ITERATE("LKRA", ="knrooms_rooms")>
+       </table>
+</div>
+</div>
diff --git a/webcit/static/t/knrooms_rooms.html b/webcit/static/t/knrooms_rooms.html
new file mode 100644 (file)
index 0000000..b545b61
--- /dev/null
@@ -0,0 +1,18 @@
+<?!("COND:ITERATE:FIRSTN", 1)>
+       <tr><td valign=top><?=("box_begin_1")>
+       <?ROOM:INFO:FLOOR:NAME><?=("box_begin_2")>
+<?!("X", 1)>
+<?!("COND:ITERATE:ISGROUPCHANGE", 2)>
+       <?=("box_end")><br>
+       <?!("COND:ITERATE:ISGROUPCHANGE", 3, 2)>
+               </td><td valign=top>
+       <?!("X", 3)>
+       <?=("box_begin_1")>
+       <?ROOM:INFO:FLOOR:NAME><?=("box_begin_2")>
+<?!("X", 2)>
+&nbsp;<a href="dotgoto?room=<?ROOM:INFO:NAME("U")>"><span class="<?%("COND:ROOM:FLAG:UA", 4, #"UA_HASNEWMSGS", 0, "roomlist_new", "roomlist_old")>">
+<?ROOM:INFO:LEVELNTIMES("&nbsp;&nbsp;&nbsp;")><?ROOM:INFO:BASENAME("X")></span></a>
+<?%("COND:ROOM:INFO:IS_INBOX", 5, 0, 0, _"(INBOX)", "")><br>
+<?!("COND:ITERATE:LASTN", 2)>
+       <?=("box_end")></td></tr>
+<??("X", 2)>
diff --git a/webcit/static/t/listsub/display.html b/webcit/static/t/listsub/display.html
new file mode 100644 (file)
index 0000000..a431f93
--- /dev/null
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+  <link href="/static/styles/webcit.css" rel="stylesheet" type="text/css">
+  <title><?_("List subscription")></title>
+</head>
+<body>
+
+<div align=center>
+<table border=0 width='75%'><tr><td>
+<?=("box_begin_1")><?_("List subscribe/unsubscribe")><?=("box_begin_2")>
+<div align=center><br>
+
+<?!("COND:BSTR", 10, "cmd", "subscribe")>
+<?!("COND:LISTSUB:EXECUTE:SUBSCRIBE", 11)>
+<center>
+<h1><?_("Confirmation request sent")></h1>
+<?_("You are subscribing ")><tt><?BSTR("email", "X")></tt>
+<?_(" to the ")><b><?BSTR("room", "X")></b>
+<?_(" mailing list.")> 
+<?_("The listserver has sent you an e-mail with one additional Web link for you to click on to confirm your subscription.")>  
+<?_("This extra step is for your protection, as it prevents others from being able to subscribe you to lists without your consent.")>
+<br><br>
+<?_("Please click on the link which is being e-mailed to you and your subscription will be confirmed.")>
+<br>
+<a href="listsub"><?_("Go back...")></a>
+</center>
+<?!("X", 11)><??("COND:BSTR", 12, "__FAIL")>
+<font size=+1><b><?_("ERROR")>: <?IMPORTANTMESSAGE("X")></b></font><br><br>
+<??("X", 12)>
+<?!("X", 10)>
+
+<?!("COND:BSTR", 20, "cmd", "unsubscribe")>
+<?!("COND:LISTSUB:EXECUTE:UNSUBSCRIBE", 21)>
+<center>
+<h1><?_("Confirmation request sent")></h1>
+<?_("You are unsubscribing")> 
+<tt><?BSTR("email", "X")></tt> 
+<?_("from the")> 
+&quot;<?BSTR("room", "X")>&quot; 
+<?_("mailing list.")>
+<?_("The listserver has sent you an e-mail with one additional Web link for you to click on to confirm your unsubscription.")>
+<?_("This extra step is for your protection, as it prevents others from being able to unsubscribe you from lists without your consent.")> 
+<br><br>
+<?_("Please click on the link which is being e-mailed to you and your unsubscription will be confirmed.")><br>
+<a href="listsub"><?_("Back...")></a>
+</center>
+<?!("X", 21)><??("COND:BSTR", 22, "__FAIL")>
+<font SIZE=+1><b><?_("ERROR")>: <?IMPORTANTMESSAGE("X")></b></font>
+<br><br>
+<?!("X", 22)>
+<?!("X", 20)>
+
+<?!("COND:BSTR", 30, "cmd", "confirm_subscribe")>
+<?!("COND:LISTSUB:EXECUTE:CONFIRMSUBSCRIBE", 31)>
+<center><h1><?_("Confirmation successful!")></h1></center>
+<?!("X", 31)><??("COND:BSTR", 32, "__FAIL")>
+<center><h1><?_("Confirmation failed.")></h1></center>
+<?_("This could mean one of two things:")>
+<ul>
+<li><?_("You waited too long to confirm your subscribe/unsubscribe request (the confirmation link is only valid for three days)")></li>
+<li><?_("You have <i>already</i> successfully confirmed your subscribe/unsubscribe request and are attempting to do it again.")></li>
+</ul>
+<?_("The error returned by the server was: ")><?IMPORTANTMESSAGE("X")>
+<??("X", 32)>
+<??("X", 30)>
+
+<?!("COND:BSTR", 33, "cmd", "confirm_unsubscribe")>
+<?!("COND:LISTSUB:EXECUTE:CONFIRMUNSUBSCRIBE", 34)>
+<center><h1><?_("Confirmation successful!")></h1></center>
+<?!("X", 34)><??("COND:BSTR", 35, "__FAIL")>
+<center><h1><?_("Confirmation failed.")></h1></center>
+<?_("This could mean one of two things:")>
+<ul>
+<li><?_("You waited too long to confirm your subscribe/unsubscribe request (the confirmation link is only valid for three days)")></li>
+<li><?_("You have <i>already</i> successfully confirmed your subscribe/unsubscribe request and are attempting to do it again.")></li>
+</ul>
+<?_("The error returned by the server was: ")><?IMPORTANTMESSAGE("X")>
+<??("X", 35)>
+<??("X", 33)>
+
+<?!("COND:BSTR", 40, "cmd", "choose")>
+
+<form method="POST" action="listsub">
+
+<?_("Name of list:")>
+<select name="room" size=1>
+<?ITERATE("LPRM", ="listsub_subscribeable_rooms")>
+</select><br><br>
+
+<?_("Your e-mail address:")> 
+<input type="text" name="email" value="<?BSTR('email', 'X')>" maxlength="128" size="60">
+<br><br>
+
+<div style="display:none"><?_("(If subscribing) preferred format: ")>
+<input type="radio" name="subtype" value="list" CHECKED><?_("One message at a time")>&nbsp; 
+<input type="radio" name="subtype" value="digest"><?_("Digest format")>&nbsp; 
+<br><br></div>
+<input type="submit" name="cmd" value="subscribe">
+<input type="submit" name="cmd" value="unsubscribe">
+<br><br>
+</form>
+
+<hr>
+<?_("When you attempt to subscribe or unsubscribe to a mailing list, you will receive an e-mail containing one additional web link to click on for final confirmation.")>
+<?_("This extra step is for your protection, as it prevents others from being able to subscribe or unsubscribe you to lists.")>
+<br>
+<??("X", 40)>
+</div>
+<?=("box_end")>
+</td></tr></table></div>
+
+</body></html>
diff --git a/webcit/static/t/listsub/subscribeable_rooms.html b/webcit/static/t/listsub/subscribeable_rooms.html
new file mode 100644 (file)
index 0000000..3a757e3
--- /dev/null
@@ -0,0 +1 @@
+<?!("COND:ROOM:FLAG:QR2", 1, #"QR2_SELFLIST")><option value="<?ROOM:INFO:NAME('X')>"><?ROOM:INFO:NAME("X")></option><?!("X", 1)>
diff --git a/webcit/static/t/load_attachments.html b/webcit/static/t/load_attachments.html
new file mode 100644 (file)
index 0000000..6f6313f
--- /dev/null
@@ -0,0 +1 @@
+<?MAIL:MIME:LOADDATA>
diff --git a/webcit/static/t/loggedinas.html b/webcit/static/t/loggedinas.html
new file mode 100644 (file)
index 0000000..de73bff
--- /dev/null
@@ -0,0 +1,8 @@
+<div id="loggedinas">
+       <??("COND:LOGGEDIN",1)>
+               <?_("Logged in as")> <?CURRENT_USER>
+       <??("X",1)>
+       <?!("COND:LOGGEDIN",1)>
+               <?_("Not logged in.")>
+       <??("X",1)>
+</div>
diff --git a/webcit/static/t/login.html b/webcit/static/t/login.html
new file mode 100644 (file)
index 0000000..fcc38a3
--- /dev/null
@@ -0,0 +1,25 @@
+<?=("head")>
+
+
+<!-- start login.html -->
+<div id="login_screen">
+               <div class="box">
+                       <div class="boxlabel"><?SERV:HUMANNODE> - <?_("powered by")>
+                               <a href="http://www.citadel.org">Citadel</a>
+                       </div>
+                       <div class="boxcontent">
+                               <div id="hellomsg"><?SERV:MESG("hello")></div>
+                               <?!("COND:IMPMSG", 1)>
+                                       <div class="login_message"><?IMPORTANTMESSAGE("X")></div>
+                               <?!("X", 1)>
+                               <div class="login_image"><img src="image?name=hello" alt=""></div>
+                               <span class="logbuttons">
+                                       <a href="javascript:GetLoggedInFirst('do_welcome');"><?_("Log in")></a>
+                               </span>
+                       </div>
+               </div>
+<!-- end login.html -->
+<script type="text/javascript">
+       GetLoggedInFirst('do_welcome');
+</script>
+<?=("trailing")>
diff --git a/webcit/static/t/logout.html b/webcit/static/t/logout.html
new file mode 100644 (file)
index 0000000..60c86c3
--- /dev/null
@@ -0,0 +1,18 @@
+<?--("For sites in guest mode, redirect to the landing page after we're logged out")>
+<?!("COND:SERV:SUPPORTS_GUEST", 1)>
+<script type="text/javascript">
+window.location='/';                   
+</script>                              
+<?!("X", 1)>
+
+<div id="logout_screen">
+<div class="box">
+<div class="boxlabel"><?_("Log off")></div>
+<div class="boxcontent">
+<?SERV:MESG("goodbye")>
+
+<hr /><div class="buttons"> 
+<span class="button_link"><a href=".">
+<?_("Log in again")>
+</a></span>
+</div></div></div>
diff --git a/webcit/static/t/mail_vnoteitem.html b/webcit/static/t/mail_vnoteitem.html
new file mode 100644 (file)
index 0000000..47968b9
--- /dev/null
@@ -0,0 +1,29 @@
+<!--begin title bar div-->
+<div id='titlebar-<?VNOTE:UID>'
+ class="stickynote_titlebar"
+ style=" background-color: #<?VNOTE:BGCOLOR>"
+>
+<table border=0 cellpadding=0 cellspacing=0 valign=middle width=100%><tr>
+<td align=left valign=middle>
+</td>
+<td></td><!-- nothing in the title bar, its just for dragging-->
+<td align=right valign=middle>
+</td></tr></table>
+</div>
+<!--end title bar div; begin body div-->
+<div id="notebody-<?VNOTE:UID>"        class="stickynote_body">
+  <?VNOTE:MSG("X")>
+</div>
+<!--end body div-->
+<div id="resize-<?VNOTE:UID>" 
+     class="stickynote_resize" onMouseDown="NotesResizeMouseDown(event,'<?VNOTE:UID>')"> </div>
+
+</div>
+
+<div id="resize-<?VNOTE:UID>"
+ class="stickynote_resize"
+ onMouseDown="NotesResizeMouseDown(event,'<?VNOTE:UID>')">
+</div>
+<!--end resize handle div-->
+
+
diff --git a/webcit/static/t/mailsummary_json.html b/webcit/static/t/mailsummary_json.html
new file mode 100644 (file)
index 0000000..0129a48
--- /dev/null
@@ -0,0 +1,7 @@
+{ "nummsgs": <?BSTR("__READLOOP:TOTALMSGS")>,
+"newmsgs": <?BSTR("__READLOOP:NEWMSGS")>,
+"startmsg": <?BSTR("__READLOOP:STARTMSG")>,
+"roomname": "<?THISROOM:NAME("J")>",
+"msgs": [ <?ITERATE("MAIL:SUMM:MSGS", ="mailsummary_json_section",
+B("startmsg"), 0, B("stopmsg"))> ]
+}
diff --git a/webcit/static/t/mailsummary_json_section.html b/webcit/static/t/mailsummary_json_section.html
new file mode 100644 (file)
index 0000000..48a414b
--- /dev/null
@@ -0,0 +1 @@
+[<?MAIL:SUMM:N>,"<?MAIL:SUMM:SUBJECT("K")>","<?MAIL:SUMM:FROM("K")>",<?MAIL:SUMM:DATENO>,"<?MAIL:SUMM:DATEBRIEF>",<?%("COND:MAIL:SUMM:UNREAD",1, 0, 0, "true","false")> ]<?%("COND:ITERATE:LASTN", 1, "", "", "", ",")>
diff --git a/webcit/static/t/menu/advanced_roomcommands.html b/webcit/static/t/menu/advanced_roomcommands.html
new file mode 100644 (file)
index 0000000..e3fd0b7
--- /dev/null
@@ -0,0 +1,11 @@
+<ul class="adminitems">
+<?!("COND:ROOM:EDITACCESS", 1)>
+<li><a href="do_template?template=room_edit"><?_("Edit or delete this room")></a></li>
+<?!("X", 1)>
+<li><a href="do_template?template=room_display_private"><?_("Go to a 'hidden' room")></a></li>
+<li><a href="do_template?template=room_create"><?_("Create a new room")></a></li>
+<li><a href="do_template?template=room_create_blog"><?_("Create a new (public) blog")></a></li>
+<li><a href="do_template?template=room_zap_this"><?_("Zap (forget) this room")></a></li>
+<li><a href="do_template?template=room_zapped_list"><?_("List all forgotten rooms")></a></li>
+<li><a href="javascript:TriggerLoadDupes()"><?_("Zap duplicate messages")></a> <span><?_("(Messages of similar subject, sender and date are moved to trash)")></span></li>
+</ul>
diff --git a/webcit/static/t/menu/basic_commands.html b/webcit/static/t/menu/basic_commands.html
new file mode 100644 (file)
index 0000000..07b203f
--- /dev/null
@@ -0,0 +1,21 @@
+<!-- start of first column -->
+<ul class="adminitems col1">
+       <li><a href="knrooms?template=knrooms?SortBy=byfloorroom?SortOrder=1"><?_("List known rooms")></a><span><?_("Where can I go from here?")></span></li>
+       <li><a href="gotonext"><?_("Goto next room")></a><span><?_("...with <em>unread</em> messages")></span></li>
+       <li><a href="skip"><?_("Skip to next room")></a><span><?_("(come back here later)")></span></li>
+       <??("COND:UNGOTO", 1)><li><a href="ungoto"><?_("Ungoto")></a><span>(<?_("oops! Back to ")><?ROOM:UNGOTO>)</span></li><??("X", 1)>
+</ul>
+<!-- start of second column -->
+<ul class="adminitems col2">
+       <li><a href="readnew"><?_("Read new messages")></a><span><?_("...in this room")></span></li>
+       <li><a href="readfwd"><?_("Read all messages")></a><span><?_("...old <em>and</em> new")></span></li>
+       <li><a href="display_enter"><?_("Enter a message")></a><span><?_("(post in this room)")></span></li>
+       <?!("COND:THISROOM:FLAG:QR", 2, #"QR_VISDIR")><li><a href="do_template?template=files"><?_("File library")></a><span><?_("(List files available for download)")></span></li><??("X", 2)>
+</ul>
+<!-- start of third column -->
+<ul class="adminitems lastcol">
+       <li><a href="summary"><?_("Summary page")></a><span><?_("Summary of my account")></span></li>
+       <li><a href="do_template?template=user_list"><?_("User list")></a><span><?_("(all registered users)")></span></li>
+       <li><a href="termquit" target="_top"><?_("Log off")></a><span><?_("Bye!")></span></li>
+</ul>
+<div style="clear:both"></div>
diff --git a/webcit/static/t/menu/change_pw.html b/webcit/static/t/menu/change_pw.html
new file mode 100644 (file)
index 0000000..fbacd71
--- /dev/null
@@ -0,0 +1,32 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<?ROOMBANNER>
+<div id="content">
+
+<?=("box_begin_1")><?_("Change your password")><?=("box_begin_2")>
+
+<?SERV:MESG("changepw")>
+
+<form name="changepwform" action="changepw" method="post">
+<input type="hidden" name="nonce" value="<?NONCE>">
+
+<table class="altern" >
+<tr class="even">
+ <td><?_("Enter new password:")></td>
+ <td><input type="password" name="newpass1" value="" maxlength="20"></td>
+</tr>
+<tr class="odd">
+ <td><?_("Enter it again to confirm:")></td>
+ <td><input type="password" name="newpass2" value="" maxlength="20"></td>
+</tr>
+</table>
+
+<div class="buttons">
+<input type="submit" name="change_action" value="<?_("Change password")>"> 
+&nbsp;
+<input type="submit" name="cancel_action" value="<?_("Cancel")>">
+</div>
+</form>
+<?=("box_end")>
+<?=("trailing")>
diff --git a/webcit/static/t/menu/your_info.html b/webcit/static/t/menu/your_info.html
new file mode 100644 (file)
index 0000000..5c0cc18
--- /dev/null
@@ -0,0 +1,10 @@
+<ul class="adminitems">
+<li><a href="do_template?template=preferences"><?_("Change your preferences and settings")></a></li>
+<li><a href="display_reg?suppress_email=1"><?_("Update your contact information")></a></li>
+<li><a href="do_template?template=menu_change_pw"><?_("Change your password")></a></li>
+<li><a href="do_template?template=user_edit_bio"><?_("Enter your 'bio'")></a></li>
+<li><a href="display_editpic"><?_("Edit your online photo")></a></li>
+<li><a href="do_template?template=sieve_list"><?_("View/edit server-side mail filters")></a></li>
+<li><a href="display_pushemail"><?_("Edit your push email settings")></a></li>
+<li><a href="display_openids"><?_("Manage your OpenIDs")></a></li>
+</ul>
diff --git a/webcit/static/t/menubar.html b/webcit/static/t/menubar.html
new file mode 100644 (file)
index 0000000..6db9f86
--- /dev/null
@@ -0,0 +1,92 @@
+<! begin menubar.html>
+<script type="text/javascript">
+<!--hide
+       function OpenWholist() {
+               window.open('who', 'who', 'toolbar=no,location=no,directories=no,copyhistory=no,status=yes,scrollbars=yes,resizable=yes,height=200,width=600');
+       }
+//-->
+</script>
+
+<center>
+<img src="image?name=hello"><br><br>
+
+<table border="0" cellspacing="0" cellpadding="2">
+<tr>
+       <td class="menubar_bg">
+               <span class="menubar_link">
+               <a href="knrooms?template=knrooms?SortBy=byfloorroom?SortOrder=1"><font color="#FFFFFF">List known rooms</span></a>
+               </span>
+       </td>
+</tr><tr>
+       <td bgcolor="#3333CC">
+               <span class="menubar_link">
+               <a href="gotonext"><font coloR="#FFFFFF">Goto next room</span></a>
+               </span>
+       </td>
+</tr><tr>
+       <td bgcolor="#3333CC">
+               <span class="menubar_link">
+               <a href="skip"><font color="#FFFFFF">Skip this room</span></a>
+               </span>
+       </td>
+</tr><tr>
+       <td bgcolor="#3333CC">
+               <span class="menubar_link">
+               <a href="ungoto"><font color="#FFFFFF">Ungoto</span></a>
+       </td>
+</tr><tr>
+       <td bgcolor="#003399">
+               <span class="menubar_link">
+               <a href="readnew"><font color="#FFFFFF">Read&nbsp;new&nbsp;messages</span></a>
+               </span>
+       </td>
+</tr><tr>
+       <td bgcolor="#003399">
+               <span class="menubar_link">
+               <a href="readfwd"><font color="#FFFFFF">Read&nbsp;all&nbsp;messages</span></a>
+               </span>
+       </td>
+</tr><tr>
+       <td bgcolor="#003399">
+               <span class="menubar_link">
+               <a href="display_enter"><font color="#FFFFFF">Enter&nbsp;a&nbsp;message</span></a>
+               </span>
+       </td>
+</tr><tr>
+       <td bgcolor="#663399">
+               <span class="menubar_link">
+               <a href="javascript:OpenWholist()">
+               <font color="#FFFFFF">Who&nbsp;is&nbsp;online?</span>
+               </a>
+               </span>
+       </td>
+</tr><tr>
+       <td bgcolor="#663399">
+               <span class="menubar_link">
+               <a href="display_page"><font color="#FFFFFF">Page&nbsp;another&nbsp;user</span></a>
+               </span>
+       </td>
+</tr><tr>
+       <td bgcolor="#663399">
+               <span class="menubar_link">
+               <a href="advanced"><font color="#FFFFFF">Advanced&nbsp;options</span></a>
+               </span>
+       </td>
+</tr><tr>
+       <td bgcolor="#CC0000">
+               <span class="menubar_link">
+               <a href="termquit" target="_top" onClick="return confirm('Do you really want to log off?');"><font color="#FFFFFF">Log&nbsp;off</span></a><br>
+       </td>
+</tr>
+</table>
+
+<br><br>
+
+<a href="http://www.citadel.org"
+       onMouseOver="window.status='Find out more about Citadel'; return true;"><font 
+size=-1 color="#000000">
+POWERED BY<br></font>
+<img src="static/citadel-logo.gif" width=75 height=76 border=0 ALT="CITADEL"></a>
+
+</center>
+<! end menubar.html>
diff --git a/webcit/static/t/msg/confirm_move.html b/webcit/static/t/msg/confirm_move.html
new file mode 100644 (file)
index 0000000..127d0b0
--- /dev/null
@@ -0,0 +1,29 @@
+<?=("head")>
+<div id="banner">
+<h1>
+<?_("Confirm move of message")>
+</h1>
+</div>
+
+<div id="content" class="service">
+
+<center>
+
+<?_("Move this message to:")>
+<br>
+
+<form method="POST" action="move_msg">
+<input type="hidden" name="nonce" value="<?NONCE>">
+<input type="hidden" name="msgid" value="<?BSTR('msgid')>">
+
+<select name="target_room" size=5>
+<?ITERATE("LKRA", ="msg_confirm_move_one_targetroom")>
+</select>
+<br>
+
+<input type="submit" name="move_button" value="<?_("Move")>">
+&nbsp;
+<input type="submit" name="cancel_button" value="<?_("Cancel")>">
+</form>
+</center>
+<?=("trailing")>
diff --git a/webcit/static/t/msg/confirm_move_one_targetroom.html b/webcit/static/t/msg/confirm_move_one_targetroom.html
new file mode 100644 (file)
index 0000000..2699177
--- /dev/null
@@ -0,0 +1 @@
+<option value='<?ROOM:INFO:NAME("X")>' ><?ROOM:INFO:NAME("X")></option>
diff --git a/webcit/static/t/msg_listselector_bottom.html b/webcit/static/t/msg_listselector_bottom.html
new file mode 100644 (file)
index 0000000..714b697
--- /dev/null
@@ -0,0 +1,23 @@
+<form name="msgomaticbottom" class="selector_bottom" >
+<p><?_("Reading #")>
+<select name="whichones" size="1" 
+       OnChange="location.href=msgomaticbottom.whichones.options[selectedIndex].value">
+<?CONTEXTSTR>
+</select>
+<?_("of")> <?SUMM:COUNT> <?_("messages")>
+<input type="radio" name="direction" value="" 
+  OnChange="location.href='<?URLPART(0)>?SortBy=date?SortOrder=1'"
+  <?%("COND:BSTR", 1, "SortOrder", 1, "checked", "")>
+>
+<?_("oldest to newest")> 
+
+&nbsp;&nbsp;&nbsp;&nbsp;
+
+<input type="radio" name="direction" value="" 
+  OnChange="location.href='<?URLPART(0)>?SortBy=date?SortOrder=2'"
+  <?%("COND:BSTR", 1, "SortOrder", 2, "checked", "")>
+>
+<?_("newest to oldest")>
+</p>
+</form>
+
diff --git a/webcit/static/t/msg_listselector_top.html b/webcit/static/t/msg_listselector_top.html
new file mode 100644 (file)
index 0000000..b4d6b8a
--- /dev/null
@@ -0,0 +1,23 @@
+<form name="msgomatictop" class="selector_top" >
+<p><?_("Reading #")>
+<select name="whichones" size="1" 
+       OnChange="location.href=msgomatictop.whichones.options[selectedIndex].value">
+<?CONTEXTSTR>
+</select>
+<?_("of")> <?SUMM:COUNT> <?_("messages")>
+<input type="radio" name="direction" value="" 
+  OnChange="location.href='<?URLPART(0)>?SortBy=date?SortOrder=1'"
+  <?%("COND:BSTR", 1, "SortOrder", 1, "checked", "")>
+>
+<?_("oldest to newest")> 
+
+&nbsp;&nbsp;&nbsp;&nbsp;
+
+<input type="radio" name="direction" value="" 
+  OnChange="location.href='<?URLPART(0)>?SortBy=date?SortOrder=2'"
+  <?%("COND:BSTR", 1, "SortOrder", 2, "checked", "")>
+>
+<?_("newest to oldest")>
+</p>
+</form>
+
diff --git a/webcit/static/t/msg_listview.html b/webcit/static/t/msg_listview.html
new file mode 100644 (file)
index 0000000..3d8f054
--- /dev/null
@@ -0,0 +1,31 @@
+<script src="static/summaryview.js" type="text/javascript"></script>
+<script type="text/javascript">
+       var is_safe_mode = <?%("COND:PREF", 1, :"mailbox", "client-nosort", "true", "false")>;
+       var sortmode = ""; /*"<?PREF:ROOM:VALUE("sort")>";*/
+</script>
+<div id="message_listview">
+       <div id="message_list_hdr">      
+               <table><tr>
+                       <th class="col1" id="mlh_subject"><?_("Subject")></th>
+                       <th class="col2" id="mlh_from"><?_("Sender")></th>
+                       <th class="col3" id="mlh_date"><?_("Date")></th>
+               </tr></table>
+       </div>
+       <div id="summary_view">
+               <table id="message_list_body" class="mailbox_summary"><tr style="display: none;"><td colspan="4"></td></tr></table>
+               <div id="loading">
+                       <p><img src="static/webcit_icons/throbber.gif" alt=""></p>
+                       <p><?_("Loading messages from server, please wait")></p>
+               </div>
+       </div>
+       <div id="resize_msglist"></div>
+       <div id="preview_pane"></div>
+       <div class="ctdlTemplate" id="listViewContextMenu">
+               <?_("Open in new window")><br>
+               <?_("Move")><br>
+               <?_("Copy")><br>
+               <?_("Delete")><br>
+               <?_("Print")><br>
+       </div>
+</div>
+</div>
diff --git a/webcit/static/t/navbar.html b/webcit/static/t/navbar.html
new file mode 100644 (file)
index 0000000..a62ca7b
--- /dev/null
@@ -0,0 +1,185 @@
+<div id="navbar"><ul>
+       <li class="ungoto">
+               <a href="ungoto">
+                       <img src="static/webcit_icons/essen/16x16/ungoto.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Ungoto")></span>
+               </a>
+       </li>
+
+<?!("COND:THISROOM:CURR_VIEW", 10, #"VIEW_BBS")>
+       <li class="newmess">
+               <a href="readnew">
+                       <img src="static/webcit_icons/essen/16x16/refresh.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Read new messages")></span>
+               </a>
+       </li>
+       <li class="readallmess">
+               <a href="readfwd">
+                       <img src="static/webcit_icons/essen/16x16/readallmsg.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Read all messages")></span>
+               </a>
+       </li>
+       <li class="newmess">
+               <a href="javascript:GetLoggedInFirst('display_enter')">
+                       <img  src="static/webcit_icons/essen/16x16/pencil.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Enter a message")></span>
+               </a>
+       </li>
+<??("X", 10)>
+
+<?!("COND:THISROOM:CURR_VIEW", 20, #"VIEW_ADDRESSBOOK")>
+       <li class="viewcontacts">
+               <a href="readfwd">
+                       <img src="static/webcit_icons/essen/16x16/search.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("View contacts")></span>
+               </a>
+       </li>
+       <li class="addnewcontact">
+               <a href="javascript:GetLoggedInFirst('display_enter')">
+                       <img src="static/webcit_icons/essen/16x16/addcontact.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Add new contact")></span>
+               </a>
+       </li>
+<??("X", 20)>
+
+<?!("COND:THISROOM:CURR_VIEW", 30, #"VIEW_CALENDAR")>
+       <li class="staskday">
+               <a href="readfwd?calview=day">
+                       <img src="static/webcit_icons/essen/16x16/taskday.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Day view")></span>
+               </a>
+       </li>
+       <li class="monthview">
+               <a href="readfwd?calview=month">
+                       <img src="static/webcit_icons/essen/16x16/calendar.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Month view")></span>
+               </a>
+       </li>
+       <li class="addevent">
+               <a href="display_enter<?BSTR:FORWARD("year", "U")><?BSTR:FORWARD("month", "U")><?BSTR:FORWARD("day", "U")>">
+                       <img  src="static/webcit_icons/essen/16x16/pencil.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Add new event")></span>
+               </a>
+       </li>
+<??("X", 30)>
+
+<?!("COND:THISROOM:CURR_VIEW", 40, #"VIEW_CALBRIEF")>
+       <li class="monthview">
+               <a href="readfwd?calview=month">
+                       <img src="static/webcit_icons/essen/16x16/calendar.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Calendar list")></span>
+               </a>
+       </li>
+<??("X", 40)>
+        
+<?!("COND:THISROOM:CURR_VIEW", 50, #"VIEW_TASKS")>
+       <li class="taskmanag">
+               <a href="readfwd">
+                       <img src="static/webcit_icons/essen/16x16/task.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("View tasks")></span>
+               </a>
+       </li>
+       <li class="newmess">
+               <a href="javascript:GetLoggedInFirst('display_enter')">
+                       <img  src="static/webcit_icons/essen/16x16/pencil.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Add new task")></span>
+               </a>
+       </li>
+<??("X", 50)>
+
+<?!("COND:THISROOM:CURR_VIEW", 60, #"VIEW_NOTES")>
+       <li class="viewnotes">
+               <a href="readfwd">
+                       <img src="static/webcit_icons/essen/16x16/note.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("View notes")>
+                       </span>
+               </a>
+       </li>
+       <li class="enternewnote">
+               <a href="add_new_note">
+                       <img  src="static/webcit_icons/essen/16x16/pencil.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Add new note")></span>
+               </a>
+       </li>
+<??("X", 60)>
+        
+<?!("COND:THISROOM:CURR_VIEW", 70, #"VIEW_MAILBOX")>
+       <li class="readallmess">
+               <a id="m_refresh" href="readfwd">
+                       <img src="static/webcit_icons/essen/16x16/readallmsg.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Refresh message list")></span>
+               </a>
+       </li>
+       <li class="deleteselectedmess">
+               <a href="javascript:deleteAllSelectedMessages();">
+                       <img src="static/webcit_icons/essen/16x16/delete.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Delete")></span>
+               </a>
+       </li>
+       <li class="newmess">
+               <a href="javascript:GetLoggedInFirst('display_enter')">
+                       <img src="static/webcit_icons/essen/16x16/pencil.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Write mail")></span>
+               </a>
+       </li>
+<??("X", 70)>
+
+<?!("COND:THISROOM:CURR_VIEW", 80, #"VIEW_WIKI")>
+        <??("COND:WIKI:PAGE", 81, "home")>
+       <li class="readallmess">
+               <a href="wiki?page=home?go=<?THISROOM:NAME("U")>">
+                       <img src="static/webcit_icons/essen/16x16/readallmsg.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Wiki home")></span>
+               </a>
+       </li>
+       <?!("X", 81)>
+               <li class="newmess">
+                               <a href="javascript:GetLoggedInFirst(encodeURIComponent('display_enter<?BSTR:FORWARD("page", "U")>'))">
+                                       <img  src="static/webcit_icons/essen/16x16/pencil.png" alt="" width="16" height="16">
+                                       <span class="navbar_link"><?_("Edit this page")></span>
+                               </a>
+                       </li>
+               <li class="newmess">
+                       <a href="wiki<?%("COND:WIKI:TYPE", 84, "wiki_history", "", "", "_history")><?BSTR:FORWARD("page", "U")>">
+                               <img  src="static/webcit_icons/essen/16x16/pen.png" alt="" width="16" height="16">
+                               <span class="navbar_link"><?%("COND:WIKI:TYPE", 86, "wiki_history", "", _("Current version", _("History"))></span>
+                       </a>
+               </li>
+        <??("COND:THISROOM:IS_EDIT", 82)>
+       <li class="publishmessage">
+               <a href="javascript:publishMessage()">
+                       <img src="static/webcit_icons/essen/16x16/skiproom.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("publish to blog")></span>
+               </a>
+       </li>
+       <?!("X", 82)>
+<??("X", 80)>
+
+<?!("COND:THISROOM:CURR_VIEW", 90, #"VIEW_BLOG")>
+       <li class="newmess">
+               <a href="javascript:GetLoggedInFirst('display_enter')">
+                       <img src="static/webcit_icons/essen/16x16/pencil.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("New blog post")></span>
+               </a>
+       </li>
+<??("X", 90)>
+       
+       <li class="skipthisroom">
+               <a href="skip" title="<?_("Leave all messages marked as unread, go to next room with unread messages")>">
+                       <img  src="static/webcit_icons/essen/16x16/skiproom.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Skip this room")></span>
+               </a>
+       </li>
+       <li class="markngo">
+               <a href="gotonext" title="<?_("Mark all messages as read, go to next room with unread messages")>">
+                       <img  src="static/webcit_icons/essen/16x16/nextroom.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Goto next room")></span></a>
+       </li>
+<?!("COND:THISROOM:CURR_VIEW", 100, #"VIEW_QUEUE")>
+       <li class="runqueuenow">
+                <a href="javascript:ToggleVisibility('runqueue')"><img src="static/webcit_icons/essen/16x16/refresh.png" alt="" width="16" height="16">
+                       <span class="navbar_link"><?_("Resend Mailqueue now")></span></a>
+       </li>
+<??("X", 100)>
+
+</ul></div>
diff --git a/webcit/static/t/newstartpage.html b/webcit/static/t/newstartpage.html
new file mode 100644 (file)
index 0000000..d895d1c
--- /dev/null
@@ -0,0 +1,18 @@
+<! newstartpage.html start>
+<div class="banner" >
+<div align=center >
+<h1><?_("New start page")></h1>
+&nbsp;
+</div></div>
+<div id="content">
+<div align=center>
+<font size=+2><?_("Your start page has been changed.")></font> </div>
+<br><br>
+<div align=center>
+<i><?_("(Note: this does not change your browser's home page. It changes the page you begin on when you log on to")> <?SERV:HUMANNODE>).</i>
+<br><br>
+
+<a href="javascript:history.back()">Back...</a>
+</div>
+</div>
+<! newstartpage.html end>
diff --git a/webcit/static/t/no_new_msgs.html b/webcit/static/t/no_new_msgs.html
new file mode 100644 (file)
index 0000000..8e1bf40
--- /dev/null
@@ -0,0 +1,4 @@
+<a name="nonewmsgs">
+<div class="moreprompt">
+<?_("No new messages.")>
+</div>
diff --git a/webcit/static/t/openid_manual_create.html b/webcit/static/t/openid_manual_create.html
new file mode 100644 (file)
index 0000000..c67d62d
--- /dev/null
@@ -0,0 +1,16 @@
+<div class="login_infos">
+       <img src="static/webcit_icons/openid-small.gif"><?_("Your OpenID")> <tt><?BSTR("__claimed_id", "X")></tt> <?_("was successfully verified.")><br>
+<?!("COND:BSTR", 1, "__username")><?_("However, the user name")>  '<?BSTR("__username", "X")>' <?_("conflicts with an existing user.")><??("X", 1)>
+<br>
+       <?_("Please specify the user name you would like to use.")><br>
+</div>
+<form action="openid_manual_create" method="POST"  class="box" id="login_form">
+       <input type="hidden" NAME="openid_url" VALUE="<?BSTR("__claimed_id", "X")>">
+        <label for="uname"><?_("User name:")></label>
+        <input type="text" name="name" id="uname" > <br>
+        <div class="logbuttons">
+        <input type="submit" name="newuser_action" value="<?_("New User")>" class="logbutton" >
+        <input type="submit" name="exit_action" value="<?_("Exit")>"  class="logbutton">
+        <br>
+        </div>
+</form>
diff --git a/webcit/static/t/paging.html b/webcit/static/t/paging.html
new file mode 100644 (file)
index 0000000..a5fbc07
--- /dev/null
@@ -0,0 +1 @@
+<?=("paging_failed_hook")><?%("COND:PAGE:WAITING", 1, 1, 1, =("paging_now"), "")><?=("paging_anchor")>
diff --git a/webcit/static/t/paging/anchor.html b/webcit/static/t/paging/anchor.html
new file mode 100644 (file)
index 0000000..2b124f9
--- /dev/null
@@ -0,0 +1,16 @@
+<script type="text/javascript"> function HandleSslp(sslg_xmlresponse) {
+  sslg_response = sslg_xmlresponse.responseText.substr(0, 1);
+  if (sslg_response == 'Y') {
+   var oWin = window.open('static/instant_messenger.html', 'CTDL_MESSENGER',
+    'width=700,height=400');
+   if (oWin==null || typeof(oWin)=="undefined") {
+    PopUpFailed();
+   }
+  }
+ }
+ function CheckPager() {
+  new Ajax.Request('sslg', { method: 'get', parameters: ctdlRandomString(),
+   onSuccess: HandleSslp } );
+ }
+ new PeriodicalExecuter(CheckPager, 30);
+</script>
diff --git a/webcit/static/t/paging/failed_hook.html b/webcit/static/t/paging/failed_hook.html
new file mode 100644 (file)
index 0000000..8f79d6a
--- /dev/null
@@ -0,0 +1,13 @@
+<script type="text/javascript">
+
+function PopUpExplicit() {
+       window.open('static/instant_messenger.html', 'CTDL_MESSENGER', 'width=700,height=400');
+       toggleModal(0);
+}
+
+function PopUpFailed() {
+
+       $('md-content').innerHTML = "<div align='justify'><?_("You have one or more instant messages waiting, but the Citadel Instant Messenger window failed to open.  This is probably because you have a popup blocker installed.  Please configure your popup blocker to allow popups from this site if you wish to receive instant messages.")><\/div><br><br><div align='center'><h2><a href='javascript:PopUpExplicit();'>OK<\/a><\/h2><\/div>";
+       toggleModal(1);
+}
+</script>
diff --git a/webcit/static/t/paging/now.html b/webcit/static/t/paging/now.html
new file mode 100644 (file)
index 0000000..dab1c4f
--- /dev/null
@@ -0,0 +1,7 @@
+<script type="text/javascript">
+ var oWin = window.open('static/instant_messenger.html', 
+ 'CTDL_MESSENGER', 'width=700,height=400');    
+ if (oWin==null || typeof(oWin)=="undefined") {
+  PopUpFailed();
+ }
+</script>
diff --git a/webcit/static/t/preferences.html b/webcit/static/t/preferences.html
new file mode 100644 (file)
index 0000000..ff0f796
--- /dev/null
@@ -0,0 +1,9 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+  <h1><?_("Preferences and settings")></h1>
+</div>
+<div id="content" class="service">
+<?DOBOXED("prefs_box", _("Preferences and settings"))>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/prefs/box.html b/webcit/static/t/prefs/box.html
new file mode 100644 (file)
index 0000000..bb8758e
--- /dev/null
@@ -0,0 +1,268 @@
+<form name="prefform" action="set_preferences" method="post">
+<input type="hidden" name="nonce" value="<?NONCE>">
+<table class="altern">
+
+<tr class="even"><td><?PREF:DESCR("roomlistview")> </td>
+<td>
+  <input type="radio" name="roomlistview" VALUE="folders" 
+        <?%("COND:PREF", 1, :"roomlistview", "folders", "checked", "")> 
+        ><?_("Tree (folders) view")>
+  &nbsp;&nbsp;&nbsp;
+  <input type="radio" name="roomlistview" VALUE="rooms" <?%("COND:PREF", 1, :"roomlistview", "folders", "", "checked")><?%("COND:PREF", 1, :"roomlistview", "", "checked", "")>><?_("Table (rooms) view")>
+</td>
+</tr>
+
+<tr class="odd">
+  <td><?PREF:DESCR("calhourformat")></td>
+  <td>
+       <input type="radio" name="calhourformat" VALUE="12" 
+               <?%("COND:PREF", 1, :"calhourformat", "24", "", "checked")>
+               ><label><?_("12 hour (am/pm)")></label>
+       &nbsp;&nbsp;&nbsp;
+       <input type="radio" name="calhourformat" VALUE="24"
+               <?%("COND:PREF", 1, :"calhourformat", "24", "checked", "")>
+               ><label><?_("24 hour")></label>
+  </td>
+</tr>
+
+
+<tr class="even"><td><?PREF:DESCR("daystart")></td><td>
+<select name="daystart" size="1">
+<?!("COND:PREF", 2, :"calhourformat", "24")>
+<option <?%("COND:PREF", 1, :"daystart", "0", "selected", "")> value="0">0:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "1", "selected", "")> value="1">1:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "2", "selected", "")> value="2">2:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "3", "selected", "")> value="3">3:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "4", "selected", "")> value="4">4:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "5", "selected", "")> value="5">5:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "6", "selected", "")> value="6">6:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "7", "selected", "")> value="7">7:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "8", "selected", "")> <?%("COND:PREF:SET", 1, :"daystart", 0, "", "selected")> value="8">8:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "9", "selected", "")> value="9">9:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "10", "selected", "")> value="10">10:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "11", "selected", "")> value="11">11:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "12", "selected", "")> value="12">12:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "13", "selected", "")> value="13">13:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "14", "selected", "")> value="14">14:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "15", "selected", "")> value="15">15:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "16", "selected", "")> value="16">16:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "17", "selected", "")> value="17">17:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "18", "selected", "")> value="18">18:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "19", "selected", "")> value="19">19:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "20", "selected", "")> value="20">20:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "21", "selected", "")> value="21">21:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "22", "selected", "")> value="22">22:00</option>
+<option <?%("COND:PREF", 1, :"daystart", "23", "selected", "")> value="23">23:00</option>
+<?!("X", 2)>
+<??("COND:PREF", 3, :"calhourformat", "24")>
+<option <?%("COND:PREF", 1, :"daystart", "0", "selected", "")> value="0">12:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "1", "selected", "")> value="1">1:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "2", "selected", "")> value="2">2:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "3", "selected", "")> value="3">3:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "4", "selected", "")> value="4">4:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "5", "selected", "")> value="5">5:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "6", "selected", "")> value="6">6:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "7", "selected", "")> value="7">7:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "8", "selected", "")> <?%("COND:PREF:SET", 1, :"daystart", 0, "", "selected")> value="8">8:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "9", "selected", "")> value="9">9:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "10", "selected", "")> value="10">10:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "11", "selected", "")> value="11">11:00 am</option>
+<option <?%("COND:PREF", 1, :"daystart", "12", "selected", "")> value="12">12:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "13", "selected", "")> value="13"> 1:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "14", "selected", "")> value="14"> 2:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "15", "selected", "")> value="15"> 3:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "16", "selected", "")> value="16"> 4:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "17", "selected", "")> value="17"> 5:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "18", "selected", "")> value="18"> 6:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "19", "selected", "")> value="19"> 7:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "20", "selected", "")> value="20"> 8:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "21", "selected", "")> value="21"> 9:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "22", "selected", "")> value="22">10:00 pm</option>
+<option <?%("COND:PREF", 1, :"daystart", "23", "selected", "")> value="23">11:00 pm</option>
+<??("X", 3)>
+</select>
+</td></tr>
+
+<tr class="odd">
+  <td><?PREF:DESCR("dayend")></td>
+  <td><select name="dayend" size="1">
+<?!("COND:PREF", 4, :"calhourformat", "24")>
+<option <?%("COND:PREF", 1, :"dayend", "0", "selected", "")> value="0">0:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "1", "selected", "")> value="1">1:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "2", "selected", "")> value="2">2:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "3", "selected", "")> value="3">3:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "4", "selected", "")> value="4">4:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "5", "selected", "")> value="5">5:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "6", "selected", "")> value="6">6:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "7", "selected", "")> value="7">7:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "8", "selected", "")> value="8">8:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "9", "selected", "")> value="9">9:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "10", "selected", "")> value="10">10:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "11", "selected", "")> value="11">11:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "12", "selected", "")> value="12">12:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "13", "selected", "")> value="13">13:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "14", "selected", "")> value="14">14:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "15", "selected", "")> value="15">15:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "16", "selected", "")> value="16">16:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "17", "selected", "")> value="17">17:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "18", "selected", "")><?%("COND:PREF:SET", 1, :"dayend", 0, "", "selected")> value="18">18:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "19", "selected", "")> value="19">19:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "20", "selected", "")> value="20">20:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "21", "selected", "")> value="21">21:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "22", "selected", "")> value="22">22:00</option>
+<option <?%("COND:PREF", 1, :"dayend", "23", "selected", "")> value="23">23:00</option>
+<?!("X", 4)>
+<??("COND:PREF", 5, :"calhourformat", "24")>
+<option <?%("COND:PREF", 1, :"dayend", "0", "selected", "")> value="0">12:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "1", "selected", "")> value="1">1:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "2", "selected", "")> value="2">2:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "3", "selected", "")> value="3">3:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "4", "selected", "")> value="4">4:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "5", "selected", "")> value="5">5:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "6", "selected", "")> value="6">6:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "7", "selected", "")> value="7">7:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "8", "selected", "")> value="8">8:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "9", "selected", "")> value="9">9:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "10", "selected", "")> value="10">10:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "11", "selected", "")> value="11">11:00 am</option>
+<option <?%("COND:PREF", 1, :"dayend", "12", "selected", "")> value="12">12:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "13", "selected", "")> value="13"> 1:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "14", "selected", "")> value="14"> 2:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "15", "selected", "")> value="15"> 3:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "16", "selected", "")> value="16"> 4:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "17", "selected", "")> value="17"> 5:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "18", "selected", "")><?%("COND:PREF:SET", 1, :"dayend", 0, "", "selected")> value="18"> 6:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "19", "selected", "")> value="19"> 7:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "20", "selected", "")> value="20"> 8:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "21", "selected", "")> value="21"> 9:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "22", "selected", "")> value="22">10:00 pm</option>
+<option <?%("COND:PREF", 1, :"dayend", "23", "selected", "")> value="23">11:00 pm</option>
+<??("X", 5)>
+</select>
+</td></tr>
+
+<tr class="even">
+  <td>
+    <?PREF:DESCR("weekstart")>
+  </td>
+  <td>
+    <select name="weekstart" size="1">
+      <option <?%("COND:PREF", 1, :"weekstart", "0", "selected", "")> value="0"><?_("Sunday")></option>
+      <option <?%("COND:PREF", 1, :"weekstart", "1", "selected", "")> value="1"><?_("Monday")></option>
+    </select>
+  </td>
+</tr>
+
+<tr class="odd">
+   <td><?PREF:DESCR("use_sig")></td>
+   <td>
+       <script type="text/javascript">
+       function show_or_hide_sigbox() {
+               if ( $F('yes_sig') ) {
+                       $('signature_box').style.display = 'inline';
+               }
+               else {
+                       $('signature_box').style.display = 'none';
+               }
+       }
+       </script>
+
+       <input type="radio" id="no_sig" name="use_sig" VALUE="no" onChange="show_or_hide_sigbox();" 
+<?%("COND:PREF", 1, "use_sig", "yes", "", "checked")> >
+         <label><?_("No signature")></label>
+       &nbsp;&nbsp;&nbsp;
+       <input type="radio" id="yes_sig" name="use_sig" VALUE="yes" onChange="show_or_hide_sigbox();" 
+              <?%("COND:PREF", 1, "use_sig", "yes", "checked", "")> >
+               <div id="signature_box"><br>
+                 <textarea name="signature" cols="40" rows="5"><?PREF:VALUE("signature")></textarea>
+               </div>
+               <script type="text/javascript">show_or_hide_sigbox();</script>
+  </td>
+</tr>
+
+<tr class="even">
+  <td><?PREF:DESCR("default_header_charset")></td>
+  <td><input type="text" NAME="default_header_charset" MAXLENGTH="32" VALUE="<?PREF:VALUE("default_header_charset")>">
+</td>
+
+</tr>
+  <tr class="odd">
+    <td><?PREF:DESCR("emptyfloors")></td>
+    <td>
+      <input type="radio" name="emptyfloors" VALUE="yes" 
+            <?%("COND:PREF", 1, :"emptyfloors", "no", "", "checked")> 
+            ><label><?_("Yes")></label>
+      &nbsp;&nbsp;&nbsp;
+      <input type="radio" name="emptyfloors" VALUE="no"  <?%("COND:PREF", 1, :"emptyfloors", "no",  "checked", "")> ><label><?_("No")></label>
+</td>
+</tr>
+
+<tr class="even">
+  <td><?PREF:DESCR("defaultname")></td>
+  <td>
+<select name="defaultname" size=1 id="from_id_name">
+<?ITERATE("PREF:VALID:EMAIL:NAME", ="prefs_section_msg_sender_name_select")>
+</select>
+
+  </td>
+</tr>
+
+<tr class="odd">
+  <td><?PREF:DESCR("defaulthandle")></td>
+  <td>
+<select name="defaulthandle" size=1 id="from_id_handle">
+<?ITERATE("PREF:VALID:EMAIL:NAME", ="prefs_section_msg_handle_select")>
+</select>
+
+  </td>
+</tr>
+
+<tr class="even">
+  <td><?PREF:DESCR("defaultfrom")></td>
+  <td>
+<select name="defaultfrom" size=1>
+<?ITERATE("PREF:VALID:EMAIL:ADDR", ="prefs_section_msg_sender_from_select")>
+</select>
+  </td>
+</tr>
+
+<tr class="odd">
+  <td><?PREF:DESCR("mailbox")></td>
+  <td>
+     <input type="radio" id="m_client" name="mailbox" VALUE="client" 
+        <?%("COND:PREF", 1, :"mailbox", "client", "checked", "")> 
+        ><label for="m_client"><?_("Full-functionality")></label>
+     <input type="radio" name="mailbox" id="m_cnosort" VALUE="client-nosort" 
+        <?%("COND:PREF", 1, :"mailbox", "client", "", "checked")> 
+        ><label for="m_cnosort"><?_("Safe mode")></label><br>
+    <?_("Safe mode is less intensive on your web browser, but not as fully featured.")>
+  </td>
+</tr>
+
+<tr class="even">
+  <td><?PREF:DESCR("markdown")></td>
+  <td>
+
+      <input type="radio" name="markdown" VALUE="yes" <?%("COND:PREF", 1, :"markdown", "yes", "checked", "")> ><label><?_("Yes")></label>
+      &nbsp;&nbsp;&nbsp;
+      <input type="radio" name="markdown" VALUE="no"  <?%("COND:PREF", 1, :"markdown", "no", "", "checked")> ><label><?_("No")></label>
+  </td>
+</tr>
+
+<tr class="odd">
+  <td><?PREF:DESCR("icontheme")></td>
+  <td>
+     <select id="icontheme" name="icontheme">
+<?ITERATE("PREF:VALID:THEME", ="prefs_section_icontheme_select")>
+     </select>
+  </td>
+</tr>
+
+</table>
+
+<div class="buttons"> 
+  <input type="submit" name="change_button" value="<?_("Change")>">&nbsp;
+  <input type="submit" name="cancel_button" value="<?_("Cancel")>">
+</div>
+</form>
+</div>
diff --git a/webcit/static/t/prefs/pushemail.html b/webcit/static/t/prefs/pushemail.html
new file mode 100644 (file)
index 0000000..6ee0eaf
--- /dev/null
@@ -0,0 +1,53 @@
+    <div id="room_banner_override">
+      <h1><?_("Configure Push Email")></h1>
+    </div>
+
+    <div id="content" class="config_service">
+    <p>
+    <!-- NOT beginbox -->
+    <div class="box">
+    <div class="boxlabel"><?_("Push email and SMS settings")></div>
+    <div class="boxcontent">
+       <!-- still not begin box -->
+    <!-- Begin Push email configure -->
+
+      <div id="pushemail">
+        <div class="instructions">
+          <p>
+<?_("If your administrator has enabled the functionality, Citadel can notify a Funambol server that you haved recieved new email and automatically syncronize any devices you have with the Funambol client installed.")></p>
+
+          <p>
+<?_("Alternatively, if the administrator has configured it, Citadel can send a text message to you when new mail arrives.")></p>
+        </div>
+
+        <form id="pushconfig" method="post" action="save_pushemail">
+          <p class="option">
+           <input type="radio" name="pushsetting" value="funambol" <?%("COND:LONGVECTOR", 1, 1, 4, 'CHECKED', "")>>
+           <strong><?_("Notify Funambol server")></strong>
+         </p>
+
+          <p class="option">
+           <input type="radio" name="pushsetting" value="textmessage" <?%("COND:LONGVECTOR", 1, 1, 3, 'CHECKED', "")>>
+           <strong><?_("Send a text message to...")></strong> 
+           <input type="text" name="user_sms_number" size="20" value=" " >
+           <?_("(Use international format, without any leading zeros, spaces or hypens, like +61415011501)")>
+         </p>
+
+          <p class="option">
+           <input type="radio" name="pushsetting" value="httpmessage" <?%("COND:LONGVECTOR", 1, 1, 5, 'CHECKED', "")>>
+           <strong><?_("Use custom notification scheme configured by your Admin")></strong>
+         </p>
+
+          <p class="option">
+           <input type="radio" name="pushsetting" value="none" <?%("COND:LONGVECTOR", 1, 1, 2, "CHECKED", "")>>
+           <strong><?_("Don‘t send any notifications")></strong>
+         </p>
+
+          <p><input type="submit" name="submit" value="Save settings"></p>
+        </form>
+        <br>
+        <br>
+      </div>
+      </div>
+      </div>
+    </p>
diff --git a/webcit/static/t/prefs/section_icontheme_select.html b/webcit/static/t/prefs/section_icontheme_select.html
new file mode 100644 (file)
index 0000000..a31bba7
--- /dev/null
@@ -0,0 +1 @@
+<option value="<?CONTEXTSTR("X")>" <?%("COND:CONTEXTSTR", 1, :"icontheme", 0, "selected", "")>><?CONTEXTSTR("H")></option>
diff --git a/webcit/static/t/prefs/section_msg_handle_select.html b/webcit/static/t/prefs/section_msg_handle_select.html
new file mode 100644 (file)
index 0000000..0dfe3e8
--- /dev/null
@@ -0,0 +1 @@
+<option value="<?CONTEXTSTR("X")>" <?%("COND:CONTEXTSTR", 1, :"defaulthandle", 0, "selected", "")>><?CONTEXTSTR("H")></option>
diff --git a/webcit/static/t/prefs/section_msg_sender_from_select.html b/webcit/static/t/prefs/section_msg_sender_from_select.html
new file mode 100644 (file)
index 0000000..e987715
--- /dev/null
@@ -0,0 +1 @@
+<option value="<?PREF:VALID:EMAIL:ADDR:STR("X")>" <?%("COND:PREF:VALID:EMAIL:ADDR:STR", 1, 0, 0, "selected", "")>>&lt;<?PREF:VALID:EMAIL:ADDR:STR("H")>&gt;</option>
diff --git a/webcit/static/t/prefs/section_msg_sender_name_select.html b/webcit/static/t/prefs/section_msg_sender_name_select.html
new file mode 100644 (file)
index 0000000..33e0495
--- /dev/null
@@ -0,0 +1 @@
+<option value="<?CONTEXTSTR("X")>" <?%("COND:CONTEXTSTR", 1, :"defaultname", 0, "selected", "")>><?CONTEXTSTR("H")></option>
diff --git a/webcit/static/t/readinfo.html b/webcit/static/t/readinfo.html
new file mode 100644 (file)
index 0000000..cebe9f4
--- /dev/null
@@ -0,0 +1,9 @@
+<div class="infos" 
+       onMouseOver="javascript:Effect.Appear('room_infos', { duration: 2 });"
+       onMouseOut="javascript:Effect.Fade('room_infos', { duration: 2 });"
+>
+       <?THISROOM:INFOTEXT(30, "X")>
+</div>
+<div id="room_infos" style="display:none;">
+       <?THISROOM:INFOTEXT(0, "X")>
+</div>
diff --git a/webcit/static/t/richedit.html b/webcit/static/t/richedit.html
new file mode 100644 (file)
index 0000000..e839738
--- /dev/null
@@ -0,0 +1,19 @@
+<script type="text/javascript" src="tiny_mce/tiny_mce.js"></script>
+<script type="text/javascript">
+idealHeight = $('entmsg').offsetHeight - $('msgtext').offsetTop - 10;
+tinyMCE.init({
+       mode : "textareas",
+       width : "100%",
+       height : idealHeight,
+       browsers : "msie,gecko,safari,opera",
+       theme : "advanced",
+       plugins : "iespell",
+       gecko_spellcheck : true,
+       theme_advanced_buttons1 : "bold, italic, underline, strikethrough, justifyleft, justifycenter, justifyright, justifyfull, blockquote, bullist, numlist, cut, copy, paste, link, image, help, forecolor, iespell, code",
+       theme_advanced_buttons2 : "",
+       theme_advanced_buttons3 : "",
+       theme_advanced_toolbar_location : "top",
+       content_css : "static/styles/webcit-tinymce.css",
+       entity_encoding : "raw"
+});
+</script>
diff --git a/webcit/static/t/room/create.html b/webcit/static/t/room/create.html
new file mode 100644 (file)
index 0000000..5dbb9d5
--- /dev/null
@@ -0,0 +1,106 @@
+<?!("COND:MAY_CREATE_ROOM", 10)>
+<?=("display_main_menu")>
+<?!("X", 10)>
+<??("COND:MAY_CREATE_ROOM", 11)>
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<?=("roombanner")>
+</div>
+<div id="content" class="service">
+<br>
+<?=("box_begin_1")><?_("Create a new room")><?=("box_begin_2")>
+
+<form name="create_room_form" method="POST" action="entroom">
+<input type="hidden" name="nonce" value="<?NONCE>">
+
+<table class="altern"> 
+
+<tr class="odd"><td><?_("Name of room: ")></td><td><input type="text" NAME="er_name" MAXLENGTH="127"></td></tr>
+
+<tr class="even"><td><?_("Resides on floor: ")></td><td>
+
+
+<select name="er_floor" size="1"><?ITERATE("LFLR", ="room_select_targetfloor")></select>
+</td></tr>
+
+<!--
+   * Our clever little snippet of JavaScript automatically selects
+   * a public room if the view is set to Bulletin Board or wiki, and
+   * it selects a mailbox room otherwise.  The user can override this,
+   * of course.  We also disable the floor selector for mailboxes.
+-->
+<tr class="odd"><td><?_("Default view for room: ")></td>
+<td>
+<select name="er_view" size="1" OnChange="
+if ( (this.form.er_view.value == 0)
+|| (this.form.er_view.value == 6) ) {
+       this.form.type[0].checked=true;
+       this.form.er_floor.disabled = false;
+}
+else {
+       this.form.type[4].checked=true;
+       this.form.er_floor.disabled = true;
+}">
+
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_BBS")><option value="<?DEF:VAL(#"VIEW_BBS")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_BBS", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_BBS", "X")></option><??("X", 1)>
+
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_MAILBOX")><option value="<?DEF:VAL(#"VIEW_MAILBOX")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_MAILBOX", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_MAILBOX", "X")></option><??("X", 1)>
+
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_ADDRESSBOOK")><option value="<?DEF:VAL(#"VIEW_ADDRESSBOOK")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_ADDRESSBOOK", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_ADDRESSBOOK", "X")></option><??("X", 1)>
+
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_CALENDAR")><option value="<?DEF:VAL(#"VIEW_CALENDAR")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_CALENDAR", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_CALENDAR", "X")></option><??("X", 1)>
+
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_TASKS")><option value="<?DEF:VAL(#"VIEW_TASKS")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_TASKS", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_TASKS", "X")></option><??("X", 1)>
+
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_NOTES")><option value="<?DEF:VAL(#"VIEW_NOTES")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_NOTES", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_NOTES", "X")></option><??("X", 1)>
+
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_WIKI")><option value="<?DEF:VAL(#"VIEW_WIKI")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_WIKI", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_WIKI", "X")></option><??("X", 1)>
+
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_JOURNAL")><option value="<?DEF:VAL(#"VIEW_JOURNAL")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_JOURNAL", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_JOURNAL", "X")></option><??("X", 1)>
+
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_BLOG")><option value="<?DEF:VAL(#"VIEW_BLOG")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_BLOG", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_BLOG", "X")></option><??("X", 1)>
+
+</select>
+</td></tr>
+
+<tr class="even"><td><?_("Type of room:")></td>
+<td>
+<ul class="adminlist">
+
+<li><input type="radio" NAME="type" VALUE="public" CHECKED OnChange="if (this.form.type[0].checked == true) { this.form.er_floor.disabled = false;}"> 
+<?_("Public (automatically appears to everyone)")>
+</li>
+
+<li><input type="radio" NAME="type" VALUE="hidden" OnChange="if (this.form.type[1].checked == true) {this.form.er_floor.disabled = false;}"> 
+<?_("Private - hidden (accessible to anyone who knows its name)")>
+</li>
+
+<li><input type="radio" NAME="type" VALUE="passworded" OnChange="if (this.form.type[2].checked == true) {this.form.er_floor.disabled = false;}"> 
+<?_("Private - require password: ")>
+<input type="text" NAME="er_password" MAXLENGTH="9">
+</li>
+
+<li><input type="radio" NAME="type" VALUE="invonly" OnChange="if (this.form.type[3].checked == true) {this.form.er_floor.disabled = false;}"> 
+<?_("Private - invitation only")>
+</li>
+
+<li><input type="radio" NAME="type" VALUE="personal" OnChange="if (this.form.type[4].checked == true) {this.form.er_floor.disabled = true;}"> 
+<?_("Personal (mailbox for you only)")>
+</li>
+
+</ul>
+</td></tr></table>
+
+<div class="buttons">
+<input type="submit" name="ok_button" value="<?_("Create new room")>">
+&nbsp;
+<input type="submit" name="cancel_button" value="<?_("Cancel")>">
+</div>
+</form><hr />
+<?SERV:MESG("roomaccess")>
+
+<?=("box_end")>
+</div>
+
+<?=("trailing")>
+<??("X", 11)>
diff --git a/webcit/static/t/room/create_blog.html b/webcit/static/t/room/create_blog.html
new file mode 100644 (file)
index 0000000..b1659b3
--- /dev/null
@@ -0,0 +1,94 @@
+<?!("COND:MAY_CREATE_ROOM", 10)>
+<?=("display_main_menu")>
+<?!("X", 10)>
+<??("COND:MAY_CREATE_ROOM", 11)>
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<?=("roombanner")>
+</div>
+
+<div id="content" class="service">
+<br>
+<?=("box_begin_1")><?_("Create a new blog")><?=("box_begin_2")>
+
+<form name="create_room_form" onsubmit="return false" action="entroom" >
+<input type="hidden" name="nonce" id="Nonce" value="<?NONCE>">
+<input type="hidden" name="er_view_blog" id="er_iew_blog" value="<?DEF:VAL(#"VIEW_BLOG")>">
+<input type="hidden" name="er_blog_markup_html" id="er_blog_markup_html" value="<?DEF:VAL(#"VIEW_WIKI")>">
+
+<div id="throbber" style="display: none;"><img src="static/throbber.gif" ></div>
+<div id="wikitext" style="display: none;"><?_("This is the new edit room for your blog")></div>
+<div id="wikipublish" style="display: none;"><?_("Once you've saved your edits, you can press 'publish' to make your writings visible in the blog.")></div>
+<div id="wikilinktext" style="display: none;"><?_("click this link to start your first article")></div>
+<div id="wikilinkmore" style="display: none;"><?_("Edit this page and copy plus edit the above to add more articles.")></div>
+<div id="wikilinkembedmedia" style="display: none;"><?_("You may link previously uploaded images like this:")> (<?_("assuming its name is test.jpg")>)</div>
+
+
+<table class="altern"> 
+
+<tr class="odd"><td><?_("Name of the blog: ")></td><td><input type="text" id="er_name" NAME="er_name" MAXLENGTH="127"><div id="er_name_fixed" style="display: none;"></div></td></tr>
+
+<tr class="even"><td><?_("Resides on floor: ")></td><td>
+
+
+<select name="er_floor" id="er_floor" size="1"><?ITERATE("LFLR", ="room_select_targetfloor")></select>
+<div id="er_floor_fixed" style="display: none;">xxx</div></td></tr>
+</table>
+<hr>
+<table class="altern"> 
+<tr class="odd"><td><?_("Default editor for blog: ")></td>
+<td>
+<?_("Articles will be published from wiki articles to the blog. Choose your prefered source wiki format:")>
+<select name="er_view" id="er_view" size="1">
+<?!("COND:ALLOWED_DEFAULT_VIEW", 1, #"VIEW_WIKI")><option value="<?DEF:VAL(#"VIEW_WIKI")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_WIKI", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_WIKI", "X")></option><??("X", 1)>
+
+</select>
+<div id="er_view_fixed" style="display: none;">xxx</div></td></tr>
+<tr class="even"><td><?_("Type of edit room:")></td>
+<td>
+<ul class="adminlist">
+
+<li id="li_adminlist_passworded"><input id="adminlist_passworded" type="radio" NAME="type" VALUE="passworded" checked="false"> 
+<?_("Private - require password: ")>
+<input id="er_password" type="text" NAME="er_password" MAXLENGTH="9">
+</li>
+
+<li id="li_adminlist_invonly"><input id="adminlist_invonly" type="radio" NAME="type" VALUE="invonly" checked="true"> 
+<?_("Private - invitation only")>
+</li>
+
+</ul>
+</td></tr></table>
+
+<div id="create_buttons" class="buttons">
+<input type="submit" onclick="create_blog()" value="<?_('Create new blog')>">
+&nbsp;
+<input type="submit" name="cancel_button" value="<?_("Cancel")>">
+</div>
+</form><hr />
+
+
+<div id="edit_info" style="display: none;">
+<?_("Enter the room info below.")> <?_("The text is formatted to the reader's browser. A newline is forced by preceding the next line by a blank.")>
+<form method="post" action="editinfo">
+<input type="hidden" name="nonce" value="<?NONCE()>">
+<input type="hidden" name="template" value="room_info_status_json">
+<textarea name="msgtext" wrap=soft rows=10 cols=80 width=80><?THISROOM:INFOTEXT("X")></textarea>
+
+<div class="buttons" >
+<input type="submit" name="save_button" value="<?_('Save changes')>">
+&nbsp;
+<input type="submit" name="cancel_button" value="<?_('Cancel')>"><br>
+</div>
+
+</form>
+</div>
+
+
+<?SERV:MESG("roomaccess")>
+
+<?=("box_end")>
+</div>
+</div>
+<?=("trailing")>
+<??("X", 11)>
diff --git a/webcit/static/t/room/display_private.html b/webcit/static/t/room/display_private.html
new file mode 100644 (file)
index 0000000..4a8056d
--- /dev/null
@@ -0,0 +1,34 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<?=("roombanner")>
+</div>
+<div id="content" class="service">
+
+<?=("box_begin_1")><?_("Go to a hidden room")><?=("box_begin_2")>
+<p><?_("If you know the name of a hidden (guess-name) or passworded room, you can enter that room by typing its name below.  Once you gain access to a private room, it will appear in your regular room listings so you don‘t have to keep returning here.")></p>
+<form method="post" action="goto_private">
+<input type="hidden" name="nonce" value="<?NONCE>">
+
+<table class="altern">
+<tr class="even">
+<td><?_("Enter room name:")></td>
+<td><input type="text" name="gr_name" value="<?BSTR("gr_name", "U")>" maxlength="128">
+</td></tr>
+
+<?!("COND:BSTR", 1, "gr_name")>
+<!-- todo: we may hide this if no passvoid is needed... -->
+<tr class="odd">
+<td><?_("Enter room password:")></td>
+<td><input type="password" name="gr_pass" maxlength="9"></td>
+</tr>
+<!-- xxx -->
+<?!("X", 1)>
+</table>
+<div class="buttons">
+<input type="submit" name="ok_button" value="<?_("Go there")>">
+&nbsp;<input type="submit" name="cancel_button" value="<?_("Cancel")>">
+</div></form>
+
+<?=("box_end")>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/room/edit.html b/webcit/static/t/room/edit.html
new file mode 100644 (file)
index 0000000..a026741
--- /dev/null
@@ -0,0 +1,17 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<?ROOMBANNER>
+<div id="content" class="service">
+<table border="0" cellspacing="0" cellpadding="0" ><tr><td>
+<?DOTABBED(_("Administration"), ="room_edit_tab_admin",
+          _("Configuration"), ="room_edit_tab_config",
+          _("Message expire policy"), ="room_edit_tab_expire",
+          _("Access controls"), ="room_edit_tab_access",
+          _("Sharing"), ="room_edit_tab_share",
+          _("Mailing list service"), ="room_edit_tab_listserv",
+          _("Remote retrieval"), ="room_edit_tab_feed",
+          "", ="room_edit_submit")>
+</td></tr></table>
+</div>
+<?=("addressbook_popup")>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/room/edit/alias_domainname.html b/webcit/static/t/room/edit/alias_domainname.html
new file mode 100644 (file)
index 0000000..cca1277
--- /dev/null
@@ -0,0 +1 @@
+                                 <option value="<?CONTEXTSTR("U")>"><?CONTEXTSTR("U")></option>
diff --git a/webcit/static/t/room/edit/alias_removal.html b/webcit/static/t/room/edit/alias_removal.html
new file mode 100644 (file)
index 0000000..60a655f
--- /dev/null
@@ -0,0 +1 @@
+<tr class="<?ITERATE:ODDEVEN>"><td><?CONTEXTSTR("X")><a href="netedit?cmd=removealias?tab=listserv?alias=1?prefix=<?CONTEXTSTR("U")>?last_tabsel=<?TAB:N>"><?_("(remove)")></a></td></tr>
diff --git a/webcit/static/t/room/edit/digestrecp_removal.html b/webcit/static/t/room/edit/digestrecp_removal.html
new file mode 100644 (file)
index 0000000..130d51b
--- /dev/null
@@ -0,0 +1 @@
+<tr class="<?ITERATE:ODDEVEN>"><td><?CONTEXTSTRARR(1, "X")><a href="netedit?cmd=remove?tab=listserv?line=digestrecp|<?CONTEXTSTRARR(1, "U")>?last_tabsel=<?TAB:N>"><?_("(remove)")></a></td></tr>
diff --git a/webcit/static/t/room/edit/editroom.html b/webcit/static/t/room/edit/editroom.html
new file mode 100644 (file)
index 0000000..b47be12
--- /dev/null
@@ -0,0 +1,13 @@
+<table border="0" cellspacing="0" cellpadding="0"><tr><td>
+       <form method="post" action="siteconfig">
+               <input type="hidden" name="nonce" value= '<?NONCE>' />
+               <?DOTABBED(_("Administration"), "tab_editroom_admin",
+                       _("Configuration"), "tab_editroom_admin",
+                       _("Message expire policy"), "tab_editroom_expire",
+                       _("Access controls"), "tab_editroom_access",
+                       _("Sharing"), "tab_editroom_sharing",
+                       _("Mailing list service"), "tab_editroom_listserv",
+                       _("Remote retrieval"), "tab_editroom_feeds",
+                       "", "submit_editroom")>
+       </form>
+</td></tr></table>
diff --git a/webcit/static/t/room/edit/er_config_tab_room_option_list.html b/webcit/static/t/room/edit/er_config_tab_room_option_list.html
new file mode 100644 (file)
index 0000000..8dfe90c
--- /dev/null
@@ -0,0 +1 @@
+<option <?%("COND:FLOOR:ISSUBROOM", 1, 1, 0, 'selected="selected"', "")> value="<?FLOOR:ID>"><?FLOOR:NAME("X")></option>
diff --git a/webcit/static/t/room/edit/listrecp_removal.html b/webcit/static/t/room/edit/listrecp_removal.html
new file mode 100644 (file)
index 0000000..5ea8120
--- /dev/null
@@ -0,0 +1 @@
+<tr class="<?ITERATE:ODDEVEN>"><td><?CONTEXTSTRARR(1, "X")><a href="netedit?cmd=remove?tab=listserv?line=listrecp|<?CONTEXTSTRARR(1, "U")>"><?_("(remove)")></a></td></tr>
diff --git a/webcit/static/t/room/edit/participate_removal.html b/webcit/static/t/room/edit/participate_removal.html
new file mode 100644 (file)
index 0000000..b03956d
--- /dev/null
@@ -0,0 +1 @@
+<tr class="<?ITERATE:ODDEVEN>"><td><?CONTEXTSTRARR(1, "X")><a href="netedit?cmd=remove?tab=listserv?line=participate|<?CONTEXTSTRARR(1, "U")>?last_tabsel=<?TAB:N>"><?_("(remove)")></a></td></tr>
diff --git a/webcit/static/t/room/edit/pop3client_removal.html b/webcit/static/t/room/edit/pop3client_removal.html
new file mode 100644 (file)
index 0000000..d3c968a
--- /dev/null
@@ -0,0 +1,13 @@
+<tr class="<?ITERATE:ODDEVEN>">
+       <td><?CONTEXTSTRARR(#"GNET_POP3_HOST", "X")></td>
+       <td><?CONTEXTSTRARR(#"GNET_POP3_USER", "X")></td>
+       <td>*****</td> <!-- Don't show the password -->
+       <td><?CONTEXTSTRARR(#"GNET_POP3_DONT_DELETE_REMOTE")></td> <!-- Keep on server. didnt come up with a better name... -->
+       <td><?CONTEXTSTRARR(#"GNET_POP3_INTERVAL")></td>
+       <td class="button_link">
+               <a href="netedit?cmd=remove?tab=feeds?line=pop3client|<?CONTEXTSTRARR(#"GNET_POP3_HOST", "U")>">
+                       <?_("(remove)")>
+               </a>
+       </td>
+</tr>
+
diff --git a/webcit/static/t/room/edit/rssclient_removal.html b/webcit/static/t/room/edit/rssclient_removal.html
new file mode 100644 (file)
index 0000000..f8d1fbf
--- /dev/null
@@ -0,0 +1,9 @@
+<tr class="<?ITERATE:ODDEVEN>">
+       <td><?CONTEXTSTRARR(1, "X")></td>
+       <td class="button_link">
+               <a href="netedit?cmd=remove?tab=feeds?line=rssclient|<?CONTEXTSTRARR(1, "U")>">
+                       <?_("(remove)")>
+               </a>
+       </td>
+</tr>
+
diff --git a/webcit/static/t/room/edit/select_alias.html b/webcit/static/t/room/edit/select_alias.html
new file mode 100644 (file)
index 0000000..2f2bd0b
--- /dev/null
@@ -0,0 +1 @@
+<option value="<?CONTEXTSTR("U")>"<?%("COND:THISROOM:ISALIAS:CONTEXTSTR", 1, #"eAlias", "", ' selected="selected"', "")>><?CONTEXTSTR("X")></option>
diff --git a/webcit/static/t/room/edit/shared_room_add.html b/webcit/static/t/room/edit/shared_room_add.html
new file mode 100644 (file)
index 0000000..c090594
--- /dev/null
@@ -0,0 +1,13 @@
+<form method="post" action="netedit">
+       <input type="hidden" name="nonce" value="<?NONCE>" />
+       <tr id="ignet_share_node_add__<?CFG:IGNET:NODE("U")>">
+               <td><?CFG:IGNET:NODE("X")></td>
+               <td><input type="text" name="suffix" maxlength="128" /></td>
+               <td>
+                       <input type="hidden" name="line" value="ignet_push_share|<?CFG:IGNET:NODE("U")>|" /> 
+                       <input type="hidden" name="tab" value="sharing" />
+                       <input type="hidden" name="cmd" value="add" />
+                       <input type="submit" name="add_button" value="<?_("Share")>" />
+               </td>
+       </tr>
+</form>
diff --git a/webcit/static/t/room/edit/shared_room_removal.html b/webcit/static/t/room/edit/shared_room_removal.html
new file mode 100644 (file)
index 0000000..2bf10f3
--- /dev/null
@@ -0,0 +1,21 @@
+<form method="post" action="netedit">
+       <tr>
+               <td><input type="hidden" name="nonce" value="<?NONCE>" />
+                   <?CONTEXTSTRARR(#"GNET_IGNET_NODE")></td>
+               <td><?CONTEXTSTRARR(#"GNET_IGNET_ROOM")></td>
+               <td>
+                       <input type="hidden" 
+                              name="line" 
+                              value="ignet_push_share|<?CONTEXTSTRARR(#"GNET_IGNET_NODE", "X")>|<?CONTEXTSTRARR(#"GNET_IGNET_ROOM", "X")>"
+                       />
+                       <input type="hidden" name="tab" value="sharing" />
+                       <input type="hidden" name="cmd" value="remove" />
+                       <input type="submit" name="unshare_button" value="<?_("Unshare")>" />
+                       <a href="javascript:NetworkSynchronizeRoom('<?CONTEXTSTRARR(#"GNET_IGNET_NODE", "X")>')"><img src="static/webcit_icons/essen/16x16/refresh.png" alt='<?_("resend messages to this node")>' width="16" height="16"></a>
+<script type="text/javascript">
+<?--("if we already have this room, you can't add it anymore.")>
+remove_something('ignet_share_node_add__<?CONTEXTSTRARR(#"GNET_IGNET_NODE", "U")>', "hidden");
+</script>
+               </td>
+       </tr>
+</form>
diff --git a/webcit/static/t/room/edit/submit.html b/webcit/static/t/room/edit/submit.html
new file mode 100644 (file)
index 0000000..4a230f2
--- /dev/null
@@ -0,0 +1 @@
+<?--("this file was intentionaly left blank.")>
diff --git a/webcit/static/t/room/edit/tab_access.html b/webcit/static/t/room/edit/tab_access.html
new file mode 100644 (file)
index 0000000..ad55949
--- /dev/null
@@ -0,0 +1,44 @@
+<?!("COND:THISROOM:EDIT", 1)><div class="tabcontent">
+       <table border="0" cellspacing="10">
+               <tr valign="top">
+                       <td>
+                               <?_("The users listed below have access to this room. To remove a user from the access list, select the user name from the list and click 'Kick'.")>
+                               <br><br>
+                               <center>
+                                       <form method="post" action="do_invt_kick">
+                                               <input type="hidden" name="nonce" value="<?NONCE>">
+                                               <input type="hidden" name="last_tabsel" value="<?TAB:N>">
+                                               <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+                                               <select name="username" size="10" style="width:100%">
+                                                       <?ITERATE("ITERATE:THISROOM:WHO_KNOWS", ="room_edit_username_list", 0, 0, -1)>
+                                               </select>
+                                               <br>
+                                               <input type="submit" name="kick_button" value="<?_("Kick")>">
+                                       </form>
+                               </center>
+                       </td>
+                       <td>
+                               <?_("To grant another user access to this room, enter the user name in the box below and click 'Invite'.")>
+                               <br><br>
+                               <center>
+                                       <form method="post" action="do_invt_kick">
+                                               <input type="hidden" name="last_tabsel" value="<?TAB:N>">
+                                               <input type="hidden" name="nonce" value="<?NONCE>">
+                                               <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+                                               <?_("Invite:")>
+                                               <input type="text" name="username" id="username_id" style="width:100R"><br>
+                                               <input type="hidden" name="invite_button" value="Invite">
+                                               <input type="submit" value="<?_("Invite")>">
+                                       </form>
+                               </center>
+                               <!-- Pop open an address book - begin -->
+                               <a href="javascript:PopOpenAddressBook('username_id|<?_("User")>');" title="<?_("Users")>">
+                                       <img align="middle" border="0" width="24" height="24" alt="<?_("Addressbook Popup")>" src="static/webcit_icons/essen/16x16/contact.png">
+                                       &nbsp;<?_("Users")>
+                               </a>
+                               <!-- Pop open an address book - end -->
+                       </td>
+               </tr>
+       </table>
+</div>
+<?!("X", 1)><??("COND:THISROOM:EDIT", 20)><div class="tabcontent"><?_("Higher access is required to access this function.")></div><??("X", 20)>
diff --git a/webcit/static/t/room/edit/tab_admin.html b/webcit/static/t/room/edit/tab_admin.html
new file mode 100644 (file)
index 0000000..52b83f0
--- /dev/null
@@ -0,0 +1,17 @@
+<div class="tabcontent">
+       <ul>
+               <li>
+                       <a href="delete_room?go=<?THISROOM:NAME("U")>" onClick="return confirm('<?_("Are you sure you want to delete this room?")>')">
+                               <?_("Delete this room")>
+                       </a>
+               </li>
+               <li>
+                       <a href="display_editroompic?which_room=<?THISROOM:NAME("U")>">
+                               <?_("Set or change the icon for this rooms banner")>
+                       </a>
+               </li>
+               <li>
+                       <a href="do_template?template=room_edit_info"><?_("Edit this rooms Info file")></a>
+               </li>
+       </ul>
+</div>
diff --git a/webcit/static/t/room/edit/tab_config.html b/webcit/static/t/room/edit/tab_config.html
new file mode 100644 (file)
index 0000000..b4b1055
--- /dev/null
@@ -0,0 +1,155 @@
+<?!("COND:THISROOM:EDIT", 1)><div class="tabcontent">
+       <form method="post" action="editroom">
+               <input type="hidden" name="nonce" value="<?NONCE>" />
+               <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+               <ul>   
+                       <li>
+                               <?_("name of room: ")>
+                               <input type="text" name="er_name" value="<?THISROOM:NAME("X")>" maxlength="127" />
+                       </li>
+                       <li>
+                               <?_("Resides on floor: ")>
+                               <select name="er_floor" size="1" <?%("COND:THISROOM:FLAG:QR", 1, #"QR_MAILBOX", 1, 'disabled="disabled" >', ">")>
+                                 <??("COND:THISROOM:FLAG:QR", 2, #"QR_MAILBOX")><?ITERATE("LFLR", ="room_edit_er_config_tab_room_option_list")><??("X", 2)>
+                               </select>
+                        </li>
+                       <li>
+                               <?_("Type of room:")>
+                               <ul>
+                                       <li>
+                                               <input type="radio" name="type" value="public" 
+                                                      <?%("COND:THISROOM:FLAG:QR", 3, #"QR_PRIVATE | QR_MAILBOX", 1, "", 'checked="checked" ')>
+                                                      onChange="if (this.form.type[0].checked == true) { this.form.er_floor.disabled = false; }" />
+                                               <?_("Public (automatically appears to everyone)")>
+                                       </li>
+                                       <li>
+                                               <input type="radio" name="type" value="hidden" 
+                                                      <?%("COND:THISROOM:FLAG:QR", 5, #"QR_GUESSNAME & QR_PRIVATE", 1, 'checked="checked" ', "")> 
+                                                      onChange="if (this.form.type[1].checked == true) { this.form.er_floor.disabled = false; }" />
+                                               <?_("Private - hidden (accessible to anyone who knows its name)")>
+                                       </li>
+                                       <li>
+                                               <input type="radio" name="type" value="passworded" 
+                                                      <?%("COND:THISROOM:FLAG:QR", 7, #"QR_PASSWORDED & QR_PRIVATE", 1, 'checked="checked" ', "")>
+                                                      onChange="this.form.er_floor.disabled = false; { (this.form.type[2].checked == true) }"
+                                                       />
+                                               <?_("Private - require password: ")>
+                                               <input type="text" name="er_password" value="<?THISROOM:PASS("U")>" maxlength="9" />
+                                       </li>
+                                       <li>
+                                               <input type="radio" name="type" value="invonly" 
+                                                      <??("COND:THISROOM:FLAG:QR", 9, #"QR_PASSWORDED | QR_GUESSNAME")>
+                                                      <?%("COND:THISROOM:FLAG:QR", 10, #"QR_PRIVATE", 1, 'checked="checked" ', "")>
+                                                      <??("X", 9)>
+                                                      onChange="if (this.form.type[3].checked == true) { this.form.er_floor.disabled = false; }" />
+                                               <?_("Private - invitation only")>            
+                                       </li>
+                                       <li>
+                                               <input type="radio" name="type" value="personal" 
+                                                      <?%("COND:THISROOM:FLAG:QR", 11, #"QR_MAILBOX", 1, 'checked="checked" ', "")>
+                                                      onChange="if (this.form.type[4].checked == true) { this.form.er_floor.disabled = true; }"
+                                                       />
+                                               <?_("Personal (mailbox for you only)")>
+                                       </li>
+                                       <li>
+                                               <input type="checkbox" name="bump" value="yes" />
+                                               <?_("If private, cause current users to forget room")>
+                                       </li>
+                               </ul>
+                               <li>
+                                       <input type="checkbox" name="prefonly" value="yes" 
+                                       <?%("COND:THISROOM:FLAG:QR", 12, #"QR_PREFONLY", 1, 'checked="checked" ', "")> />     
+                                       <?_("Preferred users only")>
+                               </li>
+                               <li>
+                                       <input type="checkbox" name="readonly" value="yes" 
+                                       <?%("COND:THISROOM:FLAG:QR", 13, #"QR_READONLY", 1, 'checked="checked" ', "")>  />
+                                       <?_("Read-only room")>
+                               </li>
+                               <li>
+                                       <input type="checkbox" name="collabdel" value="yes" 
+                                       <?%("COND:THISROOM:FLAG:QR2", 14, #"QR2_COLLABDEL", 1, 'checked="checked" ', "")> />
+                                       <?_("All users allowed to post may also delete messages")>
+                               </li>
+                               <li>
+                                       <input type="checkbox" name="directory" value="yes" 
+                                       <?%("COND:THISROOM:FLAG:QR", 15, #"QR_DIRECTORY", 1, 'checked="checked" ', "")>  />
+                                       <?_("File directory room")>
+                               
+                               <ul>
+                                       <li>
+                                               <?_("Directory name: ")>
+                                               <input type="text" name="er_dirname" value="<?THISROOM:DIRECTORY("X")>" maxlength="14" />
+                                       </li>
+                                       <li>
+                                               <input type="checkbox" name="ulallowed" value="yes" 
+                                               <?%("COND:THISROOM:FLAG:QR", 16, #"QR_UPLOAD", 1, 'checked="checked" ', "")>  />
+                                               <?_("Uploading allowed")>
+                                       </li>
+                                       <li>
+                                               <input type="checkbox" name="dlallowed" value="yes" 
+                                               <?%("COND:THISROOM:FLAG:QR", 17, #"QR_DOWNLOAD", 1, 'checked="checked" ', "")>  />
+                                               <?_("Downloading allowed")>
+                                       </li>
+                                       <li>
+                                               <input type="checkbox" name="ulmsg" value="yes" 
+                                               <?%("COND:THISROOM:FLAG:QR2", 17, #"QR2_NOUPLMSG", 1, 'checked="checked" ', "")>  />
+                                               <?_("Don't send message on upload")>
+                                       </li>
+                                       <li>
+                                               <input type="checkbox" name="visdir" value="yes" 
+                                               <?%("COND:THISROOM:FLAG:QR", 18, #"QR_VISDIR", 1, 'checked="checked" ', "")>  />
+                                               <?_("Visible directory")>
+                                       </li>
+                                 </ul></li>
+                       
+                       <li>
+                               <input type="checkbox" name="network" value="yes" 
+                               <?%("COND:THISROOM:FLAG:QR", 19, #"QR_NETWORK", 1, 'checked="checked" ', "")>  />
+                               <?_("Network shared room")>
+                       </li>                         
+                       <li>
+                               <input type="checkbox" name="permanent" value="yes" 
+                               <?%("COND:THISROOM:FLAG:QR", 20, #"QR_PERMANENT", 1, 'checked="checked" ', "")>  />
+                               <?_("Permanent (does not auto-purge)")>
+                       </li>
+                       <li>
+                               <input type="checkbox" name="subjectreq" value="yes" 
+                               <?%("COND:THISROOM:FLAG:QR2", 21, #"QR2_SUBJECTREQ", 1, 'checked="checked" ', "")>  />
+                               <?_("Subject Required (Force users to specify a message subject)")>
+                       </li>
+                       <li>
+                               <?_("Anonymous messages")>
+                        <ul>
+                               <li>
+                                       <input type="radio" name="anon" value="no" 
+                                              <?%("COND:THISROOM:FLAG:QR", 23, #"QR_ANONOPT & QR_ANONONLY", 1, "", 'checked="checked" ')>
+                                              >
+                                       <?_("No anonymous messages")>
+                               </li>
+                               <li>
+                                       <input type="radio" name="anon" value="anononly" 
+                                       <?%("COND:THISROOM:FLAG:QR", 24, #"QR_ANONONLY", 1, 'checked="checked" ', "")> />
+                                       <?_("All messages are anonymous")>
+                               </li>
+                               <li>
+                                       <input type="radio" name="anon" value="anon2" 
+                                       <?%("COND:THISROOM:FLAG:QR", 25, #"QR_ANONOPT", 1, 'checked="checked" ', "")> />
+                                       <?_("Prompt user when entering messages")>
+                               </li>
+                       </ul></li>
+                       <li>
+                               <?_("Room aide: ")>
+                               <input type="text" name="er_roomaide" value="<?THISROOM:AIDE("U")>" maxlength="25" /'>
+                       </li>
+       </ul>
+
+       <center>
+               <input type="hidden" name="last_tabsel" value="<?TAB:N>" />
+               <input type="submit" name="ok_button" value="<?_("Save changes")>" />
+               &nbsp;
+               <input type="submit" name="cancel_button" value="<?_("Cancel")>" />
+       </center>
+       </form>
+</div>
+<?!("X", 1)><??("COND:THISROOM:EDIT", 20)><div class="tabcontent"><?_("Higher access is required to access this function.")></div><??("X", 20)>
diff --git a/webcit/static/t/room/edit/tab_expire.html b/webcit/static/t/room/edit/tab_expire.html
new file mode 100644 (file)
index 0000000..958c0b1
--- /dev/null
@@ -0,0 +1,73 @@
+<?!("COND:THISROOM:EDIT", 1)><div class="tabcontent">
+       <br />
+       <form method="post" action="set_room_policy">
+               <input type="hidden" name="nonce" value="<?NONCE>" />
+               <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+               <table border="0" cellspacing="5">
+                       <tr>
+                               <td>
+                                       <?_("Message expire policy for this room")>
+                                       <br />
+                                       <?THISROOM:NAME("X")>
+                               </td>
+                               <td>
+                                       <input type="radio" name="roompolicy" value="0" <?%("COND:EXPIRE:MODE", 1, #"roompolicy", #"EXPIRE_NEXTLEVEL" , 'checked="checked"',"")>/>&nbsp;
+                                       <?_("Use the default policy for this floor")>&nbsp;
+                                       <br />
+                                       <input type="radio" name="roompolicy" value="1" <?%("COND:EXPIRE:MODE", 1, #"roompolicy", #"EXPIRE_MANUAL", 'checked="checked"',"")> />&nbsp;
+                                       <?_("Never automatically expire messages")>
+                                       <br />
+                                       <input type="radio" name="roompolicy" value="2" <?%("COND:EXPIRE:MODE", 2, #"roompolicy", #"EXPIRE_NUMMSGS", 'checked="checked"', "")> />&nbsp;
+                                       <?_("Expire by message count")>
+                                       <br />
+                                       <input type="radio" name="roompolicy" value="3" <?%("COND:EXPIRE:MODE", 1, #"roompolicy", #"EXPIRE_AGE", 'checked="checked"', "")> />&nbsp;
+                                       <?_("Expire by message age")>
+                                       <br />
+                                       <?_("Number of messages or days: ")>
+                                       <input type="text" name="roomvalue" MAXLENGTH="5" value="<?EXPIRE:VALUE(#"roompolicy", #"EXPIRE_NUMMSGS")>">
+                               </td>
+                       </tr>
+       
+                       <??("COND:AIDE", 2)>
+                       <tr>
+                               <td colspan="2"><hr /></td>
+                       </tr>
+                       <tr>
+                               <td>
+                                       <?_("Message expire policy for this floor")>
+                                       <br />
+                                       <?THISROOM:FLOOR:NAME("X")>
+                               </td>
+                               <td>
+                                       <input type="radio" name="floorpolicy" value="0" <?%("COND:EXPIRE:MODE", 1, #"floorpolicy", #"EXPIRE_NEXTLEVEL" , 'checked="checked"',"")>>&nbsp;
+                                       <?_("Use the system default")>
+                                       <br />
+                                       <input type="radio" name="floorpolicy" value="1" <?%("COND:EXPIRE:MODE", 1, #"floorpolicy", #"EXPIRE_MANUAL", 'checked="checked"',"")> />&nbsp;
+                                       <?_("Never automatically expire messages")>
+                                       <br />
+                                       <input type="radio" name="floorpolicy" value="2" <?%("COND:EXPIRE:MODE", 2, #"floorpolicy", #"EXPIRE_NUMMSGS", 'checked="checked"', "")> />&nbsp;
+                                       <?_("Expire by message count")>
+                                       <br />
+                                       <input type="radio" name="floorpolicy" value="3" <?%("COND:EXPIRE:MODE", 1, #"floorpolicy", #"EXPIRE_AGE", 'checked="checked"', "")> />&nbsp;
+                                       <?_("Expire by message age")>
+                                       <br />
+                                       <?_("Number of messages or days: ")>
+                                       <input type="text" name="floorvalue" MAXLENGTH="5" value="<?EXPIRE:VALUE(#"floorpolicy", #"EXPIRE_NUMMSGS")>">
+                                       </td>
+                               </tr>
+                       <??("X", 2)>    
+                       <tr>
+                               <td colspan="2">
+                                       <hr />
+                                       <center>
+                                               <input type="submit" name="ok_button" value="<?_("Save changes")>" />
+                                               &nbsp;
+                                               <input type="submit" name="cancel_button" value="<?_("Cancel")>" />
+                                       </center>
+                               </td>
+                       </tr>
+               </table>
+               <input type="hidden" name="last_tabsel" value="<?TAB:N>" />
+       </form>
+</div>
+<?!("X", 1)><??("COND:THISROOM:EDIT", 20)><div class="tabcontent"><?_("Higher access is required to access this function.")></div><??("X", 20)>
diff --git a/webcit/static/t/room/edit/tab_feed.html b/webcit/static/t/room/edit/tab_feed.html
new file mode 100644 (file)
index 0000000..78d3f6d
--- /dev/null
@@ -0,0 +1,57 @@
+<div class="tabcontent">
+       <i><?_("Retrieve messages from these remote POP3 accounts and store them in this room:")></i>
+       <br />
+       <form method="post" action="netedit">
+<p>
+        <input type="hidden" name="last_tabsel" value="<?TAB:N>" />
+       <input type="hidden" name="prefix" value="pop3client|" />
+       <input type="hidden" name="nonce" value="<?NONCE>">
+       <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+</p>
+       <table class="altern" border="0" cellpadding="5">
+               <tr class="even">
+                       <th><?_("Remote host")></th>
+                       <th><?_("User name")></th>
+                       <th><?_("Password")></th>
+                       <th><?_("Keep messages on server?")></th>
+                       <th><?_("Interval")></th>
+                       <th>&nbsp;</th>
+               </tr>
+               <?ITERATE("ITERATE:THISROOM:GNET", ="room_edit_pop3client_removal", 0, 0, -1, #"pop3client")>
+                       <tr>
+                               <td><input type="text" id="add_as_pop3host" name="line_pop3host" /></td>
+                               <td><input type="text" id="add_as_pop3user" name="line_pop3user" /></td>
+                               <td><input type="password" id="add_as_pop3pass" name="line_pop3pass" /></td>
+                               <td><input type="checkbox" id="add_as_pop3keep" name="line_pop3keep" value="1" /></td>
+                               <td><input type="text" id="add_as_pop3int" name="line_pop3int" maxlength="5" /></td>
+                               <td><input type="submit" name="add_button" value="<?_("Add")>" /></td>
+                       </tr>
+       </table>
+       </form>
+       <hr>
+       <i><?_("Fetch the following RSS feeds and store them in this room:")></i>
+       <br />
+       <form method="post" action="netedit">
+<p>
+       <input type="hidden" name="last_tabsel" value="<?TAB:N>" />
+       <input type="hidden" name="prefix" value="rssclient|" />
+       <input type="hidden" name="nonce" value="<?NONCE>" />
+       <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+</p>
+       <table class="altern" border="0" cellpadding="5">
+               <tr class="even">
+                       <th>
+                               <img src="static/webcit_icons/essen/16x16/rss.png" alt=" " /> 
+                               <?_("Feed URL")>
+                       </th>
+                       <th></th>
+               </tr>
+               <?ITERATE("ITERATE:THISROOM:GNET", ="room_edit_rssclient_removal", 0, 0, -1, #"rssclient")>
+                       <tr>
+                               <td><input type="text" id="add_as_rssclient" size="72" maxlength="256" name="line_pop3host" /></td>
+                               <td><input type="submit" name="add_button" value="<?_("Add")>" /></td>
+                       </tr>
+       </table>
+       </form>
+</div>
+
diff --git a/webcit/static/t/room/edit/tab_listserv.html b/webcit/static/t/room/edit/tab_listserv.html
new file mode 100644 (file)
index 0000000..d3ec69b
--- /dev/null
@@ -0,0 +1,161 @@
+<div class="tabcontent">
+       <center>
+               <table border="0" width="100%" cellpadding="5">
+                       <tr><td valign="top">
+                           <table class="altern">
+                             <tr><th><?_("<i>The contents of this room are being mailed <b>as individual messages</b> to the following list recipients:</i><br><br>")></th></tr>
+                             <?ITERATE("ITERATE:THISROOM:GNET", ="room_edit_listrecp_removal", 0, 0, -1, #"listrecp")>
+                           </table>
+                       <br>
+                       <form method="post" action="netedit">
+                         <p>
+                               <input type="hidden" name="last_tabsel" value="<?TAB:N>">
+                               <input type="hidden" name="prefix" value="listrecp|">
+                               <input type="hidden" name="nonce" value="<?NONCE>">
+                               <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+                               <input type="text" id="add_as_listrecp" name="line">
+                               <input type="submit" name="add_button" value="<?_("Add")>">
+                         </p>
+                       </form>
+                       </td>
+                       <td valign="top">
+                           <table class="altern">
+                             <tr><th><?_("<i>The contents of this room are being mailed <b>in digest form</b> to the following list recipients:</i><br><br>")></th></tr>
+                             <?ITERATE("ITERATE:THISROOM:GNET", ="room_edit_digestrecp_removal", 0, 0, -1, #"digestrecp")>
+                           </table>
+                       <br>
+                       <form method="post" action="netedit">
+                         <p>
+                               <input type="hidden" name="last_tabsel" value="<?TAB:N>">
+                               <input type="hidden" name="prefix" value="digestrecp|">
+                               <input type="hidden" name="nonce" value="<?NONCE>">
+                               <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+                               <input type="text" id="add_as_digestrecp" name="line">
+                               <input type="submit" name="add_button" value="<?_("Add")>">
+                         </p>
+                       </form>
+                       </td></tr>
+               </table>
+
+               <table border="0" width="100%" cellpadding="5">
+                       <td valign="top">
+                           <table class="altern">
+                             <tr><th><?_("Posts to this room will be sent to these mailing lists")></th></tr>
+                             <tr><td><?_("All messages posted / mailed into this room will be sent to these email addresses. If you link this with mailinglist subscriptions, make shure the default sender address below matches the subscribed address. You will see your messages twice once the mailinglist sends it back to you.")></td></tr>
+                             <?ITERATE("ITERATE:THISROOM:GNET", ="room_edit_participate_removal", 0, 0, -1, #"participate")>
+                           </table>
+                       <br>
+                       <form method="post" action="netedit">
+                         <p>
+                               <input type="hidden" name="last_tabsel" value="<?TAB:N>">
+                               <input type="hidden" name="prefix" value="participate|">
+                               <input type="hidden" name="nonce" value="<?NONCE>">
+                               <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+                               <input type="text" id="add_as_digestrecp" name="line">
+                               <input type="submit" name="add_button" value="<?_("Add")>">
+                         </p>
+                       </form>
+                       </td></tr>
+               </table>
+
+               <!-- Pop open an address book - begin -->
+               <div align="right">
+                       <a href="javascript:PopOpenAddressBook('add_as_listrecp|<?_("List")>|add_as_digestrecp|<?_("Digest")>')"
+                       title="<?_("Add recipients from Contacts or other address books")>">
+                       <img align="middle" border="0" width="24" height="24" alt="<?_("Addressbook Popup")>" src="static/webcit_icons/essen/16x16/contact.png">
+                       &nbsp;<?_("Add recipients from Contacts or other address books")></a>
+               </div>
+               <!-- Pop open an address book - end -->
+
+               <br>
+               <form method="get" action="toggle_self_service">
+                       <table>
+                               <!-- Public posting? -->
+                               <tr>
+                                       <td><?_("Allow non-subscribers to mail to this room.")></td>
+                                       <td><input type="checkbox" name="QR2_SubsOnly" value="yes" <?%("COND:THISROOM:FLAG:QR2", 20, #"QR2_SMTP_PUBLIC", 1, 'checked="checked" ', "")>></td>
+                               </tr>
+               
+                               <!-- Moderated List? -->
+                               <tr>
+                                       <td><?_("Room post publication needs Admin permission.")></td>
+                                       <td><input type="checkbox" name="QR2_Moderated" value="yes" <?%("COND:THISROOM:FLAG:QR2", 20, #"QR2_MODERATED", 1, 'checked="checked" ', "")>></td>
+                               </tr>
+                               <!-- Self Service subscription? -->
+                               <tr>
+                                       <td><?_("Allow self-service subscribe/unsubscribe requests.")></td>
+                                       <td><input type="checkbox" name="QR2_SelfList" value="yes" <?%("COND:THISROOM:FLAG:QR2", 20, #"QR2_SELFLIST", 1, 'checked="checked" ', "")>></td>
+                               </tr>
+                               <tr>
+                               <!-- Give the admin some hint how to access the subscriber interface -->
+                                       <td colspan="2">
+                                               <?_("The URL for subscribe/unsubscribe is: ")>
+                                               <tt><?%("COND:IS_HTTPS", 3, 1, 0, "https", "http")>://<?SERV:FQDN>/listsub</tt>
+                                       </td>
+                               </tr>
+                               <tr>
+                                 <td colspan="2" align="center">
+                                   <input type="hidden" name="last_tabsel" value="<?TAB:N>">
+                                   <input type="hidden" name="nonce" value="<?NONCE>">
+                                   <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+                                   <input type="submit" name="add_button" value="<?_("Save changes")>">
+                                 </td>
+                               </tr>
+                       </table>
+               </form>
+
+               <table class="altern">
+                 <tr>
+                 <td colspan="2">
+                   <?_("Which from address should be used: ")>
+                 </td>
+                 </tr>
+                 <tr>
+                   <td colspan="2">
+                     <form method="post" action="netedit">
+                       <p>
+                         <input type="hidden" name="last_tabsel" value="<?TAB:N>">
+                         <input type="hidden" name="alias" value="room_<?THISROOM:NAME("X")>">
+                         <input type="hidden" name="nonce" value="<?NONCE>">
+                         <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+                         <input type="hidden" name="prefix" value="roommailalias|">
+                         <select size="1" name="default_aliasdomain">
+                                 <option value=""<?%("COND:THISROOM:ISALIAS:CONTEXTSTR", 1, #"eNotSet", "", ' selected="selected"', "")>><?_("none (not advised)")></option>
+                 <?ITERATE("ITERATE:THISROOM:POSSIBLE:MALIAS", ="room_edit_select_alias", 0, 0, -1, "")>
+                         </select>
+                         <input type="submit" name="add_button" value="<?_("Set")>">
+                       </p>
+                     </form>
+                   </td>
+                 </tr>
+               </table>
+               <table class="altern">
+                 <tr>
+                 <td colspan="2">
+                   <?_("Alternative public emailaddresses pointing to this room: ")>
+                 </td>
+                 </tr>
+                 <?ITERATE("ITERATE:THISROOM:MALIAS", ="room_edit_alias_removal", 0, 0, -1, "")>
+                 <tr>
+                   <td colspan="2">
+                     <form method="post" action="netedit">
+                       <p>
+                         <input type="hidden" name="last_tabsel" value="<?TAB:N>">
+                         <input type="hidden" name="alias" value="room_<?THISROOM:NAME("X")>">
+                         <input type="hidden" name="nonce" value="<?NONCE>">
+                         <input type="hidden" name="go" value="<?THISROOM:NAME("X")>">
+                         <input type="text" id="prefix" name="prefix">
+                         @ 
+                         <select size="1" name="aliasdomain">
+                                 <option value=""><?_("All Domains")></option>
+                                 <?ITERATE("ITERATE:VALID:DOMAINNAMES", ="room_edit_alias_domainname", 0, 0, -1, "")>
+                         </select>
+                         <input type="submit" name="add_button" value="<?_("Add")>">
+                       </p>
+                     </form>
+                   </td>
+                 </tr>
+               </table>
+               
+       </center>
+</div>
diff --git a/webcit/static/t/room/edit/tab_share.html b/webcit/static/t/room/edit/tab_share.html
new file mode 100644 (file)
index 0000000..efe04a3
--- /dev/null
@@ -0,0 +1,47 @@
+<div class="tabcontent">
+       <br />
+       <table border="1" cellpadding="5">
+               <tr>
+                       <td><b><i><?_("Not shared with")></i></b></td>
+                       <td><b><i><?_("Shared with")></i></b></td>
+               </tr>
+               <tr>
+                       <td valign="top">
+                               <table border="0" cellpadding="5">
+                                       <tr class="tab_cell">
+                                               <td><?_("Remote node name")></td>
+                                               <td><?_("Remote room name")></td>
+                                               <td><?_("Actions")></td>
+                                       </tr>
+                                       <?ITERATE("NODECONFIG", ="room_edit_shared_room_add")>
+                               </table>
+                       </td>
+                       <td valign="top">
+                               <table border="0" cellpadding="5">
+                                       <tr class="tab_cell">
+                                               <td><?_("Remote node name")></td>
+                                               <td><?_("Remote room name")></td>
+                                               <td><?_("Actions")></td>
+                                       </tr>
+                                       <?ITERATE("ITERATE:THISROOM:GNET", ="room_edit_shared_room_removal", 0, 0, -1, #"ignet_push_share")>
+                               </table>
+                       </td>
+               </tr>
+       </table>
+       <br />
+       <div id="hints">
+               <b><?_("Notes:")></b>
+               <div><ul>
+                       <li>
+                               <?_("When sharing a room, it must be shared from both ends.  Adding a node to the 'shared' list sends messages out, but in order to receive messages, the other nodes must be configured to send messages out to your system as well.")>
+                       <li>
+                         <?_("If the remote room name is blank, it is assumed that the room name is identical on the remote node.")>
+                       </li> <li>
+                         <?_("If the remote room name is different, the remote node must also configure the name of the room here.")>
+                       </li> <li>
+                         (<img src="static/webcit_icons/essen/16x16/refresh.png" alt='<?_("resend messages to this node")>' width="16" height="16">)<?_("Re-sharing may stress your system and produce large spoolfiles that need to be transmitted; All messages in this room not originating from this node are re-spooled and re-sent with the next networker run.")>
+                       </li>
+               </ul></div>
+       </div>
+       <br />
+</div>
diff --git a/webcit/static/t/room/edit/username_list.html b/webcit/static/t/room/edit/username_list.html
new file mode 100644 (file)
index 0000000..a187055
--- /dev/null
@@ -0,0 +1 @@
+<option><?CONTEXTSTR("X")></option>
diff --git a/webcit/static/t/room/edit_info.html b/webcit/static/t/room/edit_info.html
new file mode 100644 (file)
index 0000000..b0af30e
--- /dev/null
@@ -0,0 +1,26 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<?=("roombanner")>
+</div>
+<div id="content" class="service">
+
+<?=("box_begin_1")>
+<?_("Edit Room info")>
+<?=("box_begin_2")>
+
+<?_("Enter the room info below.")> <?_("The text is formatted to the reader's browser. A newline is forced by preceding the next line by a blank.")>
+<form method="post" action="editinfo">
+<input type="hidden" name="nonce" value="<?NONCE()>">
+<textarea name="msgtext" wrap=soft rows=10 cols=80 width=80><?THISROOM:INFOTEXT("X")></textarea>
+
+<div class="buttons" >
+<input type="submit" name="save_button" value="<?_('Save changes')>">
+&nbsp;
+<input type="submit" name="cancel_button" value="<?_('Cancel')>"><br>
+</div>
+
+</form>
+<?=("box_end")>
+</div>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/room/info_status_json.html b/webcit/static/t/room/info_status_json.html
new file mode 100644 (file)
index 0000000..bc7e54f
--- /dev/null
@@ -0,0 +1,3 @@
+{
+Message: "<?IMPORTANTMESSAGE('j')>"
+}
diff --git a/webcit/static/t/room/result_json.html b/webcit/static/t/room/result_json.html
new file mode 100644 (file)
index 0000000..b492f72
--- /dev/null
@@ -0,0 +1,4 @@
+{
+Message: "<?IMPORTANTMESSAGE('j')>",
+success: <?%("COND:BSTR", 1, "success", 1, "true", "false")>
+}
diff --git a/webcit/static/t/room/select_targetfloor.html b/webcit/static/t/room/select_targetfloor.html
new file mode 100644 (file)
index 0000000..bf742d3
--- /dev/null
@@ -0,0 +1 @@
+<??("COND:FLOOR:ISVIRTUAL", 1)><option value="<?FLOOR:ID>"><?FLOOR:NAME("X")></option><??("X", 1)>
diff --git a/webcit/static/t/room/view_picture.html b/webcit/static/t/room/view_picture.html
new file mode 100644 (file)
index 0000000..cbd8a6d
--- /dev/null
@@ -0,0 +1,31 @@
+<?!("COND:THISROOM:HAVE_PIC", 1)>
+<img height="64px" alt="<?_("Room Logo")>" src="roompic?room=<?THISROOM:NAME("U")>">
+<?!("X", 1)><??("COND:THISROOM:HAVE_PIC", 2)>
+       <?!("COND:ROOM:TYPE_IS", 3, #"VIEW_ADDRESSBOOK")>
+               <img class="roompic" alt="" src="static/webcit_icons/essen/32x32/contact.png">
+       <?!("X", 3)>
+       <?!("COND:ROOM:TYPE_IS", 4, #"VIEW_CALENDAR")>
+               <img class="roompic" alt="" src="static/webcit_icons/essen/32x32/calendar.png">
+        <?!("X", 4)>
+       <?!("COND:ROOM:TYPE_IS", 5, #"VIEW_CALBRIEF")>
+               <img class="roompic" alt="" src="static/webcit_icons/essen/32x32/calendar.png">
+       <?!("X", 5)>
+       <?!("COND:ROOM:TYPE_IS", 6, #"VIEW_TASKS")>
+               <img class="roompic" alt="" src="static/webcit_icons/essen/32x32/task.png">
+       <?!("X", 6)>
+       <?!("COND:ROOM:TYPE_IS", 7, #"VIEW_NOTES")>
+               <img class="roompic" alt="" src="static/webcit_icons/essen/32x32/note.png">
+        <?!("X", 7)>
+       <?!("COND:ROOM:TYPE_IS", 8, #"VIEW_MAILBOX")>
+               <img class="roompic" alt="" src="static/webcit_icons/essen/32x32/email.png">
+        <?!("X", 8)>
+       <?!("COND:ROOM:TYPE_IS", 9, #"VIEW_BBS")>
+                <img class="roompic" alt="" src="static/webcit_icons/essen/32x32/room.png">
+        <?!("X", 9)>
+       <?!("COND:ROOM:TYPE_IS", 9, #"VIEW_JOURNAL")>
+                <img class="roompic" alt="" src="static/webcit_icons/essen/32x32/chat.png">
+        <?!("X", 9)>
+       <?!("COND:ROOM:TYPE_IS", 9, #"VIEW_BLOG")>
+                <img class="roompic" alt="" src="static/webcit_icons/essen/32x32/blog.png">
+        <?!("X", 9)>
+<??("X", 2)>
diff --git a/webcit/static/t/room/zap_entry.html b/webcit/static/t/room/zap_entry.html
new file mode 100644 (file)
index 0000000..eba8ad5
--- /dev/null
@@ -0,0 +1,11 @@
+&nbsp;<a href="dotgoto?room=<?ROOM:INFO:NAME("U")>">
+       <span class="<?%("COND:ROOM:FLAG:UA", 4, #"UA_HASNEWMSGS", 0, "roomlist_new", "roomlist_old")>">
+               <?ROOM:INFO:LEVELNTIMES("&nbsp;&nbsp;&nbsp;")><?ROOM:INFO:BASENAME>
+               <??("COND:THISROOM:FLAG:QR", 1, #"QR_DIRECTORY")>
+                       <img src="/static/webcit_icons/essen/16x16/file.png" alt="<?_("Has Files")>">
+               <??("X", 1)>
+               <??("COND:THISROOM:FLAG:QR", 2, #"QR_NETWORK")>
+                       <img src="/static/webcit_icons/essen/16x16/network.png" alt="<?_("Networked Room")>">
+               <??("X", 2)>
+       </span>
+</a><br>
diff --git a/webcit/static/t/room/zap_this.html b/webcit/static/t/room/zap_this.html
new file mode 100644 (file)
index 0000000..c35bd65
--- /dev/null
@@ -0,0 +1,16 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<h1><?_("Zap (forget/unsubscribe) the current room")></h1>
+</div>
+<div id="content" class="service">
+<?_("If you select this option,")>
+<em><?THISROOM:NAME("X")></em>
+<?_("will disappear from your room list.  Is this what you wish to do?")>
+<br>
+
+<form method="POST" action="zap">
+<input type="hidden" name="nonce" value="<?NONCE>">
+<input type="submit" NAME="ok_button" VALUE="<?_("Zap this room")>">&nbsp;
+<input type="submit" NAME="cancel_button" VALUE="<?_("Cancel")>">
+</form>
+<?=("trailing")>
diff --git a/webcit/static/t/room/zapped_list.html b/webcit/static/t/room/zapped_list.html
new file mode 100644 (file)
index 0000000..ce5eaf8
--- /dev/null
@@ -0,0 +1,13 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<?=("roombanner")>
+</div>
+<div id="content" class="service">
+
+<?=("box_begin_1")><?_("Zapped (forgotten) rooms")><?=("box_begin_2")>
+<?ITERATE("LZRM", ="room_zap_entry")>
+<br><br>
+<?_("Click on any room to un-zap it and goto that room.")>
+<?=("box_end")>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/roombanner.html b/webcit/static/t/roombanner.html
new file mode 100644 (file)
index 0000000..fe22f10
--- /dev/null
@@ -0,0 +1,36 @@
+<!-- start roombanner.html -->
+<div class="banner" id="room_banner">
+  <div id="nummsgs_template" class="hidden">UNREADMSGS <?_("new of")> TOTALMSGS <?_("messages")></div>
+       <table border=0><tr>
+               <td><?=("room_view_picture")></td>
+
+               <td>
+                       <h1 id="rmname"><a href="/readnew?go=<?THISROOM:NAME("U")>"><?THISROOM:NAME("X")></a></h1>
+                       <?THISROOM:FEED:RSS>
+                       <?!("COND:ROOM:TYPE_IS", 7, #"VIEW_WIKI")><h2><a href="wiki?go=<?THISROOM:NAME("U")>?page=<?BSTR("page")>"><?BSTR("page")></a></h2><?!("X", 7)>
+                       <?!("COND:ROOM:TYPE_IS", 8, #"VIEW_BBS")><p id="nummsgs"><?THISROOM:MSGS:NEW> <?_("new of")> <?THISROOM:MSGS:TOTAL> <?_("messages")></p><?!("X", 8)>
+                       <?!("COND:ROOM:TYPE_IS", 11, #"VIEW_MAILBOX")><p id="nummsgs"><?THISROOM:MSGS:NEW> <?_("new of")> <?THISROOM:MSGS:TOTAL> <?_("messages")></p><?!("X", 11)>
+                       <?!("COND:THISROOM:FLAG:QR", 9, #"QR_DIRECTORY")><?!("COND:THISROOM:FLAG:QR", 10, #"QR_VISDIR")>
+                               <p id="numfiles"><a href="do_template?template=files">
+                                       <img src="/static/webcit_icons/essen/16x16/file.png" alt="File">
+                                       <?THISROOM:FILES:N> <?THISROOM:FILES:STR></a>
+                               </p>
+                       <?!("X", 10)><?!("X", 9)>
+               </td>
+               <td><?=("readinfo")></td>
+               <td id="actiondiv">
+                       <ul class="room_actions">
+                               <li class="start_page"><?OFFERSTARTPAGE></li>
+                               <li class="logstatus"><?=("loggedinas")></li>
+                               <?!("COND:ROOM:TYPE_IS", 12, #"VIEW_MAILBOX")><li class="search" id="searchomatic"><?=("searchomatic")></li><?!("X", 12)>
+                               <li class="view"><?=("viewomatic")></li>
+                               <?!("COND:THISROOM:CURR_VIEW", 1, #"VIEW_MAILBOX")>
+                                       <li class="hidden" id="selectpage">
+                                               <?_("Select page: ")> <select id="summpage"><option> </option></select>
+                                       </li>
+                               <?!("X",1)>
+                       </ul>
+               </td>
+       </tr></table>
+</div>
+<!-- end roombanner.html -->
diff --git a/webcit/static/t/roomchat.html b/webcit/static/t/roomchat.html
new file mode 100644 (file)
index 0000000..b37aa2d
--- /dev/null
@@ -0,0 +1,44 @@
+<div id="chatrecv_history" class="chatrecv_history_class"></div>
+<div id="chatrecv" class="chatrecv_class"></div>
+<div id="chat_userlist" class="chat_userlist_class"></div>
+<div id="chatsend" class="chatsend_class">
+       <form method="POST" onsubmit="return chatsendfunc()" action="chat_send" id="chatsendid" name="chatsendform">
+       <input type="hidden" name="nonce" value="<?NONCE>">
+       <img src="static/webcit_icons/essen/32x32/chat.png" alt="">
+       <textarea id="send_this_id" name="send_this" rows="4" cols="78"
+               onKeyPress="chat_enter(event);"></textarea>
+       <input type="submit" value="<?_("Send")>">
+       <iframe style="width:0px; height:0px; border: 0px" src="static/roomchat_unload.html"></iframe>
+</div>
+
+<script type="text/javascript">
+
+function chatsendfunc() {
+       $('chatsendid').request({
+               onComplete: function(){ $('send_this_id').value = '' }
+       })
+       return false;
+}
+
+function chat_enter(evt) {
+       var charCode = (evt.which) ? evt.which : window.event.keyCode; 
+       if (charCode == 13) {
+               chatsendfunc();
+       }
+}
+
+new Ajax.PeriodicalUpdater('chatrecv', 'chat_recv', {
+       method: 'get', frequency: 2,
+               onSuccess: function(){ 
+                       $('chatrecv_history').innerHTML =
+                               $('chatrecv_history').innerHTML + $('chatrecv').innerHTML;
+                       $('chatrecv').innerHTML = '';
+                       $('chatrecv_history').scrollTop = 9999999;
+               }
+});
+
+new Ajax.PeriodicalUpdater('chat_userlist', 'chat_rwho', {
+       method: 'get', frequency: 15
+});
+
+</script>
diff --git a/webcit/static/t/searchomatic.html b/webcit/static/t/searchomatic.html
new file mode 100644 (file)
index 0000000..d758910
--- /dev/null
@@ -0,0 +1,7 @@
+<form name="searchomatic" action="do_search">
+       <div style="display: inline;">
+               <input type="hidden" name="nonce" value="<?NONCE>">
+               <label for="srchquery"><?_("Search: ")></label>
+               <input <?%("COND:SERV:FULLTEXT_ENABLED", 1, "something needed here", 1,  "", "disabled='disabled'")> type="text" name="query" id="srchquery" size="15" maxlength="128" class="inputbox">
+       </div>
+</form>
diff --git a/webcit/static/t/section_mailsummary.html b/webcit/static/t/section_mailsummary.html
new file mode 100644 (file)
index 0000000..6c0815b
--- /dev/null
@@ -0,0 +1,5 @@
+<tr id="m<?MAIL:SUMM:N>" style="font-weight:<?%("COND:MAIL:SUMM:UNREAD", 1, 0, 0, "bold", "normal")>" onMouseDown="CtdlMoveMsgMouseDown(event)">
+<td class="col1"><?MAIL:SUMM:SUBJECT("X")></td>
+<td class="col2"><?MAIL:SUMM:FROM("X")></td>
+<td class="col3"><?MAIL:SUMM:DATEBRIEF></td>
+</td>
diff --git a/webcit/static/t/section_mailsummary_m.html b/webcit/static/t/section_mailsummary_m.html
new file mode 100644 (file)
index 0000000..c9bef99
--- /dev/null
@@ -0,0 +1,5 @@
+<div><div id="m<?MAIL:SUMM:N>" style="font-weight:<?%("COND:MAIL:SUMM:UNREAD", 1, 0, 0, "bold", "normal")>;" onClick="CtdlLoadMsgMouseDown(event,<?MAIL:SUMM:N>)">
+<span class="from"><?MAIL:SUMM:FROM("X")></span>
+<span style="float: right;"><?MAIL:SUMM:DATEBRIEF></span><br>
+<span class="subject"><?MAIL:SUMM:SUBJECT("X")></span>
+</div><div id="m_<?MAIL:SUMM:N>" class="msgview" onMouseDown=""></div></div>
diff --git a/webcit/static/t/select_messageindex.html b/webcit/static/t/select_messageindex.html
new file mode 100644 (file)
index 0000000..62b5b92
--- /dev/null
@@ -0,0 +1 @@
+<option <?%("COND:LONGVECTOR", 1, 1, 6, "selected", "")> value="readgt?gt=<?LONGVECTOR(7)>?startmsg=<?LONGVECTOR(6)>?maxmsgs=<?LONGVECTOR(3)>?is_summary=0?SortBy=date?SortOrder=<?BSTR("SortOrder")>"><?LONGVECTOR(4)>-<?LONGVECTOR(5)></option>
diff --git a/webcit/static/t/select_messageindex_all.html b/webcit/static/t/select_messageindex_all.html
new file mode 100644 (file)
index 0000000..9c123af
--- /dev/null
@@ -0,0 +1 @@
+<option <?%("COND:LONGVECTOR", 1, 1, 2, "", "selected")> value="readgt?gt=<?LONGVECTOR(7)>?startmsg=<?LONGVECTOR(6)>?maxmsgs=9999999?is_summary=0?SortBy=date?SortOrder=<?BSTR("SortOrder")>"><?_("All")></option>
diff --git a/webcit/static/t/sieve/add.html b/webcit/static/t/sieve/add.html
new file mode 100644 (file)
index 0000000..5d724ee
--- /dev/null
@@ -0,0 +1,35 @@
+<div id="room_banner_override">
+       <img src="static/webcit_icons/essen/32x32/config.png">
+       <h1><?_("Add or delete scripts")></h1>
+</div>
+<div id="content" class="service">
+       <table border=0 cellspacing=10><tr valign=top><td>
+               <?=("box_begin_1")><?_("Add a new script")><?=("box_begin_2")>
+                       <?_("To create a new script, enter the desired script name in the box below and click 'Create'.")>
+                       <br><br>
+                       <center><form method="POST" action="create_script">
+                               <input type="hidden" name="nonce" value="<?NONCE>">
+                               <?_("Script name: ")>
+                               <input type="text" name="script_name"><br>
+                               <input type="submit" name="create_button" value='<?_("Create")>'></form></center>
+               <?=("box_end")>
+               <?=("box_begin_1")><?_("Edit scripts")><?=("box_begin_2")>
+                       <br><div align="center">
+                       <a href="do_template?template=sieve_list"><?_("Return to the script editing screen")></a><br><br>
+               <?=("box_end")>
+       </td><td>
+               <?=("box_begin_1")><?_("Delete scripts")><?=("box_begin_2")>
+                       <?_("To delete an existing script, select the script name from the list and click 'Delete'.")>
+                       <br><br>
+                       <center><form method="POST" action="delete_script">
+                       <input type="hidden" name="nonce" value="<?NONCE>">
+                       <select name="script_name" size=10 style="width:100%%">
+                               <?ITERATE("SIEVE:SCRIPTS", ="sieve_script_select")>
+                       </select>
+                       <input type="submit" name="delete_button" value='<?_("Delete")>'></form>
+                       </form>
+               <?=("box_end")>
+       <td>
+       </tr>
+       </table>
+</div> <!-- end of 'content' div -->
diff --git a/webcit/static/t/sieve/display.html b/webcit/static/t/sieve/display.html
new file mode 100644 (file)
index 0000000..0bba5c0
--- /dev/null
@@ -0,0 +1,121 @@
+
+<script type="text/javascript">
+
+/*
+ * This script should get called by every onChange event...
+ *
+ */
+
+var highest_active_rule = (-1);
+
+function UpdateRules() {
+/*
+ * Show only the active rows... /// TODO 255-> we need no limit anymore.
+ */
+  highest_active_rule = (-1);
+  for (i=0; i< 50; ++i) {
+   if ($('active'+i).checked) {
+     $('rule' + i).style.display = 'block';
+     highest_active_rule = i;
+   }
+   else {
+     $('rule' + i).style.display = 'none';
+   }
+  }
+
+/*
+ * Show only the fields relevant to the rules...
+ */
+  for (i=0; i<=highest_active_rule; ++i) {
+    d = ($('movedown'+i));
+    if (i < highest_active_rule) {
+      d.style.display = 'block';
+    }
+    else {
+      d.style.display = 'none';
+    }
+    d = ($('hfield'+i).options[$('hfield'+i).selectedIndex].value);
+    if (d == 'all') {
+      $('div_size'+i).style.display = 'none';
+      $('div_compare'+i).style.display = 'none';
+      $('div_nocompare'+i).style.display = 'block';
+    }
+    else if (d == 'size') {
+      $('div_size'+i).style.display = 'block';
+      $('div_compare'+i).style.display = 'none';
+      $('div_nocompare'+i).style.display = 'none';
+    }
+    else {
+      $('div_size'+i).style.display = 'none';
+      $('div_compare'+i).style.display = 'block';
+      $('div_nocompare'+i).style.display = 'none';
+    }
+    d = ($('action'+i).options[$('action'+i).selectedIndex].value);
+    if (d == 'fileinto') {
+      $('div_fileinto'+i).style.display = 'block';
+      $('div_redirect'+i).style.display = 'none';
+      $('div_automsg'+i).style.display = 'none';
+    } else if (d == 'redirect') {
+      $('div_fileinto'+i).style.display = 'none';
+      $('div_redirect'+i).style.display = 'block';
+      $('div_automsg'+i).style.display = 'none';
+    } else if ((d == 'reject') || (d == 'vacation'))  {
+      $('div_fileinto'+i).style.display = 'none';
+      $('div_redirect'+i).style.display = 'none';
+      $('div_automsg'+i).style.display = 'block';
+    } else {
+      $('div_fileinto'+i).style.display = 'none';
+      $('div_redirect'+i).style.display = 'none';
+      $('div_automsg'+i).style.display = 'none';
+    }/* TODO: we don't have any limits anymore */
+    if (highest_active_rule < 49) {
+      $('div_addrule').style.display = 'block';
+    } else {
+      $('div_addrule').style.display = 'none';
+    }
+  }
+}
+
+/*
+ * Add a rule (really, just un-hide it)
+ */
+function AddRule() {
+  highest_active_rule = highest_active_rule + 1;
+  $('active'+highest_active_rule).checked = true;
+  UpdateRules();
+}
+
+/*
+ * Swap two rules
+ */
+function SwapRules(ra, rb) {
+
+  var things = new Array();
+  things[0] = 'hfield';
+  things[1] = 'compare';
+  things[2] = 'htext';
+  things[3] = 'action';
+  things[4] = 'fileinto';
+  things[5] = 'redirect';
+  things[6] = 'final';
+  things[7] = 'sizecomp';
+  things[8] = 'sizeval';
+  things[9] = 'automsg';
+
+  for (i=0; i<=9; ++i) {
+    tempval=$(things[i]+ra).value;
+    $(things[i]+ra).value = $(things[i]+rb).value;
+    $(things[i]+rb).value = tempval;
+  }
+}
+
+/*
+ * Delete a rule (percolate the deleted rule out to the end, then deactivate it)
+ */
+function DeleteRule(rd) {
+  for (j=rd; j<=highest_active_rule; ++j) {
+    SwapRules(j, (j+1));
+  }
+  $('active'+highest_active_rule).checked = false;
+}
+</script>
diff --git a/webcit/static/t/sieve/display_one.html b/webcit/static/t/sieve/display_one.html
new file mode 100644 (file)
index 0000000..1d71654
--- /dev/null
@@ -0,0 +1,97 @@
+<?SIEVE:SCRIPT:LOOKUP_FILEINTO><tr id="rule<?ITERATE:N>" class="<?ITERATE:ODDEVEN>">
+<td width=5% align="center">
+<div style="display:none">
+<input type="checkbox" name="active<?ITERATE:N>" id="active<?ITERATE:N>" <?%("COND:SIEVE:ACTIVE", 1, 0, 0, "checked", "")>>
+</div>
+<??("COND:ITERATE:FIRSTN", 1)><a href="javascript:SwapRules(<?ITERATE:N> - 1, <?ITERATE:N>);UpdateRules();"><img border="0" src="static/webcit_icons/up_pointer.gif" title='<?_("Move rule up")>'/></a><??("X", 1)>
+<??("COND:ITERATE:LASTN",  2)><a href="javascript:SwapRules(<?ITERATE:N>,<?ITERATE:N> + 1);UpdateRules();"><img id="movedown<?ITERATE:N>" border="0" src="static/webcit_icons/down_pointer.gif" title='<?_("Move rule down")>'/></a><??("X", 2)>
+<a href="javascript:DeleteRule(<?ITERATE:N>);UpdateRules();"><img id="delete<?ITERATE:N>" border="0" src="static/webcit_icons/delete.gif" title='<?_("Delete rule")>'/></a>
+
+</td>
+
+<td width=5% align="center">
+<font size=+2><script type="text/javascript"> $z = <?ITERATE:N> + 1; document.write($z);</script></font>
+</td>
+
+<td width=20%><?_("If")>
+
+<select id="hfield<?ITERATE:N>" name="hfield<?ITERATE:N>" size=1 onChange="UpdateRules();">
+
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"from",                "selected", "")> value="from"           ><?_("From")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"tocc",                "selected", "")> value="tocc"           ><?_("To or Cc")></option>              
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"subject",     "selected", "")> value="subject",       ><?_("Subject")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"replyto",     "selected", "")> value="replyto"        ><?_("Reply-to")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"sender",      "selected", "")> value="sender"         ><?_("Sender")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"resentfrom",  "selected", "")> value="resentfrom"     ><?_("Resent-From")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"resentto",    "selected", "")> value="resentto"       ><?_("Resent-To")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"envfrom",     "selected", "")> value="envfrom"        ><?_("Envelope From")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"envto",       "selected", "")> value="envto"          ><?_("Envelope To")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"xmailer",     "selected", "")> value="xmailer"        ><?_("X-Mailer")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"xspamflag",   "selected", "")> value="xspamflag"      ><?_("X-Spam-Flag")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"xspamstatus", "selected", "")> value="xspamstatus"    ><?_("X-Spam-Status")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"listid",      "selected", "")> value="listid"         ><?_("List-ID")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"size",                "selected", "")> value="size"           ><?_("Message size")></option>
+<option <?%("COND:SIEVE:HFIELD", 1, 0, #"all",         "selected", "")> value="all"            ><?_("All")></option>
+</select>
+</td>
+
+<td width=20%>
+<div id="div_compare<?ITERATE:N>">
+<select id="compare<?ITERATE:N>" name="compare<?ITERATE:N>" size=1 onChange="UpdateRules();">
+<option <?%("COND:SIEVE:COMPARE", 1, 0, #"contains",   "selected", "")> value="contains"><?_(          "contains"              )></option>
+<option <?%("COND:SIEVE:COMPARE", 1, 0, #"notcontains",        "selected", "")> value="notcontains"><?_(       "does not contain"      )></option>
+<option <?%("COND:SIEVE:COMPARE", 1, 0, #"is",         "selected", "")> value="is"><?_(                "is"                    )></option>
+<option <?%("COND:SIEVE:COMPARE", 1, 0, #"isnot",      "selected", "")> value="isnot"><?_(             "is not"                )></option>
+<option <?%("COND:SIEVE:COMPARE", 1, 0, #"matches",    "selected", "")> value="matches"><?_(           "matches"               )></option>
+<option <?%("COND:SIEVE:COMPARE", 1, 0, #"notmatches", "selected", "")> value="notmatches"><?_(        "does not match"        )></option>
+</select>
+
+<input type="text" id="htext<?ITERATE:N>" name="htext<?ITERATE:N>" value="<?SIEVE:SCRIPT:HTEXT("X")>">
+</div>
+
+<div id="div_nocompare<?ITERATE:N>"><?_("(All messages)")></div>
+
+<div id="div_size<?ITERATE:N>">
+<select id="sizecomp<?ITERATE:N>" name="sizecomp<?ITERATE:N>" size=1 onChange="UpdateRules();">
+<option <?%("COND:SIEVE:SIZECOMP", 1, 0, #"larger", "selected", "")> value="larger"><?_("is larger than")></option>
+<option <?%("COND:SIEVE:SIZECOMP", 1, 0, #"smaller", "selected", "")> value="smaller"><?_("is smaller than")></option>
+</select>
+<input type="text" id="sizeval<?ITERATE:N>" name="sizeval<?ITERATE:N>" value="<?SIEVE:SCRIPT:SIZE>"><?_("bytes")>
+</div>
+</td>
+
+<td width=20%>
+<select id="action<?ITERATE:N>" name="action<?ITERATE:N>" size=1 onChange="UpdateRules();">
+<option <?%("COND:SIEVE:ACTION", 1, 0, #"keep",        "selected", "")> value="keep"><?_("Keep")>              </option>
+<option <?%("COND:SIEVE:ACTION", 1, 0, #"discard",     "selected", "")> value="discard"><?_("Discard silently")></option>
+<option <?%("COND:SIEVE:ACTION", 1, 0, #"reject",      "selected", "")> value="reject"><?_("Reject")>          </option>
+<option <?%("COND:SIEVE:ACTION", 1, 0, #"fileinto",    "selected", "")> value="fileinto"><?_("Move message to")></option>
+<option <?%("COND:SIEVE:ACTION", 1, 0, #"redirect",    "selected", "")> value="redirect"><?_("Forward to")>    </option>
+<option <?%("COND:SIEVE:ACTION", 1, 0, #"vacation",    "selected", "")> value="vacation"><?_("Vacation")>      </option>
+</select>
+
+<div id="div_fileinto<?ITERATE:N>">
+<select name="fileinto<?ITERATE:N>" id="fileinto<?ITERATE:N>">
+<?ITERATE("LKRA", ="sieve_roomlist")>
+</select>
+</div>
+
+<div id="div_redirect<?ITERATE:N>">
+<input type="text" id="redirect<?ITERATE:N>" name="redirect<?ITERATE:N>" value='<?SIEVE:SCRIPT:REDIRECT("X")>'></div>
+
+<div id="div_automsg<?ITERATE:N>"><?_("Message:")><br>
+<textarea name="automsg<?ITERATE:N>" id="automsg<?ITERATE:N>" wrap=soft rows=5>
+<?SIEVE:SCRIPT:AUTOMSG("X")>
+</textarea>
+</div>
+
+</td>
+
+<td width=10% align="center"><?_("and then")></td>
+<td width=20%>
+<select name="final<?ITERATE:N>" id="final<?ITERATE:N>" size=1 onChange="UpdateRules();">
+<option <?%("COND:SIEVE:FINAL", 1, 0, #"continue", "selected", "")> value="continue"><?_("continue processing")></option>
+<option <?%("COND:SIEVE:FINAL", 1, 0, #"stop", "selected", "")> value="stop"><?_("stop")></option>
+</select>
+</td>
+</tr>
diff --git a/webcit/static/t/sieve/display_one_script.html b/webcit/static/t/sieve/display_one_script.html
new file mode 100644 (file)
index 0000000..3a2bb94
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="script_<?SIEVE:SCRIPT:NAME('U')>" style="display:none">
+<textarea name="text_<?SIEVE:SCRIPT:NAME("U")>" wrap=soft rows=20 cols=80 width=80><?SIEVE:SCRIPT:CONTENT("X")></textarea>
+</div>
diff --git a/webcit/static/t/sieve/empty.html b/webcit/static/t/sieve/empty.html
new file mode 100644 (file)
index 0000000..4a230f2
--- /dev/null
@@ -0,0 +1 @@
+<?--("this file was intentionaly left blank.")>
diff --git a/webcit/static/t/sieve/list.html b/webcit/static/t/sieve/list.html
new file mode 100644 (file)
index 0000000..292c240
--- /dev/null
@@ -0,0 +1,45 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+
+<div id="banner">
+       <img src="static/webcit_icons/essen/32x32/config.png">
+       <h1><?_("View/edit server-side mail filters")></h1>
+</div>
+
+<div id="content" class="service">
+
+  <table class="sieve_background">
+    <tr><td valign="top"><form id="sieveform" method="post" action="save_sieve">
+       <input type="hidden" name="nonce" value="<?NONCE>">
+
+       <?_("When new mail arrives: ")><br>
+       <?_("Filter it according to rules selected below")>
+
+       <!-- This is a hack to force everyone to use the "rules" version since we are abandoning Sieve.   -- ajc 2020jul11
+       <select name="bigaction" size=1 onChange="ToggleSievePanels();">
+         <option <?%("COND:BSTR", 1, "__SIEVE:RULESSCRIPT", 1, "", "selected")> value="0"><?_("Leave it in my inbox without filtering")></option>
+         <option <?%("COND:BSTR", 1, "__SIEVE:RULESSCRIPT", 1, "selected", "")> value="1"><?_("Filter it according to rules selected below")></option>
+         <option <?%("COND:BSTR", 1, "__SIEVE:EXTERNAL_SCRIPT", 1, "selected", "")> value="2"><?_("Filter it through a manually edited script (advanced users only)")></option>
+       </select>
+       -->
+
+       <div id="sievediv1">
+               <?=("sieve_display")><br>
+               <table cellpadding="2" width="100%" class="altern">
+                       <?ITERATE("SIEVE:RULES", ="sieve_display_one")>
+               </table>
+               <br>
+               <div id="div_addrule"><a href="javascript:AddRule();"><?_("Add rule")></a><br></div>
+               <script type="text/javascript">UpdateRules();</script>
+       </div>
+
+       <div align="center"><br>
+               <input type="submit" name="save_button" value='<?_("Save changes")>'>
+               &nbsp;
+               <input type="submit" name="cancel_button" value='<?_("Cancel")>'>
+       </div>
+  </form></td></tr></table>
+
+  <script type="text/javascript">ToggleSievePanels();</script>
+
+</div> <!-- end of 'content' div -->
+<?=("trailing")>
diff --git a/webcit/static/t/sieve/list_select_one.html b/webcit/static/t/sieve/list_select_one.html
new file mode 100644 (file)
index 0000000..25e9eaf
--- /dev/null
@@ -0,0 +1 @@
+<option <?%("COND:SIEVE:SCRIPT:ACTIVE" 1, 0, 0, "selected", "")> value="<?SIEVE:SCRIPT:NAME("U")>"><?SIEVE:SCRIPT:NAME("X")></option>
diff --git a/webcit/static/t/sieve/none.html b/webcit/static/t/sieve/none.html
new file mode 100644 (file)
index 0000000..70884c6
--- /dev/null
@@ -0,0 +1,11 @@
+<div id="room_banner_override">
+<img src="static/advanpage2_48x.gif">
+<h1>
+<?_("View/edit server-side mail filters")>
+</h1>
+</div>
+<div id="content" class="service">
+<table class="sieve_background"><tr><td valign=top>
+<?_("This installation of Citadel was built without support for server-side mail filtering.<br>Please contact your system administrator if you require this feature.<br>")>
+
+</td></tr></table>
diff --git a/webcit/static/t/sieve/roomlist.html b/webcit/static/t/sieve/roomlist.html
new file mode 100644 (file)
index 0000000..1c6a27b
--- /dev/null
@@ -0,0 +1 @@
+<option <?%("COND:THIS:THAT:ROOM", 1, 0, 0, "selected", "")> value='<?ROOM:INFO:NAME("X")>' ><?ROOM:INFO:NAME("X")></option>
diff --git a/webcit/static/t/sieve/script_select.html b/webcit/static/t/sieve/script_select.html
new file mode 100644 (file)
index 0000000..3887a54
--- /dev/null
@@ -0,0 +1 @@
+<option <?%("COND:SIEVE:SCRIPT:ACTIVE", 1, 0, "selected", "")> value="<?SIEVE:SCRIPT:NAME("U")>"><?SIEVE:SCRIPT:NAME("X")></option>
diff --git a/webcit/static/t/start_of_new_msgs.html b/webcit/static/t/start_of_new_msgs.html
new file mode 100644 (file)
index 0000000..62bc7da
--- /dev/null
@@ -0,0 +1,10 @@
+<a name="newmsgs"></a>
+<div class="moreprompt">
+&uarr;&uarr;&uarr;
+<?_("Old messages")>
+&uarr;&uarr;&uarr;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&darr;&darr;&darr;
+<?_("New messages")>
+&darr;&darr;&darr;
+</div>
diff --git a/webcit/static/t/summary/page.html b/webcit/static/t/summary/page.html
new file mode 100644 (file)
index 0000000..6daa3be
--- /dev/null
@@ -0,0 +1,82 @@
+<div id="room_banner_override">
+<table border=0><tr>
+<td><img src="static/webcit_icons/essen/32x32/summary.png"></td>
+<td><h1><?_("Summary page for ")>
+       <??("COND:LOGGEDIN", 1)><?CURRENT_USER("X")><??("X", 1)>
+       <?!("COND:LOGGEDIN", 2)><?SERV:HUMANNODE("X")><??("X", 2)>
+</h1><h2><?TIME:NOW></h2></td>
+</tr></table>
+</div>
+<?--("
+* You guessed it ... were going to refresh using ajax.
+* In the future we might consider updating individual sections of the summary
+* instead of the whole thing.
+")>
+<div class="service">
+  <table width="98%" cellspacing="3" cellpadding="0">
+    <tr valign=top>
+      <td width="33%">
+       <div class="box">       
+         <div class="boxlabel">        
+           <?_("Messages")>
+         </div><div class="boxcontent">        
+           <div id="msg_inner">
+               <img src="static/webcit_icons/throbber.gif">
+       </div></div></div>
+      </td>
+      <td width="33%">
+       <div class="box">       
+         <div class="boxlabel">        
+           <?_("Tasks")>
+         </div><div class="boxcontent">        
+           <div id="tasks_inner">      
+               <img src="static/webcit_icons/throbber.gif">
+       </div></div></div>
+      </td>
+      <td width="33%">
+       <div class="box">       
+         <div class="boxlabel">        
+           <?_("Today&nbsp;on&nbsp;your&nbsp;calendar")>
+         </div><div class="boxcontent">        
+           <div id="calendar_inner">
+               <img src="static/webcit_icons/throbber.gif">
+       </div></div></div>
+      </td>
+      
+    </tr><tr valign=top>
+
+      <td colspan=2>
+       <div class="box">       
+         <div class="boxlabel">        
+           <?_("Who‘s&nbsp;online&nbsp;now")>
+         </div><div class="boxcontent">
+           <div id="who_inner">
+               <img src="static/webcit_icons/throbber.gif">
+           </div></div></div>
+      </td>
+      <td width="33%">
+       <div class="box">       
+         <div class="boxlabel">        
+           <?_("About&nbsp;this&nbsp;server")>
+         </div><div class="boxcontent">        
+           <div id="info_inner">       
+             <?_("You are connected to")> <?SERV:HUMANNODE>,
+             <?_("running")> <?SERV:SOFTWARE> 
+             <?_("with")> <?PACKAGESTRING>, 
+             <?_("server build")> <?SERV:REV_LEVEL>
+             <?_("and located in")> <?SERV:BBS_CITY>.
+             <?_("Your system administrator is")> <?SERV:ADMIN>
+       </div></div></div>
+      </td>
+  </tr></table>
+
+</div>
+
+</div>
+
+<script type="text/javascript">
+ new Ajax.PeriodicalUpdater('msg_inner', 'new_messages_html', { method: 'get', frequency: 60 }  );
+ new Ajax.PeriodicalUpdater('tasks_inner', 'tasks_inner_html', { method: 'get', frequency: 120 }  );
+ new Ajax.PeriodicalUpdater('calendar_inner', 'calendar_inner_html', { method: 'get', frequency: 90 }  );
+ new Ajax.PeriodicalUpdater('who_inner', 'do_template?template=who_summary', { method: 'get', frequency: 30 }  );
+</script>
diff --git a/webcit/static/t/trailing.html b/webcit/static/t/trailing.html
new file mode 100644 (file)
index 0000000..5bbd082
--- /dev/null
@@ -0,0 +1,27 @@
+<!-- start trailing.html -->
+<div id="important_message"
+<??("COND:IMPMSG", 1)>
+style="visibility: hidden;"
+<?!("X", 1)>
+>
+<span class="imsg">
+<?IMPORTANTMESSAGE("X")>
+</span><br>
+</div>
+<?!("COND:IMPMSG", 2)>
+<script type="text/javascript">
+  setTimeout('hide_imsg_popup()', 5000);
+</script>
+<?!("X", 2)>
+
+<noscript><div id="noscript_warning">
+       <?_("WARNING: You have JavaScript disabled in your web browser.  Many functions of this system will not work properly.")>
+       </div></noscript>
+       <script type="text/javascript">
+               <?TRAILING_JAVASCRIPT>
+               if ( $("room_banner_override") && $("room_banner") ) {
+                       $("room_banner").innerHTML = $("room_banner_override").innerHTML;
+               }
+       </script>
+</body>
+</html>
diff --git a/webcit/static/t/user/edit_bio.html b/webcit/static/t/user/edit_bio.html
new file mode 100644 (file)
index 0000000..11ca668
--- /dev/null
@@ -0,0 +1,26 @@
+<?=("head")><?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+<?=("roombanner")>
+</div>
+<div id="content" class="service">
+
+<?=("box_begin_1")>
+<?_("Edit Room info")>
+<?=("box_begin_2")>
+
+<?_("Enter your bio below."> <?_("The text is formatted to the reader's browser. A newline is forced by preceding the next line by a blank.")>
+<form method="post" action="editbio">
+<input type="hidden" name="nonce" value="<?NONCE()>">
+<textarea name="msgtext" wrap=soft rows=10 cols=80 width=80><?USER:BIO("", "X")></textarea>
+
+<div class="buttons" >
+<input type="submit" name="save_button" value="<?_('Save changes')>">
+&nbsp;
+<input type="submit" name="cancel_button" value="<?_('Cancel')>"><br>
+</div>
+
+</form>
+<?=("box_end")>
+</div>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/user/list.html b/webcit/static/t/user/list.html
new file mode 100644 (file)
index 0000000..eb3f08d
--- /dev/null
@@ -0,0 +1,17 @@
+<?=("head")>
+<div id="banner">
+  <h1><?_("User list for ")> <?SERV:HUMANNODE("X")></h1>
+</div>
+<div id="content" class="service">
+
+  <table class="userlist_background"><tr><td>
+       <tr>
+         <th><?_("User Name")></th>
+         <th><?_("Number")></th>
+         <th><?_("Access Level")></th>
+         <th><?_("Last Login")></th>
+         <th><?_("Total Logins")></th>
+         <th><?_("Total Posts")></th>
+       </tr>
+       <?ITERATE("USERLIST", ="user_list_section")>
+</table>
diff --git a/webcit/static/t/user/list_section.html b/webcit/static/t/user/list_section.html
new file mode 100644 (file)
index 0000000..b4a8025
--- /dev/null
@@ -0,0 +1,8 @@
+<tr class="<?ITERATE:ODDEVEN>"><td>
+    <?!("COND:USERLIST:HAVEBIO", 1)><a href="do_template?template=user_show?who=<?USERLIST:USERNAME('U')>"><?USERLIST:USERNAME('X')></a><?!("X", 1)><??("COND:USERLIST:HAVEBIO", 2)><?USERLIST:USERNAME('X')><??("X", 2)>
+  </td>
+<td><?USERLIST:UID></td>
+<td><?USERLIST:ACCLVLSTR>(<?USERLIST:ACCLVLNO>)</td>
+<td><?USERLIST:LASTLOGON:STR></td>
+<td><?USERLIST:NLOGONS></td>
+<td><?USERLIST:NPOSTS></td>
diff --git a/webcit/static/t/user/show.html b/webcit/static/t/user/show.html
new file mode 100644 (file)
index 0000000..c9c599f
--- /dev/null
@@ -0,0 +1,27 @@
+<?=("head")>
+<div id="banner">
+  <img src="static/webcit_icons/essen/32x32/account.png" alt="">
+  <h1><?_("User profile")></h1>
+  <div id="navbar">
+    <ul><li><a href="display_page?recp=<?BSTR("who", "U")>">
+          <img src="static/webcit_icons/essen/16x16/chat.png" alt="">
+         <span class="navbar_link">
+        <?_("Click here to send an instant message to")> <?BSTR("who", "X")> </span></li></a>
+  </div>
+</div>
+<div id="content" class="service bio">
+  <table class="userlist_background">
+    <tr><td>
+       <center>
+         <table>
+           <tr><td>
+               <img src="userpic?user=<?BSTR("who", "U")>" alt="" border=0>
+             </td><td><h1>
+                 <?BSTR("who", "X")>
+       </h1></td></tr>
+       </table>
+       </center>
+       <?USER:BIO(B"who", "FJUSTIFY")>
+  </td></tr>
+  </table>
+<?=("trailing")>
diff --git a/webcit/static/t/vcard/edit.html b/webcit/static/t/vcard/edit.html
new file mode 100644 (file)
index 0000000..7990ce1
--- /dev/null
@@ -0,0 +1,81 @@
+<?=("box_begin_1")><?_("Edit contact information")><?=("box_begin_2")>
+
+<form method="POST" action="submit_vcard">
+<input type="hidden" name="nonce" value="<?NONCE()>">
+<table class="vcard_edit_background"><tr><td>
+
+<table border="0">
+<tr>
+  <td><?_("Prefix")></td>
+  <td><?_("First Name")></td>
+  <td><?_("Middle Name")></td>
+  <td><?_("Last Name")></td>
+  <td><?_("Suffix")></td>
+</tr>
+<tr>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.prefix")>' value='<?VC:ITEM(#"VC:.n.prefix", "X")>' maxlength="5" size="5"></td>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.first")>' value='<?VC:ITEM(#"VC:.n.first", "X")>' maxlength="29"></td>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.middle")>' value='<?VC:ITEM(#"VC:.n.middle", "X")>' maxlength="29"></td>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.last")>' value='<?VC:ITEM(#"VC:.n.last", "X")>' maxlength="29"></td>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.suffix")>' value='<?VC:ITEM(#"VC:.n.suffix", "X")>' maxlength="10" size="10"></td>
+</tr></table>
+
+<table  class="vcard_edit_background_alt">
+<tr>
+  <td>
+    <?_("Display name:")><br> <input type="text" name='VC:<?DEF:VAL(#"VC:.fn")>' value='<?VC:ITEM(#"VC:.fn", "X")>' maxlength="40"><br><br>
+    <?_("Title:")><br><input type="text" name='VC:<?DEF:VAL(#"VC:.title")>' value='<?VC:ITEM(#"VC:.title", "X")>' maxlength="40"><br><br>
+    <?_("Organization:")><br><input type="text" name='VC:<?DEF:VAL(#"VC:.org")>' value='<?VC:ITEM(#"VC:.org", "X")>' maxlength="40"><br><br>
+  </td>
+<td>
+
+<table border="0">
+  <tr><td><?_("PO box:")></td>   <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.POBox")>' value='<?VC:ITEM(#"VC:.adr.POBox", "X")>' maxlength="29"></td></tr>
+  <tr><td><?_("Address:")></td>  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.extadr")>' value='<?VC:ITEM(#"VC:.adr.extadr", "X")>' maxlength="29"></td></tr>
+  <tr><td></td>                  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.street")>' value='<?VC:ITEM(#"VC:.adr.street", "X")>' maxlength="29"></td></tr>
+  <tr><td><?_("City:")></td>     <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.city")>' value='<?VC:ITEM(#"VC:.adr.city", "X")>' maxlength="29"></td></tr>
+  <tr><td><?_("State:")></td>    <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.state")>' value='<?VC:ITEM(#"VC:.adr.state", "X")>' maxlength="29"></td></tr>
+  <tr><td><?_("ZIP code:")></td> <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.zip")>' value='<?VC:ITEM(#"VC:.adr.zip", "X")>' maxlength="10"></td></tr>
+  <tr><td><?_("Country:")></td>  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.country")>' value='<?VC:ITEM(#"VC:.adr.country", "X")>' maxlength="29" width="5"></td></tr>
+</table>
+
+</table>
+<table border=0>
+<tr>
+  <td><?_("Home telephone:")></td><td><input type="text" name='VC:<?DEF:VAL(#"VC:.tel;home")>' value='<?VC:ITEM(#"VC:.tel;home", "X")>' maxlength="29"></td>
+  <td><?_("Work telephone:")></td><td><input type="text" name='VC:<?DEF:VAL(#"VC:.tel;work")>' value='<?VC:ITEM(#"VC:.tel;work", "X")>' maxlength="29"></td>
+</tr>
+<tr>
+  <td><?_("Mobile telephone:")></td> <td><input type="text" name='VC:<?DEF:VAL(#"VC:.tel;cell")>' value='<?VC:ITEM(#"VC:.tel;cell", "X")>' maxlength="29"></td>
+  <td><?_("Fax number:")></td>       <td><input type="text" name='VC:<?DEF:VAL(#"VC:.tel;fax")>' value='<?VC:ITEM(#"VC:.tel;fax", "X")>' maxlength="29"></td>
+</tr></table>
+
+<??("COND:VC:SUPPRESS_EMAIL_FIELDS", 1)>
+<table class="vcard_edit_background_alt">
+<tr>
+  <td>
+    <table border=0>
+      <tr>
+       <td valign=top><?_("Primary Internet e-mail address")><br>
+         <input type="text" name='VC:<?DEF:VAL(#"VC:.email;internet")>' size=40 maxlength=60 value='<?VC:ITEM(#"VC:.email;internet", "X")>'><br>
+       </td>
+       <td valign=top><?_("Internet e-mail aliases")><br><textarea name="other_inetemail" rows=5 cols=40 width=40><?ITERATE("VC:TYPE", ="vcard_edit_email", 0, 0, -1, #"EmailAddr")></textarea>
+    </td>
+    </tr>
+    </table>
+</td></tr></table>
+<??("X", 1)>
+
+<input type="hidden" name='VC:<?DEF:VAL(#"VC:.version")>' value='<?VC:ITEM(#"VC:.version", "X")>'>
+<input type="hidden" name='VC:<?DEF:VAL(#"VC:.rev")>' value='<?VC:ITEM(#"VC:.rev", "X")>'>
+<input type="hidden" name='VC:<?DEF:VAL(#"VC:.label")>' value='<?VC:ITEM(#"VC:.label", "X")>'>
+<input type="hidden" name='VC:<?DEF:VAL(#"VC:.uid")>' value='<?VC:ITEM(#"VC:.uid", "X")>'>
+<input type="hidden" name="extrafields" value='<?VC:ITEM(#"VC:.uid", "X")>'>
+
+<input type="hidden" name="return_to" value="display_main_menu?go=Contacts">
+<div class="buttons">
+<input type="submit" name="ok_button" value="Save changes">&nbsp;<input type="submit" name="cancel_button" value="Cancel"></div>
+</td></tr></table>
+</form>
+<?=("box_end")>
+</div>
diff --git a/webcit/static/t/vcard/edit/email.html b/webcit/static/t/vcard/edit/email.html
new file mode 100644 (file)
index 0000000..fa01009
--- /dev/null
@@ -0,0 +1 @@
+<?ITERATE("VC:TYPE:ITEMS", ="vcard_edit_one_email")>
diff --git a/webcit/static/t/vcard/edit/one_email.html b/webcit/static/t/vcard/edit/one_email.html
new file mode 100644 (file)
index 0000000..0ef8e53
--- /dev/null
@@ -0,0 +1 @@
+<??("COND:ITERATE:FIRSTN", 1)><?CONTEXTSTR("X")><?!("X", 1)>
diff --git a/webcit/static/t/vcard/list.html b/webcit/static/t/vcard/list.html
new file mode 100644 (file)
index 0000000..531530b
--- /dev/null
@@ -0,0 +1 @@
+<?ITERATE("MAIL:VCARDS", ="vcard_list_item")> 
diff --git a/webcit/static/t/vcard/list/cell_end.html b/webcit/static/t/vcard/list/cell_end.html
new file mode 100644 (file)
index 0000000..9d58dda
--- /dev/null
@@ -0,0 +1 @@
+<td>&nbsp;</td>
diff --git a/webcit/static/t/vcard/list/empty.html b/webcit/static/t/vcard/list/empty.html
new file mode 100644 (file)
index 0000000..8b4583a
--- /dev/null
@@ -0,0 +1,4 @@
+<br><br><br><div align="center"><i>
+<?_("This address book is empty.")>
+</i></div>
+
diff --git a/webcit/static/t/vcard/list/head.html b/webcit/static/t/vcard/list/head.html
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/webcit/static/t/vcard/list/internal_error.html b/webcit/static/t/vcard/list/internal_error.html
new file mode 100644 (file)
index 0000000..0a8f141
--- /dev/null
@@ -0,0 +1,3 @@
+<br><br><br><div align="center"><i>
+<?_("An internal error has occurred.")>
+</i></div>
diff --git a/webcit/static/t/vcard/list/item.html b/webcit/static/t/vcard/list/item.html
new file mode 100644 (file)
index 0000000..7f04d0b
--- /dev/null
@@ -0,0 +1,10 @@
+<??("COND:ITERATE:FIRSTN", 40)><?!("COND:ITERATE:ISMOD", 45, #"NAMESPERPAGE", 0)><!--y=<?ITERATE:N()>--><?=("vcard_list_section_end")><??("X", 40)><??("X", 45)>
+<?!("COND:ITERATE:ISMOD", 10, #"NAMESPERPAGE", 0)><?=("vcard_list_section_start")><??("X", 10)>
+<?!("COND:ITERATE:ISMOD", 20, 4, 0)> <?=("vcard_list_row_start")><??("X", 20)>
+<td><!--X=<?ITERATE:N()>--><a href='readfwd?startmsg=<?VC:MSGNO()>?is_singlecard=1?maxmsgs=1?is_summary=0?alpha=<?BSTR("alpha")>'><?VC:ITEM(#"VC:.n.last", "X")> <?VC:ITEM(#"VC:.n.first", "X")><?VC:ITEM(#"VC:.n.middle", "X")> <?VC:ITEM(#"VC:.n.prefix", "X")> <?VC:ITEM(#"VC:.n.suffix", "X")></a></td>
+
+<??("COND:ITERATE:FIRSTN", 30)><?!("COND:ITERATE:ISMOD", 35, 4, 3)> <?=("vcard_list_row_end")><??("X", 35)><?!("X", 30)>
+<?!("COND:ITERATE:LASTN",  40)><??("COND:ITERATE:ISMOD", 45, 4, 3)> <?=("vcard_list_row_end")><??("X", 45)><?!("X", 40)>
+
+
+<?!("COND:ITERATE:LASTN",  40)><??("COND:ITERATE:ISMOD", 45, #"NAMESPERPAGE", 0)><!--z=<?ITERATE:N()>--><?=("vcard_list_section_end")><??("X", 45)><?!("X", 40)>
diff --git a/webcit/static/t/vcard/list/name.txt b/webcit/static/t/vcard/list/name.txt
new file mode 100644 (file)
index 0000000..e210fe2
--- /dev/null
@@ -0,0 +1 @@
+<?VC:ITEM(#"VC:.n.last", "")>;<?VC:ITEM(#"VC:.n.first", "")>;<?VC:ITEM(#"VC:.n.middle", "")>;<?VC:ITEM(#"VC:.n.prefix", "")>;<?VC:ITEM(#"VC:.n.suffix", "")>
diff --git a/webcit/static/t/vcard/list/row_end.html b/webcit/static/t/vcard/list/row_end.html
new file mode 100644 (file)
index 0000000..df16534
--- /dev/null
@@ -0,0 +1 @@
+</tr><!-- rowend -->
diff --git a/webcit/static/t/vcard/list/row_start.html b/webcit/static/t/vcard/list/row_start.html
new file mode 100644 (file)
index 0000000..b997a13
--- /dev/null
@@ -0,0 +1 @@
+<tr bgcolor='<?%("COND:ITERATE:ISMOD", 10, 8, 0, "#dddddd", "#ffffff")>'>
diff --git a/webcit/static/t/vcard/list/section_end.html b/webcit/static/t/vcard/list/section_end.html
new file mode 100644 (file)
index 0000000..ae9ebb5
--- /dev/null
@@ -0,0 +1,3 @@
+</table> <!-- sectionend -->
+</div>
+<!-- end tab <?ITERATE:N:DIV(#"NAMESPERPAGE")> of 10 -->
diff --git a/webcit/static/t/vcard/list/section_start.html b/webcit/static/t/vcard/list/section_start.html
new file mode 100644 (file)
index 0000000..4d9d5b0
--- /dev/null
@@ -0,0 +1,5 @@
+<!-- begin tab <?ITERATE:N:DIV(#"NAMESPERPAGE")> of 10 -->
+<div id="tabdiv<?ITERATE:N:DIV(#"NAMESPERPAGE")>" style='display:<?%("COND:ITERATE:FIRSTN", 1, 0, 0, "block", "none")>' class="tabcontent" >
+<table border="0" cellspacing="0" cellpadding="3" width="100%"><!--section start-->
+
+
diff --git a/webcit/static/t/vcard/msg_display.html b/webcit/static/t/vcard/msg_display.html
new file mode 100644 (file)
index 0000000..a55b03d
--- /dev/null
@@ -0,0 +1,44 @@
+<div class="message_content"><div>
+<div align="center">
+<table bgcolor="#aaaaaa" width="50%">
+<tr bgcolor="#aaaaaa">
+  <td colspan=2 bgcolor="#ffffff">
+  <img align="center" src="static/webcit_icons/essen/32x32/contact.png">
+  <font size="+1"><b><?VC:ITEM(#"VC:.fn", "X")></b></font>
+  <div align="right>"<?VC:ITEM(#"VC:.title", "X")></div>
+  <div align="right"><?VC:ITEM(#"VC:.org", "X")></div>
+</td>
+</tr>
+
+<?!("VC:HAVE:TYPE", 10, #"PhoneNumber")>
+<tr>
+ <td>Telephone:</td>
+ <td>
+<?ITERATE("VC:TYPE", ="vcard_msg_display_phone", 0, 0, -1, #"PhoneNumber")>
+ </td>
+</tr>
+<??("X", 10)>
+
+<?!("VC:HAVE:TYPE", 20, #"EmailAddr")>
+<tr>
+ <td>E-mail:</td>
+ <td>
+<?ITERATE("VC:TYPE", ="vcard_msg_display_email", 0, 0, -1, #"EmailAddr")>
+ </td>
+</tr>
+<?!("X", 20)>
+
+
+<?!("VC:HAVE:TYPE", 30, #"VC:.adr.address")>
+<tr>
+ <td><?VC:NAME(#"Address")>:</td>
+ <td>
+<?VC:ITEM(#"VC:.adr.POBox", "X")><br>
+<?VC:ITEM(#"VC:.adr.extadr", "X")><br>
+<?VC:ITEM(#"VC:.adr.street", "X")><br>
+<?VC:ITEM(#"VC:.adr.city", "X")> <?VC:ITEM(#"VC:.adr.state", "X")> <?VC:ITEM(#"VC:.adr.zip", "X")> <?VC:ITEM(#"VC:.adr.country", "X")>
+ </td>
+</tr>
+<?!("X", 30)>
+</table></div>
+
diff --git a/webcit/static/t/vcard/msg_display/email.html b/webcit/static/t/vcard/msg_display/email.html
new file mode 100644 (file)
index 0000000..9ffc2ea
--- /dev/null
@@ -0,0 +1,2 @@
+
+<?ITERATE("VC:TYPE:ITEMS", ="vcard_msg_display_one_email")>
diff --git a/webcit/static/t/vcard/msg_display/one_email.html b/webcit/static/t/vcard/msg_display/one_email.html
new file mode 100644 (file)
index 0000000..d8d49ce
--- /dev/null
@@ -0,0 +1 @@
+  <a href='display_enter?force_room=_MAIL_?recp=<?CONTEXTSTR("U")>'><?CONTEXTSTR("X")></a><??("COND:ITERATE:LASTN", 1)><br><??("X", 1)>
diff --git a/webcit/static/t/vcard/msg_display/phone.html b/webcit/static/t/vcard/msg_display/phone.html
new file mode 100644 (file)
index 0000000..7508faf
--- /dev/null
@@ -0,0 +1 @@
+<?VC:CTXNAME("X")>: <?VC:CTXITEM("X")><?!("COND:ITERATE:LASTN", 1)><br><??("X", 1)><??("COND:ITERATE:LASTN", 1)><br><??("X", 1)>
diff --git a/webcit/static/t/view_blog/comment.html b/webcit/static/t/view_blog/comment.html
new file mode 100644 (file)
index 0000000..387ed69
--- /dev/null
@@ -0,0 +1,23 @@
+<div class='<?%("COND:MAIL:SUMM:UNREAD", 1, 0, 0, "blog_comment", "blog_comment")>' id="blog_comment_<?MAIL:SUMM:N>">
+       <div class="blog_comment_header">
+               <span class="blog_commenter_name">
+               <??("COND:MAIL:ANON",1)>
+                       <?!("COND:MAIL:LOCAL", 2)><a href="do_template?template=user_show?who=<?MAIL:SUMM:FROM("Q")>"><?MAIL:SUMM:FROM("X")></a><?!("X", 2)>
+                       <??("COND:MAIL:LOCAL", 2)><?MAIL:SUMM:FROM("X")> &lt;<?MAIL:SUMM:RFCA>&gt;</a><?!("X", 2)>
+               <??("X", 1)>
+               &nbsp;says:&nbsp;</span>
+               <span class="blog_comment_date"><?MAIL:SUMM:DATEFULL></span>
+               <?!("COND:ROOM:EDITACCESS", 16)>
+                       <a href="#" onclick="if (confirm('<?_("Delete this message?")>')) { DeleteBlogComment(<?MAIL:SUMM:N>); }"><span>[</span><?_("Delete")><span>]</span> </a> 
+               <??("X", 16)>
+       </div>
+       <div class="blog_comment_content">
+               <?MAIL:BODY>
+               <?!("COND:MAIL:MIME:ATTACH:SUBMESSAGES", 10)>
+                       <?ITERATE("MAIL:MIME:ATTACH:SUBMESSAGES", ="view_message_inline_attach")>
+               <?!("X", 10)>
+               <?!("COND:MAIL:MIME:ATTACH:LINKS", 11)>
+                       <?ITERATE("MAIL:MIME:ATTACH:LINKS", ="view_message_list_attach")>
+               <?!("X", 11)>
+       </div>
+</div>
diff --git a/webcit/static/t/view_blog/comment_box.html b/webcit/static/t/view_blog/comment_box.html
new file mode 100644 (file)
index 0000000..d8fedef
--- /dev/null
@@ -0,0 +1,29 @@
+<script type="text/javascript">
+function submit_comment() {
+       $('comment_form_references').value = $('comment_replyto').innerHTML ;
+       return false;
+}
+</script>
+<div class="blog_comment">
+<span class="post_a_comment_title"><?_("Post a comment")></span>
+<form id="blog_comment_form" accept-charset="UTF-8" enctype="multipart/form-data"
+ method="POST" action="post#comments" onSubmit="submit_comment();">
+<input type="hidden" name="postseq" value="<?DATE:NOW:NO>">
+<input type="hidden" name="nonce" value="<?NONCE>">
+<input type="hidden" name="force_room" value="<?THISROOM:NAME("X")>">
+<input type="hidden" name="markdown" value="1"/>
+<input type="hidden" name="references" id="comment_form_references" /><br>
+<input type="hidden" name="p" value="<?BSTR('p')>">
+<textarea name="msgtext" id="comment_form_msgtext" cols=80 rows=10 style="width:98%"
+       <?!("COND:LOGGEDIN",1)>
+               onClick="javascript:GetLoggedInFirst(encodeURIComponent(window.location.href));"
+       <??("X",1)>
+>
+</textarea>
+<input type="submit" name="submit_action" value="Submit Comment"
+       <?!("COND:LOGGEDIN",1)>
+               disabled="disabled"
+       <??("X",1)>
+/>
+</form>
+</div>
diff --git a/webcit/static/t/view_blog/newer_posts.html b/webcit/static/t/view_blog/newer_posts.html
new file mode 100644 (file)
index 0000000..ac59da3
--- /dev/null
@@ -0,0 +1 @@
+<div class="newer_blog_posts"><a href='readfwd?go=<?THISROOM:NAME("U")>?firstp=<?BLOG:TOPLEVEL:MSGID()>?maxp=<?BSTR("maxp")>'><?_("Newer posts")> →</a></div>
diff --git a/webcit/static/t/view_blog/older_posts.html b/webcit/static/t/view_blog/older_posts.html
new file mode 100644 (file)
index 0000000..f48657e
--- /dev/null
@@ -0,0 +1 @@
+<div class="older_blog_posts"><a href='readfwd?go=<?THISROOM:NAME("U")>?firstp=<?BLOG:TOPLEVEL:MSGID()>?maxp=<?BSTR("maxp")>'>← <?_("Older posts")></a></div>
diff --git a/webcit/static/t/view_blog/post.html b/webcit/static/t/view_blog/post.html
new file mode 100644 (file)
index 0000000..3053b16
--- /dev/null
@@ -0,0 +1,29 @@
+<div class="blog_post" id="msgdiv|<?MAIL:SUMM:N>|<?MAIL:SUMM:INREPLYTO()>">
+       <div class="blog_post_title">
+               <?!("COND:MAIL:SUBJ", 7)><a class="blog_permalink_link" href='/readfwd?go=<?THISROOM:NAME("U")>?p=<?BLOG:TOPLEVEL:MSGID()>'><?MAIL:SUMM:SUBJECT("X")></a><??("X", 7)>
+       </div>
+       <div class="blog_post_content">
+               <div>   
+                       <?MAIL:BODY>
+                       <?!("COND:MAIL:MIME:ATTACH:SUBMESSAGES", 10)>
+                               <?ITERATE("MAIL:MIME:ATTACH:SUBMESSAGES", ="view_message_inline_attach")>
+                       <?!("X", 10)>
+                       <?!("COND:MAIL:MIME:ATTACH:LINKS", 11)>
+                               <?ITERATE("MAIL:MIME:ATTACH:LINKS", ="view_message_list_attach")>
+                       <?!("X", 11)>
+               </div>
+       </div>
+       <div class="blog_post_header">
+               <span>Posted by <??("COND:MAIL:ANON",1)>
+                       <?!("COND:MAIL:LOCAL", 2)><a href="do_template?template=user_show?who=<?MAIL:SUMM:FROM("Q")>"><?MAIL:SUMM:FROM("X")></a><?!("X", 2)>
+                       <??("COND:MAIL:LOCAL", 2)><?MAIL:SUMM:FROM("X")> &lt;<?MAIL:SUMM:RFCA>&gt;</a><?!("X", 2)>
+               <??("X", 1)></span>
+               <span>on <?MAIL:SUMM:DATEFULL></span>
+               <?!("COND:ROOM:EDITACCESS", 16)>
+                       <a href="delete_msg?msgid=<?MAIL:SUMM:N>" onclick="return confirm('<?_("Delete this message?")>');">
+                               <span>[</span><?_("Delete")><span>]</span>
+                       </a> 
+               <??("X", 16)>
+       </div>
+       <div id="comment_replyto" style="display:none"><?MAIL:SUMM:INREPLYTO("X")></div>
+<!-- closing /div provided by blogview_render.c -->
diff --git a/webcit/static/t/view_blog/show_commentlink.html b/webcit/static/t/view_blog/show_commentlink.html
new file mode 100644 (file)
index 0000000..bbb376d
--- /dev/null
@@ -0,0 +1 @@
+<a class="blog_show_comments_link" name="comments"></a> <?BLOG:COMMENTS:COUNT()> <?_("comments")> | <a class="blog_permalink_link" href='/readfwd?go=<?THISROOM:NAME("U")>?p=<?BLOG:TOPLEVEL:MSGID()>'><?_("permalink")></a></div>
diff --git a/webcit/static/t/view_blog/show_no_comments.html b/webcit/static/t/view_blog/show_no_comments.html
new file mode 100644 (file)
index 0000000..b6fa1c5
--- /dev/null
@@ -0,0 +1,3 @@
+<a class="blog_show_comments_link" href='readfwd?p=<?THISROOM:NAME("U")>?go=<?THISROOM:NAME("U")>?p=<?BLOG:TOPLEVEL:MSGID()>#comments'> <?BLOG:COMMENTS:COUNT()> <?_("comments")>
+<?BLOG:COMMENTS:UNREAD:COUNT()> <?_("new")></a> | 
+<a class="blog_permalink_link" href='/readfwd?go=<?THISROOM:NAME("U")>?p=<?BLOG:TOPLEVEL:MSGID()>'><?_("permalink")></a></div>
diff --git a/webcit/static/t/view_blog/sitemap.xml b/webcit/static/t/view_blog/sitemap.xml
new file mode 100644 (file)
index 0000000..ebd91fb
--- /dev/null
@@ -0,0 +1 @@
+<url><loc><?SERV:SITE:PREFIX("X")>/readfwd?go=<?THISROOM:NAME("U")>?p=<?BLOG:TOPLEVEL:MSGID()></loc></url>
diff --git a/webcit/static/t/view_json/message.js b/webcit/static/t/view_json/message.js
new file mode 100644 (file)
index 0000000..f6a92ac
--- /dev/null
@@ -0,0 +1,18 @@
+{"message": {
+       "from" : {
+               "name" : "<?MAIL:SUMM:FROM("J")>",
+               "email": "<?MAIL:SUMM:RFCA>"
+       },
+       "date" : "<?MAIL:SUMM:DATEFULL>",
+       "to" : {
+               "email" : "<?MAIL:SUMM:TO("J")>"
+       },
+       "cc" : {
+               "email" : "<?MAIL:SUMM:CCCC("J")>"
+       },
+       "subject" : "<?MAIL:SUMM:SUBJECT("J")>"
+  },
+       "body" : "<?MAIL:BODY("J")>",
+       "attachments" : [<?ITERATE("MAIL:MIME:ATTACH:LINKS", ="view_json_message_list_attach")>],
+       "submessages" : [<?ITERATE("MAIL:MIME:ATTACH:SUBMESSAGES", ="view_json_message_inline_attach")>]
+}
\ No newline at end of file
diff --git a/webcit/static/t/view_json/message_inline_attach.js b/webcit/static/t/view_json/message_inline_attach.js
new file mode 100644 (file)
index 0000000..01826a3
--- /dev/null
@@ -0,0 +1,7 @@
+{
+       "filename" : "<?MAIL:MIME:FILENAME("X")>",
+       "size" : "<?MAIL:MIME:LENGTH>",
+       "content-type" : "<?MAIL:MIME:CONTENTTYPE>",
+       "url" : "mimepart_download/<?MAIL:MIME:MSGNUM>/<?MAIL:MIME:PARTNUM>/<?MAIL:MIME:FILENAME("U")>",
+       "mime-data" : "<?MAIL:MIME:DATA>"
+},     
diff --git a/webcit/static/t/view_json/message_list_attach.js b/webcit/static/t/view_json/message_list_attach.js
new file mode 100644 (file)
index 0000000..7e87234
--- /dev/null
@@ -0,0 +1,7 @@
+{
+       "filename" : "<?MAIL:MIME:FILENAME("X")>",
+       "size" : "<?MAIL:MIME:LENGTH>",
+       "content-type" : "<?MAIL:MIME:CONTENTTYPE>",
+       "url" : "mimepart_download/<?MAIL:MIME:MSGNUM>/<?MAIL:MIME:PARTNUM>/<?MAIL:MIME:FILENAME("U")>",
+       "mime-data" : "<?MAIL:MIME:DATA>"
+},
\ No newline at end of file
diff --git a/webcit/static/t/view_mailq/footer.html b/webcit/static/t/view_mailq/footer.html
new file mode 100644 (file)
index 0000000..af46120
--- /dev/null
@@ -0,0 +1,12 @@
+</table></div>
+<?=("box_end")>
+<?!("COND:AIDE", 1)>
+<br><br><div align="center">
+<?_("You do not have permission to view this resource.")>
+</div><br><br>
+<?!("X", 1)>
+</div>
+<script type="text/javascript">
+ new Ajax.PeriodicalUpdater('mailq_sessions', 'do_template?template=who_active_smtpsessions',
+                            { method: 'get', frequency: 10 }  );
+</script>
diff --git a/webcit/static/t/view_mailq/footer_empty.html b/webcit/static/t/view_mailq/footer_empty.html
new file mode 100644 (file)
index 0000000..50ac5ad
--- /dev/null
@@ -0,0 +1,12 @@
+</table>
+</div>
+<br><br><div align="center">
+<?_("The queue is empty.")>
+</div><br><br>
+
+<?!("COND:AIDE", 1)>
+<br><br><div align="center">
+<?_("You do not have permission to view this resource.")>
+</div><br><br>
+<?!("X", 1)>
+</div>
diff --git a/webcit/static/t/view_mailq/footer_listonly.html b/webcit/static/t/view_mailq/footer_listonly.html
new file mode 100644 (file)
index 0000000..bdcc76e
--- /dev/null
@@ -0,0 +1 @@
+</table></div>
diff --git a/webcit/static/t/view_mailq/header.html b/webcit/static/t/view_mailq/header.html
new file mode 100644 (file)
index 0000000..8b078a8
--- /dev/null
@@ -0,0 +1,49 @@
+<div id="room_banner_override">
+<h1>
+<?_("View the outbound SMTP queue")>
+</h1>
+</div>
+
+<!--
+<table class="smtpqueue_background">
+<tr><td valign=top>
+<div id="smtpqueue_inner_div">
+<div align="center"><img src="static/webcit_icons/throbber.gif"></div>"
+</div>
+<div align="center">
+<a href="javascript:RefreshSMTPqueueDisplay();"><?_("Refresh this page")></a>
+</div>
+</td></tr></table>
+-->
+
+<div id="runqueue" class="runqueue" style="display:none">
+<?=("box_begin_1")><?_("HINT")><?=("box_begin_2")>
+<?_("Citadel reattempts sending mail per interval; it starts at 60 second, and doubles each time. You can however bypass this mechanism once; all messages will be reattempted on the next queue run.")>
+<a href="javascript:ToggleVisibility('runqueue_help1')"><?_("OK, got you, lets go!")></a>
+<?=("box_end")>
+</div>
+&nbsp;
+
+<div id="runqueue_help1" style="display:none">
+<?=("box_begin_1")><?=("box_begin_2")>
+<br><a href="javascript:SMTPRunQueue();"><?_("Reschedule all messages for delivery on next queue run")></a>
+<?=("box_end")>
+</div>
+&nbsp;
+
+<?=("box_begin_1")>
+<?_("Currently active mail delivery jobs")> ; 
+<?_("Remote Sites:")>;&nbsp 
+<?_("Status:")>;
+<?=("box_begin_2")>
+<div align="center">
+<?=("who_active_smtpsessions")>
+</div>
+<?=("box_end")>
+&nbsp;
+
+<?=("box_begin_1")><?_("Jobs waiting for further processing:")><?=("box_begin_2")>
+<div align="center">
+<a href="javascript:RefreshSMTPqueueDisplay();"><?_("Refresh this page")></a>
+</div>
+<?=("view_mailq_table")>
diff --git a/webcit/static/t/view_mailq/message.html b/webcit/static/t/view_mailq/message.html
new file mode 100644 (file)
index 0000000..8dcd00b
--- /dev/null
@@ -0,0 +1,11 @@
+<tr>
+<td><a href="javascript:DeleteSMTPqueueMsg(<?MAILQ:PAYLOAD:ID>,<?MAILQ:ID>);"><?_("(Delete)")></a><br>
+<?MAILQ:ID></td>
+<td><?MAILQ:SUBMITTED></td>
+<td><?MAILQ:ATTEMPTED></td>
+<td><?MAILQ:BOUNCETO()><br><?MAILQ:ENVELOPEFROM()><?!("COND:MAILQ:HAVESRCROOM", 1)><br><?_("Originaly posted in: ")><?MAILQ:SRCROOM("X")><?!("X", 1)></td>
+
+<td><table class="mailstatus">
+<?ITERATE("MAILQ:RCPT", ="view_mailq_recipient")>
+</table></td>
+</tr>
diff --git a/webcit/static/t/view_mailq/message_bearer.html b/webcit/static/t/view_mailq/message_bearer.html
new file mode 100644 (file)
index 0000000..939ded0
--- /dev/null
@@ -0,0 +1,2 @@
+<?--("this page was intentionaly left blank")>
+
diff --git a/webcit/static/t/view_mailq/recipient.html b/webcit/static/t/view_mailq/recipient.html
new file mode 100644 (file)
index 0000000..3a0a79d
--- /dev/null
@@ -0,0 +1,4 @@
+<tr >
+<td class="mailstatus_<?MAILQ:RCPT:STATUS()>"><?MAILQ:RCPT:ADDR()></td>
+<td class="mailstatus_<?MAILQ:RCPT:STATUS()>"><pre><?MAILQ:RCPT:STATUSMSG()></pre><td>
+</tr>
diff --git a/webcit/static/t/view_mailq/table.html b/webcit/static/t/view_mailq/table.html
new file mode 100644 (file)
index 0000000..4d036e4
--- /dev/null
@@ -0,0 +1,13 @@
+<div id="mailqueue_list">
+<table class="mailbox_summary" rules=rows cellpadding=2 style="width:100%%;">
+<tr><td><b><i>
+<?_("Message ID")>
+</i></b></td><td><b><i>
+<?_("Date/time submitted")>
+</i></b></td><td><b><i>
+<?_("Next attempt")>
+</i></b></td><td><b><i>
+<?_("Sender")>
+</i></b></td><td><b><i>
+<?_("Recipients")>
+</i></b></td></tr>
diff --git a/webcit/static/t/view_message.html b/webcit/static/t/view_message.html
new file mode 100644 (file)
index 0000000..e2d32c8
--- /dev/null
@@ -0,0 +1,49 @@
+<div class="message" id="msgdiv|<?MAIL:SUMM:N>|<?MAIL:SUMM:INREPLYTO()>">
+<?!("COND:ROOM:TYPE_IS", 13, #"VIEW_BBS")><a name="<?MAIL:SUMM:N>"></a><??("X", 13)>
+<??("COND:ROOM:TYPE_IS", 12, #"VIEW_WIKI")>
+<div class="message_header">
+<?!("COND:ROOM:TYPE_IS", 14, #"VIEW_BBS")><a href="<?MAIL:SUMM:PERMALINK>">[#]</a><??("X", 14)>
+ <span><?MAIL:SUMM:DATEFULL></span>
+ <?_("from ")>
+ <??("COND:MAIL:ANON",1)>
+   <?!("COND:MAIL:LOCAL", 2)><a href="do_template?template=user_show?who=<?MAIL:SUMM:FROM("Q")>"><?MAIL:SUMM:FROM("X")></a><?!("X", 2)>
+   <??("COND:MAIL:LOCAL", 2)><?MAIL:SUMM:FROM("X")> &lt;<?MAIL:SUMM:RFCA>&gt;</a><?!("X", 2)>
+ <??("X", 1)>
+ <?!("COND:MAIL:ANON", 4)>****<??("X", 4)>
+ <?!("COND:MAIL:TO", 5)><?_("to")> <?MAIL:SUMM:TO("X")><?!("X", 5)>
+<?!("COND:MAIL:SUMM:CCCC", 6)><br><?_("CC:")><?MAIL:SUMM:CCCC("X")><??("X", 6)>
+<?!("COND:MAIL:SUBJ", 7)><br><p class="message_subject"><?_("Subject:")> <?MAIL:SUMM:SUBJECT("X")></p><??("X", 7)>
+ <p id="msg<?MAIL:SUMM:N>" class="msgbuttons">
+<?!("COND:ROOM:TYPE_IS", 15, #"VIEW_MAILBOX")>
+ <a href="display_enter?edit=<?MAIL:SUMM:N>?recp=<?MAIL:SUMM:TO("U")>?cc=<?MAIL:SUMM:CCCC("U")>?subject=<?MAIL:SUMM:SUBJECT("U", 0, "", "")>?force_room=_MAIL_"><span>[</span><?_("Edit")><span>]</span></a> 
+<?!("X", 15)>
+<?!("COND:ROOM:TYPE_IS", 8, #"VIEW_BBS")>
+       <a href="javascript:GetLoggedInFirst(encodeURIComponent('display_enter?replying_to=<?MAIL:SUMM:N>'));"><span>[</span><?_("Reply")><span>]</span></a> 
+       <a href="javascript:GetLoggedInFirst(encodeURIComponent('display_enter?replying_to=<?MAIL:SUMM:N>?replyquote=<?MAIL:SUMM:N>'));"><span>[</span><?_("ReplyQuoted")><span>]</span></a> 
+<?!("X", 8)>
+<??("COND:ROOM:TYPE_IS", 9, #"VIEW_BBS")>
+       <a href="javascript:GetLoggedInFirst(encodeURIComponent('display_enter?replying_mode=reply?replying_to=<?MAIL:SUMM:N>?replyquote=<?MAIL:SUMM:N>'));"><span>[</span><?_("Reply")><span>]</span></a> 
+       <a href="javascript:GetLoggedInFirst(encodeURIComponent('display_enter?replying_mode=replyall?replying_to=<?MAIL:SUMM:N>?replyquote=<?MAIL:SUMM:N>'));"><span>[</span><?_("ReplyAll")><span>]</span></a> 
+       <a href="javascript:GetLoggedInFirst(encodeURIComponent('display_enter?replying_mode=forward?replying_to=<?MAIL:SUMM:N>?fwdquote=<?MAIL:SUMM:N>'));"><span>[</span><?_("Forward")><span>]</span></a> 
+<??("X", 9)>
+<?!("COND:ROOM:EDITACCESS", 16)>
+   <a href="do_template?template=msg_confirm_move?msgid=<?MAIL:SUMM:N>"><span>[</span><?_("Move")><span>]</span></a> 
+   <a href="delete_msg?msgid=<?MAIL:SUMM:N>" onclick="return confirm('<?_("Delete this message?")>');"><span>[</span><?_("Delete")><span>]</span> </a> 
+<??("X", 16)>
+   <a href="#" onclick="window.open('msgheaders/<?MAIL:SUMM:N>', 'headers<?MAIL:SUMM:N>', 'toolbar=no,location=no,directories=no,copyhistory=no,status=yes,scrollbars=yes,resizable=yes,width=600,height=400'); "><span>[</span><?_("Headers")><span>]</span></a>
+   <a href="#" onclick="window.open('printmsg/<?MAIL:SUMM:N>', 'print<?MAIL:SUMM:N>', 'toolbar=no,location=no,directories=no,copyhistory=no,status=yes,scrollbars=yes,resizable=yes,width=600,height=400'); "><span>[</span><?_("Print")><span>]</span></a>
+ </p>
+</div>
+<?!("X", 16)><?!("X", 12)>
+<div class="message_content"><div>
+<?MAIL:BODY>
+<?!("COND:MAIL:MIME:ATTACH:SUBMESSAGES", 10)>
+<?ITERATE("MAIL:MIME:ATTACH:SUBMESSAGES", ="view_message_inline_attach")>
+<?!("X", 10)>
+<?!("COND:MAIL:MIME:ATTACH:LINKS", 11)>
+<?ITERATE("MAIL:MIME:ATTACH:LINKS", ="view_message_list_attach")>
+<?!("X", 11)>
+
+</div>
+</div>
+</div>
diff --git a/webcit/static/t/view_message/inline_attach.html b/webcit/static/t/view_message/inline_attach.html
new file mode 100644 (file)
index 0000000..85ceffc
--- /dev/null
@@ -0,0 +1,9 @@
+<div class="display_inline_attachment">
+<img src="display_mime_icon?type=<?MAIL:MIME:CONTENTTYPE("U")>" border="0" align="middle" alt="">
+<?MAIL:MIME:FILENAME("X")>  (<?MAIL:MIME:CONTENTTYPE>, <?MAIL:MIME:LENGTH> bytes)
+[<a href="javascript:ToggleVisibility('ATTCH_ID_<?MAIL:MIME:FILENAME("X")>')"><?_("View")></a>|
+<a href="mimepart_download/<?MAIL:MIME:MSGNUM>/<?MAIL:MIME:PARTNUM>/<?MAIL:MIME:FILENAME("U")>"><?_("Download")></a>]<br>
+<div class="display_inline_attachment_body" id="ATTCH_ID_<?MAIL:MIME:FILENAME("X")>" style="display:none">
+<?MAIL:MIME:DATA>
+</div>
+</div>
diff --git a/webcit/static/t/view_message/list_attach.html b/webcit/static/t/view_message/list_attach.html
new file mode 100644 (file)
index 0000000..d8f5937
--- /dev/null
@@ -0,0 +1,4 @@
+<img src="display_mime_icon?type=<?MAIL:MIME:CONTENTTYPE("U")>" border="0" align="middle" alt="">
+<?MAIL:MIME:FILENAME("X")>  (<?MAIL:MIME:CONTENTTYPE>, <?MAIL:MIME:LENGTH> bytes) 
+[ <a href="mimepart/<?MAIL:MIME:MSGNUM>/<?MAIL:MIME:PARTNUM>/<?MAIL:MIME:FILENAME("U")>" target="wc.<?MAIL:MIME:MSGNUM>.<?MAIL:MIME:PARTNUM>"><?_("View")></a> | 
+ <a href="mimepart_download/<?MAIL:MIME:MSGNUM>/<?MAIL:MIME:PARTNUM>/<?MAIL:MIME:FILENAME("U")>"><?_("Download")></a> ]<br>
diff --git a/webcit/static/t/view_message/print.html b/webcit/static/t/view_message/print.html
new file mode 100644 (file)
index 0000000..ae051e2
--- /dev/null
@@ -0,0 +1,30 @@
+<html><head><title>
+<?CURRENT_USER>
+</title></head>
+<body onLoad=" window.print(); window.close(); ">
+<div class="message">
+<div class="message_header"><span><?MAIL:SUMM:DATEFULL></span>
+ <span><?MAIL:SUMM:DATEFULL></span>
+ <?_("from ")>
+ <??("COND:MAIL:ANON",1)>
+       <?!("COND:MAIL:LOCAL", 2)><a href="do_template?template=user_show?who=<?MAIL:SUMM:FROM("Q")>"><?MAIL:SUMM:FROM("X")></a><?!("X", 2)>
+       <??("COND:MAIL:LOCAL", 2)><?MAIL:SUMM:FROM("X")> &lt;<?MAIL:SUMM:RFCA>&gt;</a><?!("X", 2)>
+<??("X", 1)>
+ <?!("COND:MAIL:ANON", 4)>***<??("X", 4)>
+ <?!("COND:MAIL:TO", 5)><?_("to")> <?MAIL:SUMM:TO("X")><?!("X", 5)><br>
+<?!("COND:MAIL:SUMM:CCCC", 6)><?_("CC:")><?MAIL:SUMM:CCCC("X")><??("X", 6)>
+<?!("COND:MAIL:SUBJ", 7)><p class="message_subject"><?_("Subject:")> <?MAIL:SUMM:SUBJECT></p><??("X", 7)>
+</div>
+<div class="message_content"><div align="justify">
+<?MAIL:BODY>    
+</div>
+<?!("COND:MAIL:MIME:ATTACH:LINKS", 2)>
+<?ITERATE("MAIL:MIME:ATTACH:LINKS", ="view_message_list_attach")>
+<?!("X", 2)>
+
+<?!("COND:MAIL:MIME:ATTACH:SUBMESSAGES", 3)>
+<?ITERATE("MAIL:MIME:ATTACH:SUBMESSAGES", ="view_message_inline_attach")>
+<?!("X", 3)>
+
+</body>
+</html>
diff --git a/webcit/static/t/view_message/replyquote.html b/webcit/static/t/view_message/replyquote.html
new file mode 100644 (file)
index 0000000..58cda01
--- /dev/null
@@ -0,0 +1,13 @@
+<blockquote> <div class="message_header"> <span><?MAIL:SUMM:DATEFULL></span> 
+<??("COND:MAIL:ANON",1)>
+<span><?_("from ")>
+<?!("COND:MAIL:LOCAL", 2)><a href="do_template?template=user_show?who=<?MAIL:SUMM:FROM("Q")>"><?MAIL:SUMM:FROM("X")></a><?!("X", 2)>
+<??("COND:MAIL:LOCAL", 2)><?MAIL:SUMM:FROM("X")> &lt;<?MAIL:SUMM:RFCA>&gt;</a><?!("X", 2)>
+</span>
+<??("X", 1)><?!("COND:MAIL:ANON",5)><span><?_("from ")>***</span><??("X", 5)>
+<?!("COND:MAIL:SUBJ",6)><span class="message_subject"><?_("Subject:")> <?MAIL:SUMM:SUBJECT></span><?!("X", 6)>
+</div><?ITERATE("MAIL:MIME:ATTACH:ATT", ="load_attachments")>  
+ <div class="message_content"> <?MAIL:BODY>
+ <?!("COND:MAIL:MIME:ATTACH:SUBMESSAGES", 10)><?ITERATE("MAIL:MIME:ATTACH:SUBMESSAGES", ="view_message_inline_attach")><?!("X", 10)>
+</div>
+</blockquote>
diff --git a/webcit/static/t/view_message/wikiedit.html b/webcit/static/t/view_message/wikiedit.html
new file mode 100644 (file)
index 0000000..a448818
--- /dev/null
@@ -0,0 +1,4 @@
+<?MAIL:BODY>
+<?!("COND:MAIL:MIME:ATTACH:SUBMESSAGES", 10)>
+       <?ITERATE("MAIL:MIME:ATTACH:SUBMESSAGES", ="view_message_inline_attach")>
+<?!("X", 10)>
diff --git a/webcit/static/t/view_message_edit.html b/webcit/static/t/view_message_edit.html
new file mode 100644 (file)
index 0000000..4e2b88a
--- /dev/null
@@ -0,0 +1,3 @@
+<?ITERATE("MAIL:MIME:ATTACH:ATT", ="load_attachments")>  
+<?MAIL:BODY>
+ <?!("COND:MAIL:MIME:ATTACH:SUBMESSAGES", 10)><?ITERATE("MAIL:MIME:ATTACH:SUBMESSAGES", ="view_message_inline_attach")><?!("X", 10)>
diff --git a/webcit/static/t/view_submessage.html b/webcit/static/t/view_submessage.html
new file mode 100644 (file)
index 0000000..049fb0a
--- /dev/null
@@ -0,0 +1,15 @@
+<br><blockquote>
+<div class="message_header">
+  <span><?MAIL:SUMM:DATEFULL></span>
+  <span><?_("from ")>
+    <??("COND:MAIL:ANON",1)><?MAIL:SUMM:FROM("X")><??("X", 1)>
+    <?!("COND:MAIL:ANON",2)>***<??("X", 2)>
+  </span>
+  <p class="message_subject"><?MAIL:SUMM:SUBJECT></p>
+</div>
+
+<div class="message_content">
+<?MAIL:BODY>    
+</div>
+
+</blockquote>
diff --git a/webcit/static/t/viewomatic.html b/webcit/static/t/viewomatic.html
new file mode 100644 (file)
index 0000000..a21d527
--- /dev/null
@@ -0,0 +1,27 @@
+<form name="viewomatic" action="changeview">
+       <div style="display: inline;">
+               <input type="hidden" name="nonce" value="<?NONCE>">
+                       <label for="view_name"><?_("View as:")></label>
+                       <select name="newview" size="1" id="view_name" class="selectbox" OnChange="location.href=viewomatic.newview.options[selectedIndex].value">
+
+
+<?!("COND:THISROOM:HAVE_VIEW", 1, #"VIEW_BBS")><option value="changeview?view=<?DEF:VAL(#"VIEW_BBS")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_BBS", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_BBS", "X")></option><??("X", 1)>
+
+<?!("COND:THISROOM:HAVE_VIEW", 1, #"VIEW_MAILBOX")><option value="changeview?view=<?DEF:VAL(#"VIEW_MAILBOX")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_MAILBOX", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_MAILBOX", "X")></option><??("X", 1)>
+
+<?!("COND:THISROOM:HAVE_VIEW", 1, #"VIEW_ADDRESSBOOK")><option value="changeview?view=<?DEF:VAL(#"VIEW_ADDRESSBOOK")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_ADDRESSBOOK", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_ADDRESSBOOK", "X")></option><??("X", 1)>
+
+<?!("COND:THISROOM:HAVE_VIEW", 1, #"VIEW_CALENDAR")><option value="changeview?view=<?DEF:VAL(#"VIEW_CALENDAR")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_CALENDAR", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_CALENDAR", "X")></option><??("X", 1)>
+
+<?!("COND:THISROOM:HAVE_VIEW", 1, #"VIEW_TASKS")><option value="changeview?view=<?DEF:VAL(#"VIEW_TASKS")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_TASKS", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_TASKS", "X")></option><??("X", 1)>
+
+<?!("COND:THISROOM:HAVE_VIEW", 1, #"VIEW_NOTES")><option value="changeview?view=<?DEF:VAL(#"VIEW_NOTES")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_NOTES", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_NOTES", "X")></option><??("X", 1)>
+
+<?!("COND:THISROOM:HAVE_VIEW", 1, #"VIEW_WIKI")><option value="changeview?view=<?DEF:VAL(#"VIEW_WIKI")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_WIKI", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_WIKI", "X")></option><??("X", 1)>
+
+<?!("COND:THISROOM:HAVE_VIEW", 1, #"VIEW_JOURNAL")><option value="changeview?view=<?DEF:VAL(#"VIEW_JOURNAL")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_JOURNAL", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_JOURNAL", "X")></option><??("X", 1)>
+
+<?!("COND:THISROOM:HAVE_VIEW", 1, #"VIEW_BLOG")><option value="changeview?view=<?DEF:VAL(#"VIEW_BLOG")>" <?%("COND:THISROOM:CURR_VIEW", 2, #"VIEW_BLOG", 0, "selected", "")>><?ROOM:VIEW_STRING(#"VIEW_BLOG", "X")></option><??("X", 1)>
+                       </select>
+       </div>
+</form>
diff --git a/webcit/static/t/vnoteitem.html b/webcit/static/t/vnoteitem.html
new file mode 100644 (file)
index 0000000..61c6c2d
--- /dev/null
@@ -0,0 +1,62 @@
+<div id="note-<?VNOTE:UID>"
+       class="stickynote_outer"
+       style=" left: <?VNOTE:POS:LEFT>px; top: <?VNOTE:POS:TOP>px; width: <?VNOTE:POS:WIDTH>px; height: <?VNOTE:POS:HEIGHT>px; background-color: #<?VNOTE:COLOR>"
+>
+<!--begin title bar div-->
+       <div id='titlebar-<?VNOTE:UID>'
+               class="stickynote_titlebar"
+               onMouseDown="NotesDragMouseDown(event,'<?VNOTE:UID>')"
+               style=" background-color: #<?VNOTE:BGCOLOR>"
+       ><table border="0" cellpadding="0" cellspacing="0" width="100%">
+               <tr>
+                       <td align="left">
+                               <img onclick="NotesClickPalette(event,'<?VNOTE:UID>')" src="static/webcit_icons/8paint16.gif" alt="#">
+                       </td>
+                       <td></td><!-- nothing in the title bar, its just for dragging-->
+                       <td align="right">
+                               <img onclick="DeleteStickyNote(event,'<?VNOTE:UID>','<?_("Delete this note?")>')"
+                                       src="static/webcit_icons/closewindow.gif" alt="x"
+                               >
+                       </td>
+               </tr>
+       </table></div>
+<!--end title bar div; begin body div-->
+       <div id="notebody-<?VNOTE:UID>" class="stickynote_body">
+               <?VNOTE:MSG("X")>
+       </div>
+<!--end body div-->
+       <script type="text/javascript">
+               new Ajax.InPlaceEditor('notebody-<?VNOTE:UID>', 'ajax_update_note?note_uid=<?VNOTE:UID>',
+               {
+                       rows:<?VNOTE:POS:HEIGHT2>,
+                       cols:<?VNOTE:POS:WIDTH2>,
+                       onEnterHover:false,
+                       onLeaveHover:false,
+                       okText:'<?_("Save")>',
+                       cancelText:'<?_("Cancel")>',
+                       clickToEditText:'<?_("Click on any note to edit it.")>'
+               });
+       </script>
+       <div id="resize-<?VNOTE:UID>" class="stickynote_resize" onMouseDown="NotesResizeMouseDown(event,'<?VNOTE:UID>')"> </div>
+       <div id="palette-<?VNOTE:UID>" class="stickynote_palette">
+               <table border="0" cellpadding="0" cellspacing="0">
+                       <tr>
+                               <td onClick="NotesClickColor(event,'<?VNOTE:UID>',128,128,128,'#808080','#404040')" bgcolor="#808080"> </td>
+                               <td onClick="NotesClickColor(event,'<?VNOTE:UID>',255,128,128,'#ff8080','#7f4040')" bgcolor="#ff8080"> </td>
+                               <td onClick="NotesClickColor(event,'<?VNOTE:UID>',128,128,255,'#8080ff','#40407f')" bgcolor="#8080ff"> </td>
+                       </tr><tr>
+                               <td onClick="NotesClickColor(event,'<?VNOTE:UID>',255,255,128,'#ffff80','#7f7f40')" bgcolor="#ffff80"> </td>
+                               <td onClick="NotesClickColor(event,'<?VNOTE:UID>',128,255,128,'#80ff80','#407f40')" bgcolor="#80ff80"> </td>
+                               <td onClick="NotesClickColor(event,'<?VNOTE:UID>',255,128,255,'#ff80ff','#7f407f')" bgcolor="#ff80ff"> </td>
+                       </tr><tr>
+                               <td onClick="NotesClickColor(event,'<?VNOTE:UID>',128,255,255,'#80ffff','#407f7f')" bgcolor="#80ffff"> </td>
+                               <td onClick="NotesClickColor(event,'<?VNOTE:UID>',255,128,128,'#ff8080','#7f4040')" bgcolor="#ff8080"> </td>
+                               <td onClick="NotesClickColor(event,'<?VNOTE:UID>',128,128,128,'#808080','#404040')" bgcolor="#808080"> </td>
+                       </tr>
+               </table>
+       </div>
+</div>
+<div id="resize-<?VNOTE:UID>" class="stickynote_resize" onMouseDown="NotesResizeMouseDown(event,'<?VNOTE:UID>')"></div>
+<!--end resize handle div-->
+
+
diff --git a/webcit/static/t/who.html b/webcit/static/t/who.html
new file mode 100644 (file)
index 0000000..b68d5fa
--- /dev/null
@@ -0,0 +1,35 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+
+<script type="text/javascript">
+       function ConfirmKill() { 
+               return confirm('<?_("Do you really want to kill this session?")>');
+       }
+</script>
+
+<div id="banner" class="banner">
+       <h1>
+               <img alt="" src="static/webcit_icons/essen/32x32/user.png">
+               <?_("Users currently on ")><?SERV:HUMANNODE>
+       </h1>
+       <div id="actiondiv">
+               <ul class="room_actions">
+                       <li class="start_page"><?OFFERSTARTPAGE></li>
+                       <li><?=("loggedinas")></li>
+               </ul>
+       </div>
+       <div id="navbar"><ul><li>
+               <span class="navbar_link"><?_("Click on a name to read user info.  Click on")></span>
+               <img align="middle" src="static/webcit_icons/essen/16x16/chat.png" alt="(p)">
+               <span class="navbar_link"><?_("to send an instant message to that user.")></span>
+       </li></ul></div>
+</div>
+<div id="content" class="who_is_online">
+       <?DOBOXED(="who_box_list_static", ="who_list_static_header")>
+</div>
+<script type="text/javascript">
+ new Ajax.PeriodicalUpdater('who_inner', 'do_template?template=who_box_list_static',
+                            { method: 'get', frequency: 30 }  );
+</script>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/who/active_smtpsessions.html b/webcit/static/t/who/active_smtpsessions.html
new file mode 100644 (file)
index 0000000..8092044
--- /dev/null
@@ -0,0 +1,5 @@
+<div id="mailq_sessions">
+<table class="altern">
+<?ITERATE("WHOLIST", ="who_activesmtpsessions_one", "SYS_SMTP_Send")>
+</table>
+</div>
diff --git a/webcit/static/t/who/activesmtpsessions_one.html b/webcit/static/t/who/activesmtpsessions_one.html
new file mode 100644 (file)
index 0000000..c11c463
--- /dev/null
@@ -0,0 +1,16 @@
+<tr class="<?ITERATE:ODDEVEN>">
+       <td class="smtpstate_col">
+         <?WHO:USERAGENT("X")><br>
+       </td>
+       <!-- hostname -->
+       <td class="host_col">
+               <?WHO:HOST("X")>
+                       <?!("WHO:REALHOST", 8)><br><i> <?WHO:REALHOST("X")></i>
+               <?!("X", 8)>
+       </td>
+       <td class="edit_col">
+               <??("COND:AIDE", 1)>
+                       <a href="terminate_session?which_session=<?WHO:SESSION>?template=who" onClick="return ConfirmKill();"><?_("(kill)")></a>&nbsp;
+               <??("X", 1)>
+       </td>
+</tr>
diff --git a/webcit/static/t/who/bio.html b/webcit/static/t/who/bio.html
new file mode 100644 (file)
index 0000000..d5d2c0f
--- /dev/null
@@ -0,0 +1,26 @@
+<?=("head")>
+<?%("COND:LOGGEDIN", 1, 1, 1, "", ="paging")>
+<div id="banner">
+       <h1><img src="static/webcit_icons/essen/32x32/account.png" alt="">&nbsp;<?_("User profile")></h1>
+       <div id="actiondiv">
+               <ul class="room_actions"></ul>
+       </div>
+       <div id="navbar"><ul>
+               <li><a href="display_page?recp=<?BSTR("who", "U")>">
+                       <img src="static/webcit_icons/essen/16x16/chat.png" alt="">
+                       <span class="navbar_link"><?_("Click here to send an instant message to")> <?BSTR("who", "X")> </span>
+               </a></li>
+       </ul></div>
+</div>
+<div id="content" class="service">
+       <div id="bio_page">
+               <div id="bio_pic">
+               <img src="userpic?user=<?BSTR("who", "U")>" alt="" border=0>
+               </div>
+               <?!("X", 1)>
+               <div id="bio_title"><h1><?BSTR("who", "X")></h1></div>
+               <div id="bio_text">
+       <?USER:BIO(B"who", "FJUSTIFY")>
+               </div>
+       </div>
+<?=("trailing")>
diff --git a/webcit/static/t/who/box_list_static.html b/webcit/static/t/who/box_list_static.html
new file mode 100644 (file)
index 0000000..be05a9e
--- /dev/null
@@ -0,0 +1,13 @@
+<div id="who_inner" >
+       <table class="altern">
+               <tr>
+                       <th class="edit_col"> </th>
+                       <th colspan="2"> </th>
+                       <th><?_("User name")></th>
+                       <th><?_("Room")></th>
+                       <th class="host_col"><?_("From host")></th>
+               </tr>
+               <?ITERATE("WHOLIST", ="who_section", 0)>
+       </table>
+</div>
+
diff --git a/webcit/static/t/who/edit.html b/webcit/static/t/who/edit.html
new file mode 100644 (file)
index 0000000..90345f0
--- /dev/null
@@ -0,0 +1,52 @@
+<?=("head")>
+<div id="banner">
+<table class="who_banner"><tr><td>
+<span class="titlebar">
+<?_("Edit your session display")>
+</span></td></tr></table>
+</div>
+<div id="content">
+
+<?_("This screen allows you to change the way your session appears in the 'Who is online' listing. To turn off any 'fake' name you've previously set, simply click the appropriate 'change' button without typing anything in the corresponding box. ")>
+<br>
+
+<form method="POST" action="edit_me">
+<input type="hidden" name="nonce" value="<?NONCE>">
+<table border=0 width=100%%>
+
+<tr><td><b>
+<?_("Room name:")>
+</b></td>
+<td>
+<input type="text" name="fake_roomname" maxlength="64">
+</td>
+<td align="center">
+<input type="submit" name="change_room_name_button" value="<?_("Change room name")>">
+</td>
+</tr>
+
+<tr><td><b>
+<?_("Host name:")>
+</b></td><td>
+<input type="text" name="fake_hostname" maxlength="64">
+</td>
+<td align="center">
+<input type="submit" name="change_host_name_button" value="<?_("Change host name")>">
+</td>
+</tr>
+<??("COND:AIDE", 1)>
+       <tr><td><b>
+       <?_("User name:")>
+       </b></td><td>
+       <input type="text" name="fake_username" maxlength="64">
+       </td>
+       <td align="center">
+       <input type="submit" name "change_user_name_button" value="<?_("Change user name")>">           
+       </td>
+       </tr>
+<??("X", 1)>
+<tr><td> </td><td> </td><td align="center">
+<input type="submit" name="cancel_button" value="<?_("Cancel")>">
+</td></tr></table>
+</form></center>
+<?=("trailing")>
diff --git a/webcit/static/t/who/iconbar.html b/webcit/static/t/who/iconbar.html
new file mode 100644 (file)
index 0000000..cb436d9
--- /dev/null
@@ -0,0 +1 @@
+<?ITERATE("WHOLIST", ="who_iconbar_section", 0)>
diff --git a/webcit/static/t/who/iconbar_section.html b/webcit/static/t/who/iconbar_section.html
new file mode 100644 (file)
index 0000000..8105e94
--- /dev/null
@@ -0,0 +1 @@
+<li class="<?%("WHO:IDLE", 1, 0, 0, "inactiveuser", "activeuser")>"><a href='do_template?template=user_show?who=<?WHO:NAME("U")>'><?WHO:NAME("X")></a></li>
diff --git a/webcit/static/t/who/list_static_header.html b/webcit/static/t/who/list_static_header.html
new file mode 100644 (file)
index 0000000..26b3ca6
--- /dev/null
@@ -0,0 +1 @@
+<?_("Users currently on")> <?SERV:HUMANNODE>
diff --git a/webcit/static/t/who/section.html b/webcit/static/t/who/section.html
new file mode 100644 (file)
index 0000000..16bcbf2
--- /dev/null
@@ -0,0 +1,40 @@
+<tr class="<?ITERATE:ODDEVEN>">
+       <td class="edit_col">
+               <??("COND:AIDE", 1)><??("WHO:ISME", 2)>
+                       <a href="terminate_session?which_session=<?WHO:SESSION>?template=who" onClick="return ConfirmKill();"><?_("(kill)")></a>&nbsp;
+                       (<a href="display_edituser?username=<?WHO:NAME("U")>&edit_config_button=Edit+configuration&nonce=<?NONCE>"><?_("Edit configuration")></a>)&nbsp;
+                       (<a href="display_edituser?username=<?WHO:NAME("U")>&edit_abe_button=Edit+address+book+entry"><?_("Edit address book entry")></a>)
+               <??("X", 2)><??("X", 1)>
+       </td>
+       <!-- link to page this user -->
+       <td><a href="display_page?recp=<?WHO:NAME("X")>">
+               <img src="static/webcit_icons/essen/16x16/chat.png" alt="(p)" title="chat"></a> 
+       </td>
+       <!-- idle flag -->
+       <td>
+               <?!("WHO:IDLE", 4)>
+                       <img align="middle" src="static/webcit_icons/essen/16x16/user.png" alt="(<?_("idle since")>s <?WHO:IDLESINCE> <?_("Minutes")>)" title="(<?_("idle since")>s <?WHO:IDLESINCE> <?_("Minutes")>)">
+               <?!("X", 4)>
+               <??("WHO:IDLE", 5)>
+                       <img align="middle" src="static/webcit_icons/essen/16x16/activeuser.png" alt="(<?_("active")>)">
+               <?!("X", 5)>
+       </td>
+       <!--  username (link to user bio/photo page)  -->
+       <td>
+               <a href="do_template?template=user_show?who=<?WHO:NAME("U")>"><?WHO:NAME("X")></a>
+               <??("WHO:NSESSIONS", 6, 1)>[<?WHO:NSESSIONS>]<?!("X", 6)>
+       </td>
+       <!-- room -->
+       <td>
+               <?WHO:ROOM>
+               <?!("WHO:REALROOM", 7)>
+                       <br><i>  <?WHO:REALROOM("X")>  </i>
+               <?!("X", 7)>
+       </td>
+       <!-- hostname -->
+       <td class="host_col">
+               <?WHO:HOST("X")>
+                       <?!("WHO:REALHOST", 8)><br><i> <?WHO:REALHOST("X")></i>
+               <?!("X", 8)>
+       </td>
+</tr>
diff --git a/webcit/static/t/who/summary.html b/webcit/static/t/who/summary.html
new file mode 100644 (file)
index 0000000..5a99085
--- /dev/null
@@ -0,0 +1,9 @@
+<table class="altern">
+ <tr>
+  <th></th>
+  <th></th>
+  <th><?_("User name")></th>
+  <th><?_("Room")></th>
+</tr>
+<?ITERATE("WHOLIST", ="who_summary_section", 0)>
+</table>
diff --git a/webcit/static/t/who/summary_section.html b/webcit/static/t/who/summary_section.html
new file mode 100644 (file)
index 0000000..8c0f63d
--- /dev/null
@@ -0,0 +1,25 @@
+<tr class="<?ITERATE:ODDEVEN>">
+       <!-- link to page this user -->
+       <td width="5%"><a href="display_page?recp=<?WHO:NAME("X")>">
+               <img align="middle" src="static/webcit_icons/essen/16x16/chat.png" alt="(p)"></a> 
+       </td>
+       <!-- idle flag -->
+       <td width="5%">
+               <?!("WHO:IDLE", 4)>
+                       <img align="middle" src="static/webcit_icons/essen/16x16/user.png" alt="(<?_("idle since")>s <?WHO:IDLESINCE> <?_("Minutes")>)">
+               <?!("X", 4)>
+               <??("WHO:IDLE", 5)>
+                       <img align="middle" src="static/webcit_icons/essen/16x16/activeuser.png" alt="(<?_("active")>)">
+               <?!("X", 5)>
+       </td>
+       <td>
+               <!--  username (link to user bio/photo page)  -->
+               <a href="do_template?template=user_show?who=<?WHO:NAME("U")>"> <?WHO:NAME("X")></a> 
+               <??("WHO:NSESSIONS", 6, 0, 1)>[<?WHO:NSESSIONS>]<?!("X", 6)>
+               <!-- room -->
+       </td>
+       <td>
+               <?WHO:ROOM>
+               <?!("WHO:REALROOM", 7)><br><i>  <?WHO:REALROOM("X")>  </i><?!("X", 7)>
+       </td>
+</tr>
diff --git a/webcit/static/t/wiki/empty.html b/webcit/static/t/wiki/empty.html
new file mode 100644 (file)
index 0000000..742b42d
--- /dev/null
@@ -0,0 +1,10 @@
+<br><br>
+<div align="center">
+  <table border="0" bgcolor="#ffffff" cellpadding="10">
+    <tr><td align="center">
+       <br><b> <?_("There is no page called '"><?BSTR("pagename", "x")><?_("'here")>.
+       </b><br><br>
+       <?_("Select the 'Edit this page' link in the room banner if you would like to create this page.")>
+       <br><br>
+    </td></tr>
+</table></div>
diff --git a/webcit/static/t/wiki/history.html b/webcit/static/t/wiki/history.html
new file mode 100644 (file)
index 0000000..49d3d11
--- /dev/null
@@ -0,0 +1 @@
+<?DOBOXED("wiki_history_inner", _("History of edits for this page"))>
diff --git a/webcit/static/t/wiki/history_inner.html b/webcit/static/t/wiki/history_inner.html
new file mode 100644 (file)
index 0000000..c4a41d0
--- /dev/null
@@ -0,0 +1 @@
+<?WIKI:DISPLAYHISTORY>
diff --git a/webcit/static/t/wiki/pagelist.html b/webcit/static/t/wiki/pagelist.html
new file mode 100644 (file)
index 0000000..ddf9519
--- /dev/null
@@ -0,0 +1 @@
+<?DOBOXED("wiki_pagelist_inner", _("List of Wiki pages"))>
diff --git a/webcit/static/t/wiki/pagelist_inner.html b/webcit/static/t/wiki/pagelist_inner.html
new file mode 100644 (file)
index 0000000..9c6e474
--- /dev/null
@@ -0,0 +1 @@
+<?WIKI:DISPLAYPAGELIST>
diff --git a/webcit/static/table.js b/webcit/static/table.js
new file mode 100644 (file)
index 0000000..128c8ca
--- /dev/null
@@ -0,0 +1,114 @@
+var categories;
+/** 
+ * Task view table sorter
+ * Written by Mathew McBride <matt@mcbridematt.dhs.org>
+ * Copyright 2009 The Citadel Team
+ * Licensed under the GPL V3
+ */
+function gatherCategoriesFromTable() {
+       var tbody = document.getElementById("taskview");
+       var childNodes = tbody.childNodes;
+       for (i=0; i<=childNodes.length; i++) {
+               var child = childNodes[i]; // Should be TR
+               if (child != undefined && child.nodeName == "TR") {
+                       var childTds = child.getElementsByTagName("TD");
+                       if (childTds.length == 4) {
+                       var categoryTd = childTds[3];
+                       if (categoryTd != undefined) {
+                               // Get text child
+                               if (categoryTd.childNodes.length > 0 &&
+                                       categoryTd.childNodes[0].nodeType == 3) {
+                                               categories[categoryTd.childNodes[0].nodeValue]
+                                                       = categoryTd.childNodes[0].nodeValue;
+                                       }
+                       }
+               }
+       }
+}
+}
+function addCategoriesToSelector() {
+       var selector = document.getElementById("selectcategory");
+       for (description in categories) {
+               var newOptionElement = document.createElement("option");
+               newOptionElement.setAttribute("value", categories[description]);
+               var text = document.createTextNode(categories[description]);
+               newOptionElement.appendChild(text);
+               selector.appendChild(newOptionElement);
+       }
+}
+function filterCategories(event) {
+       hideAllExistingRows();
+       var selector = document.getElementById("selectcategory");
+       var selected = selector.selectedIndex;
+       var selectedCategory = selector.options[selected];
+               var tbody = document.getElementById("taskview");
+       var cat = selectedCategory.getAttribute("value");
+       var nodesToUnhide = new Array();
+       var curIndex = 0;
+       // Hunt down all the rows with this category using XPath
+       if (document.evaluate) { // Only if we can do so, of course 
+               var debugText = "";
+               var toEvaluate = null;
+               if (cat != 'showall') {
+               toEvaluate = "//tr[td='"+cat+"']";
+               } else {
+                       toEvaluate = "//tr[td]";
+               }
+               var trNodes = document.evaluate(toEvaluate,
+               document,
+               null,
+               XPathResult.ANY_TYPE,
+               null);
+       var trNode = trNodes.iterateNext();
+       while(trNode) {
+               debugText += "<br>"+trNode.nodeName;
+               nodesToUnhide[curIndex++] = trNode;
+               trNode = trNodes.iterateNext();
+       } 
+               
+       }
+       for (i=0;i<curIndex;i++) {
+               nodesToUnhide[i].style.display = "table-row";
+               if (((i-1) % 2) == 0) {
+                       nodesToUnhide[i].setAttribute("class","table-alt-row");
+               }
+       }
+}
+function hideAllExistingRows() {
+       var nodes = new Array();
+       var curIndex = 0;
+       if (document.evaluate) { // Only if we can do so, of course 
+               var debugText = "";
+               var toEvaluate = "//tr/td";
+               var tdNodes = document.evaluate(toEvaluate,
+               document,
+               null,
+               XPathResult.ANY_TYPE,
+               null);
+       var tdNode = tdNodes.iterateNext();
+       while(tdNode) {
+               // Get parent
+               var parent = tdNode.parentNode;
+               nodes[curIndex++] = parent;
+               tdNode = tdNodes.iterateNext();
+       } 
+       }
+       for(i=0;i<curIndex;i++) {
+               nodes[i].style.display = "none";
+               nodes[i].removeAttribute("class");
+       }
+}
+
+function taskViewActivate(event ) {
+       // Do not run if not tasks, do not run without XPath3
+       if (document.getElementById("taskview") != null && document.evaluate != null) {
+       // var count = countRowsInTaskView();
+       categories = new Object();
+       gatherCategoriesFromTable();
+       addCategoriesToSelector();
+       
+       $('selectcategory').observe('change', filterCategories);
+       filterCategories(null); // color the rows first
+       }
+}
+
diff --git a/webcit/static/unittest.js b/webcit/static/unittest.js
new file mode 100644 (file)
index 0000000..6c938a7
--- /dev/null
@@ -0,0 +1,568 @@
+// script.aculo.us unittest.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005-2010 Jon Tirsen (http://www.tirsen.com)
+//           (c) 2005-2010 Michael Schuerig (http://www.schuerig.de/michael/)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// experimental, Firefox-only
+Event.simulateMouse = function(element, eventName) {
+  var options = Object.extend({
+    pointerX: 0,
+    pointerY: 0,
+    buttons:  0,
+    ctrlKey:  false,
+    altKey:   false,
+    shiftKey: false,
+    metaKey:  false
+  }, arguments[2] || {});
+  var oEvent = document.createEvent("MouseEvents");
+  oEvent.initMouseEvent(eventName, true, true, document.defaultView, 
+    options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, 
+    options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element));
+  
+  if(this.mark) Element.remove(this.mark);
+  this.mark = document.createElement('div');
+  this.mark.appendChild(document.createTextNode(" "));
+  document.body.appendChild(this.mark);
+  this.mark.style.position = 'absolute';
+  this.mark.style.top = options.pointerY + "px";
+  this.mark.style.left = options.pointerX + "px";
+  this.mark.style.width = "5px";
+  this.mark.style.height = "5px;";
+  this.mark.style.borderTop = "1px solid red;";
+  this.mark.style.borderLeft = "1px solid red;";
+  
+  if(this.step)
+    alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
+  
+  $(element).dispatchEvent(oEvent);
+};
+
+// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
+// You need to downgrade to 1.0.4 for now to get this working
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
+Event.simulateKey = function(element, eventName) {
+  var options = Object.extend({
+    ctrlKey: false,
+    altKey: false,
+    shiftKey: false,
+    metaKey: false,
+    keyCode: 0,
+    charCode: 0
+  }, arguments[2] || {});
+
+  var oEvent = document.createEvent("KeyEvents");
+  oEvent.initKeyEvent(eventName, true, true, window, 
+    options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
+    options.keyCode, options.charCode );
+  $(element).dispatchEvent(oEvent);
+};
+
+Event.simulateKeys = function(element, command) {
+  for(var i=0; i<command.length; i++) {
+    Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
+  }
+};
+
+var Test = {};
+Test.Unit = {};
+
+// security exception workaround
+Test.Unit.inspect = Object.inspect;
+
+Test.Unit.Logger = Class.create();
+Test.Unit.Logger.prototype = {
+  initialize: function(log) {
+    this.log = $(log);
+    if (this.log) {
+      this._createLogTable();
+    }
+  },
+  start: function(testName) {
+    if (!this.log) return;
+    this.testName = testName;
+    this.lastLogLine = document.createElement('tr');
+    this.statusCell = document.createElement('td');
+    this.nameCell = document.createElement('td');
+    this.nameCell.className = "nameCell";
+    this.nameCell.appendChild(document.createTextNode(testName));
+    this.messageCell = document.createElement('td');
+    this.lastLogLine.appendChild(this.statusCell);
+    this.lastLogLine.appendChild(this.nameCell);
+    this.lastLogLine.appendChild(this.messageCell);
+    this.loglines.appendChild(this.lastLogLine);
+  },
+  finish: function(status, summary) {
+    if (!this.log) return;
+    this.lastLogLine.className = status;
+    this.statusCell.innerHTML = status;
+    this.messageCell.innerHTML = this._toHTML(summary);
+    this.addLinksToResults();
+  },
+  message: function(message) {
+    if (!this.log) return;
+    this.messageCell.innerHTML = this._toHTML(message);
+  },
+  summary: function(summary) {
+    if (!this.log) return;
+    this.logsummary.innerHTML = this._toHTML(summary);
+  },
+  _createLogTable: function() {
+    this.log.innerHTML =
+    '<div id="logsummary"></div>' +
+    '<table id="logtable">' +
+    '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
+    '<tbody id="loglines"></tbody>' +
+    '</table>';
+    this.logsummary = $('logsummary');
+    this.loglines = $('loglines');
+  },
+  _toHTML: function(txt) {
+    return txt.escapeHTML().replace(/\n/g,"<br>");
+  },
+  addLinksToResults: function(){ 
+    $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log
+      td.title = "Run only this test";
+      Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;});
+    });
+    $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log
+      td.title = "Run all tests";
+      Event.observe(td, 'click', function(){ window.location.search = "";});
+    });
+  }
+};
+
+Test.Unit.Runner = Class.create();
+Test.Unit.Runner.prototype = {
+  initialize: function(testcases) {
+    this.options = Object.extend({
+      testLog: 'testlog'
+    }, arguments[1] || {});
+    this.options.resultsURL = this.parseResultsURLQueryParameter();
+    this.options.tests      = this.parseTestsQueryParameter();
+    if (this.options.testLog) {
+      this.options.testLog = $(this.options.testLog) || null;
+    }
+    if(this.options.tests) {
+      this.tests = [];
+      for(var i = 0; i < this.options.tests.length; i++) {
+        if(/^test/.test(this.options.tests[i])) {
+          this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
+        }
+      }
+    } else {
+      if (this.options.test) {
+        this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
+      } else {
+        this.tests = [];
+        for(var testcase in testcases) {
+          if(/^test/.test(testcase)) {
+            this.tests.push(
+               new Test.Unit.Testcase(
+                 this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, 
+                 testcases[testcase], testcases["setup"], testcases["teardown"]
+               ));
+          }
+        }
+      }
+    }
+    this.currentTest = 0;
+    this.logger = new Test.Unit.Logger(this.options.testLog);
+    setTimeout(this.runTests.bind(this), 1000);
+  },
+  parseResultsURLQueryParameter: function() {
+    return window.location.search.parseQuery()["resultsURL"];
+  },
+  parseTestsQueryParameter: function(){
+    if (window.location.search.parseQuery()["tests"]){
+        return window.location.search.parseQuery()["tests"].split(',');
+    };
+  },
+  // Returns:
+  //  "ERROR" if there was an error,
+  //  "FAILURE" if there was a failure, or
+  //  "SUCCESS" if there was neither
+  getResult: function() {
+    var hasFailure = false;
+    for(var i=0;i<this.tests.length;i++) {
+      if (this.tests[i].errors > 0) {
+        return "ERROR";
+      }
+      if (this.tests[i].failures > 0) {
+        hasFailure = true;
+      }
+    }
+    if (hasFailure) {
+      return "FAILURE";
+    } else {
+      return "SUCCESS";
+    }
+  },
+  postResults: function() {
+    if (this.options.resultsURL) {
+      new Ajax.Request(this.options.resultsURL, 
+        { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
+    }
+  },
+  runTests: function() {
+    var test = this.tests[this.currentTest];
+    if (!test) {
+      // finished!
+      this.postResults();
+      this.logger.summary(this.summary());
+      return;
+    }
+    if(!test.isWaiting) {
+      this.logger.start(test.name);
+    }
+    test.run();
+    if(test.isWaiting) {
+      this.logger.message("Waiting for " + test.timeToWait + "ms");
+      setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
+    } else {
+      this.logger.finish(test.status(), test.summary());
+      this.currentTest++;
+      // tail recursive, hopefully the browser will skip the stackframe
+      this.runTests();
+    }
+  },
+  summary: function() {
+    var assertions = 0;
+    var failures = 0;
+    var errors = 0;
+    var messages = [];
+    for(var i=0;i<this.tests.length;i++) {
+      assertions +=   this.tests[i].assertions;
+      failures   +=   this.tests[i].failures;
+      errors     +=   this.tests[i].errors;
+    }
+    return (
+      (this.options.context ? this.options.context + ': ': '') + 
+      this.tests.length + " tests, " + 
+      assertions + " assertions, " + 
+      failures   + " failures, " +
+      errors     + " errors");
+  }
+};
+
+Test.Unit.Assertions = Class.create();
+Test.Unit.Assertions.prototype = {
+  initialize: function() {
+    this.assertions = 0;
+    this.failures   = 0;
+    this.errors     = 0;
+    this.messages   = [];
+  },
+  summary: function() {
+    return (
+      this.assertions + " assertions, " + 
+      this.failures   + " failures, " +
+      this.errors     + " errors" + "\n" +
+      this.messages.join("\n"));
+  },
+  pass: function() {
+    this.assertions++;
+  },
+  fail: function(message) {
+    this.failures++;
+    this.messages.push("Failure: " + message);
+  },
+  info: function(message) {
+    this.messages.push("Info: " + message);
+  },
+  error: function(error) {
+    this.errors++;
+    this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
+  },
+  status: function() {
+    if (this.failures > 0) return 'failed';
+    if (this.errors > 0) return 'error';
+    return 'passed';
+  },
+  assert: function(expression) {
+    var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
+    try { expression ? this.pass() : 
+      this.fail(message); }
+    catch(e) { this.error(e); }
+  },
+  assertEqual: function(expected, actual) {
+    var message = arguments[2] || "assertEqual";
+    try { (expected == actual) ? this.pass() :
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 
+        '", actual "' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertInspect: function(expected, actual) {
+    var message = arguments[2] || "assertInspect";
+    try { (expected == actual.inspect()) ? this.pass() :
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 
+        '", actual "' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertEnumEqual: function(expected, actual) {
+    var message = arguments[2] || "assertEnumEqual";
+    try { $A(expected).length == $A(actual).length && 
+      expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
+        this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + 
+          ', actual ' + Test.Unit.inspect(actual)); }
+    catch(e) { this.error(e); }
+  },
+  assertNotEqual: function(expected, actual) {
+    var message = arguments[2] || "assertNotEqual";
+    try { (expected != actual) ? this.pass() : 
+      this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertIdentical: function(expected, actual) { 
+    var message = arguments[2] || "assertIdentical"; 
+    try { (expected === actual) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + Test.Unit.inspect(actual) + '"'); } 
+    catch(e) { this.error(e); } 
+  },
+  assertNotIdentical: function(expected, actual) { 
+    var message = arguments[2] || "assertNotIdentical"; 
+    try { !(expected === actual) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + Test.Unit.inspect(actual) + '"'); } 
+    catch(e) { this.error(e); } 
+  },
+  assertNull: function(obj) {
+    var message = arguments[1] || 'assertNull';
+    try { (obj==null) ? this.pass() : 
+      this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertMatch: function(expected, actual) {
+    var message = arguments[2] || 'assertMatch';
+    var regex = new RegExp(expected);
+    try { (regex.exec(actual)) ? this.pass() :
+      this.fail(message + ' : regex: "' +  Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertHidden: function(element) {
+    var message = arguments[1] || 'assertHidden';
+    this.assertEqual("none", element.style.display, message);
+  },
+  assertNotNull: function(object) {
+    var message = arguments[1] || 'assertNotNull';
+    this.assert(object != null, message);
+  },
+  assertType: function(expected, actual) {
+    var message = arguments[2] || 'assertType';
+    try { 
+      (actual.constructor == expected) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + (actual.constructor) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertNotOfType: function(expected, actual) {
+    var message = arguments[2] || 'assertNotOfType';
+    try { 
+      (actual.constructor != expected) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + (actual.constructor) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertInstanceOf: function(expected, actual) {
+    var message = arguments[2] || 'assertInstanceOf';
+    try { 
+      (actual instanceof expected) ? this.pass() : 
+      this.fail(message + ": object was not an instance of the expected type"); }
+    catch(e) { this.error(e); } 
+  },
+  assertNotInstanceOf: function(expected, actual) {
+    var message = arguments[2] || 'assertNotInstanceOf';
+    try { 
+      !(actual instanceof expected) ? this.pass() : 
+      this.fail(message + ": object was an instance of the not expected type"); }
+    catch(e) { this.error(e); } 
+  },
+  assertRespondsTo: function(method, obj) {
+    var message = arguments[2] || 'assertRespondsTo';
+    try {
+      (obj[method] && typeof obj[method] == 'function') ? this.pass() : 
+      this.fail(message + ": object doesn't respond to [" + method + "]"); }
+    catch(e) { this.error(e); }
+  },
+  assertReturnsTrue: function(method, obj) {
+    var message = arguments[2] || 'assertReturnsTrue';
+    try {
+      var m = obj[method];
+      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+      m() ? this.pass() : 
+      this.fail(message + ": method returned false"); }
+    catch(e) { this.error(e); }
+  },
+  assertReturnsFalse: function(method, obj) {
+    var message = arguments[2] || 'assertReturnsFalse';
+    try {
+      var m = obj[method];
+      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+      !m() ? this.pass() : 
+      this.fail(message + ": method returned true"); }
+    catch(e) { this.error(e); }
+  },
+  assertRaise: function(exceptionName, method) {
+    var message = arguments[2] || 'assertRaise';
+    try { 
+      method();
+      this.fail(message + ": exception expected but none was raised"); }
+    catch(e) {
+      ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); 
+    }
+  },
+  assertElementsMatch: function() {
+    var expressions = $A(arguments), elements = $A(expressions.shift());
+    if (elements.length != expressions.length) {
+      this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
+      return false;
+    }
+    elements.zip(expressions).all(function(pair, index) {
+      var element = $(pair.first()), expression = pair.last();
+      if (element.match(expression)) return true;
+      this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
+    }.bind(this)) && this.pass();
+  },
+  assertElementMatches: function(element, expression) {
+    this.assertElementsMatch([element], expression);
+  },
+  benchmark: function(operation, iterations) {
+    var startAt = new Date();
+    (iterations || 1).times(operation);
+    var timeTaken = ((new Date())-startAt);
+    this.info((arguments[2] || 'Operation') + ' finished ' + 
+       iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+    return timeTaken;
+  },
+  _isVisible: function(element) {
+    element = $(element);
+    if(!element.parentNode) return true;
+    this.assertNotNull(element);
+    if(element.style && Element.getStyle(element, 'display') == 'none')
+      return false;
+    
+    return this._isVisible(element.parentNode);
+  },
+  assertNotVisible: function(element) {
+    this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
+  },
+  assertVisible: function(element) {
+    this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
+  },
+  benchmark: function(operation, iterations) {
+    var startAt = new Date();
+    (iterations || 1).times(operation);
+    var timeTaken = ((new Date())-startAt);
+    this.info((arguments[2] || 'Operation') + ' finished ' + 
+       iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+    return timeTaken;
+  }
+};
+
+Test.Unit.Testcase = Class.create();
+Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
+  initialize: function(name, test, setup, teardown) {
+    Test.Unit.Assertions.prototype.initialize.bind(this)();
+    this.name           = name;
+    
+    if(typeof test == 'string') {
+      test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
+      test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
+      this.test = function() {
+        eval('with(this){'+test+'}');
+      }
+    } else {
+      this.test = test || function() {};
+    }
+    
+    this.setup          = setup || function() {};
+    this.teardown       = teardown || function() {};
+    this.isWaiting      = false;
+    this.timeToWait     = 1000;
+  },
+  wait: function(time, nextPart) {
+    this.isWaiting = true;
+    this.test = nextPart;
+    this.timeToWait = time;
+  },
+  run: function() {
+    try {
+      try {
+        if (!this.isWaiting) this.setup.bind(this)();
+        this.isWaiting = false;
+        this.test.bind(this)();
+      } finally {
+        if(!this.isWaiting) {
+          this.teardown.bind(this)();
+        }
+      }
+    }
+    catch(e) { this.error(e); }
+  }
+});
+
+// *EXPERIMENTAL* BDD-style testing to please non-technical folk
+// This draws many ideas from RSpec http://rspec.rubyforge.org/
+
+Test.setupBDDExtensionMethods = function(){
+  var METHODMAP = {
+    shouldEqual:     'assertEqual',
+    shouldNotEqual:  'assertNotEqual',
+    shouldEqualEnum: 'assertEnumEqual',
+    shouldBeA:       'assertType',
+    shouldNotBeA:    'assertNotOfType',
+    shouldBeAn:      'assertType',
+    shouldNotBeAn:   'assertNotOfType',
+    shouldBeNull:    'assertNull',
+    shouldNotBeNull: 'assertNotNull',
+    
+    shouldBe:        'assertReturnsTrue',
+    shouldNotBe:     'assertReturnsFalse',
+    shouldRespondTo: 'assertRespondsTo'
+  };
+  var makeAssertion = function(assertion, args, object) { 
+       this[assertion].apply(this,(args || []).concat([object]));
+  };
+  
+  Test.BDDMethods = {};   
+  $H(METHODMAP).each(function(pair) { 
+    Test.BDDMethods[pair.key] = function() { 
+       var args = $A(arguments); 
+       var scope = args.shift(); 
+       makeAssertion.apply(scope, [pair.value, args, this]); }; 
+  });
+  
+  [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each(
+    function(p){ Object.extend(p, Test.BDDMethods) }
+  );
+};
+
+Test.context = function(name, spec, log){
+  Test.setupBDDExtensionMethods();
+  
+  var compiledSpec = {};
+  var titles = {};
+  for(specName in spec) {
+    switch(specName){
+      case "setup":
+      case "teardown":
+        compiledSpec[specName] = spec[specName];
+        break;
+      default:
+        var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
+        var body = spec[specName].toString().split('\n').slice(1);
+        if(/^\{/.test(body[0])) body = body.slice(1);
+        body.pop();
+        body = body.map(function(statement){ 
+          return statement.strip()
+        });
+        compiledSpec[testName] = body.join('\n');
+        titles[testName] = specName;
+    }
+  }
+  new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
+};
diff --git a/webcit/static/util.js b/webcit/static/util.js
new file mode 100644 (file)
index 0000000..8a94c4f
--- /dev/null
@@ -0,0 +1,435 @@
+// small but works-for-me stuff for testing javascripts
+// not ready for "production" use
+
+Object.inspect = function(obj) {
+  var info = [];
+  
+  if(typeof obj in ["string","number"]) {
+    return obj;
+  } else {
+    for(property in obj)
+      if(typeof obj[property]!="function")
+        info.push(property + ' => ' + 
+          (typeof obj[property] == "string" ?
+            '"' + obj[property] + '"' :
+            obj[property]));
+  }
+  
+  return ("'" + obj + "' #" + typeof obj + 
+    ": {" + info.join(", ") + "}");
+}
+
+// borrowed from http://www.schuerig.de/michael/javascript/stdext.js
+// Copyright (c) 2005, Michael Schuerig, michael@schuerig.de
+// License
+// 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 
+// See http://www.gnu.org/copyleft/lesser.html
+
+Array.flatten = function(array, excludeUndefined) {
+  if (excludeUndefined === undefined) {
+    excludeUndefined = false;
+  }
+  var result = [];
+  var len = array.length;
+  for (var i = 0; i < len; i++) {
+    var el = array[i];
+    if (el instanceof Array) {
+      var flat = el.flatten(excludeUndefined);
+      result = result.concat(flat);
+    } else if (!excludeUndefined || el != undefined) {
+      result.push(el);
+    }
+  }
+  return result;
+};
+
+if (!Array.prototype.flatten) {
+  Array.prototype.flatten = function(excludeUndefined) {
+    return Array.flatten(this, excludeUndefined);
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Builder = {
+  node: function(elementName) {
+    var element = document.createElement('div');
+    element.innerHTML = 
+      "<" + elementName + "></" + elementName + ">";
+
+    // attributes (or text)
+    if(arguments[1])
+      if(this._isStringOrNumber(arguments[1]) ||
+        (arguments[1] instanceof Array)) {
+          this._children(element.firstChild, arguments[1]);
+        } else {
+          var attrs = this._attributes(arguments[1]);
+          if(attrs.length) 
+            element.innerHTML = "<" +elementName + " " +
+              attrs + "></" + elementName + ">";
+        } 
+
+    // text, or array of children
+    if(arguments[2])
+      this._children(element.firstChild, arguments[2]);
+
+     return element.firstChild;
+  },
+  _text: function(text) {
+     return document.createTextNode(text);
+  },
+  _attributes: function(attributes) {
+    var attrs = [];
+    for(attribute in attributes)
+      attrs.push((attribute=='className' ? 'class' : attribute) +
+          '="' + attributes[attribute].toString().escapeHTML() + '"');
+    return attrs.join(" ");
+  },
+  _children: function(element, children) {
+    if(typeof children=='object') { // array can hold nodes and text
+      children = children.flatten();
+      for(var i = 0; i<children.length; i++)
+        if(typeof children[i]=='object')
+          element.appendChild(children[i]);
+        else
+          if(this._isStringOrNumber(children[i]))
+            element.appendChild(this._text(children[i]));
+    } else
+      if(this._isStringOrNumber(children)) 
+         element.appendChild(this._text(children));
+  },
+  _isStringOrNumber: function(param) {
+    return(typeof param=='string' || typeof param=='number');
+  }
+}
+
+/* ------------- element ext -------------- */
+
+// adapted from http://dhtmlkitchen.com/learn/js/setstyle/index4.jsp
+// note: Safari return null on elements with display:none; see http://bugzilla.opendarwin.org/show_bug.cgi?id=4125
+// instead of "auto" values returns null so it's easier to use with || constructs
+
+String.prototype.camelize = function() {
+  var oStringList = this.split('-');
+  if(oStringList.length == 1)    
+    return oStringList[0];
+  var ret = this.indexOf("-") == 0 ? 
+    oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) : oStringList[0];
+  for(var i = 1, len = oStringList.length; i < len; i++){
+    var s = oStringList[i];
+    ret += s.charAt(0).toUpperCase() + s.substring(1)
+  }
+  return ret;
+}
+
+Element.getStyle = function(element, style) {
+  element = $(element);
+  var value = element.style[style.camelize()];
+  if(!value)
+    if(document.defaultView && document.defaultView.getComputedStyle) {
+      var css = document.defaultView.getComputedStyle(element, null);
+      value = (css!=null) ? css.getPropertyValue(style) : null;
+    } else if(element.currentStyle) {
+      value = element.currentStyle[style.camelize()];  
+    }
+  if(value=='auto') value = null;
+  return value;
+}
+
+Element.makePositioned = function(element) {
+  element = $(element);
+  if(Element.getStyle(element, 'position')=='static')
+    element.style.position = "relative";
+}
+
+Element.makeClipping = function(element) {
+  element = $(element);
+  element._overflow = Element.getStyle(element, 'overflow') || 'visible';
+  if(element._overflow!='hidden') element.style.overflow = 'hidden';
+}
+
+Element.undoClipping = function(element) {
+  element = $(element);
+  if(element._overflow!='hidden') element.style.overflow = element._overflow;
+}
+
+Element.collectTextNodesIgnoreClass = function(element, ignoreclass) {
+  var children = $(element).childNodes;
+  var text     = "";
+  var classtest = new RegExp("^([^ ]+ )*" + ignoreclass+ "( [^ ]+)*$","i");
+
+  for (var i = 0; i < children.length; i++) {
+    if(children[i].nodeType==3) {
+      text+=children[i].nodeValue;
+    } else {
+      if((!children[i].className.match(classtest)) && children[i].hasChildNodes())
+        text += Element.collectTextNodesIgnoreClass(children[i], ignoreclass);
+    }
+  }
+
+  return text;
+}
+
+/*--------------------------------------------------------------------------*/
+
+Position.positionedOffset = function(element) {
+  var valueT = 0, valueL = 0;
+  do {
+    valueT += element.offsetTop  || 0;
+    valueL += element.offsetLeft || 0;
+    element = element.offsetParent;
+    if (element) {
+      p = Element.getStyle(element,'position');
+      if(p == 'relative' || p == 'absolute') break;
+    }
+  } while (element);
+  return [valueL, valueT];
+}
+
+// Safari returns margins on body which is incorrect if the child is absolutely positioned.
+// for performance reasons, we create a specialized version of Position.positionedOffset for
+// KHTML/WebKit only
+
+if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+  Position.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      
+      if (element.offsetParent==document.body) 
+        if (Element.getStyle(element,'position')=='absolute') break;
+        
+      element = element.offsetParent;
+    } while (element);
+    return [valueL, valueT];
+  }
+}
+
+Position.page = function(forElement) {
+  if(element == document.body) return [0, 0];
+  var valueT = 0, valueL = 0;
+
+  var element = forElement;
+  do {
+    valueT += element.offsetTop  || 0;
+    valueL += element.offsetLeft || 0;
+
+    // Safari fix
+    if (element.offsetParent==document.body)
+      if (Element.getStyle(element,'position')=='absolute') break;
+      
+  } while (element = element.offsetParent);
+
+  element = forElement;
+  do {
+    valueT -= element.scrollTop  || 0;
+    valueL -= element.scrollLeft || 0;    
+  } while (element = element.parentNode);
+
+  return [valueL, valueT];
+}
+
+// elements with display:none don't return an offsetParent, 
+// fall back to  manual calculation
+Position.offsetParent = function(element) {
+  if(element.offsetParent) return element.offsetParent;
+  if(element == document.body) return element;
+  
+  while ((element = element.parentNode) && element != document.body)
+    if (Element.getStyle(element,'position')!='static')
+      return element;
+  
+  return document.body;
+}
+
+Position.clone = function(source, target) {
+  var options = Object.extend({
+    setLeft:    true,
+    setTop:     true,
+    setWidth:   true,
+    setHeight:  true,
+    offsetTop:  0,
+    offsetLeft: 0
+  }, arguments[2] || {})
+  
+  // find page position of source
+  source = $(source);
+  var p = Position.page(source);
+
+  // find coordinate system to use
+  target = $(target);
+  var delta = [0, 0];
+  var parent = null;
+  // delta [0,0] will do fine with position: fixed elements, 
+  // position:absolute needs offsetParent deltas
+  if (Element.getStyle(target,'position') == 'absolute') {
+    parent = Position.offsetParent(target);
+    delta = Position.page(parent);
+  }
+  
+  // correct by body offsets (fixes Safari)
+  if (parent==document.body) {
+    delta[0] -= document.body.offsetLeft;
+    delta[1] -= document.body.offsetTop; 
+  }
+
+  // set position
+  if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + "px";
+  if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + "px";
+  if(options.setWidth)  target.style.width = source.offsetWidth + "px";
+  if(options.setHeight) target.style.height = source.offsetHeight + "px";
+}
+
+Position.absolutize = function(element) {
+  element = $(element);
+  if(element.style.position=='absolute') return;
+  Position.prepare();
+
+  var offsets = Position.positionedOffset(element);
+  var top     = offsets[1];
+  var left    = offsets[0];
+  var width   = element.clientWidth;
+  var height  = element.clientHeight;
+
+  element._originalLeft   = left - parseFloat(element.style.left  || 0);
+  element._originalTop    = top  - parseFloat(element.style.top || 0);
+  element._originalWidth  = element.style.width;
+  element._originalHeight = element.style.height;
+
+  element.style.position = 'absolute';
+  element.style.top    = top + 'px';;
+  element.style.left   = left + 'px';;
+  element.style.width  = width + 'px';;
+  element.style.height = height + 'px';;
+}
+
+Position.relativize = function(element) {
+  element = $(element);
+  if(element.style.position=='relative') return;
+  Position.prepare();
+
+  element.style.position = 'relative';
+  var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+  var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+  element.style.top    = top + 'px';
+  element.style.left   = left + 'px';
+  element.style.height = element._originalHeight;
+  element.style.width  = element._originalWidth;
+}
+
+/*--------------------------------------------------------------------------*/
+
+Element.Class = {
+    // Element.toggleClass(element, className) toggles the class being on/off
+    // Element.toggleClass(element, className1, className2) toggles between both classes,
+    //   defaulting to className1 if neither exist
+    toggle: function(element, className) {
+      if(Element.Class.has(element, className)) {
+        Element.Class.remove(element, className);
+        if(arguments.length == 3) Element.Class.add(element, arguments[2]);
+      } else {
+        Element.Class.add(element, className);
+        if(arguments.length == 3) Element.Class.remove(element, arguments[2]);
+      }
+    },
+
+    // gets space-delimited classnames of an element as an array
+    get: function(element) {
+      element = $(element);
+      return element.className.split(' ');
+    },
+
+    // functions adapted from original functions by Gavin Kistner
+    remove: function(element) {
+      element = $(element);
+      var regEx;
+      for(var i = 1; i < arguments.length; i++) {
+        regEx = new RegExp("(^|\\s)" + arguments[i] + "(\\s|$)", 'g');
+        element.className = element.className.replace(regEx, '')
+      }
+    },
+
+    add: function(element) {
+      element = $(element);
+      for(var i = 1; i < arguments.length; i++) {
+        Element.Class.remove(element, arguments[i]);
+        element.className += (element.className.length > 0 ? ' ' : '') + arguments[i];
+      }
+    },
+
+    // returns true if all given classes exist in said element
+    has: function(element) {
+      element = $(element);
+      if(!element || !element.className) return false;
+      var regEx;
+      for(var i = 1; i < arguments.length; i++) {
+        if((typeof arguments[i] == 'object') && 
+          (arguments[i].constructor == Array)) {
+          for(var j = 0; j < arguments[i].length; j++) {
+            regEx = new RegExp("(^|\\s)" + arguments[i][j] + "(\\s|$)");
+            if(!regEx.test(element.className)) return false;
+          }
+        } else {
+          regEx = new RegExp("(^|\\s)" + arguments[i] + "(\\s|$)");
+          if(!regEx.test(element.className)) return false;
+        }
+      }
+      return true;
+    },
+
+    // expects arrays of strings and/or strings as optional paramters
+    // Element.Class.has_any(element, ['classA','classB','classC'], 'classD')
+    has_any: function(element) {
+      element = $(element);
+      if(!element || !element.className) return false;
+      var regEx;
+      for(var i = 1; i < arguments.length; i++) {
+        if((typeof arguments[i] == 'object') && 
+          (arguments[i].constructor == Array)) {
+          for(var j = 0; j < arguments[i].length; j++) {
+            regEx = new RegExp("(^|\\s)" + arguments[i][j] + "(\\s|$)");
+            if(regEx.test(element.className)) return true;
+          }
+        } else {
+          regEx = new RegExp("(^|\\s)" + arguments[i] + "(\\s|$)");
+          if(regEx.test(element.className)) return true;
+        }
+      }
+      return false;
+    },
+
+    childrenWith: function(element, className) {
+      var children = $(element).getElementsByTagName('*');
+      var elements = new Array();
+
+      for (var i = 0; i < children.length; i++) {
+        if (Element.Class.has(children[i], className)) {
+          elements.push(children[i]);
+          break;
+        }
+      }
+
+      return elements;
+    }
+}
+
+/*--------------------------------------------------------------------------*/
+
+String.prototype.parseQuery = function() {
+  var str = this;
+  if(str.substring(0,1) == '?') {
+    str = this.substring(1);
+  }
+  var result = {};
+  var pairs = str.split('&');
+  for(var i = 0; i < pairs.length; i++) {
+    var pair = pairs[i].split('=');
+    result[pair[0]] = pair[1];
+  }
+  return result;
+}
\ No newline at end of file
diff --git a/webcit/static/wclib.js b/webcit/static/wclib.js
new file mode 100644 (file)
index 0000000..59bbc84
--- /dev/null
@@ -0,0 +1,1167 @@
+/*jshint strict: false, bitwise: false */
+/*global document, window, Ajax, currentlyMarkedRows, Event, event, taskViewActivate, setTimeout, fillRooms, $, ctdlLocalPrefs, currentDropTargets, iconBarRoomList, confirm, Effect */
+/*
+ * JavaScript function library for WebCit.
+ *
+ * Copyright (c) 2005-2012 by the citadel.org team
+ *
+ * This program is open source software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ * the Free Software Foundation, either version 3 of the License, or
+ * 
+ *
+ * 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.
+ *
+ * 
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+var browserType;
+var room_is_trash = 0;
+
+var currentlyExpandedFloor = null;
+var roomlist = null;
+
+var supportsAddEventListener = (!!document.addEventListener);
+var today = new Date();
+
+var wc_log = "";
+if (document.all) {browserType = "ie";}
+if (window.navigator.userAgent.toLowerCase().match("gecko")) {
+       browserType= "gecko";
+}
+var ns6=document.getElementById&&!document.all;
+Event.observe(window, 'load', ToggleTaskDateOrNoDateActivate);
+Event.observe(window, 'load', taskViewActivate);
+//document.observe("dom:loaded", setupPrefEngine);
+document.observe("dom:loaded", setupIconBar);
+function ctdlRandomString()  {
+       return((Math.random()+'').substr(3));
+}
+function strcmp ( str1, str2 ) {
+    // http://kevin.vanzonneveld.net
+    // +   original by: Waldo Malqui Silva
+    // +      input by: Steve Hilder
+    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+    // +    revised by: gorthaur
+    // *     example 1: strcmp( 'waldo', 'owald' );
+    // *     returns 1: 1
+    // *     example 2: strcmp( 'owald', 'waldo' );
+    // *     returns 2: -1
+    return ( ( str1 === str2 ) ? 0 : ( ( str1 > str2 ) ? 1 : -1 ) );
+}
+
+function ctdlMarkLog(Which, Status)
+{
+    if (Status) {
+       document.getElementById(Which).checked = false;
+    }
+    else {
+       document.getElementById(Which).checked = true;
+    }
+}
+function ToggleLogEnable(Which)
+{
+    var p;
+    var element = document.getElementById(Which);
+    if (element.hasOwnProperty('checked')) {
+       var Status = element.checked;
+       if (!Status) {
+           p = encodeURI('g_cmd=LOGS ' + Which + '|0');
+       }
+       else {
+           p = encodeURI('g_cmd=LOGS ' + Which + '|1');
+       }
+       new Ajax.Request('ajax_servcmd', {
+           method: 'post',
+           parameters: p,
+           onComplete: ctdlMarkLog(Which, Status)
+       });
+    }
+}
+
+function SMTPRunQueue()
+{
+    var p;
+
+    p= encodeURI('g_cmd=SMTP runqueue');
+    new Ajax.Request('ajax_servcmd', {
+       method: 'post',
+       parameters: p,
+       onComplete: function(transport) { ajax_important_message(transport.responseText.substr(4));}
+    });
+}
+
+function NetworkSynchronizeRoom(NodeName)
+{
+    var p;
+
+    p= encodeURI('g_cmd=NSYN ' + NodeName);
+    new Ajax.Request('ajax_servcmd', {
+       method: 'post',
+       parameters: p,
+       onComplete: function(transport) { ajax_important_message(transport.responseText.substr(4));}
+    });
+}
+function ToggleVisibility ($Which)
+{
+    if (document.getElementById)
+    {
+       if (document.getElementById($Which).style.display  === "none") {
+           document.getElementById($Which).style.display  = "inline";
+       }
+       else {
+           document.getElementById($Which).style.display  = "none";
+       }
+    }
+}
+
+function emptyElement(element) {
+  var childNodes = element.childNodes;
+  for(var i=0; i<childNodes.length; i++) {
+    try {
+    element.removeChild(childNodes[i]);
+    } catch (e) {
+      wCLog(e+"|"+e.description);
+    }
+  }
+}
+// Implements superior internet explorer 'extract all child text from element' feature'.
+// Falls back on buggy, patent violating standardized method
+function getTextContent(element) {
+  if (element.textContent === undefined) {
+    return element.innerText;
+  }
+  return element.textContent;
+}
+/** Same reasons as above */
+function setTextContent(element, textContent) {
+  if(element.textContent === undefined) {
+    element.innerText = textContent;
+  } else {
+  element.textContent = textContent;
+  }
+}
+
+// We love string tokenizers.
+function extract_token(source_string, token_num, delimiter) {
+    var j, i = 0;
+    var extracted_string = source_string;
+
+    if (token_num > 0) {
+       for (i=0; i<token_num; ++i) {
+           j = extracted_string.indexOf(delimiter);
+           if (j >= 0) {
+               extracted_string = extracted_string.substr(j+1);
+           }
+       }
+    }
+
+    j = extracted_string.indexOf(delimiter);
+    if (j >= 0) {
+       extracted_string = extracted_string.substr(0, j);
+    }
+
+    return extracted_string;
+}
+
+function CtdlSpawnContextMenu(event, source) {
+  // remove any existing menus
+  disintergrateContextMenus(null);
+  var x = event.clientX-10; // cut a few pixels out so our mouseout works right
+  var y = event.clientY-10;
+  var contextDIV = document.createElement("div");
+  contextDIV.setAttribute("id", "ctdlContextMenu");
+  document.body.appendChild(contextDIV);
+  var sourceChildren = source.childNodes;
+  for(var j=0; j<sourceChildren.length; j++) {
+    contextDIV.appendChild(sourceChildren[j].cloneNode(true));
+  }
+  var leftRule = "left: "+x+"px;";
+  contextDIV.setAttribute("style", leftRule);
+  contextDIV.setAttribute("actual", leftRule);
+  contextDIV.style.top = y+"px";
+  contextDIV.style.display = "block";
+  $(contextDIV).observe('mouseout',disintergrateContextMenus);
+}
+function disintergrateContextMenus(event) {
+  var contextMenu = document.getElementById("ctdlContextMenu");
+  if (contextMenu) {
+    contextMenu.parentNode.removeChild(contextMenu);
+  }
+  Event.stopObserving(document,'click',disintergrateContextMenus);
+}
+// This code handles the popups for important-messages.
+function hide_imsg_popup() {
+    if (browserType === "gecko") {
+       document.poppedLayer = eval('document.getElementById(\'important_message\')');
+    }
+    else if (browserType === "ie") {
+       document.poppedLayer = eval('document.all[\'important_message\']');
+    }
+    else {
+       document.poppedLayer = eval('document.layers[\'`important_message\']');
+    }
+
+    document.poppedLayer.style.visibility = "hidden";
+}
+function remove_something(what_to_search, new_visibility) {
+    if (browserType === "gecko") {
+       document.poppedLayer = eval('document.getElementById(\'' + what_to_search + '\')');
+    }
+    else if (browserType === "ie") {
+       document.poppedLayer = eval('document.all[\'' + what_to_search + '\']');
+    }
+    else {
+       document.poppedLayer = eval('document.layers[\'`' + what_to_search + '\']');
+    }
+    if (document.poppedLayer !== null) {
+       document.poppedLayer.innerHTML = "";
+    }
+}
+
+function unhide_imsg_popup() {
+    if (browserType === "gecko") {
+       document.poppedLayer = eval('document.getElementById(\'important_message\')');
+    }
+    else if (browserType === "ie") {
+       document.poppedLayer = eval('document.all[\'important_message\']');
+    }
+    else {
+       document.poppedLayer = eval('document.layers[\'`important_message\']');
+    }
+
+    document.poppedLayer.style.visibility = "visible";
+    setTimeout('hide_imsg_popup()', 5000);
+}
+
+function ajax_important_message(messagetext)
+{
+    if (browserType === "gecko") {
+       document.poppedLayer = eval('document.getElementById(\'important_message\')');
+    }
+    else if (browserType === "ie") {
+       document.poppedLayer = eval('document.all[\'important_message\']');
+    }
+    else {
+       document.poppedLayer = eval('document.layers[\'`important_message\']');
+    }
+    document.poppedLayer.style.visibility = "visible";
+    setTimeout('hide_imsg_popup()', 5000);
+    document.poppedLayer.innerHTML = messagetext;
+}
+
+// This function activates the ajax-powered recipient autocompleters on the message entry screen.
+function activate_entmsg_autocompleters() {
+       new Ajax.Autocompleter('cc_id', 'cc_name_choices', 'cc_autocomplete', {} );
+       new Ajax.Autocompleter('bcc_id', 'bcc_name_choices', 'bcc_autocomplete', {} );
+       new Ajax.Autocompleter('recp_id', 'recp_name_choices', 'recp_autocomplete', {} );
+}
+
+function activate_iconbar_wholist_populat0r() 
+{
+       new Ajax.PeriodicalUpdater('online_users', 'do_template?template=who_iconbar', {method: 'get', frequency: 30});
+}
+
+function setupIconBar() {
+
+       /* WARNING: VILE, SLEAZY HACK.  We determine the state of the box based on the image loaded. */
+       if ( $('expand_roomlist').src.substring($('expand_roomlist').src.length - 12) === "collapse.gif" ) {
+               $('roomlist').style.display = 'block';
+               $('roomlist').innerHTML = '';
+               fillRooms(iconBarRoomList);
+       }
+       else {
+               $('roomlist').style.display = 'none';
+       }
+
+       /* WARNING: VILE, SLEAZY HACK.  We determine the state of the box based on the image loaded. */
+       if ( $('expand_wholist').src.substring($('expand_wholist').src.length - 12) === "collapse.gif" ) {
+               $('online_users').style.display = 'block';
+               activate_iconbar_wholist_populat0r();
+       }
+       else {
+               $('online_users').style.display = 'none';
+       }
+
+}
+
+
+// These functions handle moving sticky notes around the screen by dragging them
+
+var uid_of_note_being_dragged = 0;
+var saved_cursor_style = 'default';
+var note_was_dragged = 0;
+
+function NotesDragMouseUp(evt) {
+    document.onmouseup = null;
+    document.onmousemove = null;
+    if (document.layers) {
+       document.releaseEvents(Event.MOUSEUP | Event.MOUSEMOVE);
+    }
+
+    var d = $('note-' + uid_of_note_being_dragged);
+    d.style.cursor = saved_cursor_style;
+
+    // If any motion actually occurred, submit an ajax http call to record it to the server
+    if (note_was_dragged > 0) {
+       var p = 'note_uid=' + uid_of_note_being_dragged
+           + '&left=' + d.style.left
+           + '&top=' + d.style.top
+           + '&r=' + ctdlRandomString();
+       new Ajax.Request(
+           'ajax_update_note',
+           {
+               method: 'post',
+               parameters: p
+           }
+       );
+    }
+
+    uid_of_note_being_dragged = '';
+    return true;
+}
+var saved_x, saved_y;
+function NotesDragMouseMove(evt) {
+    var x = (ns6 ? evt.clientX : event.clientX);
+    var x_increment = x - saved_x;
+    var y = (ns6 ? evt.clientY : event.clientY);
+    var y_increment = y - saved_y;
+
+    // Move the div
+    var d = $('note-' + uid_of_note_being_dragged);
+
+    var divTop = parseInt(d.style.top);
+    var divLeft = parseInt(d.style.left);
+
+    d.style.top = (divTop + y_increment) + 'px';
+    d.style.left = (divLeft + x_increment) + 'px';
+
+    saved_x = x;
+    saved_y = y;
+    note_was_dragged = 1;
+    return true;
+}
+
+
+function NotesDragMouseDown(evt, uid) {
+    saved_x = (ns6 ? evt.clientX : event.clientX);
+    saved_y = (ns6 ? evt.clientY : event.clientY);
+    document.onmouseup = NotesDragMouseUp;
+    document.onmousemove = NotesDragMouseMove;
+    if (document.layers) {
+       document.captureEvents(Event.MOUSEUP | Event.MOUSEMOVE);
+    }
+    uid_of_note_being_dragged = uid;
+    var d = $('note-' + uid_of_note_being_dragged);
+    saved_cursor_style = d.style.cursor;
+    d.style.cursor = 'move';
+    return false;              // disable the default action
+}
+
+
+// Called when the user clicks on the palette icon of a sticky note to change its color.
+// It toggles the color selector visible or invisible.
+
+function NotesClickPalette(evt, uid) {
+    var uid_of_note_being_colored = uid;
+    var d = $('palette-' + uid_of_note_being_colored);
+
+    if (d.style.display) {
+       if (d.style.display === 'none') {
+           d.style.display = 'block';
+       }
+       else {
+           d.style.display = 'none';
+       }
+    }
+    else {
+       d.style.display = 'block';
+    }
+
+    return true;
+}
+
+
+// Called when the user clicks on one of the colors in an open color selector.
+// Sets the desired color and then closes the color selector.
+
+function NotesClickColor(evt, uid, red, green, blue, notecolor, titlecolor) {
+    var uid_of_note_being_colored = uid;
+    var palette_button = $('palette-' + uid_of_note_being_colored);
+    var note_div = $('note-' + uid_of_note_being_colored);
+    var titlebar_div = $('titlebar-' + uid_of_note_being_colored);
+
+    // alert('FIXME red=' + red + ' green=' + green + ' blue=' + blue);
+
+    note_div.style.backgroundColor = notecolor;
+    titlebar_div.style.backgroundColor = titlecolor;
+    palette_button.style.display = 'none';
+
+    // submit an ajax http call to record it to the server
+    var p = 'note_uid=' + uid_of_note_being_colored
+       + '&red=' + red
+       + '&green=' + green
+       + '&blue=' + blue
+       + '&r=' + ctdlRandomString();
+    new Ajax.Request(
+       'ajax_update_note',
+       {
+           method: 'post',
+           parameters: p
+       }
+    );
+}
+
+
+
+
+// These functions handle resizing sticky notes by dragging the resize handle
+
+var uid_of_note_being_resized = 0;
+var saved_cursor_style = 'default';
+var note_was_resized = 0;
+
+function NotesResizeMouseUp(evt) {
+    document.onmouseup = null;
+    document.onmousemove = null;
+    if (document.layers) {
+       document.releaseEvents(Event.MOUSEUP | Event.MOUSEMOVE);
+    }
+
+    var d = $('note-' + uid_of_note_being_resized);
+    d.style.cursor = saved_cursor_style;
+
+    // If any motion actually occurred, submit an ajax http call to record it to the server
+    if (note_was_resized > 0) {
+       var p = 'note_uid=' + uid_of_note_being_resized
+           + '&width=' + d.style.width
+           + '&height=' + d.style.height
+           + '&r=' + ctdlRandomString();
+       new Ajax.Request(
+           'ajax_update_note',
+           {
+               method: 'post',
+               parameters: p
+           }
+       );
+    }
+
+    uid_of_note_being_resized = '';
+    return false;              // disable the default action
+}
+
+function NotesResizeMouseMove(evt) {
+    var x = (ns6 ? evt.clientX : event.clientX);
+    var x_increment = x - saved_x;
+    var y = (ns6 ? evt.clientY : event.clientY);
+    var y_increment = y - saved_y;
+
+    // Move the div
+    var d = $('note-' + uid_of_note_being_resized);
+
+    var divTop = parseInt(d.style.height);
+    var divLeft = parseInt(d.style.width);
+
+    var newHeight = divTop + y_increment;
+    if (newHeight < 50) {
+       newHeight = 50;
+    }
+
+    var newWidth = divLeft + x_increment;
+    if (newWidth < 50) {
+       newWidth = 50;
+    }
+    d.style.height = newHeight + 'px';
+    d.style.width = newWidth + 'px';
+
+    saved_x = x;
+    saved_y = y;
+    note_was_resized = 1;
+    return false;              // disable the default action
+}
+
+
+function NotesResizeMouseDown(evt, uid) {
+    var saved_x = (ns6 ? evt.clientX : event.clientX);
+    var saved_y = (ns6 ? evt.clientY : event.clientY);
+    document.onmouseup = NotesResizeMouseUp;
+    document.onmousemove = NotesResizeMouseMove;
+    if (document.layers) {
+       document.captureEvents(Event.MOUSEUP | Event.MOUSEMOVE);
+    }
+    uid_of_note_being_resized = uid;
+    var d = $('note-' + uid_of_note_being_resized);
+    saved_cursor_style = d.style.cursor;
+    d.style.cursor = 'move';
+    return false;              // disable the default action
+}
+
+
+function DeleteStickyNote(evt, uid, confirmation_prompt) {
+    var uid_of_note_being_deleted = uid;
+    var d = $('note-' + uid_of_note_being_deleted);
+
+    if (confirm(confirmation_prompt)) {
+       new Effect.Puff(d);
+
+       // submit an ajax http call to delete it on the server
+       var p = 'note_uid=' + uid_of_note_being_deleted
+           + '&deletenote=yes'
+           + '&r=' + ctdlRandomString();
+       new Ajax.Request(
+           'ajax_update_note',
+           {
+               method: 'post',
+               parameters: p
+           }
+       );
+    }
+}
+
+function ctdl_ts_getInnerText(el) {
+    if (typeof el === "string") {
+       return el;
+    }
+    if (typeof el === "undefined") {
+       return el;
+    }
+    if (el.innerText) {
+       return el.innerText;    //Not needed but it is faster
+    }
+    var str = "";
+    
+    var cs = el.childNodes;
+    var l = cs.length;
+    for (var i = 0; i < l; i++) {
+       switch (cs[i].nodeType) {
+       case 1: //ELEMENT_NODE
+           str += ts_getInnerText(cs[i]);
+           break;
+       case 3: //TEXT_NODE
+           str += cs[i].nodeValue;
+           break;
+       }
+    }
+    return str;
+}
+
+
+// Place a gradient loadscreen on an element, e.g to use before Ajax.updater
+function CtdlLoadScreen(elementid) {
+var elem = document.getElementById(elementid);
+    elem.innerHTML = "<div align=center><br>" + 
+       "<table border=0 cellpadding=10 bgcolor=\"#ffffff\">" + 
+       " <tr><td><img src=\"static/throbber.gif\" />" + 
+       " <font color=\"#AAAAAA\">&nbsp;&nbsp;Loading....</font>" + 
+       "</td></tr></table><br></div>";
+}
+
+
+
+// Pop open the address book (target_input is the INPUT field to populate)
+
+function PopOpenAddressBook(target_input) {
+       $('address_book_popup').style.display = 'block';
+       p = 'target_input=' + target_input + '&r=' + ctdlRandomString();
+       new Ajax.Updater(
+               'address_book_popup_middle_div',
+               'do_template?template=addressbook_list',
+               {
+                       method: 'get',
+                       parameters: p,
+                       evalScripts: true
+               }
+       );
+}
+
+function PopulateAddressBookInnerDiv(which_addr_book, target_input) {
+
+    $('address_book_inner_div').innerHTML =
+       "<div align=center><br>" + 
+       "<table border=0 cellpadding=10 bgcolor=\"#ffffff\">" + 
+       "<tr><td><img src=\"static/throbber.gif\" />" + 
+       "<font color=\"#AAAAAA\">" +
+       "&nbsp;&nbsp;Loading...." + 
+       "</font></td></tr></table><br></div>";
+
+    p = 'which_addr_book=' + which_addr_book
+       + '&target_input=' + target_input
+       + '&r=' + ctdlRandomString()
+       + "&template=addressbook_namelist";
+    new Ajax.Updater(
+       'address_book_inner_div',
+       'do_template',
+       {
+           method: 'get',
+           parameters: p
+       }
+    );
+}
+
+// What happens when a contact is selected from the address book popup
+// (populate the specified target)
+
+function AddContactsToTarget(target, whichaddr) {
+       while (whichaddr.selectedIndex !== -1) {
+               if (target.value.length > 0) {
+                       target.value = target.value + ', ';
+               }
+               target.value = target.value + whichaddr.value;
+               whichaddr.options[whichaddr.selectedIndex].selected = false;
+       }
+}
+
+// Respond to a meeting invitation
+function RespondToInvitation(question_divname, title_divname, msgnum, cal_partnum, sc) {
+       p = 'msgnum=' + msgnum + '&cal_partnum=' + cal_partnum + '&sc=' + sc ;
+       new Ajax.Updater(title_divname, 'respond_to_request', { method: 'post', parameters: p } );
+       Effect.Fade(question_divname, { duration: 0.5 });
+}
+
+// Handle a received RSVP
+function HandleRSVP(question_divname, title_divname, msgnum, cal_partnum, sc) {
+       p = 'msgnum=' + msgnum + '&cal_partnum=' + cal_partnum + '&sc=' + sc ;
+       new Ajax.Updater(title_divname, 'handle_rsvp', { method: 'post', parameters: p } );
+       Effect.Fade(question_divname, { duration: 0.5 });
+}
+/* var fakeMouse = document.createEvent("MouseEvents");
+ fakeMouse.initMouseEvent("click", true, true, window, 
+   0,0,0,0,0, false, false, false, false, 0, null); */
+// TODO: Collapse into one function
+function toggleTaskDtStart(event) {
+    var checkBox = $('nodtstart');
+    var checkBoxTime = $('dtstart_time_assoc');
+    var dtstart = document.getElementById("dtstart");
+    var dtstart_date = document.getElementById("dtstart_date");
+    var dtstart_time = document.getElementById("dtstart_time");
+    if (checkBox.checked) {
+       dtstart_date.style.visibility = "hidden";
+       dtstart_time.style.visibility = "hidden";
+    } else {
+       if (checkBoxTime.checked) {
+           dtstart_time.style.visibility = "visible";
+       } else {
+           dtstart_time.style.visibility = "hidden";
+       }
+       dtstart_date.style.visibility = "visible";
+       if (dtstart.value.length === 0) {
+           dtstart.dpck._initCurrentDate();
+       }
+    }
+}
+function toggleTaskDue(event) {
+    var checkBox = $('nodue');
+    var checkBoxTime = $('due_time_assoc');
+    var due = document.getElementById("due");
+    var due_date = document.getElementById("due_date");
+    var due_time = document.getElementById("due_time");
+    if (checkBox.checked) {
+       due_date.style.visibility = "hidden";
+       due_time.style.visibility = "hidden";
+    } else {
+       if (checkBoxTime.checked) {
+           due_time.style.visibility = "visible";
+       } else {
+           due_time.style.visibility = "hidden";
+       }
+       due_date.style.visibility = "visible";
+       if (due.value.length === 0) {
+           due.dpck._initCurrentDate();
+       }
+    }
+}
+function ToggleTaskDateOrNoDateActivate(event) {
+       var dtstart = document.getElementById("nodtstart");
+       if (dtstart !== null) {
+               toggleTaskDtStart(null);
+               toggleTaskDue(null);
+               $('nodtstart').observe('click', toggleTaskDtStart);
+               $('dtstart_time_assoc').observe('click', toggleTaskDtStart);
+               $('nodue').observe('click', toggleTaskDue);
+               $('due_time_assoc').observe('click', toggleTaskDue);
+       } 
+}
+function TaskViewGatherCategoriesFromTable() {
+       var table = $('taskview');
+       
+}
+function attachDatePicker(relative) {
+       var dpck = new DatePicker({
+       relative: relative,
+             language: 'en', //wclang.substr(0,2),
+             disableFutureDate: false,
+             dateFormat: [ ["yyyy", "mm", "dd"], "-"],
+             showDuration: 0.2
+       });
+       document.getElementById(relative).dpck = dpck; // attach a ref to it
+}
+function eventEditAllDay() {
+       var allDayCheck = document.getElementById("alldayevent");
+       var dtend_time = document.getElementById("dtend_time");
+       var dtstart_time = document.getElementById("dtstart_time");
+       if(allDayCheck.checked) {
+               dtstart_time.style.visibility = "hidden";
+               dtend_time.style.visibility = "hidden";
+       } else {
+               dtstart_time.style.visibility = "visible";
+               dtend_time.style.visibility = "visible";
+       }
+}
+
+// Functions which handle show/hide of various elements in the recurrence editor
+
+function RecurrenceShowHide() {
+
+       if ($('is_recur').checked) {
+               $('rrule_div').style.display = 'block';
+       }
+       else {
+               $('rrule_div').style.display = 'none';
+       }
+
+       if ($('freq_selector').selectedIndex === 4) {
+               $('weekday_selector').style.display = 'block';
+       }
+       else {
+               $('weekday_selector').style.display = 'none';
+       }
+
+       if ($('freq_selector').selectedIndex === 5) {
+               $('monthday_selector').style.display = 'block';
+       }
+       else {
+               $('monthday_selector').style.display = 'none';
+       }
+
+       if ($('rrend_count').checked) {
+               $('rrcount').disabled = false;
+       }
+       else {
+               $('rrcount').disabled = true;
+       }
+
+       if ($('rrend_until').checked) {
+               $('rruntil').disabled = false;
+       }
+       else {
+               $('rruntil').disabled = true;
+       }
+
+       if ($('rrmonthtype_mday').checked) {
+               $('rrmday').disabled = false;
+       }
+       else {
+               $('rrmday').disabled = true;
+       }
+
+       if ($('rrmonthtype_wday').checked) {
+               $('rrmweek').disabled = false;
+               $('rrmweekday').disabled = false;
+       }
+       else {
+               $('rrmweek').disabled = true;
+               $('rrmweekday').disabled = true;
+       }
+
+       if ($('freq_selector').selectedIndex === 6) {
+               $('yearday_selector').style.display = 'block';
+       }
+       else {
+               $('yearday_selector').style.display = 'none';
+       }
+
+       $('ymday').innerHTML = 'XXXX-' + $('dtstart').value.substr(5);
+       $('rrmday').innerHTML = $('dtstart').value.substr(8);
+
+       if ($('rryeartype_ywday').checked) {
+               $('rrymweek').disabled = false;
+               $('rrymweekday').disabled = false;
+               $('rrymonth').disabled = false;
+       }
+       else {
+               $('rrymweek').disabled = true;
+               $('rrymweekday').disabled = true;
+               $('rrymonth').disabled = true;
+       }
+
+}
+
+
+// Enable or disable the 'check attendee availability' button depending on whether
+// the attendees list is empty
+function EnableOrDisableCheckButton()
+{
+       if ($('attendees_box').value.length === 0) {
+               $('check_button').disabled = true;
+       }
+       else {
+               $('check_button').disabled = false;
+       }
+}
+
+
+
+
+function launchChat(event) {
+    window.open('chat',
+               'ctdl_chat_window',
+               'toolbar=no,location=no,directories=no,copyhistory=no,status=no,scrollbars=yes,resizable=yes');
+}
+// logger
+function wCLog(msg) {
+  if (!!window.console && !!console.log) {
+    console.log(msg);
+  } else if (!!window.opera && !!opera.postError) {
+    opera.postError(msg);
+  } else {
+    wc_log += msg + "\r\n";
+  }
+}
+
+function RefreshSMTPqueueDisplay() {
+       new Ajax.Updater('mailqueue_list',
+       'dotskip?room=__CitadelSMTPspoolout__&view=11&ListOnly=yes', { method: 'get',
+               parameters: Math.random() } );
+}
+
+function DeleteSMTPqueueMsg(msgnum1, msgnum2) {
+    var p = encodeURI('g_cmd=DELE ' + msgnum1 + ',' + msgnum2);
+    new Ajax.Request(
+       'ajax_servcmd', {
+           method: 'post',
+           parameters: p,
+           onComplete: function(transport) {
+               ajax_important_message(transport.responseText.substr(4));
+               RefreshSMTPqueueDisplay();}
+       }
+    );
+}
+
+
+function ConfirmLogoff() {
+    new Ajax.Updater(
+       'md-content',
+       'do_template?template=confirmlogoff',
+       {
+           method: 'get',
+           evalScripts: true,
+           onSuccess: function(cl_success) {
+               toggleModal(1);
+           }
+       }
+    );
+}
+
+
+function switch_to_lang(new_lang) {
+       p = 'push?url=' + encodeURI(window.location);
+       new Ajax.Request(p, { method: 'get' } );
+       window.location = 'switch_language?lang=' + new_lang ;
+}
+
+
+function toggle_roomlist() 
+{
+       /* WARNING: VILE, SLEAZY HACK.  We determine the state of the box based on the image loaded. */
+       if ( $('expand_roomlist').src.substring($('expand_roomlist').src.length - 12) === "collapse.gif" ) {
+               $('roomlist').style.display = 'none';
+               $('expand_roomlist').src = 'static/webcit_icons/expand.gif';
+               wstate=0;
+       }
+
+       else {
+               $('roomlist').style.display = 'block';
+               $('expand_roomlist').src = 'static/webcit_icons/collapse.gif';
+               $('roomlist').innerHTML = '';
+               fillRooms(iconBarRoomList);
+               wstate=1;
+       }
+
+       // tell the server what I did
+       p = 'toggle_roomlist_expanded_state?wstate=' + wstate + '?rand=' + Math.random() ;
+       new Ajax.Request(p, { method: 'get' } );
+
+       return false;   /* this prevents the click from registering as a roomlist button press */
+}
+
+
+function toggle_wholist() 
+{
+       /* WARNING: VILE, SLEAZY HACK.  We determine the state of the box based on the image loaded. */
+       if ( $('expand_wholist').src.substring($('expand_wholist').src.length - 12) === "collapse.gif" ) {
+               $('online_users').style.display = 'none';
+               $('expand_wholist').src = 'static/webcit_icons/expand.gif';
+               wstate=0;
+       }
+
+       else {
+               $('online_users').style.display = 'block';
+               $('expand_wholist').src = 'static/webcit_icons/collapse.gif';
+               activate_iconbar_wholist_populat0r();
+               wstate=1;
+       }
+
+       // tell the server what I did
+       p = 'toggle_wholist_expanded_state?wstate=' + wstate + '?rand=' + Math.random() ;
+       new Ajax.Request(p, { method: 'get' } );
+
+       return false;   /* this prevents the click from registering as a wholist button press */
+}
+
+function getBlogStartText(wikitype) {
+    var wikitext = document.getElementById("wikitext").innerHTML;
+    var wikipublish = document.getElementById("wikipublish").innerHTML;
+    var wikilinktext = document.getElementById("wikilinktext").innerHTML;
+    var wikilinkmore = document.getElementById("wikilinkmore").innerHTML;
+    var wikilinkembedmedia = document.getElementById("wikilinkembedmedia").innerHTML;
+    if (wikitype) {
+       return "<html><head></head><body>\n" +
+           "<h1>" + wikitext + "</h1>\n" + 
+           "<p>" + wikipublish + "</p>\n" +
+           "<a href='wiki?page=firstarticle'>" + wikilinktext + "</a>" +
+           "<p>" + wikilinkmore + "</p>\n" + 
+           "<p>" + wikilinkembedmedia + " </p>\n<p><img src='/download_file/test.jpg' alt=\"alttext\"></p>\n" + 
+           "</body></html>";
+    }
+    else {
+       return "#" + wikitext + "\n" + 
+           wikipublish + "\n\n" + 
+           "[" + wikilinktext + "](wiki?page=firstarticle)\n\n" +
+           wikilinkmore + "\n\n" + 
+           wikilinkembedmedia + "\n\n ![alttext](/download_file/test.jpg)";
+    }
+}
+
+function create_blog()
+{
+    var er_view_blog = document.getElementById('er_view_blog');
+    var Nonce = document.getElementById('Nonce');
+    var roomname = document.getElementById('er_name').value;
+    var editroomname = roomname + '\\edit';
+    var filePath = "files_" + roomname;
+    var floorID = document.getElementById('er_floor').value;
+
+    var selects = document.getElementById("er_floor");
+    var selectedFloor = selects.options[selects.selectedIndex].value;
+    var selectedFloorName = selects.options[selects.selectedIndex].text;
+
+    var vselects = document.getElementById("er_view");
+    var vselectedMarkup = vselects.options[vselects.selectedIndex].value;
+    var vselectedMarkupName = vselects.options[vselects.selectedIndex].text;
+
+    var adminPW = document.getElementById('adminlist_passworded').checked;
+
+    var passvoid = document.getElementById('er_password').value;
+    var roomtypeWiki = document.getElementById('er_blog_markup_html').value;
+
+    var isHtmlWiki = vselectedMarkup === roomtypeWiki;
+    var starttext = getBlogStartText(isHtmlWiki);
+
+    ToggleVisibility('er_password');
+    var type_edit;
+    if (adminPW) {
+       type_edit = document.getElementById('adminlist_passworded').value;
+       ToggleVisibility('li_adminlist_invonly');
+       ToggleVisibility('adminlist_passworded');
+       
+    }
+    else {
+       type_edit = document.getElementById('adminlist_invonly').value;
+       ToggleVisibility('adminlist_invonly');
+       ToggleVisibility('li_adminlist_passworded');
+    }
+
+    ToggleVisibility('er_floor');
+    document.getElementById('er_floor_fixed').innerHTML = selectedFloorName;
+    ToggleVisibility('er_floor_fixed');
+
+    ToggleVisibility('er_name');
+    document.getElementById('er_name_fixed').innerHTML = roomname;
+    ToggleVisibility('er_name_fixed');
+
+    ToggleVisibility('er_view');
+    document.getElementById('er_view_fixed').innerHTML = vselectedMarkupName;
+    ToggleVisibility('er_view_fixed');
+
+    ToggleVisibility('create_buttons');
+
+    ToggleVisibility('edit_info');
+    ToggleVisibility('throbber');
+    
+
+    var roomdata = {
+       create_blog_room: {
+           nonce:       Nonce,
+           er_name:     roomname,
+           type:       'public',
+           er_view:     er_view_blog,
+           er_floor:    floorID,
+           template:    "room_result_json",
+           ok_button:   1
+       },
+       setflags_blog_room: {
+           nonce:       Nonce,
+           er_name:     roomname,
+           go:   roomname,
+           type:       'public',
+           er_floor:    floorID,
+
+           directory:   "yes",
+           er_dirname:  filePath,
+           ulallowed:   "no",
+           dlallowed:   "yes",
+           ulmsg:       "no",
+           visdir:      "no",
+
+           anon:       "no",
+           last_tabsel: 1,
+           er_view:     er_view_blog,
+           template:    "room_result_json",
+           ok_button:   1
+       },
+       create_blog_edit_room: {
+           nonce:       Nonce,
+           er_name:     editroomname,
+           type:       type_edit,
+           er_view:     vselectedMarkup,
+           er_floor:    floorID,
+           er_password: passvoid,
+           template:    "room_result_json",
+           ok_button:   1
+       },
+       setflags_blog_edit_room: {
+           nonce:       Nonce,
+           er_name:     editroomname,
+           go:   editroomname,
+           type:       type_edit,
+           er_floor:    floorID,
+
+           directory:   "yes",
+           er_dirname:  filePath,
+           ulallowed:   "yes",
+           dlallowed:   "yes",
+           ulmsg:       "no",
+           visdir:      "yes",
+
+           anon:       "no",
+           last_tabsel: 1,
+           er_view:     er_view_blog,
+           template:    "room_result_json",
+           ok_button:   1
+       },
+       blog_wiki_startmessage : {
+           nonce:       Nonce,
+           force_room:  editroomname,
+           page:       "home",
+           markdown:    (isHtmlWiki)?0:1,
+           msgtext:     starttext
+
+       }
+    };
+
+    /* promises anyone?
+     *  - create the blog room
+     *  - set the blog rooms file flags
+     *  - create the edit room
+     *  - set the blog edit room flags
+     */
+    new Ajax.Request("/entroom",
+                    { method: 'post',
+                      parameters: $H(roomdata.create_blog_room).toQueryString(),
+                      onComplete: function(transport) {
+                          new Ajax.Request("/editroom",
+                                           { method: 'post',
+                                             parameters: $H(roomdata.setflags_blog_room).toQueryString(),
+                                             onComplete: function(transport) {
+                                                 new Ajax.Request("/entroom",
+                                                                  { method: 'post',
+                                                                    parameters: $H(roomdata.create_blog_edit_room).toQueryString(),
+                                                                    onComplete: function(transport) {
+                                                                        new Ajax.Request("/editroom",
+                                                                                         { method: 'post',
+                                                                                           parameters: $H(roomdata.setflags_blog_edit_room).toQueryString(),
+                                                                                           onComplete: function(transport) {
+                                                                                               ToggleVisibility('throbber');
+                                                                                               new Ajax.Request("/post",
+                                                                                                                { method: 'post',
+                                                                                                                  parameters: $H(roomdata.blog_wiki_startmessage).toQueryString(),
+                                                                                                                  onComplete: function(transport) {
+
+                                                                                                                  }
+                                                                                                                }
+                                                                                                               );
+                                                                                           }
+                                                                                         }
+                                                                                        );
+                                                                    }
+                                                                  }
+                                                                 );
+                                             }
+                                           }
+                                          )
+                      }
+                    }
+                   );
+
+    return false;
+}
+
+
+function deleteAllSelectedMessages() {
+
+}
+
+
+function publishMessage()
+{
+    var messages = document.getElementsByClassName("message");
+    var messageIdParts = messages[0].id.split('|');
+    var editRoomName = getTextContent(document.getElementById("rmname"));
+    var roomName = editRoomName.substring(0, editRoomName.length - 5);
+
+    var publish = {
+       editRoom: editRoomName,
+       blogRoom: roomName,
+       msgNo : messageIdParts[1],
+       msgIdStr : messageIdParts[2]
+    }
+
+    mvCommand = encodeURI("g_cmd=MOVE " + publish.msgNo + "|" + publish.blogRoom + "|1");
+    
+    new Ajax.Request("ajax_servcmd", {
+       parameters: mvCommand,
+       method: 'post',
+       onSuccess: function(transport) {
+           wCLog(transport.responseText);
+       }
+    });
+}
+
+
+
+
+// Generate a random string of the specified length
+// Useful for generating one-time-use div names
+//
+function randomString(length) {
+       var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghiklmnopqrstuvwxyz'.split('');
+       var str = '';
+
+       if (!length) {
+               length = Math.floor(Math.random() * chars.length);
+       }
+       for (var i = 0; i < length; i++) {
+               str += chars[Math.floor(Math.random() * chars.length)];
+       }
+       return str;
+}
+
+
+
+
diff --git a/webcit/static/wcpref.js b/webcit/static/wcpref.js
new file mode 100644 (file)
index 0000000..26e9451
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2005 - 2009 The Citadel Team
+ * Licensed under the GPL V3
+ * Webcit preference code 
+ */
+var persistentStorage = false;
+/* DOM5 storage disabled for now.. we want localStorage which isn't as widely available yet */
+//if (window.sessionStorage) {
+//  persistentStorage = true;
+//}
+function WCPrefs() {
+  this.cookieValCache = new Object();
+  this.noExpire = "Mon, 18 Jan 2038 5:14:07 AM";
+}
+
+function readPref(name) {
+  if (persistentStorage) {
+    return sessionStorage.getItem(name);
+  } else {
+    return this.cookieValCache[name];
+  }
+}
+
+function setPref(name, value) {
+  if (persistentStorage) {
+    sessionStorage.setItem(name, value);
+  } else {
+    document.cookie = "WC_" + name + "="+value+";expires="+this.noExpire;
+    //    this.cookieValCache[name] = value; 
+    //this.saveLocal();
+  }
+}
+
+function loadLocal() {
+  if (!persistentStorage) {
+    var cookies = document.cookie.split(";");
+    for(var i=0; i<cookies.length; i++) {
+      var cookie = cookies[i].split("=");
+      var name = cookie[0];
+      if (name.charAt(0) == " ") {
+       name = name.substr(1);
+      }
+      if (name.substr(0, 3) == "WC_") {
+       name = name.substr(3);
+       this.cookieValCache[name] = cookie[1];
+       if (!!window.console) {
+         console.log(name+"="+cookie[1]);
+       }
+      }
+    }
+  }
+}
+
+function saveLocal() {
+  if (!persistentStorage) {
+    // First we purge cookies with WC_ infront
+    var cookies = document.cookie.split(";");
+    var numOfCookies = cookies.length;
+    var finalCookieString = "";
+    for(var i=0; i<numOfCookies; i++) 
+      var cookie = cookies[i].split("=");
+      var name = cookie[0];
+      if (name.substr(0, 3) != "WC_") {
+       finalCookieString += cookies[i] + ";";
+      }
+    }
+    for(key in this.cookieValCache) {
+      var val = this.cookieValCache[key];
+      finalCookieString += "WC_" + key+"="+val+";";
+    }
+    document.cookie = finalCookieString;
+}
+
+WCPrefs.prototype.saveLocal = saveLocal;
+WCPrefs.prototype.loadLocal = loadLocal;
+WCPrefs.prototype.setPref = setPref;
+WCPrefs.prototype.readPref = readPref;
+var ctdlLocalPrefs = null;
+setupPrefEngine();
+function setupPrefEngine() {
+  ctdlLocalPrefs = new WCPrefs();
+  ctdlLocalPrefs.loadLocal();
+}
diff --git a/webcit/static/webcit_icons/8paint16.gif b/webcit/static/webcit_icons/8paint16.gif
new file mode 100644 (file)
index 0000000..5c2b48f
Binary files /dev/null and b/webcit/static/webcit_icons/8paint16.gif differ
diff --git a/webcit/static/webcit_icons/aol-32x32.gif b/webcit/static/webcit_icons/aol-32x32.gif
new file mode 100644 (file)
index 0000000..aed236e
Binary files /dev/null and b/webcit/static/webcit_icons/aol-32x32.gif differ
diff --git a/webcit/static/webcit_icons/blank.gif b/webcit/static/webcit_icons/blank.gif
new file mode 100644 (file)
index 0000000..4bcc753
Binary files /dev/null and b/webcit/static/webcit_icons/blank.gif differ
diff --git a/webcit/static/webcit_icons/bubble.gif b/webcit/static/webcit_icons/bubble.gif
new file mode 100644 (file)
index 0000000..93adba3
Binary files /dev/null and b/webcit/static/webcit_icons/bubble.gif differ
diff --git a/webcit/static/webcit_icons/bubble_filler.gif b/webcit/static/webcit_icons/bubble_filler.gif
new file mode 100644 (file)
index 0000000..49c9a6b
Binary files /dev/null and b/webcit/static/webcit_icons/bubble_filler.gif differ
diff --git a/webcit/static/webcit_icons/citadel-button-32x32.gif b/webcit/static/webcit_icons/citadel-button-32x32.gif
new file mode 100644 (file)
index 0000000..f16264f
Binary files /dev/null and b/webcit/static/webcit_icons/citadel-button-32x32.gif differ
diff --git a/webcit/static/webcit_icons/closewindow.gif b/webcit/static/webcit_icons/closewindow.gif
new file mode 100644 (file)
index 0000000..0cdac60
Binary files /dev/null and b/webcit/static/webcit_icons/closewindow.gif differ
diff --git a/webcit/static/webcit_icons/collapse.gif b/webcit/static/webcit_icons/collapse.gif
new file mode 100644 (file)
index 0000000..49f5819
Binary files /dev/null and b/webcit/static/webcit_icons/collapse.gif differ
diff --git a/webcit/static/webcit_icons/delete.gif b/webcit/static/webcit_icons/delete.gif
new file mode 100644 (file)
index 0000000..4309863
Binary files /dev/null and b/webcit/static/webcit_icons/delete.gif differ
diff --git a/webcit/static/webcit_icons/down_pointer.gif b/webcit/static/webcit_icons/down_pointer.gif
new file mode 100644 (file)
index 0000000..49a3ef5
Binary files /dev/null and b/webcit/static/webcit_icons/down_pointer.gif differ
diff --git a/webcit/static/webcit_icons/error.gif b/webcit/static/webcit_icons/error.gif
new file mode 100644 (file)
index 0000000..57d398c
Binary files /dev/null and b/webcit/static/webcit_icons/error.gif differ
diff --git a/webcit/static/webcit_icons/essen/16x16/abort.png b/webcit/static/webcit_icons/essen/16x16/abort.png
new file mode 100644 (file)
index 0000000..f7b6255
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/abort.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/account.png b/webcit/static/webcit_icons/essen/16x16/account.png
new file mode 100644 (file)
index 0000000..a705ea9
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/account.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/activeuser.png b/webcit/static/webcit_icons/essen/16x16/activeuser.png
new file mode 100644 (file)
index 0000000..e405a93
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/activeuser.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/addcontact.png b/webcit/static/webcit_icons/essen/16x16/addcontact.png
new file mode 100644 (file)
index 0000000..95a6319
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/addcontact.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/attachement.png b/webcit/static/webcit_icons/essen/16x16/attachement.png
new file mode 100644 (file)
index 0000000..7b54c84
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/attachement.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/back.png b/webcit/static/webcit_icons/essen/16x16/back.png
new file mode 100644 (file)
index 0000000..44c07d1
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/back.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/blog.png b/webcit/static/webcit_icons/essen/16x16/blog.png
new file mode 100644 (file)
index 0000000..72fe1d0
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/blog.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/calendar.png b/webcit/static/webcit_icons/essen/16x16/calendar.png
new file mode 100644 (file)
index 0000000..224306c
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/calendar.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/chat.png b/webcit/static/webcit_icons/essen/16x16/chat.png
new file mode 100644 (file)
index 0000000..6fd9a48
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/chat.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/check.png b/webcit/static/webcit_icons/essen/16x16/check.png
new file mode 100644 (file)
index 0000000..10624cd
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/check.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/config.png b/webcit/static/webcit_icons/essen/16x16/config.png
new file mode 100644 (file)
index 0000000..c749f65
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/config.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/contact.png b/webcit/static/webcit_icons/essen/16x16/contact.png
new file mode 100644 (file)
index 0000000..8c94722
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/contact.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/delete.png b/webcit/static/webcit_icons/essen/16x16/delete.png
new file mode 100644 (file)
index 0000000..787a600
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/delete.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/draft.png b/webcit/static/webcit_icons/essen/16x16/draft.png
new file mode 100644 (file)
index 0000000..73c3466
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/draft.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/email.png b/webcit/static/webcit_icons/essen/16x16/email.png
new file mode 100644 (file)
index 0000000..c728377
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/email.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/file.png b/webcit/static/webcit_icons/essen/16x16/file.png
new file mode 100644 (file)
index 0000000..aff0a5c
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/file.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/forward.png b/webcit/static/webcit_icons/essen/16x16/forward.png
new file mode 100644 (file)
index 0000000..6c86a9a
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/forward.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/login.png b/webcit/static/webcit_icons/essen/16x16/login.png
new file mode 100644 (file)
index 0000000..becbc5a
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/login.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/logout.png b/webcit/static/webcit_icons/essen/16x16/logout.png
new file mode 100644 (file)
index 0000000..10632ef
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/logout.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/network.png b/webcit/static/webcit_icons/essen/16x16/network.png
new file mode 100644 (file)
index 0000000..68ac983
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/network.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/nextroom.png b/webcit/static/webcit_icons/essen/16x16/nextroom.png
new file mode 100644 (file)
index 0000000..c6a6ae6
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/nextroom.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/note.png b/webcit/static/webcit_icons/essen/16x16/note.png
new file mode 100644 (file)
index 0000000..b807deb
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/note.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/pen.png b/webcit/static/webcit_icons/essen/16x16/pen.png
new file mode 100644 (file)
index 0000000..4d5bbd9
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/pen.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/pencil.png b/webcit/static/webcit_icons/essen/16x16/pencil.png
new file mode 100644 (file)
index 0000000..6616740
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/pencil.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/read.png b/webcit/static/webcit_icons/essen/16x16/read.png
new file mode 100644 (file)
index 0000000..7d7f8a0
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/read.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/readallmsg.png b/webcit/static/webcit_icons/essen/16x16/readallmsg.png
new file mode 100644 (file)
index 0000000..c7c26ab
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/readallmsg.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/refresh.png b/webcit/static/webcit_icons/essen/16x16/refresh.png
new file mode 100644 (file)
index 0000000..b6cb0e1
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/refresh.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/room.png b/webcit/static/webcit_icons/essen/16x16/room.png
new file mode 100644 (file)
index 0000000..9951f00
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/room.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/rss.png b/webcit/static/webcit_icons/essen/16x16/rss.png
new file mode 100644 (file)
index 0000000..eec61da
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/rss.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/search.png b/webcit/static/webcit_icons/essen/16x16/search.png
new file mode 100644 (file)
index 0000000..699f40a
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/search.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/setup.png b/webcit/static/webcit_icons/essen/16x16/setup.png
new file mode 100644 (file)
index 0000000..6e4f4e7
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/setup.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/skiproom.png b/webcit/static/webcit_icons/essen/16x16/skiproom.png
new file mode 100644 (file)
index 0000000..d698641
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/skiproom.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/summary.png b/webcit/static/webcit_icons/essen/16x16/summary.png
new file mode 100644 (file)
index 0000000..74cb86b
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/summary.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/task.png b/webcit/static/webcit_icons/essen/16x16/task.png
new file mode 100644 (file)
index 0000000..704acc2
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/task.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/taskday.png b/webcit/static/webcit_icons/essen/16x16/taskday.png
new file mode 100644 (file)
index 0000000..c7a8a33
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/taskday.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/ungoto.png b/webcit/static/webcit_icons/essen/16x16/ungoto.png
new file mode 100644 (file)
index 0000000..5cf416c
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/ungoto.png differ
diff --git a/webcit/static/webcit_icons/essen/16x16/user.png b/webcit/static/webcit_icons/essen/16x16/user.png
new file mode 100644 (file)
index 0000000..2660b9a
Binary files /dev/null and b/webcit/static/webcit_icons/essen/16x16/user.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/abort.png b/webcit/static/webcit_icons/essen/32x32/abort.png
new file mode 100644 (file)
index 0000000..72f9e21
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/abort.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/account.png b/webcit/static/webcit_icons/essen/32x32/account.png
new file mode 100644 (file)
index 0000000..b6520f7
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/account.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/activeuser.png b/webcit/static/webcit_icons/essen/32x32/activeuser.png
new file mode 100644 (file)
index 0000000..8cc8ba0
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/activeuser.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/addcontact.png b/webcit/static/webcit_icons/essen/32x32/addcontact.png
new file mode 100644 (file)
index 0000000..6843212
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/addcontact.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/attachement.png b/webcit/static/webcit_icons/essen/32x32/attachement.png
new file mode 100644 (file)
index 0000000..56fcbcf
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/attachement.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/back.png b/webcit/static/webcit_icons/essen/32x32/back.png
new file mode 100644 (file)
index 0000000..a367595
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/back.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/blog.png b/webcit/static/webcit_icons/essen/32x32/blog.png
new file mode 100644 (file)
index 0000000..b039659
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/blog.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/calendar.png b/webcit/static/webcit_icons/essen/32x32/calendar.png
new file mode 100644 (file)
index 0000000..8e5ca06
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/calendar.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/chat.png b/webcit/static/webcit_icons/essen/32x32/chat.png
new file mode 100644 (file)
index 0000000..7c4154a
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/chat.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/check.png b/webcit/static/webcit_icons/essen/32x32/check.png
new file mode 100644 (file)
index 0000000..dddc20c
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/check.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/config.png b/webcit/static/webcit_icons/essen/32x32/config.png
new file mode 100644 (file)
index 0000000..5366b4d
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/config.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/contact.png b/webcit/static/webcit_icons/essen/32x32/contact.png
new file mode 100644 (file)
index 0000000..8a13063
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/contact.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/delete.png b/webcit/static/webcit_icons/essen/32x32/delete.png
new file mode 100644 (file)
index 0000000..32bd66d
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/delete.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/draft.png b/webcit/static/webcit_icons/essen/32x32/draft.png
new file mode 100644 (file)
index 0000000..aa76cdc
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/draft.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/email.png b/webcit/static/webcit_icons/essen/32x32/email.png
new file mode 100644 (file)
index 0000000..eb98276
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/email.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/feed.png b/webcit/static/webcit_icons/essen/32x32/feed.png
new file mode 100644 (file)
index 0000000..040720d
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/feed.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/file.png b/webcit/static/webcit_icons/essen/32x32/file.png
new file mode 100644 (file)
index 0000000..6b622b4
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/file.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/forward.png b/webcit/static/webcit_icons/essen/32x32/forward.png
new file mode 100644 (file)
index 0000000..eae25fc
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/forward.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/login.png b/webcit/static/webcit_icons/essen/32x32/login.png
new file mode 100644 (file)
index 0000000..1dfd809
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/login.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/logout.png b/webcit/static/webcit_icons/essen/32x32/logout.png
new file mode 100644 (file)
index 0000000..696bc50
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/logout.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/network.png b/webcit/static/webcit_icons/essen/32x32/network.png
new file mode 100644 (file)
index 0000000..424f79b
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/network.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/nextroom.png b/webcit/static/webcit_icons/essen/32x32/nextroom.png
new file mode 100644 (file)
index 0000000..c0255ba
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/nextroom.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/note.png b/webcit/static/webcit_icons/essen/32x32/note.png
new file mode 100644 (file)
index 0000000..8252453
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/note.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/pen.png b/webcit/static/webcit_icons/essen/32x32/pen.png
new file mode 100644 (file)
index 0000000..2fed49d
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/pen.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/pencil.png b/webcit/static/webcit_icons/essen/32x32/pencil.png
new file mode 100644 (file)
index 0000000..b138a5f
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/pencil.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/readallmsg.png b/webcit/static/webcit_icons/essen/32x32/readallmsg.png
new file mode 100644 (file)
index 0000000..80bbac6
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/readallmsg.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/refresh.png b/webcit/static/webcit_icons/essen/32x32/refresh.png
new file mode 100644 (file)
index 0000000..573d92c
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/refresh.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/room.png b/webcit/static/webcit_icons/essen/32x32/room.png
new file mode 100644 (file)
index 0000000..4d9932f
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/room.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/search.png b/webcit/static/webcit_icons/essen/32x32/search.png
new file mode 100644 (file)
index 0000000..e331d59
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/search.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/setup.png b/webcit/static/webcit_icons/essen/32x32/setup.png
new file mode 100644 (file)
index 0000000..8ee17d5
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/setup.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/skiproom.png b/webcit/static/webcit_icons/essen/32x32/skiproom.png
new file mode 100644 (file)
index 0000000..0b6fffc
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/skiproom.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/summary.png b/webcit/static/webcit_icons/essen/32x32/summary.png
new file mode 100644 (file)
index 0000000..60d8729
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/summary.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/task.png b/webcit/static/webcit_icons/essen/32x32/task.png
new file mode 100644 (file)
index 0000000..ca8b051
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/task.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/taskday.png b/webcit/static/webcit_icons/essen/32x32/taskday.png
new file mode 100644 (file)
index 0000000..bb53aba
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/taskday.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/ungoto.png b/webcit/static/webcit_icons/essen/32x32/ungoto.png
new file mode 100644 (file)
index 0000000..d8dcb1f
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/ungoto.png differ
diff --git a/webcit/static/webcit_icons/essen/32x32/user.png b/webcit/static/webcit_icons/essen/32x32/user.png
new file mode 100644 (file)
index 0000000..292dd1c
Binary files /dev/null and b/webcit/static/webcit_icons/essen/32x32/user.png differ
diff --git a/webcit/static/webcit_icons/expand.gif b/webcit/static/webcit_icons/expand.gif
new file mode 100644 (file)
index 0000000..fc968a0
Binary files /dev/null and b/webcit/static/webcit_icons/expand.gif differ
diff --git a/webcit/static/webcit_icons/google-32x32.gif b/webcit/static/webcit_icons/google-32x32.gif
new file mode 100644 (file)
index 0000000..c921f05
Binary files /dev/null and b/webcit/static/webcit_icons/google-32x32.gif differ
diff --git a/webcit/static/webcit_icons/old/activeuser_24x.gif b/webcit/static/webcit_icons/old/activeuser_24x.gif
new file mode 100644 (file)
index 0000000..6ec913f
Binary files /dev/null and b/webcit/static/webcit_icons/old/activeuser_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/addevent_24x.gif b/webcit/static/webcit_icons/old/addevent_24x.gif
new file mode 100644 (file)
index 0000000..d6b34bd
Binary files /dev/null and b/webcit/static/webcit_icons/old/addevent_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/addnewcontact_24x.gif b/webcit/static/webcit_icons/old/addnewcontact_24x.gif
new file mode 100644 (file)
index 0000000..f636492
Binary files /dev/null and b/webcit/static/webcit_icons/old/addnewcontact_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/advanpage2_32x.gif b/webcit/static/webcit_icons/old/advanpage2_32x.gif
new file mode 100644 (file)
index 0000000..667dec7
Binary files /dev/null and b/webcit/static/webcit_icons/old/advanpage2_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/advanpage2_48x.gif b/webcit/static/webcit_icons/old/advanpage2_48x.gif
new file mode 100644 (file)
index 0000000..6ba92ed
Binary files /dev/null and b/webcit/static/webcit_icons/old/advanpage2_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/bgcolor.gif b/webcit/static/webcit_icons/old/bgcolor.gif
new file mode 100644 (file)
index 0000000..55fcf1b
Binary files /dev/null and b/webcit/static/webcit_icons/old/bgcolor.gif differ
diff --git a/webcit/static/webcit_icons/old/blackdot.gif b/webcit/static/webcit_icons/old/blackdot.gif
new file mode 100644 (file)
index 0000000..f79319f
Binary files /dev/null and b/webcit/static/webcit_icons/old/blackdot.gif differ
diff --git a/webcit/static/webcit_icons/old/body-background.gif b/webcit/static/webcit_icons/old/body-background.gif
new file mode 100644 (file)
index 0000000..e69942e
Binary files /dev/null and b/webcit/static/webcit_icons/old/body-background.gif differ
diff --git a/webcit/static/webcit_icons/old/bold.gif b/webcit/static/webcit_icons/old/bold.gif
new file mode 100644 (file)
index 0000000..bdb3259
Binary files /dev/null and b/webcit/static/webcit_icons/old/bold.gif differ
diff --git a/webcit/static/webcit_icons/old/calarea_16x.gif b/webcit/static/webcit_icons/old/calarea_16x.gif
new file mode 100644 (file)
index 0000000..ec469b7
Binary files /dev/null and b/webcit/static/webcit_icons/old/calarea_16x.gif differ
diff --git a/webcit/static/webcit_icons/old/calarea_32x.gif b/webcit/static/webcit_icons/old/calarea_32x.gif
new file mode 100644 (file)
index 0000000..67d1e78
Binary files /dev/null and b/webcit/static/webcit_icons/old/calarea_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/calarea_48x.gif b/webcit/static/webcit_icons/old/calarea_48x.gif
new file mode 100644 (file)
index 0000000..fbb8fcc
Binary files /dev/null and b/webcit/static/webcit_icons/old/calarea_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/centre.gif b/webcit/static/webcit_icons/old/centre.gif
new file mode 100644 (file)
index 0000000..f98c86a
Binary files /dev/null and b/webcit/static/webcit_icons/old/centre.gif differ
diff --git a/webcit/static/webcit_icons/old/chatrooms_16x.gif b/webcit/static/webcit_icons/old/chatrooms_16x.gif
new file mode 100644 (file)
index 0000000..7c95338
Binary files /dev/null and b/webcit/static/webcit_icons/old/chatrooms_16x.gif differ
diff --git a/webcit/static/webcit_icons/old/chatrooms_32x.gif b/webcit/static/webcit_icons/old/chatrooms_32x.gif
new file mode 100644 (file)
index 0000000..8c0fb0c
Binary files /dev/null and b/webcit/static/webcit_icons/old/chatrooms_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/chatrooms_48x.gif b/webcit/static/webcit_icons/old/chatrooms_48x.gif
new file mode 100644 (file)
index 0000000..2d42ae2
Binary files /dev/null and b/webcit/static/webcit_icons/old/chatrooms_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/citadelchat_16x.gif b/webcit/static/webcit_icons/old/citadelchat_16x.gif
new file mode 100644 (file)
index 0000000..02fd9d3
Binary files /dev/null and b/webcit/static/webcit_icons/old/citadelchat_16x.gif differ
diff --git a/webcit/static/webcit_icons/old/citadelchat_24x.gif b/webcit/static/webcit_icons/old/citadelchat_24x.gif
new file mode 100644 (file)
index 0000000..64d27b8
Binary files /dev/null and b/webcit/static/webcit_icons/old/citadelchat_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/citadelchat_32x.gif b/webcit/static/webcit_icons/old/citadelchat_32x.gif
new file mode 100644 (file)
index 0000000..0212d87
Binary files /dev/null and b/webcit/static/webcit_icons/old/citadelchat_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/citadelchat_48x.gif b/webcit/static/webcit_icons/old/citadelchat_48x.gif
new file mode 100644 (file)
index 0000000..fe4770f
Binary files /dev/null and b/webcit/static/webcit_icons/old/citadelchat_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/copy.gif b/webcit/static/webcit_icons/old/copy.gif
new file mode 100644 (file)
index 0000000..faebb18
Binary files /dev/null and b/webcit/static/webcit_icons/old/copy.gif differ
diff --git a/webcit/static/webcit_icons/old/cut.gif b/webcit/static/webcit_icons/old/cut.gif
new file mode 100644 (file)
index 0000000..ca60a1a
Binary files /dev/null and b/webcit/static/webcit_icons/old/cut.gif differ
diff --git a/webcit/static/webcit_icons/old/diskette_24x.gif b/webcit/static/webcit_icons/old/diskette_24x.gif
new file mode 100644 (file)
index 0000000..3cd59ea
Binary files /dev/null and b/webcit/static/webcit_icons/old/diskette_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/enternewnote_24x.gif b/webcit/static/webcit_icons/old/enternewnote_24x.gif
new file mode 100644 (file)
index 0000000..a8fbda5
Binary files /dev/null and b/webcit/static/webcit_icons/old/enternewnote_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/folder_closed.gif b/webcit/static/webcit_icons/old/folder_closed.gif
new file mode 100644 (file)
index 0000000..f772648
Binary files /dev/null and b/webcit/static/webcit_icons/old/folder_closed.gif differ
diff --git a/webcit/static/webcit_icons/old/folder_open.gif b/webcit/static/webcit_icons/old/folder_open.gif
new file mode 100644 (file)
index 0000000..27c8bfc
Binary files /dev/null and b/webcit/static/webcit_icons/old/folder_open.gif differ
diff --git a/webcit/static/webcit_icons/old/gradient_background.jpg b/webcit/static/webcit_icons/old/gradient_background.jpg
new file mode 100644 (file)
index 0000000..0ad9fd0
Binary files /dev/null and b/webcit/static/webcit_icons/old/gradient_background.jpg differ
diff --git a/webcit/static/webcit_icons/old/hr.gif b/webcit/static/webcit_icons/old/hr.gif
new file mode 100644 (file)
index 0000000..c98da9d
Binary files /dev/null and b/webcit/static/webcit_icons/old/hr.gif differ
diff --git a/webcit/static/webcit_icons/old/hyperlink.gif b/webcit/static/webcit_icons/old/hyperlink.gif
new file mode 100644 (file)
index 0000000..1fb1a4a
Binary files /dev/null and b/webcit/static/webcit_icons/old/hyperlink.gif differ
diff --git a/webcit/static/webcit_icons/old/image.gif b/webcit/static/webcit_icons/old/image.gif
new file mode 100644 (file)
index 0000000..8cbba16
Binary files /dev/null and b/webcit/static/webcit_icons/old/image.gif differ
diff --git a/webcit/static/webcit_icons/old/inactiveuser_24x.gif b/webcit/static/webcit_icons/old/inactiveuser_24x.gif
new file mode 100644 (file)
index 0000000..74a3c1e
Binary files /dev/null and b/webcit/static/webcit_icons/old/inactiveuser_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/indent.gif b/webcit/static/webcit_icons/old/indent.gif
new file mode 100644 (file)
index 0000000..2abb6b2
Binary files /dev/null and b/webcit/static/webcit_icons/old/indent.gif differ
diff --git a/webcit/static/webcit_icons/old/italic.gif b/webcit/static/webcit_icons/old/italic.gif
new file mode 100644 (file)
index 0000000..8b1485b
Binary files /dev/null and b/webcit/static/webcit_icons/old/italic.gif differ
diff --git a/webcit/static/webcit_icons/old/justifyfull.gif b/webcit/static/webcit_icons/old/justifyfull.gif
new file mode 100644 (file)
index 0000000..b12528b
Binary files /dev/null and b/webcit/static/webcit_icons/old/justifyfull.gif differ
diff --git a/webcit/static/webcit_icons/old/lastnode.gif b/webcit/static/webcit_icons/old/lastnode.gif
new file mode 100644 (file)
index 0000000..d1fbed7
Binary files /dev/null and b/webcit/static/webcit_icons/old/lastnode.gif differ
diff --git a/webcit/static/webcit_icons/old/left_just.gif b/webcit/static/webcit_icons/old/left_just.gif
new file mode 100644 (file)
index 0000000..505c5d9
Binary files /dev/null and b/webcit/static/webcit_icons/old/left_just.gif differ
diff --git a/webcit/static/webcit_icons/old/line.gif b/webcit/static/webcit_icons/old/line.gif
new file mode 100644 (file)
index 0000000..1bb437a
Binary files /dev/null and b/webcit/static/webcit_icons/old/line.gif differ
diff --git a/webcit/static/webcit_icons/old/list.gif b/webcit/static/webcit_icons/old/list.gif
new file mode 100644 (file)
index 0000000..b3018d9
Binary files /dev/null and b/webcit/static/webcit_icons/old/list.gif differ
diff --git a/webcit/static/webcit_icons/old/logoff_32x.gif b/webcit/static/webcit_icons/old/logoff_32x.gif
new file mode 100644 (file)
index 0000000..1c42037
Binary files /dev/null and b/webcit/static/webcit_icons/old/logoff_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/markngo_24x.gif b/webcit/static/webcit_icons/old/markngo_24x.gif
new file mode 100644 (file)
index 0000000..cc7afeb
Binary files /dev/null and b/webcit/static/webcit_icons/old/markngo_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/minus.gif b/webcit/static/webcit_icons/old/minus.gif
new file mode 100644 (file)
index 0000000..50f623b
Binary files /dev/null and b/webcit/static/webcit_icons/old/minus.gif differ
diff --git a/webcit/static/webcit_icons/old/minus_last.gif b/webcit/static/webcit_icons/old/minus_last.gif
new file mode 100644 (file)
index 0000000..c316c83
Binary files /dev/null and b/webcit/static/webcit_icons/old/minus_last.gif differ
diff --git a/webcit/static/webcit_icons/old/minus_last_no_root.gif b/webcit/static/webcit_icons/old/minus_last_no_root.gif
new file mode 100644 (file)
index 0000000..cd52861
Binary files /dev/null and b/webcit/static/webcit_icons/old/minus_last_no_root.gif differ
diff --git a/webcit/static/webcit_icons/old/minus_no_root.gif b/webcit/static/webcit_icons/old/minus_no_root.gif
new file mode 100644 (file)
index 0000000..0cd1ab6
Binary files /dev/null and b/webcit/static/webcit_icons/old/minus_no_root.gif differ
diff --git a/webcit/static/webcit_icons/old/minus_nolines.gif b/webcit/static/webcit_icons/old/minus_nolines.gif
new file mode 100644 (file)
index 0000000..b54e870
Binary files /dev/null and b/webcit/static/webcit_icons/old/minus_nolines.gif differ
diff --git a/webcit/static/webcit_icons/old/monthview2_24x.gif b/webcit/static/webcit_icons/old/monthview2_24x.gif
new file mode 100644 (file)
index 0000000..209be94
Binary files /dev/null and b/webcit/static/webcit_icons/old/monthview2_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/newmess2_24x.gif b/webcit/static/webcit_icons/old/newmess2_24x.gif
new file mode 100644 (file)
index 0000000..fcfeb99
Binary files /dev/null and b/webcit/static/webcit_icons/old/newmess2_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/newmess3_24x.gif b/webcit/static/webcit_icons/old/newmess3_24x.gif
new file mode 100644 (file)
index 0000000..3c6ac92
Binary files /dev/null and b/webcit/static/webcit_icons/old/newmess3_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/nextdate_32x.gif b/webcit/static/webcit_icons/old/nextdate_32x.gif
new file mode 100644 (file)
index 0000000..6288caf
Binary files /dev/null and b/webcit/static/webcit_icons/old/nextdate_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/numbered_list.gif b/webcit/static/webcit_icons/old/numbered_list.gif
new file mode 100644 (file)
index 0000000..d1a4dbc
Binary files /dev/null and b/webcit/static/webcit_icons/old/numbered_list.gif differ
diff --git a/webcit/static/webcit_icons/old/outdent.gif b/webcit/static/webcit_icons/old/outdent.gif
new file mode 100644 (file)
index 0000000..fa3c1b6
Binary files /dev/null and b/webcit/static/webcit_icons/old/outdent.gif differ
diff --git a/webcit/static/webcit_icons/old/page.gif b/webcit/static/webcit_icons/old/page.gif
new file mode 100644 (file)
index 0000000..27f9698
Binary files /dev/null and b/webcit/static/webcit_icons/old/page.gif differ
diff --git a/webcit/static/webcit_icons/old/page16x16.gif b/webcit/static/webcit_icons/old/page16x16.gif
new file mode 100644 (file)
index 0000000..1a3b54c
Binary files /dev/null and b/webcit/static/webcit_icons/old/page16x16.gif differ
diff --git a/webcit/static/webcit_icons/old/paste.gif b/webcit/static/webcit_icons/old/paste.gif
new file mode 100644 (file)
index 0000000..9bcc76a
Binary files /dev/null and b/webcit/static/webcit_icons/old/paste.gif differ
diff --git a/webcit/static/webcit_icons/old/pixel.gif b/webcit/static/webcit_icons/old/pixel.gif
new file mode 100644 (file)
index 0000000..5bfd67a
Binary files /dev/null and b/webcit/static/webcit_icons/old/pixel.gif differ
diff --git a/webcit/static/webcit_icons/old/plus.gif b/webcit/static/webcit_icons/old/plus.gif
new file mode 100644 (file)
index 0000000..c84dce2
Binary files /dev/null and b/webcit/static/webcit_icons/old/plus.gif differ
diff --git a/webcit/static/webcit_icons/old/plus_last.gif b/webcit/static/webcit_icons/old/plus_last.gif
new file mode 100644 (file)
index 0000000..701c16c
Binary files /dev/null and b/webcit/static/webcit_icons/old/plus_last.gif differ
diff --git a/webcit/static/webcit_icons/old/plus_last_no_root.gif b/webcit/static/webcit_icons/old/plus_last_no_root.gif
new file mode 100644 (file)
index 0000000..84e0662
Binary files /dev/null and b/webcit/static/webcit_icons/old/plus_last_no_root.gif differ
diff --git a/webcit/static/webcit_icons/old/plus_no_root.gif b/webcit/static/webcit_icons/old/plus_no_root.gif
new file mode 100644 (file)
index 0000000..22a4a90
Binary files /dev/null and b/webcit/static/webcit_icons/old/plus_no_root.gif differ
diff --git a/webcit/static/webcit_icons/old/plus_nolines.gif b/webcit/static/webcit_icons/old/plus_nolines.gif
new file mode 100644 (file)
index 0000000..a7dc6be
Binary files /dev/null and b/webcit/static/webcit_icons/old/plus_nolines.gif differ
diff --git a/webcit/static/webcit_icons/old/prevdate_32x.gif b/webcit/static/webcit_icons/old/prevdate_32x.gif
new file mode 100644 (file)
index 0000000..c8c98b5
Binary files /dev/null and b/webcit/static/webcit_icons/old/prevdate_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/privatemess_16x.gif b/webcit/static/webcit_icons/old/privatemess_16x.gif
new file mode 100644 (file)
index 0000000..0070b72
Binary files /dev/null and b/webcit/static/webcit_icons/old/privatemess_16x.gif differ
diff --git a/webcit/static/webcit_icons/old/privatemess_32x.gif b/webcit/static/webcit_icons/old/privatemess_32x.gif
new file mode 100644 (file)
index 0000000..9b9d6d4
Binary files /dev/null and b/webcit/static/webcit_icons/old/privatemess_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/privatemess_48x.gif b/webcit/static/webcit_icons/old/privatemess_48x.gif
new file mode 100644 (file)
index 0000000..2c54b39
Binary files /dev/null and b/webcit/static/webcit_icons/old/privatemess_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/readallmess3_24x.gif b/webcit/static/webcit_icons/old/readallmess3_24x.gif
new file mode 100644 (file)
index 0000000..fb2479a
Binary files /dev/null and b/webcit/static/webcit_icons/old/readallmess3_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/redo.gif b/webcit/static/webcit_icons/old/redo.gif
new file mode 100644 (file)
index 0000000..b51d6b8
Binary files /dev/null and b/webcit/static/webcit_icons/old/redo.gif differ
diff --git a/webcit/static/webcit_icons/old/right_just.gif b/webcit/static/webcit_icons/old/right_just.gif
new file mode 100644 (file)
index 0000000..a3204d9
Binary files /dev/null and b/webcit/static/webcit_icons/old/right_just.gif differ
diff --git a/webcit/static/webcit_icons/old/rss_16x.png b/webcit/static/webcit_icons/old/rss_16x.png
new file mode 100644 (file)
index 0000000..e65fbf6
Binary files /dev/null and b/webcit/static/webcit_icons/old/rss_16x.png differ
diff --git a/webcit/static/webcit_icons/old/savecontact_16x.gif b/webcit/static/webcit_icons/old/savecontact_16x.gif
new file mode 100644 (file)
index 0000000..df79ac2
Binary files /dev/null and b/webcit/static/webcit_icons/old/savecontact_16x.gif differ
diff --git a/webcit/static/webcit_icons/old/savecontact_32x.gif b/webcit/static/webcit_icons/old/savecontact_32x.gif
new file mode 100644 (file)
index 0000000..c1513cf
Binary files /dev/null and b/webcit/static/webcit_icons/old/savecontact_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/savecontact_48x.gif b/webcit/static/webcit_icons/old/savecontact_48x.gif
new file mode 100644 (file)
index 0000000..d8caa0b
Binary files /dev/null and b/webcit/static/webcit_icons/old/savecontact_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/skipthisroom_24x.gif b/webcit/static/webcit_icons/old/skipthisroom_24x.gif
new file mode 100644 (file)
index 0000000..099652a
Binary files /dev/null and b/webcit/static/webcit_icons/old/skipthisroom_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/spellcheck.gif b/webcit/static/webcit_icons/old/spellcheck.gif
new file mode 100644 (file)
index 0000000..e6c8d82
Binary files /dev/null and b/webcit/static/webcit_icons/old/spellcheck.gif differ
diff --git a/webcit/static/webcit_icons/old/square.gif b/webcit/static/webcit_icons/old/square.gif
new file mode 100644 (file)
index 0000000..a413fc8
Binary files /dev/null and b/webcit/static/webcit_icons/old/square.gif differ
diff --git a/webcit/static/webcit_icons/old/storenotes_16x.gif b/webcit/static/webcit_icons/old/storenotes_16x.gif
new file mode 100644 (file)
index 0000000..66f08b5
Binary files /dev/null and b/webcit/static/webcit_icons/old/storenotes_16x.gif differ
diff --git a/webcit/static/webcit_icons/old/storenotes_32x.gif b/webcit/static/webcit_icons/old/storenotes_32x.gif
new file mode 100644 (file)
index 0000000..ea8c618
Binary files /dev/null and b/webcit/static/webcit_icons/old/storenotes_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/storenotes_48x.gif b/webcit/static/webcit_icons/old/storenotes_48x.gif
new file mode 100644 (file)
index 0000000..4ddaa63
Binary files /dev/null and b/webcit/static/webcit_icons/old/storenotes_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/summscreen_32x.gif b/webcit/static/webcit_icons/old/summscreen_32x.gif
new file mode 100644 (file)
index 0000000..b143fbf
Binary files /dev/null and b/webcit/static/webcit_icons/old/summscreen_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/summscreen_48x.gif b/webcit/static/webcit_icons/old/summscreen_48x.gif
new file mode 100644 (file)
index 0000000..9f536b8
Binary files /dev/null and b/webcit/static/webcit_icons/old/summscreen_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/t.gif b/webcit/static/webcit_icons/old/t.gif
new file mode 100644 (file)
index 0000000..23efd27
Binary files /dev/null and b/webcit/static/webcit_icons/old/t.gif differ
diff --git a/webcit/static/webcit_icons/old/t_no_root.gif b/webcit/static/webcit_icons/old/t_no_root.gif
new file mode 100644 (file)
index 0000000..3da5e91
Binary files /dev/null and b/webcit/static/webcit_icons/old/t_no_root.gif differ
diff --git a/webcit/static/webcit_icons/old/taskday2_24x.gif b/webcit/static/webcit_icons/old/taskday2_24x.gif
new file mode 100644 (file)
index 0000000..995b171
Binary files /dev/null and b/webcit/static/webcit_icons/old/taskday2_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/taskmanag_16x.gif b/webcit/static/webcit_icons/old/taskmanag_16x.gif
new file mode 100644 (file)
index 0000000..fd8cae9
Binary files /dev/null and b/webcit/static/webcit_icons/old/taskmanag_16x.gif differ
diff --git a/webcit/static/webcit_icons/old/taskmanag_24x.gif b/webcit/static/webcit_icons/old/taskmanag_24x.gif
new file mode 100644 (file)
index 0000000..120284e
Binary files /dev/null and b/webcit/static/webcit_icons/old/taskmanag_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/taskmanag_32x.gif b/webcit/static/webcit_icons/old/taskmanag_32x.gif
new file mode 100644 (file)
index 0000000..c6065a4
Binary files /dev/null and b/webcit/static/webcit_icons/old/taskmanag_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/taskmanag_48x.gif b/webcit/static/webcit_icons/old/taskmanag_48x.gif
new file mode 100644 (file)
index 0000000..883b280
Binary files /dev/null and b/webcit/static/webcit_icons/old/taskmanag_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/textcolor.gif b/webcit/static/webcit_icons/old/textcolor.gif
new file mode 100644 (file)
index 0000000..413e041
Binary files /dev/null and b/webcit/static/webcit_icons/old/textcolor.gif differ
diff --git a/webcit/static/webcit_icons/old/underline.gif b/webcit/static/webcit_icons/old/underline.gif
new file mode 100644 (file)
index 0000000..db8fb4f
Binary files /dev/null and b/webcit/static/webcit_icons/old/underline.gif differ
diff --git a/webcit/static/webcit_icons/old/undo.gif b/webcit/static/webcit_icons/old/undo.gif
new file mode 100644 (file)
index 0000000..555d0db
Binary files /dev/null and b/webcit/static/webcit_icons/old/undo.gif differ
diff --git a/webcit/static/webcit_icons/old/ungoto2_24x.gif b/webcit/static/webcit_icons/old/ungoto2_24x.gif
new file mode 100644 (file)
index 0000000..dae0abb
Binary files /dev/null and b/webcit/static/webcit_icons/old/ungoto2_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/usermanag_32x.gif b/webcit/static/webcit_icons/old/usermanag_32x.gif
new file mode 100644 (file)
index 0000000..9fa9dd4
Binary files /dev/null and b/webcit/static/webcit_icons/old/usermanag_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/usermanag_48x.gif b/webcit/static/webcit_icons/old/usermanag_48x.gif
new file mode 100644 (file)
index 0000000..0876d61
Binary files /dev/null and b/webcit/static/webcit_icons/old/usermanag_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/viewcontacts_16x.gif b/webcit/static/webcit_icons/old/viewcontacts_16x.gif
new file mode 100644 (file)
index 0000000..880adbb
Binary files /dev/null and b/webcit/static/webcit_icons/old/viewcontacts_16x.gif differ
diff --git a/webcit/static/webcit_icons/old/viewcontacts_24x.gif b/webcit/static/webcit_icons/old/viewcontacts_24x.gif
new file mode 100644 (file)
index 0000000..d04eff9
Binary files /dev/null and b/webcit/static/webcit_icons/old/viewcontacts_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/viewcontacts_32x.gif b/webcit/static/webcit_icons/old/viewcontacts_32x.gif
new file mode 100644 (file)
index 0000000..c6dee06
Binary files /dev/null and b/webcit/static/webcit_icons/old/viewcontacts_32x.gif differ
diff --git a/webcit/static/webcit_icons/old/viewcontacts_48x.gif b/webcit/static/webcit_icons/old/viewcontacts_48x.gif
new file mode 100644 (file)
index 0000000..b6495a9
Binary files /dev/null and b/webcit/static/webcit_icons/old/viewcontacts_48x.gif differ
diff --git a/webcit/static/webcit_icons/old/viewnotes_24x.gif b/webcit/static/webcit_icons/old/viewnotes_24x.gif
new file mode 100644 (file)
index 0000000..cba60b0
Binary files /dev/null and b/webcit/static/webcit_icons/old/viewnotes_24x.gif differ
diff --git a/webcit/static/webcit_icons/old/week_view.gif b/webcit/static/webcit_icons/old/week_view.gif
new file mode 100644 (file)
index 0000000..4621306
Binary files /dev/null and b/webcit/static/webcit_icons/old/week_view.gif differ
diff --git a/webcit/static/webcit_icons/old/white.gif b/webcit/static/webcit_icons/old/white.gif
new file mode 100644 (file)
index 0000000..6a62ac8
Binary files /dev/null and b/webcit/static/webcit_icons/old/white.gif differ
diff --git a/webcit/static/webcit_icons/old/xml_button.gif b/webcit/static/webcit_icons/old/xml_button.gif
new file mode 100644 (file)
index 0000000..ecb0957
Binary files /dev/null and b/webcit/static/webcit_icons/old/xml_button.gif differ
diff --git a/webcit/static/webcit_icons/old/year_view.gif b/webcit/static/webcit_icons/old/year_view.gif
new file mode 100644 (file)
index 0000000..17272f9
Binary files /dev/null and b/webcit/static/webcit_icons/old/year_view.gif differ
diff --git a/webcit/static/webcit_icons/openid-32x32.gif b/webcit/static/webcit_icons/openid-32x32.gif
new file mode 100644 (file)
index 0000000..a840e2a
Binary files /dev/null and b/webcit/static/webcit_icons/openid-32x32.gif differ
diff --git a/webcit/static/webcit_icons/openid-small.gif b/webcit/static/webcit_icons/openid-small.gif
new file mode 100644 (file)
index 0000000..cde836c
Binary files /dev/null and b/webcit/static/webcit_icons/openid-small.gif differ
diff --git a/webcit/static/webcit_icons/resizecorner.png b/webcit/static/webcit_icons/resizecorner.png
new file mode 100644 (file)
index 0000000..fa3e382
Binary files /dev/null and b/webcit/static/webcit_icons/resizecorner.png differ
diff --git a/webcit/static/webcit_icons/resizegrippy.gif b/webcit/static/webcit_icons/resizegrippy.gif
new file mode 100644 (file)
index 0000000..3cba005
Binary files /dev/null and b/webcit/static/webcit_icons/resizegrippy.gif differ
diff --git a/webcit/static/webcit_icons/sort_none.gif b/webcit/static/webcit_icons/sort_none.gif
new file mode 100644 (file)
index 0000000..68dce00
Binary files /dev/null and b/webcit/static/webcit_icons/sort_none.gif differ
diff --git a/webcit/static/webcit_icons/throbber.gif b/webcit/static/webcit_icons/throbber.gif
new file mode 100644 (file)
index 0000000..772aa89
Binary files /dev/null and b/webcit/static/webcit_icons/throbber.gif differ
diff --git a/webcit/static/webcit_icons/up_pointer.gif b/webcit/static/webcit_icons/up_pointer.gif
new file mode 100644 (file)
index 0000000..83e5e61
Binary files /dev/null and b/webcit/static/webcit_icons/up_pointer.gif differ
diff --git a/webcit/static/webcit_icons/yahoo-32x32.gif b/webcit/static/webcit_icons/yahoo-32x32.gif
new file mode 100644 (file)
index 0000000..c297a27
Binary files /dev/null and b/webcit/static/webcit_icons/yahoo-32x32.gif differ
diff --git a/webcit/static/zapduplicates.js b/webcit/static/zapduplicates.js
new file mode 100644 (file)
index 0000000..59d1674
--- /dev/null
@@ -0,0 +1,64 @@
+function loadZapMessages(transport)
+{
+    var dupes = '';
+    var dupcount = 0;
+    try {
+       var data = evalJSON(transport.responseText);
+       if (!!data && transport.responseText.length < 2) {
+           alert("Message loading failed");
+       } 
+       nummsgs = data['nummsgs'];
+       msgs = data['msgs'];
+       var length = msgs.length;
+       rowArray = new Array(length); // store so they can be sorted
+       wCLog("Row array length: "+rowArray.length);
+       for(var x=1; x<length; ++x) {
+           var currentRow = msgs[x];
+           var LastRow = msgs[x-1];
+           if ((currentRow[1] == LastRow[1]) &&
+               (currentRow[2] == LastRow[2]) &&
+               (currentRow[4] == LastRow[4]))
+           {
+               dupcount ++;
+               dupes += currentRow[0] + ',' ;
+               if (dupes.length > 800) {
+                   var mvCommand = "g_cmd=MOVE%20" + dupes + "|"+encodeURIComponent('Trash')+"|0";
+                   new Ajax.Request("ajax_servcmd", {
+                       parameters: mvCommand,
+                       method: 'post',
+                   });
+                   dupes = "";
+               }
+
+           }
+
+       }
+
+    } catch (e) {
+       window.alert(e+"|"+e.description);
+    }
+    var mvCommand = "g_cmd=MOVE%20" + dupes + "|"+encodeURIComponent('Trash')+"|0";
+    new Ajax.Request("ajax_servcmd", {
+       parameters: mvCommand,
+       method: 'post',
+    });
+
+    alert ('deleted: '+dupcount+'messages');
+}
+
+function TriggerLoadDupes ()
+{
+//    alert("bla");
+// http://127.0.0.1:2000/roommsgs?room=test%20rss&startmsg=0&stopmsg=499&SortBy=Subject&SortOrder=1
+       roomName = getTextContent(document.getElementById("rmname"));
+    var parameters = {'room':roomName, 'startmsg': 0, 'stopmsg': -1, 'SortBy' : 'Subject', 'SortOrder' : 1};
+
+       new Ajax.Request("roommsgs", {
+               method: 'get',
+                               onSuccess: loadZapMessages,
+                               parameters: parameters,
+                               sanitize: false,
+                               evalJSON: false,
+                               onFailure: function(e) { alert("Failure: " + e);}
+       });
+}
diff --git a/webcit/subst.c b/webcit/subst.c
new file mode 100644 (file)
index 0000000..0cd7615
--- /dev/null
@@ -0,0 +1,2997 @@
+// This is a template substitution engine, which began with good intentions, but ended up becoming
+// more complex and unmaintainable than what it replaced.  We are barely hanging on with this until
+// webcit-ng replaces webcit classic.
+
+#include "sysdep.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stddef.h>
+
+#define SHOW_ME_VAPPEND_PRINTF
+
+#include "webcit.h"
+#include "webserver.h"
+
+extern char *static_dirs[PATH_MAX];  /* Disk representation */
+
+HashList *TemplateCache;
+HashList *LocalTemplateCache;
+
+HashList *GlobalNS;
+HashList *Iterators;
+HashList *Conditionals;
+HashList *SortHash;
+HashList *Defines;
+
+int DumpTemplateI18NStrings = 0;
+int LoadTemplates = 0;
+int dbg_backtrace_template_errors = 0;
+WCTemplputParams NoCtx;
+StrBuf *I18nDump = NULL;
+
+const char EmptyStr[]="";
+
+#define SV_GETTEXT 1
+#define SV_CONDITIONAL 2
+#define SV_NEG_CONDITIONAL 3
+#define SV_CUST_STR_CONDITIONAL 4
+#define SV_SUBTEMPL 5
+#define SV_PREEVALUATED 6
+
+
+
+/*
+ * Dynamic content for variable substitution in templates
+ */
+typedef struct _wcsubst {
+       ContextFilter Filter;
+       int wcs_type;                           /* which type of Substitution are we */
+       char wcs_key[32];                       /* copy of our hashkey for debugging */
+       StrBuf *wcs_value;                      /* if we're a string, keep it here */
+       long lvalue;                            /* type long? keep data here */
+       WCHandlerFunc wcs_function;             /* funcion hook ???*/
+} wcsubst;
+
+
+typedef struct _WCTemplate {
+       StrBuf *Data;
+       StrBuf *FileName;
+       int nTokensUsed;
+       int TokenSpace;
+       StrBuf *MimeType;
+       WCTemplateToken **Tokens;
+} WCTemplate;
+
+typedef struct _HashHandler {
+       ContextFilter Filter;
+       WCPreevalFunc PreEvalFunc;
+       WCHandlerFunc HandlerFunc;
+}HashHandler;
+
+typedef enum _estate {
+       eNext,
+       eSkipTilEnd
+} TemplState;
+
+void *load_template(StrBuf *Target, WCTemplate *NewTemplate);
+int EvaluateConditional(StrBuf *Target, int Neg, int state, WCTemplputParams **TPP);
+
+
+
+typedef struct _SortStruct {
+       StrBuf *Name;
+       StrBuf *PrefPrepend;
+       CompareFunc Forward;
+       CompareFunc Reverse;
+       CompareFunc GroupChange;
+
+       CtxType ContextType;
+}SortStruct;
+
+HashList *CtxList = NULL;
+
+static CtxType CtxCounter = CTX_NONE;
+
+CtxType CTX_STRBUF = CTX_NONE;
+CtxType CTX_STRBUFARR = CTX_NONE;
+CtxType CTX_LONGVECTOR = CTX_NONE;
+
+CtxType CTX_ITERATE = CTX_NONE;
+CtxType CTX_TAB = CTX_NONE;
+
+void HFreeContextType(void *pCtx)
+{
+       CtxTypeStruct *FreeStruct = (CtxTypeStruct *) pCtx;
+       FreeStrBuf(&FreeStruct->Name);
+       free(FreeStruct);
+}
+void PutContextType(const char *name, long len, CtxType TheCtx)
+{
+       CtxTypeStruct *NewStruct;
+
+       NewStruct = (CtxTypeStruct*) malloc(sizeof(CtxTypeStruct));
+       NewStruct->Name = NewStrBufPlain(name, len);
+       NewStruct->Type = TheCtx;
+
+       Put(CtxList, IKEY(NewStruct->Type), NewStruct, HFreeContextType);
+}
+void RegisterContextType(const char *name, long len, CtxType *TheCtx)
+{
+       if (*TheCtx != CTX_NONE)
+               return;
+
+       *TheCtx = ++CtxCounter;
+       PutContextType(name, len, *TheCtx);
+}
+
+CtxTypeStruct *GetContextType(CtxType Type)
+{
+       void *pv = NULL;
+       GetHash(CtxList, IKEY(Type), &pv);
+       return pv;
+}
+
+const char *UnknownContext = "CTX_UNKNOWN";
+
+const char *ContextName(CtxType ContextType)
+{
+       CtxTypeStruct *pCtx;
+
+       pCtx = GetContextType(ContextType);
+
+       if (pCtx != NULL) 
+               return ChrPtr(pCtx->Name);
+       else
+               return UnknownContext;
+}
+
+void StackDynamicContext(WCTemplputParams *Super, 
+                        WCTemplputParams *Sub, 
+                        void *Context,
+                        CtxType ContextType,
+                        int nArgs,
+                        WCTemplateToken *Tokens, 
+                        WCConditionalFunc ExitCtx, 
+                        long ExitCTXID)
+{
+       memset(Sub, 0, sizeof(WCTemplputParams));
+
+       if (Super != NULL) {
+               Sub->Sub = Super->Sub;
+               Super->Sub = Sub;
+       }
+       if (Sub->Sub != NULL)
+               Sub->Sub->Super = Sub;
+       Sub->Super = Super;
+       
+       Sub->Context = Context;
+       Sub->Filter.ContextType = ContextType;
+       Sub->nArgs = nArgs;
+       Sub->Tokens = Tokens;
+       Sub->ExitCtx = ExitCtx;
+       Sub->ExitCTXID = ExitCTXID;
+}
+
+void UnStackContext(WCTemplputParams *Sub)
+{
+       if (Sub->Super != NULL)
+       {
+               Sub->Super->Sub = Sub->Sub;
+       }
+       if (Sub->Sub != NULL)
+       {
+               Sub->Sub->Super = Sub->Super;
+       }
+}
+void UnStackDynamicContext(StrBuf *Target, WCTemplputParams **TPP)
+{
+       WCTemplputParams *TP = *TPP;
+       WCTemplputParams *Super = TP->Super;
+       TP->ExitCtx(Target, TP);
+       *TPP = Super;
+}
+
+void *GetContextPayload(WCTemplputParams *TP, CtxType ContextType)
+{
+       WCTemplputParams *whichTP = TP;
+
+       if (ContextType == CTX_NONE)
+               return TP->Context;
+
+       while ((whichTP != NULL) && (whichTP->Filter.ContextType != ContextType))
+               whichTP = whichTP->Super;
+
+       return whichTP->Context;        
+}
+
+void DestroySortStruct(void *vSort)
+{
+       SortStruct *Sort = (SortStruct*) vSort;
+       FreeStrBuf(&Sort->Name);
+       FreeStrBuf(&Sort->PrefPrepend);
+       free (Sort);
+}
+
+
+void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplputParams *TP, const char *Format, ...)
+{
+       StrBuf *Error;
+       StrBuf *Info;
+        va_list arg_ptr;
+       const char *Err = NULL;
+
+       Info = NewStrBuf();
+       Error = NewStrBuf();
+
+        va_start(arg_ptr, Format);
+       StrBufVAppendPrintf(Error, Format, arg_ptr);
+       va_end(arg_ptr);
+
+       switch (ErrorPos) {
+       case ERR_NAME: /* the main token name... */ 
+               Err = (TP->Tokens!= NULL)? TP->Tokens->pName:"";
+               break;
+       default:
+               Err = ((TP->Tokens!= NULL) && 
+                      (TP->Tokens->nParameters > ErrorPos - 1))? 
+                       TP->Tokens->Params[ErrorPos - 1]->Start : "";
+               break;
+       }
+       if (TP->Tokens != NULL) 
+       {
+               syslog(LOG_WARNING, "%s [%s]  (in '%s' line %ld); %s; [%s]\n", 
+                      Type, 
+                      Err, 
+                      ChrPtr(TP->Tokens->FileName),
+                      TP->Tokens->Line, 
+                      ChrPtr(Error), 
+                      ChrPtr(TP->Tokens->FlatToken));
+       }
+       else 
+       {
+               syslog(LOG_WARNING, "%s: %s;\n", 
+                      Type, 
+                      ChrPtr(Error));
+       }
+       if (WC == NULL) {
+               FreeStrBuf(&Info);
+               FreeStrBuf(&Error);
+               return; 
+       }
+
+       if (WC->WFBuf == NULL) WC->WFBuf = NewStrBuf();
+       if (TP->Tokens != NULL) 
+       {
+               /* deprecated: 
+               StrBufAppendPrintf(                                                          
+                       Target,                                                              
+                       "<pre>\n%s [%s] (in '%s' line %ld); %s\n[%s]\n</pre>\n",
+                       Type, 
+                       Err, 
+                       ChrPtr(TP->Tokens->FileName),
+                       TP->Tokens->Line,
+                       ChrPtr(Error),
+                       ChrPtr(TP->Tokens->FlatToken));
+               */
+               StrBufPrintf(Info, "%s [%s]  %s; [%s]", 
+                            Type, 
+                            Err, 
+                            ChrPtr(Error), 
+                            ChrPtr(TP->Tokens->FlatToken));
+
+
+               SerializeJson(WC->WFBuf, WildFireException(SKEY(TP->Tokens->FileName),
+                                                       TP->Tokens->Line,
+                                                       Info,
+                                                       1), 1);
+       }
+       else {
+               StrBufPrintf(Info, "%s [%s]  %s; [%s]", 
+                            Type, 
+                            Err, 
+                            ChrPtr(Error), 
+                            ChrPtr(TP->Tokens->FlatToken));
+               SerializeJson(WC->WFBuf, WildFireException(HKEY(__FILE__), __LINE__, Info, 1), 1);
+       }
+       FreeStrBuf(&Info);
+       FreeStrBuf(&Error);
+}
+
+
+void LogError (StrBuf *Target, const char *Type, const char *Format, ...) {
+       StrBuf *Error;
+       StrBuf *Info;
+        va_list arg_ptr;
+
+       Info = NewStrBuf();
+       Error = NewStrBuf();
+
+        va_start(arg_ptr, Format);
+       StrBufVAppendPrintf(Error, Format, arg_ptr);
+       va_end(arg_ptr);
+
+       syslog(LOG_WARNING, "%s", ChrPtr(Error));
+
+       if (WC->WFBuf == NULL) WC->WFBuf = NewStrBuf();
+
+       SerializeJson(WC->WFBuf, WildFireException(Type, strlen(Type),
+                                                   0,
+                                                   Info,
+                                                   1), 1);
+
+       FreeStrBuf(&Info);
+       FreeStrBuf(&Error);
+}
+
+
+void RegisterNS(const char *NSName, 
+               long len, 
+               int nMinArgs, 
+               int nMaxArgs, 
+               WCHandlerFunc HandlerFunc, 
+               WCPreevalFunc PreevalFunc,
+               CtxType ContextRequired)
+{
+       HashHandler *NewHandler;
+       
+       NewHandler = (HashHandler*) malloc(sizeof(HashHandler));
+       memset(NewHandler, 0, sizeof(HashHandler));
+       NewHandler->Filter.nMinArgs = nMinArgs;
+       NewHandler->Filter.nMaxArgs = nMaxArgs;
+       NewHandler->Filter.ContextType = ContextRequired;
+
+       NewHandler->PreEvalFunc = PreevalFunc;
+       NewHandler->HandlerFunc = HandlerFunc;  
+       Put(GlobalNS, NSName, len, NewHandler, NULL);
+}
+
+
+
+int CheckContext(StrBuf *Target, ContextFilter *Need, WCTemplputParams *TP, const char *ErrType)
+{
+       WCTemplputParams *TPP = TP;
+       
+       if ((Need != NULL) &&
+           (Need->ContextType != CTX_NONE) && 
+           (Need->ContextType != TPP->Filter.ContextType)) {
+
+               while ((TPP != NULL) && 
+                      (Need->ContextType != TPP->Filter.ContextType))
+               {
+                       TPP = TPP->Super;
+               }
+
+               if (TPP != NULL)
+                       return 1;
+
+                LogTemplateError(
+                        Target, ErrType, ERR_NAME, TP,
+                       "  WARNING: requires Context: [%s], have [%s]!", 
+                       ContextName(Need->ContextType), 
+                       ContextName(TP->Filter.ContextType));
+               return 0;
+       }
+       return 1;
+}
+
+void FreeToken(WCTemplateToken **Token) {
+       int i; 
+       FreeStrBuf(&(*Token)->FlatToken);
+       if ((*Token)->HaveParameters) 
+               for (i = 0; i < (*Token)->nParameters; i++)
+                       free((*Token)->Params[i]);
+       free(*Token);
+       *Token = NULL;
+}
+
+
+void FreeWCTemplate(void *vFreeMe) {
+       int i;
+       WCTemplate *FreeMe = (WCTemplate*)vFreeMe;
+
+       if (FreeMe->TokenSpace > 0) {
+               for (i = 0; i < FreeMe->nTokensUsed; i ++) {
+                       FreeToken(&FreeMe->Tokens[i]);
+               }
+               free(FreeMe->Tokens);
+       }
+       FreeStrBuf(&FreeMe->FileName);
+       FreeStrBuf(&FreeMe->Data);
+       FreeStrBuf(&FreeMe->MimeType);
+       free(FreeMe);
+}
+
+int HaveTemplateTokenString(StrBuf *Target, 
+                           WCTemplputParams *TP,
+                           int N,
+                           const char **Value, 
+                           long *len)
+{
+       if (N >= TP->Tokens->nParameters) {
+               return 0;
+       }
+
+       switch (TP->Tokens->Params[N]->Type) {
+       case TYPE_INTDEFINE:
+       case TYPE_STR:
+       case TYPE_BSTR:
+       case TYPE_PREFSTR:
+       case TYPE_ROOMPREFSTR:
+       case TYPE_GETTEXT:
+       case TYPE_SUBTEMPLATE:
+               return 1;
+       case TYPE_LONG:
+       case TYPE_PREFINT:
+       default:
+               return 0;
+       }
+}
+
+void GetTemplateTokenString(StrBuf *Target, WCTemplputParams *TP, int N, const char **Value, long *len) {
+       StrBuf *Buf;
+
+       if (N >= TP->Tokens->nParameters) {
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "invalid token %d. this shouldn't have come till here.\n", N);
+               *Value = "";
+               *len = 0;
+               return;
+       }
+
+       switch (TP->Tokens->Params[N]->Type) {
+
+       case TYPE_INTDEFINE:
+       case TYPE_STR:
+               *Value = TP->Tokens->Params[N]->Start;
+               *len = TP->Tokens->Params[N]->len;
+               break;
+       case TYPE_BSTR:
+               if (TP->Tokens->Params[N]->len == 0) {
+                       LogTemplateError(Target, 
+                                        "TokenParameter", N, TP, 
+                                        "Requesting parameter %d; of type BSTR, empty lookup string not admitted.", N);
+                       *len = 0;
+                       *Value = EmptyStr;
+                       break;
+               }
+               Buf = (StrBuf*) SBstr(TKEY(N));
+               *Value = ChrPtr(Buf);
+               *len = StrLength(Buf);
+               break;
+       case TYPE_PREFSTR:
+               if (TP->Tokens->Params[N]->len == 0) {
+                       LogTemplateError(Target, 
+                                        "TokenParameter", N, TP, 
+                                        "Requesting parameter %d; of type PREFSTR, empty lookup string not admitted.", N);
+                       *len = 0;
+                       *Value = EmptyStr;
+                       break;
+               }
+               get_PREFERENCE(TKEY(N), &Buf);
+               *Value = ChrPtr(Buf);
+               *len = StrLength(Buf);
+               break;
+       case TYPE_ROOMPREFSTR:
+               if (TP->Tokens->Params[N]->len == 0) {
+                       LogTemplateError(Target, 
+                                        "TokenParameter", N, TP, 
+                                        "Requesting parameter %d; of type PREFSTR, empty lookup string not admitted.", N);
+                       *len = 0;
+                       *Value = EmptyStr;
+                       break;
+               }
+               Buf = get_ROOM_PREFS(TKEY(N));
+               *Value = ChrPtr(Buf);
+               *len = StrLength(Buf);
+               break;
+       case TYPE_LONG:
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "Requesting parameter %d; of type LONG, want string.", N);
+               break;
+       case TYPE_PREFINT:
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "Requesting parameter %d; of type PREFINT, want string.", N);
+               break;
+       case TYPE_GETTEXT:
+               *Value = _(TP->Tokens->Params[N]->Start);
+               *len = strlen(*Value);
+               break;
+       case TYPE_SUBTEMPLATE:
+               if (TP->Tokens->Params[N]->len == 0) {
+                       LogTemplateError(Target, 
+                                        "TokenParameter", N, TP, 
+                                        "Requesting parameter %d; of type SUBTEMPLATE, empty lookup string not admitted.", N);
+                       *len = 0;
+                       *Value = EmptyStr;
+                       break;
+               }
+
+               Buf = NewStrBuf();
+               DoTemplate(TKEY(N), Buf, TP);
+
+               *Value = ChrPtr(Buf);
+               *len = StrLength(Buf);
+               /* we can't free it here, so we put it into the subst so its discarded later on. */
+               PutRequestLocalMem(Buf, HFreeStrBuf);
+               break;
+
+       default:
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "unknown param type %d; [%d]", N, TP->Tokens->Params[N]->Type);
+               break;
+       }
+}
+
+long GetTemplateTokenNumber(StrBuf *Target, WCTemplputParams *TP, int N, long dflt) {
+       long Ret;
+       if (N >= TP->Tokens->nParameters) {
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "invalid token %d. this shouldn't have come till here.\n", N);
+               wc_backtrace(LOG_DEBUG); 
+               return 0;
+       }
+
+       switch (TP->Tokens->Params[N]->Type) {
+
+       case TYPE_STR:
+               return atol(TP->Tokens->Params[N]->Start);
+               break;
+       case TYPE_BSTR:
+               if (TP->Tokens->Params[N]->len == 0) {
+                       LogTemplateError(Target, 
+                                        "TokenParameter", N, TP, 
+                                        "Requesting parameter %d; of type BSTR, empty lookup string not admitted.", N);
+                       return 0;
+               }
+               return  LBstr(TKEY(N));
+               break;
+       case TYPE_PREFSTR:
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "requesting a prefstring in param %d want a number", N);
+               if (TP->Tokens->Params[N]->len == 0) {
+                       LogTemplateError(Target, 
+                                        "TokenParameter", N, TP, 
+                                        "Requesting parameter %d; of type PREFSTR, empty lookup string not admitted.", N);
+                       return 0;
+               }
+               if (get_PREF_LONG(TKEY(N), &Ret, dflt))
+                       return Ret;
+               return 0;
+       case TYPE_ROOMPREFSTR:
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "requesting a prefstring in param %d want a number", N);
+               if (TP->Tokens->Params[N]->len == 0) {
+                       LogTemplateError(Target, 
+                                        "TokenParameter", N, TP, 
+                                        "Requesting parameter %d; of type PREFSTR, empty lookup string not admitted.", N);
+                       return 0;
+               }
+               if (get_ROOM_PREFS_LONG(TKEY(N), &Ret, dflt))
+                       return Ret;
+               return 0;
+       case TYPE_INTDEFINE:
+       case TYPE_LONG:
+               return TP->Tokens->Params[N]->lvalue;
+       case TYPE_PREFINT:
+               if (TP->Tokens->Params[N]->len == 0) {
+                       LogTemplateError(Target, 
+                                        "TokenParameter", N, TP, 
+                                        "Requesting parameter %d; of type PREFINT, empty lookup string not admitted.", N);
+                       return 0;
+               }
+               if (get_PREF_LONG(TKEY(N), &Ret, dflt))
+                       return Ret;
+               return 0;               
+       case TYPE_GETTEXT:
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "requesting a I18N string in param %d; want a number", N);
+               return 0;
+       case TYPE_SUBTEMPLATE:
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "requesting a subtemplate in param %d; not supported for numbers", N);
+               return 0;
+       default:
+               LogTemplateError(Target, 
+                                "TokenParameter", N, TP, 
+                                "unknown param type %d; [%d]", N, TP->Tokens->Params[N]->Type);
+               return 0;
+       }
+}
+
+
+/*
+ * puts string into the template and computes which escape methon we should use
+ * Source = the string we should put into the template
+ * FormatTypeIndex = where should we look for escape types if?
+ */
+void StrBufAppendTemplate(StrBuf *Target, 
+                         WCTemplputParams *TP,
+                         const StrBuf *Source, int FormatTypeIndex)
+{
+       const char *pFmt = NULL;
+       char EscapeAs = ' ';
+
+       if ((FormatTypeIndex < TP->Tokens->nParameters) &&
+           (TP->Tokens->Params[FormatTypeIndex] != NULL) &&
+           (TP->Tokens->Params[FormatTypeIndex]->Type == TYPE_STR) &&
+           (TP->Tokens->Params[FormatTypeIndex]->len >= 1)) {
+               pFmt = TP->Tokens->Params[FormatTypeIndex]->Start;
+               EscapeAs = *pFmt;
+       }
+
+       switch(EscapeAs)
+       {
+       case 'H':
+               StrEscAppend(Target, Source, NULL, 0, 2);
+               break;
+       case 'X':
+               StrEscAppend(Target, Source, NULL, 0, 0);
+               break;
+       case 'J':
+               StrECMAEscAppend(Target, Source, NULL);
+               break;
+       case 'K':
+               StrHtmlEcmaEscAppend(Target, Source, NULL, 0, 0);
+               break;
+       case 'U':
+               StrBufUrlescAppend(Target, Source, NULL);
+               break;
+       case 'F':
+               if (pFmt != NULL)       pFmt++;
+               else                    pFmt = "JUSTIFY";
+               if (*pFmt == '\0')      pFmt = "JUSTIFY";
+               FmOut(Target, pFmt, Source);
+               break;
+       default:
+               StrBufAppendBuf(Target, Source, 0);
+       }
+}
+
+/*
+ * puts string into the template and computes which escape methon we should use
+ * Source = the string we should put into the template
+ * FormatTypeIndex = where should we look for escape types if?
+ */
+void StrBufAppendTemplateStr(StrBuf *Target, 
+                            WCTemplputParams *TP,
+                            const char *Source, int FormatTypeIndex)
+{
+       const char *pFmt = NULL;
+       char EscapeAs = ' ';
+
+       if ((FormatTypeIndex < TP->Tokens->nParameters) &&
+           (TP->Tokens->Params[FormatTypeIndex]->Type == TYPE_STR) &&
+           (TP->Tokens->Params[FormatTypeIndex]->len >= 1)) {
+               pFmt = TP->Tokens->Params[FormatTypeIndex]->Start;
+               EscapeAs = *pFmt;
+       }
+
+       switch(EscapeAs)
+       {
+       case 'H':
+               StrEscAppend(Target, NULL, Source, 0, 2);
+               break;
+       case 'X':
+               StrEscAppend(Target, NULL, Source, 0, 0);
+               break;
+       case 'J':
+               StrECMAEscAppend(Target, NULL, Source);
+         break;
+       case 'K':
+               StrHtmlEcmaEscAppend(Target, NULL, Source, 0, 0);
+         break;
+       case 'U':
+               StrBufUrlescAppend(Target, NULL, Source);
+               break;
+/*
+       case 'F':
+               if (pFmt != NULL)       pFmt++;
+               else                    pFmt = "JUSTIFY";
+               if (*pFmt == '\0')      pFmt = "JUSTIFY";
+               FmOut(Target, pFmt, Source);
+               break;
+*/
+       default:
+               StrBufAppendBufPlain(Target, Source, -1, 0);
+       }
+}
+
+
+void PutNewToken(WCTemplate *Template, WCTemplateToken *NewToken)
+{
+       if (Template->nTokensUsed + 1 >= Template->TokenSpace) {
+               if (Template->TokenSpace <= 0) {
+                       Template->Tokens = (WCTemplateToken**)malloc(
+                               sizeof(WCTemplateToken*) * 10);
+                       memset(Template->Tokens, 0, sizeof(WCTemplateToken*) * 10);
+                       Template->TokenSpace = 10;
+               }
+               else {
+                       WCTemplateToken **NewTokens;
+
+                       NewTokens= (WCTemplateToken**) malloc(
+                               sizeof(WCTemplateToken*) * Template->TokenSpace * 2);
+
+                       memset(NewTokens, 
+                              0, sizeof(WCTemplateToken*) * Template->TokenSpace * 2);
+
+                       memcpy(NewTokens, 
+                              Template->Tokens, 
+                              sizeof(WCTemplateToken*) * Template->nTokensUsed);
+
+                       free(Template->Tokens);
+                       Template->TokenSpace *= 2;
+                       Template->Tokens = NewTokens;
+               }
+       }
+       Template->Tokens[(Template->nTokensUsed)++] = NewToken;
+}
+
+int GetNextParameter(StrBuf *Buf, 
+                    const char **pCh, 
+                    const char *pe, 
+                    WCTemplateToken *Tokens, 
+                    WCTemplate *pTmpl, 
+                    WCTemplputParams *TP, 
+                    TemplateParam **pParm)
+{
+       const char *pch = *pCh;
+       const char *pchs, *pche;
+       TemplateParam *Parm;
+       char quote = '\0';
+       int ParamBrace = 0;
+
+       *pParm = Parm = (TemplateParam *) malloc(sizeof(TemplateParam));
+       memset(Parm, 0, sizeof(TemplateParam));
+       Parm->Type = TYPE_STR;
+
+       /* Skip leading whitespaces */
+       while ((*pch == ' ' )||
+              (*pch == '\t')||
+              (*pch == '\r')||
+              (*pch == '\n')) pch ++;
+
+       if (*pch == ':') {
+               Parm->Type = TYPE_PREFSTR;
+               pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
+       }
+       else if (*pch == '.') {
+               Parm->Type = TYPE_ROOMPREFSTR;
+               pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
+       }
+       else if (*pch == ';') {
+               Parm->Type = TYPE_PREFINT;
+               pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
+       }
+       else if (*pch == '#') {
+               Parm->Type = TYPE_INTDEFINE;
+               pch ++;
+       }
+       else if (*pch == '_') {
+               Parm->Type = TYPE_GETTEXT;
+               pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
+       }
+       else if (*pch == 'B') {
+               Parm->Type = TYPE_BSTR;
+               pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
+       }
+       else if (*pch == '=') {
+               Parm->Type = TYPE_SUBTEMPLATE;
+               pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
+       }
+
+
+       if (*pch == '"')
+               quote = '"';
+       else if (*pch == '\'')
+               quote = '\'';
+       if (quote != '\0') {
+               pch ++;
+               pchs = pch;
+               while (pch <= pe &&
+                      ((*pch != quote) ||
+                       ( (pch > pchs) && (*(pch - 1) == '\\'))
+                              )) {
+                       pch ++;
+               }
+               pche = pch;
+               if (*pch != quote) {
+                       syslog(LOG_WARNING, "Error (in '%s' line %ld); "
+                               "evaluating template param [%s] in Token [%s]\n",
+                               ChrPtr(pTmpl->FileName),
+                               Tokens->Line,
+                               ChrPtr(Tokens->FlatToken),
+                               *pCh);
+                       pch ++;
+                       free(Parm);
+                       *pParm = NULL;
+                       return 0;
+               }
+               else {
+                       StrBufPeek(Buf, pch, -1, '\0');         
+                       if (LoadTemplates > 1) {                        
+                               syslog(LOG_DEBUG,
+                                       "DBG: got param [%s] "SIZE_T_FMT" "SIZE_T_FMT"\n", 
+                                       pchs, pche - pchs, strlen(pchs)
+                               );
+                       }
+                       Parm->Start = pchs;
+                       Parm->len = pche - pchs;
+                       pch ++; /* move after trailing quote */
+                       if (ParamBrace && (*pch == ')')) {
+                               pch ++;
+                       }
+
+               }
+       }
+       else {
+               Parm->Type = TYPE_LONG;
+               pchs = pch;
+               while ((pch <= pe) &&
+                      (isdigit(*pch) ||
+                       (*pch == '+') ||
+                       (*pch == '-')))
+                       pch ++;
+               pch ++;
+               if (pch - pchs > 1){
+                       StrBufPeek(Buf, pch, -1, '\0');
+                       Parm->lvalue = atol(pchs);
+                       Parm->Start = pchs;
+                       pch++;
+               }
+               else {
+                       Parm->lvalue = 0;
+/* TODO whUT?
+                       syslog(LOG_DEBUG, "Error (in '%s' line %ld); "
+                               "evaluating long template param [%s] in Token [%s]\n",
+                               ChrPtr(pTmpl->FileName),
+                               Tokens->Line,
+                               ChrPtr(Tokens->FlatToken),
+                               *pCh);
+                               */
+                       free(Parm);
+                       *pParm = NULL;
+                       return 0;
+               }
+       }
+       while ((*pch == ' ' )||
+              (*pch == '\t')||
+              (*pch == '\r')||
+              (*pch == ',' )||
+              (*pch == '\n')) pch ++;
+
+       switch (Parm->Type)
+       {
+       case TYPE_GETTEXT:
+               if (DumpTemplateI18NStrings) {
+                       StrBufAppendPrintf(I18nDump, "_(\"%s\");\n", Parm->Start);
+               }
+               break;
+       case TYPE_INTDEFINE: {
+               void *vPVal;
+               
+               if (GetHash(Defines, Parm->Start, Parm->len, &vPVal) &&
+                   (vPVal != NULL))
+               {
+                       long *PVal;
+                       PVal = (long*) vPVal;
+               
+                       Parm->lvalue = *PVal;
+               }
+               else if (strchr(Parm->Start, '|') != NULL)
+               {
+                       const char *Pos;
+                       StrBuf *pToken;
+                       StrBuf *Match;
+
+                       Parm->MaskBy = eOR;
+                       pToken = NewStrBufPlain (Parm->Start, Parm->len);
+                       Match = NewStrBufPlain (NULL, Parm->len);
+                       Pos = ChrPtr(pToken);
+                       
+                       while ((Pos != NULL) && (Pos != StrBufNOTNULL))
+                       {
+                               StrBufExtract_NextToken(Match, pToken, &Pos, '|');
+                               StrBufTrim(Match);
+                               if (StrLength (Match) > 0)
+                               {
+                                       if (GetHash(Defines, SKEY(Match), &vPVal) &&
+                                           (vPVal != NULL))
+                                       {
+                                               long *PVal;
+                                               PVal = (long*) vPVal;
+                                               
+                                               Parm->lvalue |= *PVal;
+                                       }
+                                       else {
+                                               LogTemplateError(NULL, "Define", 
+                                                                Tokens->nParameters,
+                                                                TP,
+                                                                "%s isn't known!!",
+                                                                ChrPtr(Match));
+
+                                       }
+                               }
+                       }
+                       FreeStrBuf(&pToken);
+                       FreeStrBuf(&Match);
+               }
+               else if (strchr(Parm->Start, '&') != NULL)
+               {
+                       const char *Pos;
+                       StrBuf *pToken;
+                       StrBuf *Match;
+
+                       Parm->MaskBy = eAND;
+                       pToken = NewStrBufPlain (Parm->Start, Parm->len);
+                       Match = NewStrBufPlain (NULL, Parm->len);
+                       Pos = ChrPtr(pToken);
+                       
+                       while ((Pos != NULL) && (Pos != StrBufNOTNULL))
+                       {
+                               StrBufExtract_NextToken(Match, pToken, &Pos, '&');
+                               StrBufTrim(Match);
+                               if (StrLength (Match) > 0)
+                               {
+                                       if (GetHash(Defines, SKEY(Match), &vPVal) &&
+                                           (vPVal != NULL))
+                                       {
+                                               long *PVal;
+                                               PVal = (long*) vPVal;
+                                               
+                                               Parm->lvalue |= *PVal;
+                                       }
+                                       else {
+                                               LogTemplateError(NULL, "Define", 
+                                                                Tokens->nParameters,
+                                                                TP,
+                                                                "%s isn't known!!",
+                                                                ChrPtr(Match));
+
+                                       }
+                               }
+                       }
+                       FreeStrBuf(&Match);
+                       FreeStrBuf(&pToken);
+               }
+               else {
+
+
+                       LogTemplateError(NULL, "Define", 
+                                        Tokens->nParameters,
+                                        TP,
+                                        "%s isn't known!!",
+                                        Parm->Start);
+               }}
+               break;
+       case TYPE_SUBTEMPLATE:{
+               void *vTmpl;
+               /* well, we don't check the mobile stuff here... */
+               if (!GetHash(LocalTemplateCache, Parm->Start, Parm->len, &vTmpl) &&
+                   !GetHash(TemplateCache, Parm->Start, Parm->len, &vTmpl)) {
+                       LogTemplateError(NULL, 
+                                        "SubTemplate", 
+                                        Tokens->nParameters,
+                                        TP,
+                                        "referenced here doesn't exist");
+               }}
+               break;
+       }
+       *pCh = pch;
+       return 1;
+}
+
+WCTemplateToken *NewTemplateSubstitute(StrBuf *Buf, 
+                                      const char *pStart, 
+                                      const char *pTokenStart, 
+                                      const char *pTokenEnd, 
+                                      long Line,
+                                      WCTemplate *pTmpl)
+{
+       void *vVar;
+       const char *pch;
+       WCTemplateToken *NewToken;
+       WCTemplputParams TP;
+
+       NewToken = (WCTemplateToken*)malloc(sizeof(WCTemplateToken));
+       memset(NewToken, 0, sizeof(WCTemplateToken));
+       TP.Tokens = NewToken;
+       NewToken->FileName = pTmpl->FileName; /* to print meaningfull log messages... */
+       NewToken->Flags = 0;
+       NewToken->Line = Line + 1;
+       NewToken->pTokenStart = pTokenStart;
+       NewToken->TokenStart = pTokenStart - pStart;
+       NewToken->TokenEnd =  (pTokenEnd - pStart) - NewToken->TokenStart;
+       NewToken->pTokenEnd = pTokenEnd;
+       NewToken->NameEnd = NewToken->TokenEnd - 2;
+       NewToken->PreEval = NULL;
+       NewToken->FlatToken = NewStrBufPlain(pTokenStart + 2, pTokenEnd - pTokenStart - 2);
+       StrBufShrinkToFit(NewToken->FlatToken, 1);
+
+       StrBufPeek(Buf, pTokenStart, + 1, '\0');
+       StrBufPeek(Buf, pTokenEnd, -1, '\0');
+       pch = NewToken->pName = pTokenStart + 2;
+
+       NewToken->HaveParameters = 0;;
+       NewToken->nParameters = 0;
+
+       while (pch < pTokenEnd - 1) {
+               if (*pch == '(') {
+                       StrBufPeek(Buf, pch, -1, '\0');
+                       NewToken->NameEnd = pch - NewToken->pName;
+                       pch ++;
+                       if (*(pTokenEnd - 1) != ')') {
+                               LogTemplateError(
+                                       NULL, "Parseerror", ERR_NAME, &TP, 
+                                       "Warning, Non welformed Token; missing right parenthesis");
+                       }
+                       while (pch < pTokenEnd - 1) {
+                               NewToken->nParameters++;
+                               if (GetNextParameter(Buf, 
+                                                    &pch, 
+                                                    pTokenEnd - 1, 
+                                                    NewToken, 
+                                                    pTmpl, 
+                                                    &TP, 
+                                                    &NewToken->Params[NewToken->nParameters - 1]))
+                               {
+                                       NewToken->HaveParameters = 1;
+                                       if (NewToken->nParameters >= MAXPARAM) {
+                                               LogTemplateError(
+                                                       NULL, "Parseerror", ERR_NAME, &TP,
+                                                       "only [%d] Params allowed in Tokens",
+                                                       MAXPARAM);
+
+                                               FreeToken(&NewToken);
+                                               return NULL;
+                                       }
+                               }
+                               else break;
+                       }
+                       if((NewToken->NameEnd == 1) &&
+                          (NewToken->HaveParameters == 1))
+                          
+                       {
+                               if (*(NewToken->pName) == '_')
+                                       NewToken->Flags = SV_GETTEXT;
+                               else if (*(NewToken->pName) == '=')
+                                       NewToken->Flags = SV_SUBTEMPL;
+                               else if (*(NewToken->pName) == '%')
+                                       NewToken->Flags = SV_CUST_STR_CONDITIONAL;
+                               else if (*(NewToken->pName) == '?')
+                                       NewToken->Flags = SV_CONDITIONAL;
+                               else if (*(NewToken->pName) == '!')
+                                       NewToken->Flags = SV_NEG_CONDITIONAL;
+                       }
+               }
+               else pch ++;            
+       }
+       
+       switch (NewToken->Flags) {
+       case 0:
+               /* If we're able to find out more about the token, do it now while its fresh. */
+               pch = NewToken->pName;
+               while (pch <  NewToken->pName + NewToken->NameEnd)
+               {
+                       if (((*pch >= 'A') && (*pch <= 'Z')) || 
+                           ((*pch >= '0') && (*pch <= '9')) ||
+                           (*pch == ':') || 
+                           (*pch == '-') ||
+                           (*pch == '_')) 
+                               pch ++;
+                       else
+                       {
+                               LogTemplateError(
+                                       NULL, "Token Name", ERR_NAME, &TP,
+                                       "contains illegal char: '%c'", 
+                                       *pch);
+                               pch++;
+                       }
+
+               }
+               if (GetHash(GlobalNS, NewToken->pName, NewToken->NameEnd, &vVar)) {
+                       HashHandler *Handler;
+                       Handler = (HashHandler*) vVar;
+                       if ((NewToken->nParameters < Handler->Filter.nMinArgs) || 
+                           (NewToken->nParameters > Handler->Filter.nMaxArgs)) {
+                               LogTemplateError(
+                                       NULL, "Token", ERR_NAME, &TP,
+                                       "doesn't work with %d params", 
+                                       NewToken->nParameters);
+
+                       }
+                       else {
+                               NewToken->PreEval = Handler;
+                               NewToken->Flags = SV_PREEVALUATED;              
+                               if (Handler->PreEvalFunc != NULL)
+                                       Handler->PreEvalFunc(NewToken);
+                       }
+               } else {
+                       LogTemplateError(
+                               NULL, "Token ", ERR_NAME, &TP,
+                               " isn't known to us.");
+               }
+               break;
+       case SV_GETTEXT:
+               if ((NewToken->nParameters < 1) || (NewToken->nParameters > 2)) {
+                       LogTemplateError(                               
+                               NULL, "Gettext", ERR_NAME, &TP,
+                               "requires 1 or 2 parameter, you gave %d params", 
+                               NewToken->nParameters);
+                       NewToken->Flags = 0;
+                       break;
+               }
+               if (DumpTemplateI18NStrings) {
+                       StrBufAppendPrintf(I18nDump, "_(\"%s\");\n", NewToken->Params[0]->Start);
+               }
+               break;
+       case SV_SUBTEMPL:
+               if (NewToken->nParameters != 1) {
+                       LogTemplateError(
+                               NULL, "Subtemplates", ERR_NAME, &TP,
+                               "require exactly 1 parameter, you gave %d params", 
+                               NewToken->nParameters);
+                       break;
+               }
+               else {
+                       void *vTmpl;
+                       /* well, we don't check the mobile stuff here... */
+                       if (!GetHash(LocalTemplateCache, 
+                                    NewToken->Params[0]->Start, 
+                                    NewToken->Params[0]->len, 
+                                    &vTmpl) &&
+                           !GetHash(TemplateCache, 
+                                    NewToken->Params[0]->Start, 
+                                    NewToken->Params[0]->len, 
+                                    &vTmpl)) {
+                               LogTemplateError(
+                                       NULL, "SubTemplate", ERR_PARM1, &TP,
+                                       "doesn't exist");
+                       }
+               }
+               break;
+       case SV_CUST_STR_CONDITIONAL:
+       case SV_CONDITIONAL:
+       case SV_NEG_CONDITIONAL:
+               if (NewToken->nParameters <2) {
+                       LogTemplateError(
+                               NULL, "Conditional", ERR_PARM1, &TP,
+                               "require at least 2 parameters, you gave %d params", 
+                               NewToken->nParameters);
+                       NewToken->Flags = 0;
+                       break;
+               }
+               if (NewToken->Params[1]->lvalue == 0) {
+                       LogTemplateError(
+                               NULL, "Conditional", ERR_PARM1, &TP,
+                               "Conditional ID (Parameter 1) mustn't be 0!");
+                       NewToken->Flags = 0;
+                       break;
+               }
+               if (!GetHash(Conditionals, 
+                            NewToken->Params[0]->Start, 
+                            NewToken->Params[0]->len, 
+                            &vVar) || 
+                   (vVar == NULL)) {
+                       if ((NewToken->Params[0]->len == 1) &&
+                           (NewToken->Params[0]->Start[0] == 'X'))
+                               break;
+                       LogTemplateError(
+                               NULL, "Conditional", ERR_PARM1, &TP,
+                               "Not found!");
+/*
+                       NewToken->Error = NewStrBuf();
+                       StrBufAppendPrintf(
+                               NewToken->Error, 
+                               "<pre>\nConditional [%s] (in '%s' line %ld); Not found!\n[%s]\n</pre>\n", 
+                               NewToken->Params[0]->Start,
+                               ChrPtr(pTmpl->FileName),
+                               NewToken->Line,
+                               ChrPtr(NewToken->FlatToken));
+*/
+               }
+               else {
+                       NewToken->PreEval = vVar;
+               }
+               break;
+       }
+       return NewToken;
+}
+
+
+
+
+
+/*
+ * Display a variable-substituted template
+ * templatename template file to load
+ */
+void *prepare_template(StrBuf *filename, StrBuf *Key, HashList *PutThere) {
+       WCTemplate *NewTemplate;
+
+       NewTemplate = (WCTemplate *) malloc(sizeof(WCTemplate));
+       memset(NewTemplate, 0, sizeof(WCTemplate));
+       NewTemplate->Data = NULL;
+       NewTemplate->FileName = NewStrBufDup(filename);
+       StrBufShrinkToFit(NewTemplate->FileName, 1);
+       NewTemplate->nTokensUsed = 0;
+       NewTemplate->TokenSpace = 0;
+       NewTemplate->Tokens = NULL;
+       NewTemplate->MimeType = NewStrBufPlain(GuessMimeByFilename (SKEY(NewTemplate->FileName)), -1);
+       if (strstr(ChrPtr(NewTemplate->MimeType), "text") != NULL) {
+               StrBufAppendBufPlain(NewTemplate->MimeType, HKEY("; charset=utf-8"), 0);
+       }
+
+       if (strstr(ChrPtr(NewTemplate->MimeType), "text") != NULL) {
+               StrBufAppendBufPlain(NewTemplate->MimeType, HKEY("; charset=utf-8"), 0);
+       }
+
+       Put(PutThere, ChrPtr(Key), StrLength(Key), NewTemplate, FreeWCTemplate);
+       return NewTemplate;
+}
+
+/*
+ * Display a variable-substituted template
+ * templatename template file to load
+ */
+void *duplicate_template(WCTemplate *OldTemplate) {
+       WCTemplate *NewTemplate;
+
+       NewTemplate = (WCTemplate *) malloc(sizeof(WCTemplate));
+       memset(NewTemplate, 0, sizeof(WCTemplate));
+       NewTemplate->Data = NULL;
+       NewTemplate->FileName = NewStrBufDup(OldTemplate->FileName);
+       StrBufShrinkToFit(NewTemplate->FileName, 1);
+       NewTemplate->nTokensUsed = 0;
+       NewTemplate->TokenSpace = 0;
+       NewTemplate->Tokens = NULL;
+       NewTemplate->MimeType = NewStrBufDup(OldTemplate->MimeType);
+       return NewTemplate;
+}
+
+
+void SanityCheckTemplate(StrBuf *Target, WCTemplate *CheckMe) {
+       int i = 0;
+       int j;
+       int FoundConditionalEnd;
+
+       for (i = 0; i < CheckMe->nTokensUsed; i++) {
+               switch(CheckMe->Tokens[i]->Flags) {
+               case SV_CONDITIONAL:
+               case SV_NEG_CONDITIONAL:
+                       FoundConditionalEnd = 0;
+                       if ((CheckMe->Tokens[i]->Params[0]->len == 1) && 
+                           (CheckMe->Tokens[i]->Params[0]->Start[0] == 'X'))
+                               break;
+                       for (j = i + 1; j < CheckMe->nTokensUsed; j++)
+                       {
+                               if (((CheckMe->Tokens[j]->Flags == SV_CONDITIONAL) ||
+                                    (CheckMe->Tokens[j]->Flags == SV_NEG_CONDITIONAL)) && 
+                                   (CheckMe->Tokens[i]->Params[1]->lvalue == 
+                                    CheckMe->Tokens[j]->Params[1]->lvalue))
+                               {
+                                       FoundConditionalEnd = 1;
+                                       break;
+                               }
+
+                       }
+                       if (!FoundConditionalEnd)
+                       {
+                               WCTemplputParams TP;
+                               memset(&TP, 0, sizeof(WCTemplputParams));
+                               TP.Tokens = CheckMe->Tokens[i];
+                               LogTemplateError(
+                                       Target, "Token", ERR_PARM1, &TP,
+                                       "Conditional without Endconditional"
+                                       );
+                       }
+                       break;
+               default:
+                       break;
+               }
+       }
+}
+
+/*
+ * Display a variable-substituted template
+ * templatename template file to load
+ */
+void *load_template(StrBuf *Target, WCTemplate *NewTemplate)
+{
+       int fd;
+       struct stat statbuf;
+       const char *pS, *pE, *pch, *Err;
+       long Line;
+
+       fd = open(ChrPtr(NewTemplate->FileName), O_RDONLY);
+       if (fd <= 0) {
+               syslog(LOG_WARNING, "ERROR: could not open template '%s' - %s\n",
+                       ChrPtr(NewTemplate->FileName), strerror(errno));
+               return NULL;
+       }
+
+       if (fstat(fd, &statbuf) == -1) {
+               syslog(LOG_WARNING, "ERROR: could not stat template '%s' - %s\n",
+                       ChrPtr(NewTemplate->FileName), strerror(errno));
+               return NULL;
+       }
+
+       NewTemplate->Data = NewStrBufPlain(NULL, statbuf.st_size + 1);
+       if (StrBufReadBLOB(NewTemplate->Data, &fd, 1, statbuf.st_size, &Err) < 0) {
+               close(fd);
+               syslog(LOG_WARNING, "ERROR: reading template '%s' - %s<br>\n",
+                       ChrPtr(NewTemplate->FileName), strerror(errno));
+               return NULL;
+       }
+       close(fd);
+
+       Line = 0;
+       StrBufShrinkToFit(NewTemplate->Data, 1);
+       StrBufShrinkToFit(NewTemplate->MimeType, 1);
+       pS = pch = ChrPtr(NewTemplate->Data);
+       pE = pS + StrLength(NewTemplate->Data);
+       while (pch < pE) {
+               const char *pts, *pte;
+               char InQuotes = '\0';
+               void *pv;
+
+               /** Find one <? > */
+               for (; pch < pE; pch ++) {
+                       if ((*pch=='<')&&(*(pch + 1)=='?') &&
+                           !((pch == pS) && /* we must ommit a <?xml */
+                             (*(pch + 2) == 'x') && 
+                             (*(pch + 3) == 'm') && 
+                             (*(pch + 4) == 'l')))                          
+                               break;
+                       if (*pch=='\n') Line ++;
+               }
+               if (pch >= pE)
+                       continue;
+               pts = pch;
+
+               /** Found one? parse it. */
+               for (; pch <= pE - 1; pch ++) {
+                       if ((!InQuotes) &&
+                           ((*pch == '\'') || (*pch == '"')))
+                       {
+                               InQuotes = *pch;
+                       }
+                       else if (InQuotes && (InQuotes == *pch))
+                       {
+                               InQuotes = '\0';
+                       }
+                       else if ((InQuotes) &&
+                                (*pch == '\\') &&
+                                (*(pch + 1) == InQuotes))
+                       {
+                               pch++;
+                       }
+                       else if ((!InQuotes) && 
+                                (*pch == '>'))
+                       {
+                               break;
+                       }
+               }
+               if (pch + 1 > pE)
+                       continue;
+               pte = pch;
+               pv = NewTemplateSubstitute(NewTemplate->Data, pS, pts, pte, Line, NewTemplate);
+               if (pv != NULL) {
+                       PutNewToken(NewTemplate, pv);
+                       pch ++;
+               }
+       }
+
+       SanityCheckTemplate(NULL, NewTemplate);
+       return NewTemplate;
+}
+
+
+const char* PrintTemplate(void *vSubst)
+{
+       WCTemplate *Tmpl = vSubst;
+
+       return ChrPtr(Tmpl->FileName);
+
+}
+
+int LoadTemplateDir(const StrBuf *DirName, HashList *big, const StrBuf *BaseKey)
+{
+       int Toplevel;
+       StrBuf *FileName;
+       StrBuf *Key;
+       StrBuf *SubKey;
+       StrBuf *SubDirectory;
+       DIR *filedir = NULL;
+       struct dirent *filedir_entry;
+       struct dirent *d;
+       int d_type = 0;
+       int d_namelen;
+       int d_without_ext;
+       
+       d = (struct dirent *)malloc(offsetof(struct dirent, d_name) + PATH_MAX + 1);
+       if (d == NULL) {
+               return 0;
+       }
+
+       filedir = opendir (ChrPtr(DirName));
+       if (filedir == NULL) {
+               free(d);
+               return 0;
+       }
+
+       Toplevel = StrLength(BaseKey) == 0;
+       SubDirectory = NewStrBuf();
+       SubKey = NewStrBuf();
+       FileName = NewStrBufPlain(NULL, PATH_MAX);
+       Key = NewStrBuf();
+       while ((readdir_r(filedir, d, &filedir_entry) == 0) &&
+              (filedir_entry != NULL))
+       {
+               char *MinorPtr;
+
+#ifdef _DIRENT_HAVE_D_NAMLEN
+               d_namelen = filedir_entry->d_namlen;
+#else
+               d_namelen = strlen(filedir_entry->d_name);
+#endif
+
+#ifdef _DIRENT_HAVE_D_TYPE
+               d_type = filedir_entry->d_type;
+#else
+
+#ifndef DT_UNKNOWN
+#define DT_UNKNOWN     0
+#define DT_DIR         4
+#define DT_REG         8
+#define DT_LNK         10
+
+#define IFTODT(mode)   (((mode) & 0170000) >> 12)
+#define DTTOIF(dirtype)        ((dirtype) << 12)
+#endif
+               d_type = DT_UNKNOWN;
+#endif
+               d_without_ext = d_namelen;
+
+               if ((d_namelen > 1) && filedir_entry->d_name[d_namelen - 1] == '~')
+                       continue; /* Ignore backup files... */
+
+               if ((d_namelen == 1) && 
+                   (filedir_entry->d_name[0] == '.'))
+                       continue;
+
+               if ((d_namelen == 2) && 
+                   (filedir_entry->d_name[0] == '.') &&
+                   (filedir_entry->d_name[1] == '.'))
+                       continue;
+
+               if (d_type == DT_UNKNOWN) {
+                       struct stat s;
+                       char path[PATH_MAX];
+                       snprintf(path, PATH_MAX, "%s/%s", 
+                                ChrPtr(DirName), filedir_entry->d_name);
+                       if (lstat(path, &s) == 0) {
+                               d_type = IFTODT(s.st_mode);
+                       }
+               }
+               switch (d_type)
+               {
+               case DT_DIR:
+                       /* Skip directories we are not interested in... */
+                       if (strcmp(filedir_entry->d_name, ".svn") == 0)
+                               continue;
+
+                       FlushStrBuf(SubKey);
+                       if (!Toplevel) {
+                               /* If we're not toplevel, the upper dirs count as foo_bar_<local name>*/
+                               StrBufAppendBuf(SubKey, BaseKey, 0);
+                               StrBufAppendBufPlain(SubKey, HKEY("_"), 0);
+                       }
+                       StrBufAppendBufPlain(SubKey, filedir_entry->d_name, d_namelen, 0);
+
+                       FlushStrBuf(SubDirectory);
+                       StrBufAppendBuf(SubDirectory, DirName, 0);
+                       if (ChrPtr(SubDirectory)[StrLength(SubDirectory) - 1] != '/')
+                               StrBufAppendBufPlain(SubDirectory, HKEY("/"), 0);
+                       StrBufAppendBufPlain(SubDirectory, filedir_entry->d_name, d_namelen, 0);
+
+                       LoadTemplateDir(SubDirectory, big, SubKey);
+
+                       break;
+               case DT_LNK: 
+               case DT_REG:
+
+
+                       while ((d_without_ext > 0) && (filedir_entry->d_name[d_without_ext] != '.'))
+                               d_without_ext --;
+                       if ((d_without_ext == 0) || (d_namelen < 3))
+                               continue;
+                       if (((d_namelen > 1) && filedir_entry->d_name[d_namelen - 1] == '~') ||
+                           (strcmp(&filedir_entry->d_name[d_without_ext], ".orig") == 0) ||
+                           (strcmp(&filedir_entry->d_name[d_without_ext], ".swp") == 0))
+                               continue; /* Ignore backup files... */
+                       StrBufPrintf(FileName, "%s/%s", ChrPtr(DirName),  filedir_entry->d_name);
+                       MinorPtr = strchr(filedir_entry->d_name, '.');
+                       if (MinorPtr != NULL)
+                               *MinorPtr = '\0';
+                       FlushStrBuf(Key);
+                       if (!Toplevel) {
+                               /* If we're not toplevel, the upper dirs count as foo_bar_<local name>*/
+                               StrBufAppendBuf(Key, BaseKey, 0);
+                               StrBufAppendBufPlain(Key, HKEY("_"), 0);
+                       }
+                       StrBufAppendBufPlain(Key, filedir_entry->d_name, MinorPtr - filedir_entry->d_name, 0);
+
+                       if (LoadTemplates >= 1)
+                               syslog(LOG_DEBUG, "%s %s\n", ChrPtr(FileName), ChrPtr(Key));
+                       prepare_template(FileName, Key, big);
+               default:
+                       break;
+               }
+       }
+       free(d);
+       closedir(filedir);
+       FreeStrBuf(&FileName);
+       FreeStrBuf(&Key);
+       FreeStrBuf(&SubDirectory);
+       FreeStrBuf(&SubKey);
+       return 1;
+}
+
+void InitTemplateCache(void)
+{
+       int i;
+       StrBuf *Key;
+       StrBuf *Dir;
+       HashList *Templates[2];
+
+       Dir = NewStrBuf();
+       Key = NewStrBuf();
+
+       /* Primary Template set... */
+       StrBufPrintf(Dir, "%s/t", static_dirs[0]);
+       LoadTemplateDir(Dir, TemplateCache, Key);
+
+       /* User local Template set */
+       StrBufPrintf(Dir, "%s/t", static_dirs[1]);
+       LoadTemplateDir(Dir, LocalTemplateCache, Key);
+       
+       /* Debug Templates, just to be loaded while debugging. */
+       
+       StrBufPrintf(Dir, "%s/dbg", static_dirs[0]);
+       LoadTemplateDir(Dir, TemplateCache, Key);
+       Templates[0] = TemplateCache;
+       Templates[1] = LocalTemplateCache;
+
+
+       if (LoadTemplates == 0) 
+               for (i=0; i < 2; i++) {
+                       const char *Key;
+                       long KLen;
+                       HashPos *At;
+                       void *vTemplate;
+
+                       At = GetNewHashPos(Templates[i], 0);
+                       while (GetNextHashPos(Templates[i], At, &KLen, &Key, &vTemplate) && (vTemplate != NULL)) {
+                               load_template(NULL, (WCTemplate *)vTemplate);
+                       }
+                       DeleteHashPos(&At);
+               }
+
+
+       FreeStrBuf(&Dir);
+       FreeStrBuf(&Key);
+}
+
+
+
+/*-----------------------------------------------------------------------------
+ *                      Filling & processing Templates
+ */
+/**
+ * \brief executes one token
+ * \param Target buffer to append to
+ * \param Token da to  process.
+ * \param Template we're iterating
+ * \param Context Contextpoointer to pass in
+ * \param state are we in conditional state?
+ * \param ContextType what type of information does context giv us?
+ */
+int EvaluateToken(StrBuf *Target, int state, WCTemplputParams **TPP)
+{
+       const char *AppendMe;
+       long AppendMeLen;
+       HashHandler *Handler;
+       void *vVar;
+       WCTemplputParams *TP = *TPP;
+       
+/* much output, since pName is not terminated...
+       syslog(LOG_DEBUG,"Doing token: %s\n",Token->pName);
+*/
+
+       switch (TP->Tokens->Flags) {
+       case SV_GETTEXT:
+               TmplGettext(Target, TP);
+               break;
+       case SV_CONDITIONAL: /** Forward conditional evaluation */
+               Handler = (HashHandler*) TP->Tokens->PreEval;
+               if (!CheckContext(Target, &Handler->Filter, TP, "Conditional")) {
+                       return 0;
+               }
+               return EvaluateConditional(Target, 1, state, TPP);
+               break;
+       case SV_NEG_CONDITIONAL: /** Reverse conditional evaluation */
+               Handler = (HashHandler*) TP->Tokens->PreEval;
+               if (!CheckContext(Target, &Handler->Filter, TP, "Conditional")) {
+                       return 0;
+               }
+               return EvaluateConditional(Target, 0, state, TPP);
+               break;
+       case SV_CUST_STR_CONDITIONAL: /** Conditional put custom strings from params */
+               Handler = (HashHandler*) TP->Tokens->PreEval;
+               if (!CheckContext(Target, &Handler->Filter, TP, "Conditional")) {
+                       return 0;
+               }
+               if (TP->Tokens->nParameters >= 6) {
+                       if (EvaluateConditional(Target, 0, state, TPP)) {
+                               GetTemplateTokenString(Target, TP, 5, &AppendMe, &AppendMeLen);
+                               StrBufAppendBufPlain(Target, AppendMe, AppendMeLen, 0);
+                       }
+                       else{
+                               GetTemplateTokenString(Target, TP, 4, &AppendMe, &AppendMeLen);
+                               StrBufAppendBufPlain(Target, AppendMe, AppendMeLen, 0);
+                       }
+                       if (*TPP != TP)
+                       {
+                               UnStackDynamicContext(Target, TPP);
+                       }
+               }
+               else  {
+                       LogTemplateError( Target, "Conditional", ERR_NAME, TP, "needs at least 6 Params!"); 
+               }
+               break;
+       case SV_SUBTEMPL:
+               if (TP->Tokens->nParameters == 1)
+                       DoTemplate(TKEY(0), Target, TP);
+               break;
+       case SV_PREEVALUATED:
+               Handler = (HashHandler*) TP->Tokens->PreEval;
+               if (!CheckContext(Target, &Handler->Filter, TP, "Token")) {
+                       return 0;
+               }
+               Handler->HandlerFunc(Target, TP);
+               break;          
+       default:
+               if (GetHash(GlobalNS, TP->Tokens->pName, TP->Tokens->NameEnd, &vVar)) {
+                       Handler = (HashHandler*) vVar;
+                       if (!CheckContext(Target, &Handler->Filter, TP, "Token")) {
+                               return 0;
+                       }
+                       else {
+                               Handler->HandlerFunc(Target, TP);
+                       }
+               }
+               else {
+                       LogTemplateError(
+                               Target, "Token UNKNOWN", ERR_NAME, TP,
+                               "You've specified a token that isn't known to webcit.!");
+               }
+       }
+       return 0;
+}
+
+
+
+const StrBuf *ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, WCTemplputParams *CallingTP)
+{
+       WCTemplate *pTmpl = Tmpl;
+       int done = 0;
+       int i;
+       TemplState state;
+       const char *pData, *pS;
+       long len;
+       WCTemplputParams TP;
+       WCTemplputParams *TPtr = &TP;
+
+       memset(TPtr, 0, sizeof(WCTemplputParams));
+
+       memcpy(&TP.Filter, &CallingTP->Filter, sizeof(ContextFilter));
+
+       TP.Context = CallingTP->Context;
+       TP.Sub = CallingTP->Sub;
+       TP.Super = CallingTP->Super;
+
+       if (LoadTemplates != 0) {                       
+               if (LoadTemplates > 1)
+                       syslog(LOG_DEBUG, "DBG: ----- loading:  [%s] ------ \n", 
+                               ChrPtr(Tmpl->FileName));
+               pTmpl = duplicate_template(Tmpl);
+               if(load_template(Target, pTmpl) == NULL) {
+                       StrBufAppendPrintf( Target,
+                               "<pre>\nError loading Template [%s]\n See Logfile for details\n</pre>\n", 
+                               ChrPtr(Tmpl->FileName));
+                       FreeWCTemplate(pTmpl);
+                       return NULL;
+               }
+
+       }
+
+       pS = pData = ChrPtr(pTmpl->Data);
+       len = StrLength(pTmpl->Data);
+       i = 0;
+       state = eNext;
+       while (!done) {
+               if (i >= pTmpl->nTokensUsed) {
+                       StrBufAppendBufPlain(Target, pData, len - (pData - pS), 0);
+                       done = 1;
+               }
+               else {
+                       int TokenRc = 0;
+
+                       StrBufAppendBufPlain( Target, pData, pTmpl->Tokens[i]->pTokenStart - pData, 0);
+                       TPtr->Tokens = pTmpl->Tokens[i];
+                       TPtr->nArgs = pTmpl->Tokens[i]->nParameters;
+
+                       TokenRc = EvaluateToken(Target, TokenRc, &TPtr);
+                       if (TokenRc > 0) {
+                               state = eSkipTilEnd;
+                       }
+                       else if (TokenRc < 0) {
+                               if ((TPtr != &TP) && (TPtr->ExitCTXID == -TokenRc)) {
+                                       UnStackDynamicContext(Target, &TPtr);
+                               }
+                               TokenRc = 0;
+                       }
+
+                       while ((state != eNext) && (i+1 < pTmpl->nTokensUsed)) {
+                       /* condition told us to skip till its end condition */
+                               i++;
+                               TPtr->Tokens = pTmpl->Tokens[i];
+                               TPtr->nArgs = pTmpl->Tokens[i]->nParameters;
+                               if ((pTmpl->Tokens[i]->Flags == SV_CONDITIONAL) ||
+                                   (pTmpl->Tokens[i]->Flags == SV_NEG_CONDITIONAL))
+                               {
+                                       int rc;
+                                       rc = EvaluateConditional(
+                                               Target, 
+                                               pTmpl->Tokens[i]->Flags, 
+                                               TokenRc, 
+                                               &TPtr);
+                                       if (-rc == TokenRc) {
+                                               TokenRc = 0;
+                                               state = eNext;
+                                               if ((TPtr != &TP) && (TPtr->ExitCTXID == - rc)) {
+                                                       UnStackDynamicContext(Target, &TPtr);
+                                               }
+                                       }
+                               }
+                       }
+
+                       pData = pTmpl->Tokens[i++]->pTokenEnd + 1;
+                       if (i > pTmpl->nTokensUsed)
+                               done = 1;
+               }
+       }
+       if (LoadTemplates != 0) {
+               FreeWCTemplate(pTmpl);
+       }
+       return Tmpl->MimeType;
+
+}
+
+
+StrBuf *textPlainType;
+/**
+ * \brief Display a variable-substituted template
+ * \param templatename template file to load
+ * \returns the mimetype of the template its doing
+ */
+const StrBuf *DoTemplate(const char *templatename, long len, StrBuf *Target, WCTemplputParams *TP) 
+{
+       WCTemplputParams LocalTP;
+       HashList *Static;
+       HashList *StaticLocal;
+       void *vTmpl;
+       
+       if (Target == NULL)
+               Target = WC->WBuf;
+       if (TP == NULL) {
+               memset(&LocalTP, 0, sizeof(WCTemplputParams));
+               TP = &LocalTP;
+       }
+
+       Static = TemplateCache;
+       StaticLocal = LocalTemplateCache;
+
+       if (len == 0) {
+               syslog(LOG_WARNING, "Can't to load a template with empty name!\n");
+               StrBufAppendPrintf(Target, "<pre>\nCan't to load a template with empty name!\n</pre>");
+               return textPlainType;
+       }
+
+       if (!GetHash(StaticLocal, templatename, len, &vTmpl) &&
+           !GetHash(Static, templatename, len, &vTmpl)) {
+               StrBuf *escapedString = NewStrBufPlain(NULL, len);
+               
+               StrHtmlEcmaEscAppend(escapedString, NULL, templatename, 1, 1);
+               syslog(LOG_WARNING, "didn't find Template [%s] %ld %ld\n", ChrPtr(escapedString), len , (long)strlen(templatename));
+               StrBufAppendPrintf(Target, "<pre>\ndidn't find Template [%s] %ld %ld\n</pre>", 
+                                  ChrPtr(escapedString), len, 
+                                  (long)strlen(templatename));
+               WC->isFailure = 1;
+#if 0
+               dbg_PrintHash(Static, PrintTemplate, NULL);
+               PrintHash(Static, VarPrintTransition, PrintTemplate);
+#endif
+               FreeStrBuf(&escapedString);
+               return textPlainType;
+       }
+       if (vTmpl == NULL) 
+               return textPlainType;
+       return ProcessTemplate(vTmpl, Target, TP);
+
+}
+
+
+void tmplput_Comment(StrBuf *Target, WCTemplputParams *TP)
+{
+       if (LoadTemplates != 0)
+       {
+               StrBuf *Comment;
+               const char *pch;
+               long len;
+
+               GetTemplateTokenString(Target, TP, 0, &pch, &len);
+               Comment = NewStrBufPlain(pch, len);
+               StrBufAppendBufPlain(Target, HKEY("<!--"), 0);
+               StrBufAppendTemplate(Target, TP, Comment, 1);
+               StrBufAppendBufPlain(Target, HKEY("-->"), 0);
+               FreeStrBuf(&Comment);
+       }
+}
+
+/*-----------------------------------------------------------------------------
+ *                      Iterators
+ */
+typedef struct _HashIterator {
+       HashList *StaticList;
+       int AdditionalParams;
+       CtxType ContextType;
+       CtxType XPectContextType;
+       int Flags;
+       RetrieveHashlistFunc GetHash;
+       HashDestructorFunc Destructor;
+       SubTemplFunc DoSubTemplate;
+       FilterByParamFunc Filter;
+} HashIterator;
+
+void RegisterITERATOR(const char *Name, long len, 
+                     int AdditionalParams, 
+                     HashList *StaticList, 
+                     RetrieveHashlistFunc GetHash, 
+                     SubTemplFunc DoSubTempl,
+                     HashDestructorFunc Destructor,
+                     FilterByParamFunc Filter,
+                     CtxType ContextType, 
+                     CtxType XPectContextType, 
+                     int Flags)
+{
+       HashIterator *It;
+
+       It = (HashIterator*)malloc(sizeof(HashIterator));
+       memset(It, 0, sizeof(HashIterator));
+       It->StaticList = StaticList;
+       It->AdditionalParams = AdditionalParams;
+       It->GetHash = GetHash;
+       It->DoSubTemplate = DoSubTempl;
+       It->Destructor = Destructor;
+       It->Filter = Filter;
+       It->ContextType = ContextType;
+       It->XPectContextType = XPectContextType;
+       It->Flags = Flags;
+       Put(Iterators, Name, len, It, NULL);
+}
+
+typedef struct _iteratestruct {
+       int GroupChange;
+       int oddeven;
+       const char *Key;
+       long KeyLen;
+       int n;
+       int LastN;
+       }IterateStruct; 
+
+int preeval_iterate(WCTemplateToken *Token)
+{
+       WCTemplputParams TPP;
+       WCTemplputParams *TP;
+       void *vTmpl;
+       void *vIt;
+       HashIterator *It;
+
+       memset(&TPP, 0, sizeof(WCTemplputParams));
+       TP = &TPP;
+       TP->Tokens = Token;
+       if (!GetHash(Iterators, TKEY(0), &vIt)) {
+               LogTemplateError(
+                       NULL, "Iterator", ERR_PARM1, TP,
+                       "not found");
+               return 0;
+       }
+       if (TP->Tokens->Params[1]->Type != TYPE_SUBTEMPLATE) {
+               LogTemplateError(NULL, "Iterator", ERR_PARM1, TP,
+                                "Need token with type Subtemplate as param 1, have %s", 
+                                TP->Tokens->Params[1]->Start);
+       }
+       
+       /* well, we don't check the mobile stuff here... */
+       if (!GetHash(LocalTemplateCache, TKEY(1), &vTmpl) &&
+           !GetHash(TemplateCache, TKEY(1), &vTmpl)) {
+               LogTemplateError(NULL, "SubTemplate", ERR_PARM1, TP,
+                                "referenced here doesn't exist");
+       }
+       Token->Preeval2 = vIt;
+       It = (HashIterator *) vIt;
+
+       if (TP->Tokens->nParameters < It->AdditionalParams + 2) {
+               LogTemplateError(                               
+                       NULL, "Iterator", ERR_PARM1, TP,
+                       "doesn't work with %d params", 
+                       TP->Tokens->nParameters);
+       }
+
+
+       return 1;
+}
+
+void tmpl_iterate_subtmpl(StrBuf *Target, WCTemplputParams *TP)
+{
+       HashIterator *It;
+       HashList *List;
+       HashPos  *it;
+       SortStruct *SortBy = NULL;
+       void *vSortBy;
+       int DetectGroupChange = 0;
+       int nMembersUsed;
+       void *vContext;
+       void *vLastContext = NULL;
+       StrBuf *SubBuf;
+       WCTemplputParams IterateTP;
+       WCTemplputParams SubTP;
+       IterateStruct Status;
+
+       long StartAt = 0;
+       long StepWidth = 0;
+       long StopAt = -1;
+
+       memset(&Status, 0, sizeof(IterateStruct));
+       
+       It = (HashIterator*) TP->Tokens->Preeval2;
+       if (It == NULL) {
+               LogTemplateError(
+                       Target, "Iterator", ERR_PARM1, TP, "Unknown!");
+               return;
+       }
+
+       if (TP->Tokens->nParameters < It->AdditionalParams + 2) {
+               LogTemplateError(                               
+                       Target, "Iterator", ERR_PARM1, TP,
+                       "doesn't work with %d params", 
+                       TP->Tokens->nParameters - 1);
+               return;
+       }
+
+       if ((It->XPectContextType != CTX_NONE) &&
+           (It->XPectContextType != TP->Filter.ContextType)) {
+               LogTemplateError(
+                       Target, "Iterator", ERR_PARM1, TP,
+                       "requires context of type %s, have %s", 
+                       ContextName(It->XPectContextType), 
+                       ContextName(TP->Filter.ContextType));
+               return ;
+               
+       }
+
+       if (It->StaticList == NULL)
+               List = It->GetHash(Target, TP);
+       else
+               List = It->StaticList;
+
+       DetectGroupChange = (It->Flags & IT_FLAG_DETECT_GROUPCHANGE) != 0;
+       if (DetectGroupChange) {
+               const StrBuf *BSort;
+               DetectGroupChange = 0;
+               if (havebstr("SortBy")) {
+                       BSort = sbstr("SortBy");
+                       if (GetHash(SortHash, SKEY(BSort), &vSortBy) &&
+                           (vSortBy != NULL)) {
+                               SortBy = (SortStruct*)vSortBy;
+                               /* first check whether its intended for us... */
+                               if ((SortBy->ContextType == It->ContextType)&&
+                               /** Ok, its us, lets see in which direction we should sort... */
+                                   (havebstr("SortOrder"))) {
+                                       int SortOrder;
+                                       SortOrder = lbstr("SortOrder");
+                                       if (SortOrder != 0)
+                                               DetectGroupChange = 1;
+                               }
+                       }
+               }
+       }
+       nMembersUsed = GetCount(List);
+
+       StackContext (TP, &IterateTP, &Status, CTX_ITERATE, 0, TP->Tokens);
+       {
+               SubBuf = NewStrBuf();
+       
+               if (HAVE_PARAM(2)) {
+                       StartAt = GetTemplateTokenNumber(Target, TP, 2, 0);
+               }
+               if (HAVE_PARAM(3)) {
+                       StepWidth = GetTemplateTokenNumber(Target, TP, 3, 0);
+               }
+               if (HAVE_PARAM(4)) {
+                       StopAt = GetTemplateTokenNumber(Target, TP, 4, -1);
+               }
+               it = GetNewHashPos(List, StepWidth);
+               if (StopAt < 0) {
+                       StopAt = GetCount(List);
+               }
+               while (GetNextHashPos(List, it, &Status.KeyLen, &Status.Key, &vContext)) {
+                       if ((Status.n >= StartAt) && (Status.n <= StopAt)) {
+
+                               if ((It->Filter != NULL) &&
+                                   !It->Filter(Status.Key, Status.KeyLen, vContext, Target, TP)) 
+                               {
+                                       continue;
+                               }
+
+                               if (DetectGroupChange && Status.n > 0) {
+                                       Status.GroupChange = SortBy->GroupChange(vContext, vLastContext);
+                               }
+                               Status.LastN = (Status.n + 1) == nMembersUsed;
+                               StackContext(&IterateTP, &SubTP, vContext, It->ContextType, 0, NULL);
+                               {
+                                       if (It->DoSubTemplate != NULL)
+                                               It->DoSubTemplate(SubBuf, &SubTP);
+                                       DoTemplate(TKEY(1), SubBuf, &SubTP);
+
+                                       StrBufAppendBuf(Target, SubBuf, 0);
+                                       FlushStrBuf(SubBuf);
+                               }
+                               UnStackContext(&SubTP);
+                               Status.oddeven = ! Status.oddeven;
+                               vLastContext = vContext;
+                       }
+                       Status.n++;
+               }
+       }
+       UnStackContext(&IterateTP);
+       FreeStrBuf(&SubBuf);
+       DeleteHashPos(&it);
+       if (It->Destructor != NULL)
+               It->Destructor(&List);
+}
+
+
+int conditional_ITERATE_ISGROUPCHANGE(StrBuf *Target, WCTemplputParams *TP)
+{
+       IterateStruct *Ctx = CTX(CTX_ITERATE);
+       if (TP->Tokens->nParameters < 3)
+               return  Ctx->GroupChange;
+
+       return TP->Tokens->Params[2]->lvalue == Ctx->GroupChange;
+}
+
+void tmplput_ITERATE_ODDEVEN(StrBuf *Target, WCTemplputParams *TP)
+{
+       IterateStruct *Ctx = CTX(CTX_ITERATE);
+       if (Ctx->oddeven)
+               StrBufAppendBufPlain(Target, HKEY("odd"), 0);
+       else
+               StrBufAppendBufPlain(Target, HKEY("even"), 0);
+}
+
+
+void tmplput_ITERATE_KEY(StrBuf *Target, WCTemplputParams *TP)
+{
+       IterateStruct *Ctx = CTX(CTX_ITERATE);
+
+       StrBufAppendBufPlain(Target, Ctx->Key, Ctx->KeyLen, 0);
+}
+
+void tmplput_ITERATE_N_DIV(StrBuf *Target, WCTemplputParams *TP)
+{
+       IterateStruct *Ctx = CTX(CTX_ITERATE);
+       long div;
+       long divisor = GetTemplateTokenNumber(Target, TP, 0, 1);
+///TODO divisor == 0 -> log error exit
+       div = Ctx->n / divisor;
+       StrBufAppendPrintf(Target, "%ld", div);
+}
+
+void tmplput_ITERATE_N(StrBuf *Target, WCTemplputParams *TP)
+{
+       IterateStruct *Ctx = CTX(CTX_ITERATE);
+       StrBufAppendPrintf(Target, "%d", Ctx->n);
+}
+
+int conditional_ITERATE_FIRSTN(StrBuf *Target, WCTemplputParams *TP)
+{
+       IterateStruct *Ctx = CTX(CTX_ITERATE);
+       return Ctx->n == 0;
+}
+
+int conditional_ITERATE_LASTN(StrBuf *Target, WCTemplputParams *TP)
+{
+       IterateStruct *Ctx = CTX(CTX_ITERATE);
+       return Ctx->LastN;
+}
+
+int conditional_ITERATE_ISMOD(StrBuf *Target, WCTemplputParams *TP)
+{
+       IterateStruct *Ctx = CTX(CTX_ITERATE);
+
+       long divisor = GetTemplateTokenNumber(Target, TP, 2, 1);
+       long expectRemainder = GetTemplateTokenNumber(Target, TP, 3, 0);
+       
+       return Ctx->n % divisor == expectRemainder;
+}
+
+
+
+/*-----------------------------------------------------------------------------
+ *                      Conditionals
+ */
+int EvaluateConditional(StrBuf *Target, int Neg, int state, WCTemplputParams **TPP)
+{
+       ConditionalStruct *Cond;
+       int rc = 0;
+       int res;
+       WCTemplputParams *TP = *TPP;
+
+       if ((TP->Tokens->Params[0]->len == 1) &&
+           (TP->Tokens->Params[0]->Start[0] == 'X'))
+       {
+               return - (TP->Tokens->Params[1]->lvalue);
+       }
+           
+       Cond = (ConditionalStruct *) TP->Tokens->PreEval;
+       if (Cond == NULL) {
+               LogTemplateError(
+                       Target, "Conditional", ERR_PARM1, TP,
+                       "unknown!");
+               return 0;
+       }
+
+       if (!CheckContext(Target, &Cond->Filter, TP, "Conditional")) {
+               return 0;
+       }
+
+       res = Cond->CondF(Target, TP);
+       if (res == Neg)
+               rc = TP->Tokens->Params[1]->lvalue;
+
+       if (LoadTemplates > 5) 
+               syslog(LOG_DEBUG, "<%s> : %d %d==%d\n", 
+                       ChrPtr(TP->Tokens->FlatToken), 
+                       rc, res, Neg);
+
+       if (TP->Sub != NULL)
+       {
+               *TPP = TP->Sub;
+       }
+       return rc;
+}
+
+void RegisterContextConditional(const char *Name, long len, 
+                               int nParams,
+                               WCConditionalFunc CondF, 
+                               WCConditionalFunc ExitCtxCond,
+                               int ContextRequired)
+{
+       ConditionalStruct *Cond;
+
+       Cond = (ConditionalStruct*)malloc(sizeof(ConditionalStruct));
+       memset(Cond, 0, sizeof(ConditionalStruct));
+       Cond->PlainName = Name;
+       Cond->Filter.nMaxArgs = nParams;
+       Cond->Filter.nMinArgs = nParams;
+       Cond->CondF = CondF;
+       Cond->CondExitCtx = ExitCtxCond;
+       Cond->Filter.ContextType = ContextRequired;
+       Put(Conditionals, Name, len, Cond, NULL);
+}
+
+void RegisterTokenParamDefine(const char *Name, long len, 
+                             long Value)
+{
+       long *PVal;
+
+       PVal = (long*)malloc(sizeof(long));
+       *PVal = Value;
+       Put(Defines, Name, len, PVal, NULL);
+}
+
+long GetTokenDefine(const char *Name, long len, 
+                   long DefValue)
+{
+       void *vPVal;
+
+       if (GetHash(Defines, Name, len, &vPVal) &&
+            (vPVal != NULL))
+        {
+                return *(long*) vPVal;
+        }
+        else
+        {
+                return DefValue;
+        }
+}
+
+void tmplput_DefStr(StrBuf *Target, WCTemplputParams *TP)
+{
+       const char *Str;
+       long len;
+       GetTemplateTokenString(Target, TP, 2, &Str, &len);
+       
+       StrBufAppendBufPlain(Target, Str, len, 0);
+}
+
+void tmplput_DefVal(StrBuf *Target, WCTemplputParams *TP)
+{
+       int val;
+
+       val = GetTemplateTokenNumber(Target, TP, 0, 0);
+       StrBufAppendPrintf(Target, "%d", val);
+}
+
+HashList *Defines;
+
+/*-----------------------------------------------------------------------------
+ *                      Context Strings
+ */
+void tmplput_ContextString(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBufAppendTemplate(Target, TP, (StrBuf*)CTX(CTX_STRBUF), 0);
+}
+int ConditionalContextStr(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *TokenText = (StrBuf*) CTX((CTX_STRBUF));
+       const char *CompareToken;
+       long len;
+
+       GetTemplateTokenString(Target, TP, 2, &CompareToken, &len);
+       return strcmp(ChrPtr(TokenText), CompareToken) == 0;
+}
+
+void tmplput_ContextStringArray(StrBuf *Target, WCTemplputParams *TP)
+{
+       HashList *Arr = (HashList*) CTX(CTX_STRBUFARR);
+       void *pV;
+       int val;
+
+       val = GetTemplateTokenNumber(Target, TP, 0, 0);
+       if (GetHash(Arr, IKEY(val), &pV) && 
+           (pV != NULL)) {
+               StrBufAppendTemplate(Target, TP, (StrBuf*)pV, 1);
+       }
+}
+int ConditionalContextStrinArray(StrBuf *Target, WCTemplputParams *TP)
+{
+       HashList *Arr = (HashList*) CTX(CTX_STRBUFARR);
+       void *pV;
+       int val;
+       const char *CompareToken;
+       long len;
+
+       GetTemplateTokenString(Target, TP, 2, &CompareToken, &len);
+       val = GetTemplateTokenNumber(Target, TP, 0, 0);
+       if (GetHash(Arr, IKEY(val), &pV) && 
+           (pV != NULL)) {
+               return strcmp(ChrPtr((StrBuf*)pV), CompareToken) == 0;
+       }
+       else
+               return 0;
+}
+
+/*-----------------------------------------------------------------------------
+ *                      Boxed-API
+ */
+
+void tmpl_do_boxed(StrBuf *Target, WCTemplputParams *TP)
+{
+       WCTemplputParams SubTP;
+
+       StrBuf *Headline = NULL;
+       if (TP->Tokens->nParameters == 2) {
+               if (TP->Tokens->Params[1]->Type == TYPE_STR) {
+                       Headline = NewStrBuf();
+                       DoTemplate(TKEY(1), Headline, TP);
+               }
+               else {
+                       const char *Ch;
+                       long len;
+                       GetTemplateTokenString(Target, 
+                                              TP, 
+                                              1,
+                                              &Ch,
+                                              &len);
+                       Headline = NewStrBufPlain(Ch, len);
+               }
+       }
+       /* else TODO error? logging? */
+
+       StackContext (TP, &SubTP, Headline, CTX_STRBUF, 0, NULL);
+       {
+               DoTemplate(HKEY("box_begin"), Target, &SubTP);
+       }
+       UnStackContext(&SubTP);
+       DoTemplate(TKEY(0), Target, TP);
+       DoTemplate(HKEY("box_end"), Target, TP);
+       FreeStrBuf(&Headline);
+}
+
+/*-----------------------------------------------------------------------------
+ *                      Tabbed-API
+ */
+
+typedef struct _tab_struct {
+       long CurrentTab;
+       StrBuf *TabTitle;
+} tab_struct;
+
+int preeval_do_tabbed(WCTemplateToken *Token)
+{
+       WCTemplputParams TPP;
+       WCTemplputParams *TP;
+       const char *Ch;
+       long len;
+       int i, nTabs;
+
+       memset(&TPP, 0, sizeof(WCTemplputParams));
+       TP = &TPP;
+       TP->Tokens = Token;
+       nTabs = TP->Tokens->nParameters / 2 - 1;
+       if (TP->Tokens->nParameters % 2 != 0)
+       {
+               LogTemplateError(NULL, "TabbedApi", ERR_PARM1, TP,
+                                "need even number of arguments");
+               return 0;
+
+       }
+       else for (i = 0; i < nTabs; i++) {
+               if (!HaveTemplateTokenString(NULL, 
+                                            TP, 
+                                            i * 2,
+                                            &Ch,
+                                            &len) || 
+                   (TP->Tokens->Params[i * 2]->len == 0))
+               {
+                       LogTemplateError(NULL, "TabbedApi", ERR_PARM1, TP,
+                                        "Tab-Subject %d needs to be able to produce a string, have %s", 
+                                        i, TP->Tokens->Params[i * 2]->Start);
+                       return 0;
+               }
+               if (!HaveTemplateTokenString(NULL, 
+                                            TP, 
+                                            i * 2 + 1,
+                                            &Ch,
+                                            &len) || 
+                   (TP->Tokens->Params[i * 2 + 1]->len == 0))
+               {
+                       LogTemplateError(NULL, "TabbedApi", ERR_PARM1, TP,
+                                        "Tab-Content %d needs to be able to produce a string, have %s", 
+                                        i, TP->Tokens->Params[i * 2 + 1]->Start);
+                       return 0;
+               }
+       }
+
+       if (!HaveTemplateTokenString(NULL, 
+                                    TP, 
+                                    i * 2 + 1,
+                                    &Ch,
+                                    &len) || 
+           (TP->Tokens->Params[i * 2 + 1]->len == 0))
+       {
+               LogTemplateError(NULL, "TabbedApi", ERR_PARM1, TP,
+                                "Tab-Content %d needs to be able to produce a string, have %s", 
+                                i, TP->Tokens->Params[i * 2 + 1]->Start);
+               return 0;
+       }
+       return 1;
+}
+
+
+void tmpl_do_tabbed(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf **TabNames;
+       int i, ntabs, nTabs;
+       tab_struct TS;
+       WCTemplputParams SubTP;
+
+       memset(&TS, 0, sizeof(tab_struct));
+
+       nTabs = ntabs = TP->Tokens->nParameters / 2;
+       TabNames = (StrBuf **) malloc(ntabs * sizeof(StrBuf*));
+       memset(TabNames, 0, ntabs * sizeof(StrBuf*));
+
+       for (i = 0; i < ntabs; i++) {
+               if ((TP->Tokens->Params[i * 2]->Type == TYPE_STR) &&
+                   (TP->Tokens->Params[i * 2]->len > 0)) {
+                       TabNames[i] = NewStrBuf();
+                       DoTemplate(TKEY(i * 2), TabNames[i], TP);
+               }
+               else if (TP->Tokens->Params[i * 2]->Type == TYPE_GETTEXT) {
+                       const char *Ch;
+                       long len;
+                       GetTemplateTokenString(Target, 
+                                              TP, 
+                                              i * 2,
+                                              &Ch,
+                                              &len);
+                       TabNames[i] = NewStrBufPlain(Ch, -1);
+               }
+               else { 
+                       /** A Tab without subject? we can't count that, add it as silent */
+                       nTabs --;
+               }
+       }
+       StackContext (TP, &SubTP, &TS, CTX_TAB, 0, NULL);
+       {
+               StrTabbedDialog(Target, nTabs, TabNames);
+               for (i = 0; i < ntabs; i++) {
+                       memset(&TS, 0, sizeof(tab_struct));
+                       TS.CurrentTab = i;
+                       TS.TabTitle = TabNames[i];
+                       StrBeginTab(Target, i, nTabs, TabNames);
+                       DoTemplate(TKEY(i * 2 + 1), Target, &SubTP);
+                       StrEndTab(Target, i, nTabs);
+               }
+               for (i = 0; i < ntabs; i++) 
+                       FreeStrBuf(&TabNames[i]);
+               free(TabNames);
+       }
+       UnStackContext(&SubTP);
+}
+
+void tmplput_TAB_N(StrBuf *Target, WCTemplputParams *TP)
+{
+       tab_struct *Ctx = CTX(CTX_TAB);
+
+       StrBufAppendPrintf(Target, "%d", Ctx->CurrentTab);
+}
+
+void tmplput_TAB_TITLE(StrBuf *Target, WCTemplputParams *TP)
+{
+       tab_struct *Ctx = CTX(CTX_TAB);
+       StrBufAppendTemplate(Target, TP, Ctx->TabTitle, 0);
+}
+
+/*-----------------------------------------------------------------------------
+ *                      Sorting-API
+ */
+
+
+void RegisterSortFunc(const char *name, long len, 
+                     const char *prepend, long preplen,
+                     CompareFunc Forward, 
+                     CompareFunc Reverse, 
+                     CompareFunc GroupChange, 
+                     CtxType ContextType)
+{
+       SortStruct *NewSort;
+
+       NewSort = (SortStruct*) malloc(sizeof(SortStruct));
+       memset(NewSort, 0, sizeof(SortStruct));
+       NewSort->Name = NewStrBufPlain(name, len);
+       if (prepend != NULL)
+               NewSort->PrefPrepend = NewStrBufPlain(prepend, preplen);
+       else
+               NewSort->PrefPrepend = NULL;
+       NewSort->Forward = Forward;
+       NewSort->Reverse = Reverse;
+       NewSort->GroupChange = GroupChange;
+       NewSort->ContextType = ContextType;
+       if (ContextType == CTX_NONE) {
+               syslog(LOG_WARNING, "sorting requires a context. CTX_NONE won't make it.\n");
+               exit(1);
+       }
+               
+       Put(SortHash, name, len, NewSort, DestroySortStruct);
+}
+
+CompareFunc RetrieveSort(WCTemplputParams *TP, 
+                        const char *OtherPrefix, long OtherPrefixLen,
+                        const char *Default, long ldefault, long DefaultDirection)
+{
+       const StrBuf *BSort = NULL;
+       SortStruct *SortBy;
+       void *vSortBy;
+       long SortOrder = -1;
+       
+       if (havebstr("SortBy")) {
+               BSort = sbstr("SortBy");
+               if (OtherPrefix == NULL) {
+                       set_room_pref("sort", NewStrBufDup(BSort), 0);
+               }
+               else {
+                       set_X_PREFS(HKEY("sort"), OtherPrefix, OtherPrefixLen, NewStrBufDup(BSort), 0);
+               }
+       }
+       else { /** Try to fallback to our remembered values... */
+               if (OtherPrefix == NULL) {
+                       BSort = get_room_pref("sort");
+               }
+               else {
+                       BSort = get_X_PREFS(HKEY("sort"), OtherPrefix, OtherPrefixLen);
+               }
+               if (BSort != NULL)
+                       putbstr("SortBy", NewStrBufDup(BSort));
+               else {
+                       StrBuf *Buf;
+
+                       BSort = Buf = NewStrBufPlain(Default, ldefault);
+                       putbstr("SortBy", Buf);
+               }
+       }
+
+       if (!GetHash(SortHash, SKEY(BSort), &vSortBy) || 
+           (vSortBy == NULL)) {
+               if (!GetHash(SortHash, Default, ldefault, &vSortBy) || 
+                   (vSortBy == NULL)) {
+                       LogTemplateError(
+                               NULL, "Sorting", ERR_PARM1, TP,
+                               "Illegal default sort: [%s]", Default);
+                       wc_backtrace(LOG_WARNING);
+               }
+       }
+       SortBy = (SortStruct*)vSortBy;
+
+       if (SortBy->ContextType != TP->Filter.ContextType)
+               return NULL;
+
+       /** Ok, its us, lets see in which direction we should sort... */
+       if (havebstr("SortOrder")) {
+               SortOrder = lbstr("SortOrder");
+       }
+       else { /** Try to fallback to our remembered values... */
+               StrBuf *Buf = NULL;
+               if (SortBy->PrefPrepend == NULL) {
+                       Buf = get_room_pref("SortOrder");
+                       SortOrder = StrTol(Buf);
+               }
+               else {
+                       BSort = get_X_PREFS(HKEY("SortOrder"), OtherPrefix, OtherPrefixLen);
+               }
+
+               if (Buf == NULL)
+                       SortOrder = DefaultDirection;
+
+               Buf = NewStrBufPlain(NULL, 64);
+               StrBufPrintf(Buf, "%ld", SortOrder);
+               putbstr("SortOrder", Buf);
+       }
+       switch (SortOrder) {
+       default:
+       case 0:
+               return NULL;
+       case 1:
+               return SortBy->Forward;
+       case 2:
+               return SortBy->Reverse;
+       }
+}
+
+
+enum {
+       eNO_SUCH_SORT, 
+       eNOT_SPECIFIED,
+       eINVALID_PARAM,
+       eFOUND
+};
+
+ConstStr SortIcons[] = {
+       {HKEY("static/webcit_icons/sort_none.gif")},
+       {HKEY("static/webcit_icons/up_pointer.gif")},
+       {HKEY("static/webcit_icons/down_pointer.gif")},
+};
+
+ConstStr SortNextOrder[] = {
+       {HKEY("1")},
+       {HKEY("2")},
+       {HKEY("0")},
+};
+
+
+int GetSortMetric(WCTemplputParams *TP, SortStruct **Next, SortStruct **Param, long *SortOrder, int N)
+{
+       int bSortError = eNOT_SPECIFIED;
+       const StrBuf *BSort;
+       void *vSort;
+       
+       *SortOrder = 0;
+       *Next = NULL;
+       if (!GetHash(SortHash, TKEY(0), &vSort) || 
+           (vSort == NULL))
+               return eNO_SUCH_SORT;
+       *Param = (SortStruct*) vSort;
+       
+
+       if (havebstr("SortBy")) {
+               BSort = sbstr("SortBy");
+               bSortError = eINVALID_PARAM;
+               if ((*Param)->PrefPrepend == NULL) {
+                       set_room_pref("sort", NewStrBufDup(BSort), 0);
+               }
+               else {
+                       set_X_PREFS(HKEY("sort"), TKEY(N), NewStrBufDup(BSort), 0);
+               }
+       }
+       else { /** Try to fallback to our remembered values... */
+               if ((*Param)->PrefPrepend == NULL) {
+                       BSort = get_room_pref("sort");
+               }
+               else {
+                       BSort = get_X_PREFS(HKEY("sort"), TKEY(N));
+               }
+       }
+
+       if (!GetHash(SortHash, SKEY(BSort), &vSort) || 
+           (vSort == NULL))
+               return bSortError;
+
+       *Next = (SortStruct*) vSort;
+
+       /** Ok, its us, lets see in which direction we should sort... */
+       if (havebstr("SortOrder")) {
+               *SortOrder = lbstr("SortOrder");
+       }
+       else { /** Try to fallback to our remembered values... */
+               if ((*Param)->PrefPrepend == NULL) {
+                       *SortOrder = StrTol(get_room_pref("SortOrder"));
+               }
+               else {
+                       *SortOrder = StrTol(get_X_PREFS(HKEY("SortOrder"), TKEY(N)));
+               }
+       }
+       if (*SortOrder > 2)
+               *SortOrder = 0;
+
+       return eFOUND;
+}
+
+
+void tmplput_SORT_ICON(StrBuf *Target, WCTemplputParams *TP)
+{
+       long SortOrder;
+       SortStruct *Next;
+       SortStruct *Param;
+       const ConstStr *SortIcon;
+
+       switch (GetSortMetric(TP, &Next, &Param, &SortOrder, 2)){
+       case eNO_SUCH_SORT:
+                LogTemplateError(
+                        Target, "Sorter", ERR_PARM1, TP,
+                       " Sorter [%s] unknown!", 
+                       TP->Tokens->Params[0]->Start);
+               break;          
+       case eINVALID_PARAM:
+                LogTemplateError(NULL, "Sorter", ERR_PARM1, TP,
+                                " Sorter specified by BSTR 'SortBy' [%s] unknown!", 
+                                bstr("SortBy"));
+       case eNOT_SPECIFIED:
+       case eFOUND:
+               if (Next == Param) {
+                       SortIcon = &SortIcons[SortOrder];
+               }
+               else { /** Not Us... */
+                       SortIcon = &SortIcons[0];
+               }
+               StrBufAppendBufPlain(Target, SortIcon->Key, SortIcon->len, 0);
+       }
+}
+
+void tmplput_SORT_NEXT(StrBuf *Target, WCTemplputParams *TP)
+{
+       long SortOrder;
+       SortStruct *Next;
+       SortStruct *Param;
+
+       switch (GetSortMetric(TP, &Next, &Param, &SortOrder, 2)){
+       case eNO_SUCH_SORT:
+                LogTemplateError(
+                        Target, "Sorter", ERR_PARM1, TP,                                  
+                       " Sorter [%s] unknown!", 
+                       TP->Tokens->Params[0]->Start);
+               break;          
+       case eINVALID_PARAM:
+                LogTemplateError(
+                        NULL, "Sorter", ERR_PARM1, TP,
+                       " Sorter specified by BSTR 'SortBy' [%s] unknown!", 
+                       bstr("SortBy"));
+       case eNOT_SPECIFIED:
+       case eFOUND:
+               StrBufAppendBuf(Target, Param->Name, 0);
+               
+       }
+}
+
+void tmplput_SORT_ORDER(StrBuf *Target, WCTemplputParams *TP)
+{
+       long SortOrder;
+       const ConstStr *SortOrderStr;
+       SortStruct *Next;
+       SortStruct *Param;
+
+       switch (GetSortMetric(TP, &Next, &Param, &SortOrder, 2)){
+       case eNO_SUCH_SORT:
+                LogTemplateError(
+                        Target, "Sorter", ERR_PARM1, TP,
+                        " Sorter [%s] unknown!",
+                        TP->Tokens->Params[0]->Start);
+               break;          
+       case eINVALID_PARAM:
+                LogTemplateError(
+                        NULL, "Sorter", ERR_PARM1, TP,
+                        " Sorter specified by BSTR 'SortBy' [%s] unknown!",
+                        bstr("SortBy"));
+       case eNOT_SPECIFIED:
+       case eFOUND:
+               if (Next == Param) {
+                       SortOrderStr = &SortNextOrder[SortOrder];
+               }
+               else { /** Not Us... */
+                       SortOrderStr = &SortNextOrder[0];
+               }
+               StrBufAppendBufPlain(Target, SortOrderStr->Key, SortOrderStr->len, 0);
+       }
+}
+
+
+void tmplput_long_vector(StrBuf *Target, WCTemplputParams *TP)
+{
+       long *LongVector = (long*) CTX(CTX_LONGVECTOR);
+
+       if ((TP->Tokens->Params[0]->Type == TYPE_LONG) && 
+           (TP->Tokens->Params[0]->lvalue <= LongVector[0]))
+       {
+               StrBufAppendPrintf(Target, "%ld", LongVector[TP->Tokens->Params[0]->lvalue]);
+       }
+       else
+       {
+               if (TP->Tokens->Params[0]->Type != TYPE_LONG) {
+                       LogTemplateError(
+                               Target, "Longvector", ERR_NAME, TP,
+                               "needs a numerical Parameter!");
+               }
+               else {
+                       LogTemplateError(
+                               Target, "LongVector", ERR_PARM1, TP,
+                               "doesn't have %ld Parameters, its just the size of %ld!", 
+                               TP->Tokens->Params[0]->lvalue,
+                               LongVector[0]);
+               }
+       }
+}
+
+void dbg_print_longvector(long *LongVector)
+{
+       StrBuf *Buf = NewStrBufPlain(HKEY("Longvector: ["));
+       int nItems = LongVector[0];
+       int i;
+
+       for (i = 0; i < nItems; i++) {
+               if (i + 1 < nItems)
+                       StrBufAppendPrintf(Buf, "%d: %ld | ", i, LongVector[i]);
+               else
+                       StrBufAppendPrintf(Buf, "%d: %ld]\n", i, LongVector[i]);
+
+       }
+       syslog(LOG_DEBUG, "%s", ChrPtr(Buf));
+       FreeStrBuf(&Buf);
+}
+
+int ConditionalLongVector(StrBuf *Target, WCTemplputParams *TP)
+{
+       long *LongVector = (long*) CTX(CTX_LONGVECTOR);
+
+       if ((TP->Tokens->Params[2]->Type == TYPE_LONG) && 
+           (TP->Tokens->Params[2]->lvalue <= LongVector[0])&&
+           (TP->Tokens->Params[3]->Type == TYPE_LONG) && 
+           (TP->Tokens->Params[3]->lvalue <= LongVector[0]))
+       {
+               return LongVector[TP->Tokens->Params[2]->lvalue] == 
+                       LongVector[TP->Tokens->Params[3]->lvalue];
+       }
+       else
+       {
+               if ((TP->Tokens->Params[2]->Type == TYPE_LONG) ||
+                   (TP->Tokens->Params[2]->Type == TYPE_LONG)) {
+                       LogTemplateError(
+                               Target, "ConditionalLongvector", ERR_PARM1, TP,
+                               "needs two long Parameter!");
+               }
+               else {
+                       LogTemplateError(
+                               Target, "Longvector", ERR_PARM1, TP,
+                               "doesn't have %ld / %ld Parameters, its just the size of %ld!",
+                               TP->Tokens->Params[2]->lvalue,
+                               TP->Tokens->Params[3]->lvalue,
+                               LongVector[0]);
+               }
+       }
+       return 0;
+}
+
+
+void tmplput_CURRENT_FILE(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBufAppendTemplate(Target, TP, TP->Tokens->FileName, 0);
+}
+
+void 
+InitModule_SUBST
+(void)
+{
+       RegisterCTX(CTX_TAB);
+       RegisterCTX(CTX_ITERATE);
+
+       memset(&NoCtx, 0, sizeof(WCTemplputParams));
+       RegisterNamespace("--", 0, 2, tmplput_Comment, NULL, CTX_NONE);
+       RegisterNamespace("SORT:ICON", 1, 2, tmplput_SORT_ICON, NULL, CTX_NONE);
+       RegisterNamespace("SORT:ORDER", 1, 2, tmplput_SORT_ORDER, NULL, CTX_NONE);
+       RegisterNamespace("SORT:NEXT", 1, 2, tmplput_SORT_NEXT, NULL, CTX_NONE);
+       RegisterNamespace("CONTEXTSTR", 0, 1, tmplput_ContextString, NULL, CTX_STRBUF);
+       RegisterNamespace("CONTEXTSTRARR", 1, 2, tmplput_ContextStringArray, NULL, CTX_STRBUFARR);
+       RegisterNamespace("ITERATE", 2, 100, tmpl_iterate_subtmpl, preeval_iterate, CTX_NONE);
+       RegisterNamespace("DOBOXED", 1, 2, tmpl_do_boxed, NULL, CTX_NONE);
+       RegisterNamespace("DOTABBED", 2, 100, tmpl_do_tabbed, preeval_do_tabbed, CTX_NONE);
+       RegisterNamespace("TAB:N", 0, 0, tmplput_TAB_N, NULL, CTX_TAB);
+       RegisterNamespace("TAB:SUBJECT", 0, 1, tmplput_TAB_TITLE, NULL, CTX_TAB);
+
+
+       RegisterNamespace("LONGVECTOR", 1, 1, tmplput_long_vector, NULL, CTX_LONGVECTOR);
+
+
+       RegisterConditional("COND:CONTEXTSTR", 3, ConditionalContextStr, CTX_STRBUF);
+       RegisterConditional("COND:CONTEXTSTRARR", 4, ConditionalContextStrinArray, CTX_STRBUFARR);
+       RegisterConditional("COND:LONGVECTOR", 4, ConditionalLongVector, CTX_LONGVECTOR);
+
+
+       RegisterConditional("COND:ITERATE:ISGROUPCHANGE", 2, 
+                           conditional_ITERATE_ISGROUPCHANGE, 
+                           CTX_ITERATE);
+       RegisterConditional("COND:ITERATE:LASTN", 2, 
+                           conditional_ITERATE_LASTN, 
+                           CTX_ITERATE);
+       RegisterConditional("COND:ITERATE:FIRSTN", 2, 
+                           conditional_ITERATE_FIRSTN, 
+                           CTX_ITERATE);
+       RegisterConditional("COND:ITERATE:ISMOD", 3, 
+                           conditional_ITERATE_ISMOD, 
+                           CTX_ITERATE);
+
+       RegisterNamespace("ITERATE:ODDEVEN", 0, 0, tmplput_ITERATE_ODDEVEN, NULL, CTX_ITERATE);
+       RegisterNamespace("ITERATE:KEY", 0, 0, tmplput_ITERATE_KEY, NULL, CTX_ITERATE);
+       RegisterNamespace("ITERATE:N", 0, 0, tmplput_ITERATE_N, NULL, CTX_ITERATE);
+       RegisterNamespace("ITERATE:N:DIV", 1, 1, tmplput_ITERATE_N_DIV, NULL, CTX_ITERATE);
+       RegisterNamespace("CURRENTFILE", 0, 1, tmplput_CURRENT_FILE, NULL, CTX_NONE);
+       RegisterNamespace("DEF:STR", 1, 1, tmplput_DefStr, NULL, CTX_NONE);
+       RegisterNamespace("DEF:VAL", 1, 1, tmplput_DefVal, NULL, CTX_NONE);
+
+
+
+
+}
+
+void
+ServerStartModule_SUBST
+(void)
+{
+       textPlainType = NewStrBufPlain(HKEY("text/plain"));
+       LocalTemplateCache = NewHash(1, NULL);
+       TemplateCache = NewHash(1, NULL);
+       GlobalNS = NewHash(1, NULL);
+       Iterators = NewHash(1, NULL);
+       Conditionals = NewHash(1, NULL);
+       SortHash = NewHash(1, NULL);
+       Defines = NewHash(1, NULL);
+       CtxList = NewHash(1, NULL);
+       
+       PutContextType(HKEY("CTX_NONE"), 0);
+
+       RegisterCTX(CTX_STRBUF);
+       RegisterCTX(CTX_STRBUFARR);
+       RegisterCTX(CTX_LONGVECTOR);
+}
+
+void
+FinalizeModule_SUBST
+(void)
+{
+
+}
+
+void 
+ServerShutdownModule_SUBST
+(void)
+{
+       FreeStrBuf(&textPlainType);
+
+       DeleteHash(&TemplateCache);
+       DeleteHash(&LocalTemplateCache);
+       
+       DeleteHash(&GlobalNS);
+       DeleteHash(&Iterators);
+       DeleteHash(&Conditionals);
+       DeleteHash(&SortHash);
+       DeleteHash(&Defines);
+       DeleteHash(&CtxList);
+}
+
+
+void
+SessionNewModule_SUBST
+(wcsession *sess)
+{
+
+}
+
+void
+SessionAttachModule_SUBST
+(wcsession *sess)
+{
+}
+
+void
+SessionDetachModule_SUBST
+(wcsession *sess)
+{
+       FreeStrBuf(&sess->WFBuf);
+}
+
+void 
+SessionDestroyModule_SUBST  
+(wcsession *sess)
+{
+
+}
diff --git a/webcit/subst.h b/webcit/subst.h
new file mode 100644 (file)
index 0000000..063f46d
--- /dev/null
@@ -0,0 +1,417 @@
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ *
+ * subst template processing functions
+ */
+
+extern HashList *Conditionals;
+extern HashList *GlobalNS;
+extern HashList *Iterators;
+extern HashList *WirelessTemplateCache;
+extern HashList *WirelessLocalTemplateCache;
+extern HashList *TemplateCache;
+extern HashList *LocalTemplateCache;
+
+
+#define TYPE_STR   1
+#define TYPE_LONG  2
+#define TYPE_PREFSTR 3
+#define TYPE_ROOMPREFSTR 4
+#define TYPE_PREFINT 5
+#define TYPE_GETTEXT 6
+#define TYPE_BSTR 7
+#define TYPE_SUBTEMPLATE 8
+#define TYPE_INTDEFINE 9
+#define MAXPARAM  25
+
+#define IS_NUMBER(a) ((a == TYPE_LONG) || (a == TYPE_PREFINT) || (a == TYPE_INTDEFINE))
+
+/*
+ * \brief Values for wcs_type
+ */
+enum {
+       WCS_STRING,       /* its a string */
+       WCS_FUNCTION,     /* its a function callback */
+       WCS_SERVCMD,      /* its a command to send to the citadel server */
+       WCS_STRBUF,       /* its a strbuf we own */
+       WCS_STRBUF_REF,   /* its a strbuf we mustn't free */
+       WCS_LONG          /* its an integer */
+};
+
+#define CTX_NONE 0
+
+typedef int CtxType;
+typedef struct __CtxTypeStruct {
+       CtxType Type;
+       StrBuf *Name;
+} CtxTypeStruct;
+
+CtxTypeStruct *GetContextType(CtxType Type);
+void RegisterContextType(const char *name, long len, CtxType *TheCtx);
+#define RegisterCTX(a) RegisterContextType(#a, sizeof(#a) - 1, &a)
+
+extern CtxType CTX_STRBUF;
+extern CtxType CTX_STRBUFARR;
+extern CtxType CTX_LONGVECTOR;
+
+/**
+ * @ingroup subst
+ * ContextFilter resembles our RTTI information. With this structure
+ * we can make shure a tmplput function can live with the environment
+ * we call it in.
+ * if not, we will log/print an error and refuse to call it.
+ */
+typedef struct _contexts {
+       CtxType ContextType;                /* do we require a User Context ? */
+       int nMinArgs;                   /* How many arguments do we need at least? */
+       int nMaxArgs;                   /* up to how many arguments can we handle? */
+} ContextFilter;
+
+
+/* Forward declarations... */
+typedef struct WCTemplateToken WCTemplateToken;
+typedef struct WCTemplputParams WCTemplputParams;
+
+/* this is the signature of a tmplput function */
+typedef void (*WCHandlerFunc)(StrBuf *Target, WCTemplputParams *TP);
+
+/* if you want to pre-evaluate parts of your token, or do additional syntax, use this. */ 
+typedef int (*WCPreevalFunc)(WCTemplateToken *Token);
+
+/* make a template token a lookup key: */
+#define TKEY(a) TP->Tokens->Params[a]->Start, TP->Tokens->Params[a]->len
+
+void *GetContextPayload(WCTemplputParams *TP, CtxType ContextType);
+#define CTX(a) GetContextPayload(TP, a)
+
+/**
+ * @ingroup subst
+ * this is the signature of a conditional function 
+ * Note: Target is just passed in for error messages; don't write onto it in regular cases.
+ */
+typedef int (*WCConditionalFunc)(StrBuf *Target, WCTemplputParams *TP);
+
+typedef enum _eBitMask {
+       eNO = 0,
+       eOR,
+       eAND
+}eBitMask;
+
+typedef struct _TemplateParam {
+        /* are we a string or a number? */
+       int Type;
+       /* string data: */
+       const char *Start;
+       long len;
+       /* if we're a number: */
+       long lvalue;
+       eBitMask MaskBy;
+} TemplateParam;
+
+
+/**
+ * @ingroup subst
+ * Representation of a token; everything thats inbetween <? and >
+ */ 
+struct WCTemplateToken {
+        /* Reference to the filename we're in to print error messages; not to be freed */
+       const StrBuf *FileName; 
+       /* Raw copy of our original token; for error printing */
+       StrBuf *FlatToken;
+       /* Which line did the template parser pick us up in? For error printing */
+       long Line;
+
+       /* our position in the template cache buffer */
+       const char *pTokenStart;
+       /* our token length */
+       size_t TokenStart;
+       size_t TokenEnd;
+       /* point after us */
+       const char *pTokenEnd;
+       /* just our token name: */
+       const char *pName;
+       size_t NameEnd;
+
+       /* stuff the pre-evaluater finds out: */
+       int Flags;
+       /* pointer to our runntime evaluator; so we can cache this and save hash-lookups */
+       void *PreEval;
+       void *Preeval2;
+
+       /* if we have parameters here we go: */
+       /* do we have parameters or not? */
+       int HaveParameters;
+       /* How many of them? */
+       int nParameters;
+       /* the parameters */
+       TemplateParam *Params[MAXPARAM];
+};
+
+
+
+struct WCTemplputParams {
+       ContextFilter Filter;
+       void *Context;
+       int nArgs;
+       WCTemplateToken *Tokens;
+       WCTemplputParams *Sub, *Super;
+       WCConditionalFunc ExitCtx;
+        long ExitCTXID;
+};
+
+
+
+typedef struct _ConditionalStruct {
+       ContextFilter Filter;
+       const char *PlainName;
+       WCConditionalFunc CondF;
+       WCConditionalFunc CondExitCtx;
+} ConditionalStruct;
+
+
+typedef void (*SubTemplFunc)(StrBuf *TemplBuffer, WCTemplputParams *TP);
+typedef HashList *(*RetrieveHashlistFunc)(StrBuf *Target, WCTemplputParams *TP);
+typedef void (*HashDestructorFunc) (HashList **KillMe);
+typedef int (*FilterByParamFunc)(const char* key, long len, void *Context, StrBuf *Target, WCTemplputParams *TP);
+
+extern WCTemplputParams NoCtx;
+
+#define HAVE_PARAM(a) (TP->Tokens->nParameters > a)
+
+
+#define ERR_NAME 0
+#define ERR_PARM1 1
+#define ERR_PARM2 2
+/**
+ * @ingroup subst
+ * @brief log an error while evaluating a token; print it to the actual template 
+ * @param Target your Target Buffer to print the error message next to the log
+ * @param Type What sort of thing are we talking about? Tokens? Conditionals?
+ * @param TP grab our set of default information here
+ * @param Format for the custom error message
+ */ 
+void LogTemplateError (StrBuf *Target, 
+                      const char *Type, 
+                      int ErrorPos, 
+                      WCTemplputParams *TP, 
+                      const char *Format, ...)__attribute__((__format__(__printf__,5,6)));
+
+
+/**
+ * @ingroup subst
+ * @brief log an error while in global context; print it to Wildfire / Target
+ * @param Target your Target Buffer to print the error message next to the log
+ * @param Type What sort of thing are we talking about? Tokens? Conditionals?
+ * @param Format for the custom error message
+ */ 
+void LogError (StrBuf *Target, const char *Type, const char *Format, ...);
+
+/**
+ * @ingroup subst
+ * @brief get the actual value of a token parameter
+ * in your tmplputs or conditionals use this function to access parameters that can also be 
+ * retrieved from dynamic facilities:
+ *  _ -> Gettext; retrieve this token from the i18n facilities
+ *  : -> lookup a setting of that name
+ *  B -> bstr; an URL-Parameter
+ *  = -> subtemplate; parse a template by this name, and treat its content as this tokens value 
+ * 
+ * @param N which token do you want to lookup?
+ * @param Value reference to the string of the token; don't free me.
+ * @param len the length of Value
+ */
+void GetTemplateTokenString(StrBuf *Target, 
+                           WCTemplputParams *TP,
+                           int N,
+                           const char **Value, 
+                           long *len);
+/**
+ * @ingroup subst
+ * @return whether @ref GetTemplateTokenString would be able to give you a string
+ */
+int HaveTemplateTokenString(StrBuf *Target, 
+                           WCTemplputParams *TP,
+                           int N,
+                           const char **Value, 
+                           long *len);
+
+
+
+/**
+ * @ingroup subst
+ * @brief get the actual integer value of a token parameter
+ * in your tmplputs or conditionals use this function to access parameters that can also be 
+ * retrieved from dynamic facilities:
+ *  _ -> Gettext; retrieve this token from the i18n facilities
+ *  : -> lookup a setting of that name
+ *  B -> bstr; an URL-Parameter
+ *  = -> subtemplate; parse a template by this name, and treat its content as this tokens value 
+ * 
+ * @param N which token do you want to lookup?
+ * @param dflt default value to be retrieved if not found in preferences
+ * \returns the long value
+ */
+long GetTemplateTokenNumber(StrBuf *Target, 
+                           WCTemplputParams *TP, 
+                           int N, long dflt);
+
+/**
+ * @brief put a token value into the template
+ * use this function to append your strings into a Template. 
+ * it can escape your string according to the token at FormattypeIndex:
+ *  H: de-QP and utf8-ify
+ *  X: escapize for HTML
+ *  J: JSON Escapize
+ * @param Target the destination buffer
+ * @param TP the template token information
+ * @param Source string to append
+ * @param FormatTypeIndex which parameter contains the escaping functionality?
+ *        if this token doesn't have as much parameters, plain append is done.
+ */
+void StrBufAppendTemplate(StrBuf *Target, 
+                         WCTemplputParams *TP,
+                         const StrBuf *Source, 
+                         int FormatTypeIndex);
+
+void StrBufAppendTemplateStr(StrBuf *Target, 
+                            WCTemplputParams *TP,
+                            const char *Source, 
+                            int FormatTypeIndex);
+
+
+#define RegisterNamespace(a, b, c, d, e, f) RegisterNS(a, sizeof(a)-1, b, c, d, e, f)
+/**
+ * @ingroup subst
+ * @brief register a template token handler
+ * call this function in your InitModule_MODULENAME which will be called at the server start
+ * @param nMinArgs how much parameters does your token require at least?
+ * @param nMaxArgs how many parameters does your token accept?
+ * @param HandlerFunc your callback when the template is rendered and your token is there 
+ * @param PreEvalFunc is called when the template is parsed; you can do additional 
+ *        syntax checks here or pre-evaluate stuff for better performance
+ * @param ContextRequired if your token requires a specific context, else say CTX_NONE here.
+ */
+void RegisterNS(const char *NSName, long len, 
+               int nMinArgs, 
+               int nMaxArgs, 
+               WCHandlerFunc HandlerFunc,
+               WCPreevalFunc PreEvalFunc,
+               int ContextRequired);
+
+/**
+ * @ingroup subst
+ * @brief register a conditional token <pair> handler
+ * call this function in your InitModule_MODULENAME which will be called at the server start
+ * conditionals can be ? or ! with a pair or % similar to an implicit if
+ * @param Name whats the name of your conditional? should start with COND:
+ * @param len the token length so we don't have to measure it.
+ * @param nParams how many parameters does your conditional need on top of the default conditional parameters
+ * @param CondF your Callback to be called when the template is evaluated at runtime; return 0 or 1 to us please.
+ * @param ExitCtxCond if non-NULL, will be called after the area of the conditional is left behind.
+ * @param ContextRequired if your token requires a specific context, else say CTX_NONE here.
+ */
+void RegisterContextConditional(const char *Name, long len, 
+                               int nParams,
+                               WCConditionalFunc CondF, 
+                               WCConditionalFunc ExitCtxCond,
+                               int ContextRequired);
+
+#define RegisterCtxConditional(Name, nParams, CondF, ExitCtxCond, ContextRequired) \
+       RegisterContextConditional(Name, sizeof(Name) -1, nParams, CondF, ExitCtxCond, ContextRequired)
+
+#define RegisterConditional(Name, nParams, CondF, ContextRequired) \
+       RegisterContextConditional(Name, sizeof(Name) -1, nParams, CondF, NULL, ContextRequired)
+
+
+/**
+ * @ingroup subst
+ * @brief register a string that will represent a long value
+ * this will allow to resolve <?...(#"Name")> to Value; that way 
+ * plain strings can be used an lexed in templates without having the 
+ * lookup overhead at runtime.
+ * @param Name The name of the define
+ * @param len length of Name
+ * @param Value the value to associate with Name
+ */
+void RegisterTokenParamDefine(const char *Name, long len, 
+                             long Value);
+/**
+ * teh r0x0r! forward your favourite define from C to the templates with one easy call!
+ */
+#define REGISTERTokenParamDefine(a) RegisterTokenParamDefine(#a, sizeof(#a) - 1, a);
+
+/**
+ * @ingroup subst
+ * @brief retrieve the long value of a registered string define
+ * @param Name The name of the define
+ * @param len length of Name
+ * @param Value the value to return if not found
+ */
+long GetTokenDefine(const char *Name, 
+                   long len, 
+                   long DefValue);
+
+
+#define IT_NOFLAG 0
+#define IT_FLAG_DETECT_GROUPCHANGE (1<<0)
+#define IT_ADDT_PARAM(n) 5 + n /* If you have AdditionalParams, use this macro to fetch them. */
+#define RegisterIterator(a, b, c, d, e, f, g, h, i) RegisterITERATOR(a, sizeof(a)-1, b, c, d, e, f, NULL, g, h, i)
+#define RegisterFilteredIterator(a, b, c, d, e, f, g, h, i, j) RegisterITERATOR(a, sizeof(a)-1, b, c, d, e, f, g, h, i, j)
+void RegisterITERATOR(const char *Name, long len, /* Our identifier */
+                     int AdditionalParams,       /* do we use more parameters? */
+                     HashList *StaticList,       /* pointer to webcit lifetime hashlists */
+                     RetrieveHashlistFunc GetHash, /* else retrieve the hashlist by calling this function */
+                     SubTemplFunc DoSubTempl,       /* call this function on each iteration for svput & friends */
+                     HashDestructorFunc Destructor, /* use this function to shut down the hash; NULL if its a reference */
+                     FilterByParamFunc Filter,      /* use this function if you want to skip items */
+                     CtxType ContextType,               /* which context do we provide to the subtemplate? */
+                     CtxType XPectContextType,          /* which context do we expct to be called in? */
+                     int Flags);
+
+
+
+void StackDynamicContext(WCTemplputParams *Super, 
+                        WCTemplputParams *Sub, 
+                        void *Context,
+                        CtxType ContextType,
+                        int nArgs,
+                        WCTemplateToken *Tokens, 
+                        WCConditionalFunc ExitCtx,
+                        long ExitCTXID);
+
+#define StackContext(Super, Sub, Context, ContextType, nArgs, Tokens) \
+       StackDynamicContext(Super, Sub, Context, ContextType, nArgs, Tokens, NULL, 0)
+
+
+void UnStackContext(WCTemplputParams *Sub);
+
+
+
+CompareFunc RetrieveSort(WCTemplputParams *TP, 
+                        const char *OtherPrefix, long OtherPrefixLen,  
+                        const char *Default, long ldefault, 
+                        long DefaultDirection);
+void RegisterSortFunc(const char *name, long len, 
+                     const char *prepend, long preplen,
+                     CompareFunc Forward, 
+                     CompareFunc Reverse, 
+                     CompareFunc GroupChange, 
+                     CtxType ContextType);
+
+void dbg_print_longvector(long *LongVector);
+
+#define do_template(a) DoTemplate(a, sizeof(a) -1, NULL, &NoCtx)
+const StrBuf *DoTemplate(const char *templatename, long len, StrBuf *Target, WCTemplputParams *TP);
+void url_do_template(void);
+
+
+int CompareSubstToToken(TemplateParam *ParamToCompare, TemplateParam *ParamToLookup);
+int CompareSubstToStrBuf(StrBuf *Compare, TemplateParam *ParamToLookup);
diff --git a/webcit/summary.c b/webcit/summary.c
new file mode 100644 (file)
index 0000000..5dbe604
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ * Displays the "Summary Page"
+ *
+ * Copyright (c) 1996-2021 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "calendar.h"
+
+extern int calendar_summary_view(void);
+
+/*
+ * Display today's date in a friendly format
+ */
+void output_date(void) {
+       struct tm tm;
+       time_t now;
+       char buf[128];
+
+       time(&now);
+       localtime_r(&now, &tm);
+
+       wc_strftime(buf, 32, "%A, %x", &tm);
+       wc_printf("%s", buf);
+}
+
+void tmplput_output_date(StrBuf *Target, WCTemplputParams *TP)
+{
+       struct tm tm;
+       time_t now;
+       char buf[128];
+       size_t n;
+
+       time(&now);
+       localtime_r(&now, &tm);
+
+       n = wc_strftime(buf, 32, "%A, %x", &tm);
+       StrBufAppendBufPlain(Target, buf, n, 0);
+}
+
+
+/*
+ * New messages section
+ */
+void new_messages_section(void) {
+       char buf[SIZ];
+       char room[SIZ];
+       int i;
+       int number_of_rooms_to_check;
+       char *rooms_to_check = "Mail|Lobby";
+
+
+       number_of_rooms_to_check = num_tokens(rooms_to_check, '|');
+       if (number_of_rooms_to_check == 0) return;
+
+       wc_printf("<table border=\"0\" width=\"100%%\">\n");
+       for (i=0; i<number_of_rooms_to_check; ++i) {
+               extract_token(room, rooms_to_check, i, '|', sizeof room);
+
+               serv_printf("GOTO %s", room);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       extract_token(room, &buf[4], 0, '|', sizeof room);
+                       wc_printf("<tr><td><a href=\"dotgoto?room=");
+                       urlescputs(room);
+                       wc_printf("\">");
+                       escputs(room);
+                       wc_printf("</a></td><td>%d/%d</td></tr>\n",
+                               extract_int(&buf[4], 1),
+                               extract_int(&buf[4], 2)
+                       );
+               }
+       }
+       wc_printf("</table>\n");
+
+}
+
+
+/*
+ * Task list section
+ */
+void tasks_section(void) {
+       int num_msgs = 0;
+       HashPos *at;
+       const char *HashKey;
+       long HKLen;
+       void *vMsg;
+       message_summary *Msg;
+       StrBuf *Buf;
+       SharedMessageStatus Stat;
+
+       memset(&Stat, 0, sizeof(SharedMessageStatus));
+       Stat.maxload = 10000;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+
+       Buf = NewStrBufPlain(HKEY("_TASKS_"));
+       gotoroom(Buf);
+       FreeStrBuf(&Buf);
+
+       if (WC->CurRoom.view != VIEW_TASKS) {
+               num_msgs = 0;
+       }
+       else {
+               num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0);
+       }
+
+       if (num_msgs > 0) {
+               at = GetNewHashPos(WC->summ, 0);
+               while (GetNextHashPos(WC->summ, at, &HKLen, &HashKey, &vMsg)) {
+                       Msg = (message_summary*) vMsg;          
+                       tasks_LoadMsgFromServer(NULL, NULL, Msg, 0, 0);
+               }
+               DeleteHashPos(&at);
+       }
+
+       if (calendar_summary_view() < 1) {
+               wc_printf("<i>");
+               wc_printf(_("(None)"));
+               wc_printf("</i><br>\n");
+       }
+}
+
+
+/*
+ * Calendar section
+ */
+void calendar_section(void) {
+       char cmd[SIZ];
+       char filter[SIZ];
+       int num_msgs = 0;
+       HashPos *at;
+       const char *HashKey;
+       long HKLen;
+       void *vMsg;
+       message_summary *Msg;
+       StrBuf *Buf;
+       void *v = NULL;
+       SharedMessageStatus Stat;
+
+       memset(&Stat, 0, sizeof(SharedMessageStatus));
+       Stat.maxload = 10000;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       
+       Buf = NewStrBufPlain(HKEY("_CALENDAR_"));
+       gotoroom(Buf);
+       FreeStrBuf(&Buf);
+       if ( (WC->CurRoom.view != VIEW_CALENDAR) && (WC->CurRoom.view != VIEW_CALBRIEF) ) {
+               num_msgs = 0;
+       }
+       else {
+               num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0);
+       }
+       calendar_GetParamsGetServerCall(&Stat, 
+                                       &v,
+                                       readnew, 
+                                       cmd, 
+                                       sizeof(cmd),
+                                       filter,
+                                       sizeof(filter));
+
+
+       if (num_msgs > 0) {
+               at = GetNewHashPos(WC->summ, 0);
+               while (GetNextHashPos(WC->summ, at, &HKLen, &HashKey, &vMsg)) {
+                       Msg = (message_summary*) vMsg;          
+                       calendar_LoadMsgFromServer(NULL, &v, Msg, 0, 0);
+               }
+               DeleteHashPos(&at);
+       }
+       if (calendar_summary_view() < 1) {
+               wc_printf("<i>");
+               wc_printf(_("(Nothing)"));
+               wc_printf("</i><br>\n");
+       }
+       __calendar_Cleanup(&v);
+}
+
+void tmplput_new_messages_section(StrBuf *Target, WCTemplputParams *TP) {
+       new_messages_section();
+}
+void tmplput_tasks_section(StrBuf *Target, WCTemplputParams *TP) {
+       tasks_section();
+}
+void tmplput_calendar_section(StrBuf *Target, WCTemplputParams *TP) {
+       calendar_section();
+}
+
+
+/*
+ * summary page
+ */
+void display_summary_page(void)
+{
+       output_headers(1, 1, 1, 0, 0, 0); 
+       do_template("summary_page");
+       wDumpContent(1);
+}
+
+
+void 
+InitModule_SUMMARY
+(void)
+{
+       RegisterNamespace("TIME:NOW", 0, 0, tmplput_output_date, NULL, CTX_NONE);
+       WebcitAddUrlHandler(HKEY("summary"), "", 0, display_summary_page, ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("new_messages_html"), "", 0, new_messages_section, AJAX);
+       WebcitAddUrlHandler(HKEY("tasks_inner_html"), "", 0, tasks_section, AJAX);
+       WebcitAddUrlHandler(HKEY("calendar_inner_html"), "", 0, calendar_section, AJAX);
+}
+
diff --git a/webcit/sysdep.c b/webcit/sysdep.c
new file mode 100644 (file)
index 0000000..7c69969
--- /dev/null
@@ -0,0 +1,594 @@
+/*
+ * WebCit "system dependent" code.
+ *
+ * Copyright (c) 1996-2021 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "sysdep.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <syslog.h>
+#include <sys/syslog.h>
+#include <time.h>
+#include <limits.h>
+#include <sys/resource.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <sys/un.h>
+#include <string.h>
+#include <pwd.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <grp.h>
+#ifdef HAVE_PTHREAD_H
+#include <pthread.h>
+#endif
+#include "webcit.h"
+#include "sysdep.h"
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#include "webserver.h"
+#include "modules_init.h"
+#if HAVE_BACKTRACE
+#include <execinfo.h>
+#endif
+
+pthread_mutex_t Critters[MAX_SEMAPHORES];      /* Things needing locking */
+pthread_key_t MyConKey;                                /* TSD key for MyContext() */
+pthread_key_t MyReq;                           /* TSD key for MyReq() */
+int msock;                     /* master listening socket */
+int time_to_die = 0;            /* Nonzero if server is shutting down */
+
+extern void *context_loop(ParsedHttpHdrs *Hdr);
+extern void *housekeeping_loop(void);
+extern void do_housekeeping(void);
+
+char file_etc_mimelist[PATH_MAX]="";
+
+char etc_dir[PATH_MAX];
+char static_dir[PATH_MAX];             /* calculated on startup */
+char static_local_dir[PATH_MAX];               /* calculated on startup */
+char static_icon_dir[PATH_MAX];          /* where should we find our mime icons? */
+char  *static_dirs[]={                         /* needs same sort order as the web mapping */
+       "./static",
+       "./static.local",
+       "./tiny_mce",
+       "./static/webcit_icons"
+};
+
+int ExitPipe[2];
+HashList *GZMimeBlackList = NULL; /* mimetypes which shouldn't be gzip compressed */
+
+void LoadMimeBlacklist(void)
+{
+       StrBuf *MimeBlackLine;
+       IOBuffer IOB;
+       eReadState state;
+       
+       memset(&IOB, 0, sizeof(IOBuffer));
+       IOB.fd = open(file_etc_mimelist, O_RDONLY);
+
+       IOB.Buf = NewStrBuf();
+       MimeBlackLine = NewStrBuf();
+       GZMimeBlackList = NewHash(1, NULL);
+
+       do
+       {
+               state = StrBufChunkSipLine(MimeBlackLine, &IOB);
+
+               switch (state)
+               {
+               case eMustReadMore:
+                       if (StrBuf_read_one_chunk_callback(IOB.fd, 0, &IOB) <= 0)
+                               state = eReadFail;
+                       break;
+               case eReadSuccess:
+                       if ((StrLength(MimeBlackLine) > 1) && 
+                           (*ChrPtr(MimeBlackLine) != '#'))
+                       {
+                               Put(GZMimeBlackList, SKEY(MimeBlackLine),
+                                   (void*) 1, reference_free_handler);
+                       }
+                       FlushStrBuf(MimeBlackLine);
+                       break;
+               case eReadFail:
+                       break;
+               case eBufferNotEmpty:
+                       break;
+               }
+       }
+       while (state != eReadFail);
+
+       close(IOB.fd);
+       
+       FreeStrBuf(&IOB.Buf);
+       FreeStrBuf(&MimeBlackLine);
+}
+
+void CheckGZipCompressionAllowed(const char *MimeType, long MLen)
+{
+       void *v;
+
+       if (WC->Hdr->HR.gzip_ok)
+           WC->Hdr->HR.gzip_ok = GetHash(GZMimeBlackList, MimeType, MLen, &v) == 0;
+}
+
+void InitialiseSemaphores(void)
+{
+       int i;
+
+       /* Set up a bunch of semaphores to be used for critical sections */
+       for (i=0; i<MAX_SEMAPHORES; ++i) {
+               pthread_mutex_init(&Critters[i], NULL);
+       }
+
+       if (pipe(ExitPipe))
+       {
+               syslog(LOG_WARNING, "Failed to open exit pipe: %d [%s]\n", 
+                      errno, 
+                      strerror(errno));
+               
+               exit(-1);
+       }
+}
+
+/*
+ * Obtain a semaphore lock to begin a critical section.
+ */
+void begin_critical_section(int which_one)
+{
+       pthread_mutex_lock(&Critters[which_one]);
+}
+
+/*
+ * Release a semaphore lock to end a critical section.
+ */
+void end_critical_section(int which_one)
+{
+       pthread_mutex_unlock(&Critters[which_one]);
+}
+
+
+void ShutDownWebcit(void)
+{
+
+       DeleteHash(&GZMimeBlackList);
+       free_zone_directory ();
+       icaltimezone_release_zone_tab ();
+       icalmemory_free_ring ();
+       ShutDownLibCitadel ();
+       shutdown_modules ();
+}
+
+/*
+ * Entry point for worker threads
+ */
+void worker_entry(void)
+{
+       int ssock;
+       int i = 0;
+       int fail_this_transaction = 0;
+       ParsedHttpHdrs Hdr;
+
+       memset(&Hdr, 0, sizeof(ParsedHttpHdrs));
+       Hdr.HR.eReqType = eGET;
+       http_new_modules(&Hdr); 
+
+       do {
+               /* Each worker thread blocks on accept() while waiting for something to do. */
+               fail_this_transaction = 0;
+               ssock = -1; 
+               errno = EAGAIN;
+               do {
+                       fd_set wset;
+                       --num_threads_executing;
+                        FD_ZERO(&wset);
+                        FD_SET(msock, &wset);
+                        FD_SET(ExitPipe[1], &wset);
+
+                        select(msock + 1, NULL, &wset, NULL, NULL);
+                       if (time_to_die)
+                               break;
+
+                       ssock = accept(msock, NULL, 0);
+                       ++num_threads_executing;
+                       if (ssock < 0) fail_this_transaction = 1;
+               } while ((msock > 0) && (ssock < 0)  && (time_to_die == 0));
+
+               if ((msock == -1)||(time_to_die))
+               {/* ok, we're going down. */
+                       int shutdown = 0;
+
+                       /* The first thread to get here will have to do the cleanup.
+                        * Make sure it's really just one.
+                        */
+                       begin_critical_section(S_SHUTDOWN);
+                       if (msock == -1)
+                       {
+                               msock = -2;
+                               shutdown = 1;
+                       }
+                       end_critical_section(S_SHUTDOWN);
+                       if (shutdown == 1)
+                       {/* we're the one to cleanup the mess. */
+                               http_destroy_modules(&Hdr);
+                               syslog(LOG_DEBUG, "I'm master shutdown: tagging sessions to be killed.\n");
+                               shutdown_sessions();
+                               syslog(LOG_DEBUG, "master shutdown: waiting for others\n");
+                               sleeeeeeeeeep(1); /* wait so some others might finish... */
+                               syslog(LOG_DEBUG, "master shutdown: cleaning up sessions\n");
+                               do_housekeeping();
+                               syslog(LOG_DEBUG, "master shutdown: cleaning up libical\n");
+
+                               ShutDownWebcit();
+
+                               syslog(LOG_DEBUG, "master shutdown exiting.\n");                                
+                               exit(0);
+                       }
+                       break;
+               }
+               if (ssock < 0 ) continue;
+
+               check_thread_pool_size();
+
+               /* Now do something. */
+               if (msock < 0) {
+                       if (ssock > 0) close (ssock);
+                       syslog(LOG_DEBUG, "in between.");
+                       pthread_exit(NULL);
+               } else {
+                       /* Got it? do some real work! */
+                       /* Set the SO_REUSEADDR socket option */
+                       i = 1;
+                       setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
+
+                       /* If we are an HTTPS server, go crypto now. */
+#ifdef HAVE_OPENSSL
+                       if (is_https) {
+                               if (starttls(ssock) != 0) {
+                                       fail_this_transaction = 1;
+                                       close(ssock);
+                               }
+                       }
+                       else 
+#endif
+                       {
+                               int fdflags; 
+                               fdflags = fcntl(ssock, F_GETFL);
+                               if (fdflags < 0)
+                                       syslog(LOG_WARNING, "unable to get server socket flags! %s \n",
+                                               strerror(errno));
+                               fdflags = fdflags | O_NONBLOCK;
+                               if (fcntl(ssock, F_SETFL, fdflags) < 0)
+                                       syslog(LOG_WARNING, "unable to set server socket nonblocking flags! %s \n",
+                                               strerror(errno));
+                       }
+
+                       if (fail_this_transaction == 0) {
+                               Hdr.http_sock = ssock;
+
+                               /* Perform an HTTP transaction... */
+                               context_loop(&Hdr);
+
+                               /* Shut down SSL/TLS if required... */
+#ifdef HAVE_OPENSSL
+                               if (is_https) {
+                                       endtls();
+                               }
+#endif
+
+                               /* ...and close the socket. */
+                               if (Hdr.http_sock > 0) {
+                                       lingering_close(ssock);
+                               }
+                               http_detach_modules(&Hdr);
+
+                       }
+
+               }
+
+       } while (!time_to_die);
+
+       http_destroy_modules(&Hdr);
+       syslog(LOG_DEBUG, "Thread exiting.\n");
+       pthread_exit(NULL);
+}
+
+
+/*
+ * Shut us down the regular way.
+ * signum is the signal we want to forward
+ */
+pid_t current_child;
+void graceful_shutdown_watcher(int signum) {
+       syslog(LOG_INFO, "Watcher thread exiting.\n");
+       write(ExitPipe[0], HKEY("                              "));
+       kill(current_child, signum);
+       if (signum != SIGHUP)
+               exit(0);
+}
+
+
+/*
+ * Shut us down the regular way.
+ * signum is the signal we want to forward
+ */
+pid_t current_child;
+void graceful_shutdown(int signum) {
+       FILE *FD;
+       int fd;
+
+       syslog(LOG_INFO, "WebCit is being shut down on signal %d.\n", signum);
+       fd = msock;
+       msock = -1;
+       time_to_die = 1;
+       FD=fdopen(fd, "a+");
+       fflush (FD);
+       fclose (FD);
+       close(fd);
+       write(ExitPipe[0], HKEY("                              "));
+}
+
+
+/*
+ * Start running as a daemon.
+ */
+void start_daemon(char *pid_file) 
+{
+       int status = 0;
+       pid_t child = 0;
+       FILE *fp;
+       int do_restart = 0;
+
+       current_child = 0;
+
+       /* Close stdin/stdout/stderr and replace them with /dev/null.
+        * We don't just call close() because we don't want these fd's
+        * to be reused for other files.
+        */
+       chdir("/");
+
+       signal(SIGHUP, SIG_IGN);
+       signal(SIGINT, SIG_IGN);
+       signal(SIGQUIT, SIG_IGN);
+
+       child = fork();
+       if (child != 0) {
+               exit(0);
+       }
+
+       setsid();
+       umask(0);
+       freopen("/dev/null", "r", stdin);
+       freopen("/dev/null", "w", stdout);
+       freopen("/dev/null", "w", stderr);
+       signal(SIGTERM, graceful_shutdown_watcher);
+       signal(SIGHUP, graceful_shutdown_watcher);
+
+       do {
+               current_child = fork();
+
+       
+               if (current_child < 0) {
+                       perror("fork");
+                       ShutDownLibCitadel ();
+                       exit(errno);
+               }
+       
+               else if (current_child == 0) {  /* child process */
+                       signal(SIGHUP, graceful_shutdown);
+
+                       return; /* continue starting webcit. */
+               }
+               else { /* watcher process */
+                       if (pid_file) {
+                               fp = fopen(pid_file, "w");
+                               if (fp != NULL) {
+                                       fprintf(fp, "%d\n", getpid());
+                                       fclose(fp);
+                               }
+                       }
+                       waitpid(current_child, &status, 0);
+               }
+
+               do_restart = 0;
+
+               /* Did the main process exit with an actual exit code? */
+               if (WIFEXITED(status)) {
+
+                       /* Exit code 0 means the watcher should exit */
+                       if (WEXITSTATUS(status) == 0) {
+                               do_restart = 0;
+                       }
+
+                       /* Exit code 101-109 means the watcher should exit */
+                       else if ( (WEXITSTATUS(status) >= 101) && (WEXITSTATUS(status) <= 109) ) {
+                               do_restart = 0;
+                       }
+
+                       /* Any other exit code means we should restart. */
+                       else {
+                               do_restart = 1;
+                       }
+               }
+
+               /* Any other type of termination (signals, etc.) should also restart. */
+               else {
+                       do_restart = 1;
+               }
+
+       } while (do_restart);
+
+       if (pid_file) {
+               unlink(pid_file);
+       }
+       ShutDownLibCitadel ();
+       exit(WEXITSTATUS(status));
+}
+
+
+/*
+ * Spawn an additional worker thread into the pool.
+ */
+void spawn_another_worker_thread()
+{
+       pthread_t SessThread;   /* Thread descriptor */
+       pthread_attr_t attr;    /* Thread attributes */
+       int ret;
+
+       ++num_threads_existing;
+       ++num_threads_executing;
+
+       /* set attributes for the new thread */
+       pthread_attr_init(&attr);
+       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+       /*
+        * Our per-thread stacks need to be bigger than the default size,
+        * otherwise the MIME parser crashes on FreeBSD.
+        */
+       if ((ret = pthread_attr_setstacksize(&attr, 1024 * 1024))) {
+               syslog(LOG_WARNING, "pthread_attr_setstacksize: %s\n", strerror(ret));
+               pthread_attr_destroy(&attr);
+       }
+
+       /* now create the thread */
+       if (pthread_create(&SessThread, &attr, (void *(*)(void *)) worker_entry, NULL) != 0) {
+               syslog(LOG_WARNING, "Can't create thread: %s\n", strerror(errno));
+       }
+
+       /* free up the attributes */
+       pthread_attr_destroy(&attr);
+}
+
+
+void
+webcit_calc_dirs_n_files(int relh, const char *basedir, int home, char *webcitdir, char *relhome)
+{
+       char dirbuffer[PATH_MAX]="";
+       /* calculate all our path on a central place */
+    /* where to keep our config */
+       
+#define COMPUTE_DIRECTORY(SUBDIR) memcpy(dirbuffer,SUBDIR, sizeof dirbuffer);\
+       snprintf(SUBDIR,sizeof SUBDIR,  "%s%s%s%s%s%s%s", \
+                        (home&!relh)?webcitdir:basedir, \
+             ((basedir!=webcitdir)&(home&!relh))?basedir:"/", \
+             ((basedir!=webcitdir)&(home&!relh))?"/":"", \
+                        relhome, \
+             (relhome[0]!='\0')?"/":"",\
+                        dirbuffer,\
+                        (dirbuffer[0]!='\0')?"/":"");
+       basedir=RUNDIR;
+       COMPUTE_DIRECTORY(socket_dir);
+       basedir=WWWDIR "/static";
+       COMPUTE_DIRECTORY(static_dir);
+       basedir=WWWDIR "/static/icons";
+       COMPUTE_DIRECTORY(static_icon_dir);
+       basedir=WWWDIR "/static.local";
+       COMPUTE_DIRECTORY(static_local_dir);
+       StripSlashes(static_dir, 1);
+       StripSlashes(static_icon_dir, 1);
+       StripSlashes(static_local_dir, 1);
+
+       basedir=ETCDIR;
+       COMPUTE_DIRECTORY(etc_dir);
+       StripSlashes(etc_dir, 1);
+       snprintf(file_etc_mimelist,
+                sizeof file_etc_mimelist, 
+                "%s/nogz-mimetypes.txt",
+                etc_dir);
+
+       /* we should go somewhere we can leave our coredump, if enabled... */
+       syslog(LOG_INFO, "Changing directory to %s\n", socket_dir);
+       if (chdir(webcitdir) != 0) {
+               perror("chdir");
+       }
+}
+
+void drop_root(uid_t UID)
+{
+       struct passwd pw, *pwp = NULL;
+#ifdef HAVE_GETPWUID_R
+       char pwbuf[SIZ];
+#endif
+
+       /*
+        * Now that we've bound the sockets, change to the Citadel user id and its
+        * corresponding group ids
+        */
+       if (UID != -1) {
+               
+#ifdef HAVE_GETPWUID_R
+#ifdef SOLARIS_GETPWUID
+               pwp = getpwuid_r(UID, &pw, pwbuf, sizeof(pwbuf));
+#else /* SOLARIS_GETPWUID */
+               getpwuid_r(UID, &pw, pwbuf, sizeof(pwbuf), &pwp);
+#endif /* SOLARIS_GETPWUID */
+#else /* HAVE_GETPWUID_R */
+               pwp = NULL;
+#endif /* HAVE_GETPWUID_R */
+
+               if (pwp == NULL)
+                       syslog(LOG_CRIT, "WARNING: getpwuid(%d): %s\n"
+                               "Group IDs will be incorrect.\n", UID,
+                               strerror(errno));
+               else {
+                       initgroups(pw.pw_name, pw.pw_gid);
+                       if (setgid(pw.pw_gid))
+                               syslog(LOG_CRIT, "setgid(%ld): %s\n", (long)pw.pw_gid,
+                                       strerror(errno));
+               }
+               syslog(LOG_INFO, "Changing uid to %ld\n", (long)UID);
+               if (setuid(UID) != 0) {
+                       syslog(LOG_CRIT, "setuid() failed: %s\n", strerror(errno));
+               }
+#if defined (HAVE_SYS_PRCTL_H) && defined (PR_SET_DUMPABLE)
+               prctl(PR_SET_DUMPABLE, 1);
+#endif
+       }
+}
+
+
+/*
+ * print the actual stack frame.
+ */
+void wc_backtrace(long LogLevel)
+{
+#ifdef HAVE_BACKTRACE
+       void *stack_frames[50];
+       size_t size, i;
+       char **strings;
+
+
+       size = backtrace(stack_frames, sizeof(stack_frames) / sizeof(void*));
+       strings = backtrace_symbols(stack_frames, size);
+       for (i = 0; i < size; i++) {
+               if (strings != NULL)
+                       syslog(LogLevel, "%s\n", strings[i]);
+               else
+                       syslog(LogLevel, "%p\n", stack_frames[i]);
+       }
+       free(strings);
+#endif
+}
diff --git a/webcit/sysmsgs.c b/webcit/sysmsgs.c
new file mode 100644 (file)
index 0000000..99f8453
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+
+/**
+ *  save a screen which was displayed with display_edit()
+ *  description the window title???
+ *  enter_cmd which command to enter at the citadel server???
+ *  regoto should we go to that room again after executing that command?
+ */
+void save_edit(char *description, char *enter_cmd, int regoto)
+{
+       StrBuf *Line;
+       const StrBuf *templ;
+
+       if (!havebstr("save_button")) {
+               AppendImportantMessage(_("Cancelled.  %s was not saved."), -1);
+               display_main_menu();
+               return;
+       }
+       templ = sbstr("template");
+       Line = NewStrBuf();
+       serv_puts(enter_cmd);
+       StrBuf_ServGetln(Line);
+       if (GetServerStatusMsg(Line, NULL, 1, 0) != 4) {
+               putlbstr("success", 0);
+               FreeStrBuf(&Line);
+               if (templ != NULL) {
+                       output_headers(1, 0, 0, 0, 0, 0);       
+                       DoTemplate(SKEY(templ), NULL, &NoCtx);
+                       end_burst();
+               }
+               else {
+                       display_main_menu();
+               }
+               return;
+       }
+       FreeStrBuf(&Line);
+       text_to_server(bstr("msgtext"));
+       serv_puts("000");
+
+       AppendImportantMessage(description, -1);
+       AppendImportantMessage(_(" has been saved."), -1);
+       putlbstr("success", 1);
+       if (templ != NULL) {
+               output_headers(1, 0, 0, 0, 0, 0);       
+               DoTemplate(SKEY(templ), NULL, &NoCtx);
+               end_burst();
+       }
+       else if (regoto) {
+               smart_goto(WC->CurRoom.name);
+       } else {
+               display_main_menu();
+               return;
+       }
+}
+
+
+void editinfo(void) {save_edit(_("Room info"), "EINF 1", 1);}
+void editbio(void) { save_edit(_("Your bio"), "EBIO", 0); }
+
+void 
+InitModule_SYSMSG
+(void)
+{
+       WebcitAddUrlHandler(HKEY("editinfo"), "", 0, editinfo, 0);
+       WebcitAddUrlHandler(HKEY("editbio"), "", 0, editbio, 0);
+}
diff --git a/webcit/tabs.c b/webcit/tabs.c
new file mode 100644 (file)
index 0000000..4b58ba5
--- /dev/null
@@ -0,0 +1,210 @@
+#include <stdarg.h>
+#define SHOW_ME_VAPPEND_PRINTF
+#include "webcit.h"
+
+/*
+ * print tabbed dialog
+ */
+void tabbed_dialog(int num_tabs, const char *tabnames[]) {
+       int i;
+
+       StrBufAppendPrintf(WC->trailing_javascript,
+               "var previously_selected_tab = '0';                                             \n"
+               "function tabsel(which_tab) {                                                   \n"
+               "       if (which_tab == previously_selected_tab) {                             \n"
+               "               return;                                                         \n"
+               "       }                                                                       \n"
+               "       $('tabdiv'+previously_selected_tab).style.display = 'none';             \n"
+               "       $('tabdiv'+which_tab).style.display = 'block';                          \n"
+               "       $('tabtd'+previously_selected_tab).className = 'tab_cell_edit';         \n"
+               "       $('tabtd'+which_tab).className = 'tab_cell_label';                      \n"
+               "       previously_selected_tab = which_tab;                                    \n"
+               "}                                                                              \n"
+       );
+
+       wc_printf("<table id=\"TheTabs\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
+               "<tr align=\"center\" style=\"cursor:pointer\"><td>&nbsp;</td>"
+       );
+
+       for (i=0; i<num_tabs; ++i) {
+               wc_printf("<td id=\"tabtd%d\" class=\"%s\" "
+                       "onClick='tabsel(\"%d\");'"
+                       ">",
+                       i,
+                       ( (i==0) ? "tab_cell_label" : "tab_cell_edit" ),
+                       i
+                       );
+               wc_printf("%s", tabnames[i]);
+               wc_printf("</td>");
+
+               wc_printf("<td>&nbsp;</td>\n");
+       }
+
+       wc_printf("</tr></table>\n");
+}
+
+/*
+ * print the tab-header
+ *
+ * tabnum:      number of the tab to print
+ * num_tabs:    total number oftabs to be printed
+ *
+ */
+void begin_tab(int tabnum, int num_tabs) {
+
+       if (tabnum == num_tabs) {
+               wc_printf("<!-- begin tab-common epilogue -->\n");
+               wc_printf("<div class=\"tabcontent_submit\">");
+       }
+
+       else {
+               wc_printf("<!-- begin tab %d of %d -->\n", tabnum, num_tabs);
+               wc_printf("<div id=\"tabdiv%d\" style=\"display:%s\" class=\"tabcontent\" >",
+                       tabnum,
+                       ( (tabnum == 0) ? "block" : "none" )
+               );
+       }
+}
+
+/*
+ * print the tab-footer
+ * tabnum:      number of the tab to print
+ * num_tabs:    total number of tabs to be printed
+ *
+ */
+void end_tab(int tabnum, int num_tabs) {
+
+       if (tabnum == num_tabs) {
+               wc_printf("</div> <!-- end of 'tabcontent_submit' div -->\n");
+               wc_printf("<!-- end tab-common epilogue -->\n");
+       }
+
+       else {
+               wc_printf("</div>\n");
+               wc_printf("<!-- end tab %d of %d -->\n", tabnum, num_tabs);
+       }
+}
+
+
+/*
+ * print tabbed dialog
+ */
+void StrTabbedDialog(StrBuf *Target, int num_tabs, StrBuf *tabnames[]) {
+       int i;
+
+       StrBufAppendBufPlain(
+               Target, 
+               HKEY(
+                       "<script type=\"text/javascript\">                                              "
+                       "var previously_selected_tab = '0';                                             "
+                       "function tabsel(which_tab) {                                                   "
+                       "       if (which_tab == previously_selected_tab) {                             "
+                       "               return;                                                         "
+                       "       }                                                                       "
+                       "       $('tabdiv'+previously_selected_tab).style.display = 'none';             "
+                       "       $('tabdiv'+which_tab).style.display = 'block';                          "
+                       "       $('tabtd'+previously_selected_tab).className = 'tab_cell_edit';         "
+                       "       $('tabtd'+which_tab).className = 'tab_cell_label';                      "
+                       "       previously_selected_tab = which_tab;                                    "
+                       "}                                                                              "
+                       "</script>                                                                      \n"
+                       ), 0);
+
+       StrBufAppendBufPlain(
+               Target, 
+               HKEY(
+                       "<table id=\"TheTabs\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
+                       "<tr align=\"center\" style=\"cursor:pointer\"><td>&nbsp;</td>"
+                       ), 0);
+
+       for (i=0; i<num_tabs; ++i) {
+               StrBufAppendPrintf(
+                       Target, 
+                       "<td id=\"tabtd%d\" class=\"%s\" "
+                       "onClick='tabsel(\"%d\");'"
+                       ">",
+                       i,
+                       ( (i==0) ? "tab_cell_label" : "tab_cell_edit" ),
+                       i
+                       );
+               StrEscAppend(Target, tabnames[i], NULL, 0, 0);
+               StrBufAppendBufPlain(
+                       Target, 
+                       HKEY(
+                               "</td>"
+                               "<td>&nbsp;</td>\n"), 0);
+       }
+
+       StrBufAppendBufPlain(
+               Target, 
+               HKEY("</tr></table>\n"), 0);
+}
+
+/*
+ * print the tab-header
+ *
+ * tabnum:      number of the tab to print
+ * num_tabs:    total number oftabs to be printed
+ *
+ */
+void StrBeginTab(StrBuf *Target, int tabnum, int num_tabs, StrBuf **Names) {
+
+       if (tabnum == num_tabs) {
+               StrBufAppendBufPlain(
+                       Target, 
+                       HKEY("<!-- begin tab-common epilogue ["), 0);
+               StrEscAppend(Target, Names[tabnum], NULL, 0, 2);
+               StrBufAppendBufPlain(
+                       Target, 
+                       HKEY("] -->\n<div class=\"tabcontent_submit\">"), 0);
+       }
+
+       else {
+               StrBufAppendBufPlain(
+                       Target, 
+                       HKEY("<!-- begin tab "), 0);
+               StrBufAppendPrintf(
+                       Target,  "%d of %d [",
+                       tabnum, num_tabs);
+               
+               StrEscAppend(Target, Names[tabnum], NULL, 0, 2);
+
+               StrBufAppendPrintf(
+                       Target, 
+                       "] -->\n<div id=\"tabdiv%d\" style=\"display:%s\" class=\"tabcontent\" >",
+                       tabnum,
+                       ( (tabnum == 0) ? "block" : "none" )
+                       );
+       }
+}
+
+/*
+ * print the tab-footer
+ * tabnum:      number of the tab to print
+ * num_tabs:    total number of tabs to be printed
+ *
+ */
+void StrEndTab(StrBuf *Target, int tabnum, int num_tabs) {
+
+       if (tabnum == num_tabs) {
+               StrBufAppendBufPlain(
+                       Target, 
+                       HKEY(
+                               "</div>\n"
+                               "<!-- end tab-common epilogue -->\n"), 0);
+       }
+
+       else {
+               StrBufAppendPrintf(
+                       Target, 
+                       "</div>\n",
+                       "<!-- end tab %d of %d -->\n", tabnum, num_tabs
+               );
+       }
+       if (havebstr("last_tabsel"))
+       {
+               StrBufAppendPrintf(Target, "<script type=\"text/javascript\">tabsel(%s);</script>", BSTR("last_tabsel"));
+       }
+}
+
+
diff --git a/webcit/tasks.c b/webcit/tasks.c
new file mode 100644 (file)
index 0000000..b354382
--- /dev/null
@@ -0,0 +1,761 @@
+#include "webcit.h"
+#include "calendar.h"
+#include "webserver.h"
+
+/*
+ * qsort filter to move completed tasks to bottom of task list
+ */
+int task_completed_cmp(const void *vtask1, const void *vtask2) {
+       disp_cal * Task1 = (disp_cal *)GetSearchPayload(vtask1);
+/*     disp_cal * Task2 = (disp_cal *)GetSearchPayload(vtask2); */
+
+       icalproperty_status t1 = icalcomponent_get_status((Task1)->cal);
+       /* icalproperty_status t2 = icalcomponent_get_status(((struct disp_cal *)task2)->cal); */
+       
+       if (t1 == ICAL_STATUS_COMPLETED) 
+               return 1;
+       return 0;
+}
+
+
+/*
+ * Helper function for do_tasks_view().  Returns the due date/time of a vtodo.
+ */
+time_t get_task_due_date(icalcomponent *vtodo, int *is_date) {
+       icalproperty *p;
+
+       if (vtodo == NULL) {
+               return(0L);
+       }
+
+       /*
+        * If we're looking at a fully encapsulated VCALENDAR
+        * rather than a VTODO component, recurse into the data
+        * structure until we get a VTODO.
+        */
+       if (icalcomponent_isa(vtodo) == ICAL_VCALENDAR_COMPONENT) {
+               return get_task_due_date(
+                       icalcomponent_get_first_component(
+                               vtodo, ICAL_VTODO_COMPONENT
+                               ), is_date
+                       );
+       }
+
+       p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY);
+       if (p != NULL) {
+               struct icaltimetype t = icalproperty_get_due(p);
+
+               if (is_date)
+                       *is_date = t.is_date;
+               return(icaltime_as_timet(t));
+       }
+       else {
+               return(0L);
+       }
+}
+
+/*
+ * Compare the due dates of two tasks (this is for sorting)
+ */
+int task_due_cmp(const void *vtask1, const void *vtask2) {
+       disp_cal * Task1 = (disp_cal *)GetSearchPayload(vtask1);
+       disp_cal * Task2 = (disp_cal *)GetSearchPayload(vtask2);
+
+       time_t t1;
+       time_t t2;
+
+       t1 =  get_task_due_date(Task1->cal, NULL);
+       t2 =  get_task_due_date(Task2->cal, NULL);
+       if (t1 < t2) return(-1);
+       if (t1 > t2) return(1);
+       return(0);
+}
+
+/*
+ * do the whole task view stuff
+ */
+int tasks_RenderView_or_Tail(SharedMessageStatus *Stat, 
+                             void **ViewSpecific, 
+                             long oper)
+{
+       long hklen;
+       const char *HashKey;
+       void *vCal;
+       disp_cal *Cal;
+       HashPos *Pos;
+       int nItems;
+       time_t due;
+       char buf[SIZ];
+       icalproperty *p;
+
+       wc_printf("<table class=\"calendar_view_background\"><tbody id=\"taskview\">\n<tr>\n<th>");
+       wc_printf(_("Completed?"));
+       wc_printf("</th><th>");
+       wc_printf(_("Name of task"));
+       wc_printf("</th><th>");
+       wc_printf(_("Date due"));
+       wc_printf("</th><th>");
+       wc_printf(_("Category"));
+       wc_printf(" (<select id=\"selectcategory\"><option value=\"showall\">%s</option></select>)</th></tr>\n",
+               _("Show All"));
+
+       nItems = GetCount(WC->disp_cal_items);
+
+       /* Sort them if necessary
+       if (nItems > 1) {
+               SortByPayload(WC->disp_cal_items, task_due_cmp);
+       }
+       * this shouldn't be neccessary, since we sort by the start time.
+       */
+
+       /* And then again, by completed */
+       if (nItems > 1) {
+               SortByPayload(WC->disp_cal_items, 
+                             task_completed_cmp);
+       }
+
+       Pos = GetNewHashPos(WC->disp_cal_items, 0);
+       while (GetNextHashPos(WC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) {
+               icalproperty_status todoStatus;
+               int is_date;
+
+               Cal = (disp_cal*)vCal;
+               wc_printf("<tr><td>");
+               todoStatus = icalcomponent_get_status(Cal->cal);
+               wc_printf("<input type=\"checkbox\" name=\"completed\" value=\"completed\" ");
+               if (todoStatus == ICAL_STATUS_COMPLETED) {
+                       wc_printf("checked=\"checked\" ");
+               }
+               wc_printf("disabled=\"disabled\">\n</td><td>");
+               p = icalcomponent_get_first_property(Cal->cal,
+                       ICAL_SUMMARY_PROPERTY);
+               wc_printf("<a href=\"display_edit_task?msgnum=%ld?taskrm=", Cal->cal_msgnum);
+               urlescputs(ChrPtr(WC->CurRoom.name));
+               wc_printf("\">");
+               /* wc_printf("<img align=middle "
+               "src=\"static/taskmanag_16x.gif\" border=0>&nbsp;"); */
+               if (p != NULL) {
+                       escputs((char *)icalproperty_get_comment(p));
+               }
+               wc_printf("</a>\n");
+               wc_printf("</td>\n");
+
+               due = get_task_due_date(Cal->cal, &is_date);
+               wc_printf("<td><span");
+               if (due > 0) {
+                       webcit_fmt_date(buf, SIZ, due, is_date ? DATEFMT_RAWDATE : DATEFMT_FULL);
+                       wc_printf(">%s",buf);
+               }
+               else {
+                       wc_printf(">");
+               }
+               wc_printf("</span></td>");
+               wc_printf("<td>");
+               p = icalcomponent_get_first_property(Cal->cal,
+                       ICAL_CATEGORIES_PROPERTY);
+               if (p != NULL) {
+                       escputs((char *)icalproperty_get_categories(p));
+               }
+               wc_printf("</td>");
+               wc_printf("</tr>");
+       }
+
+       wc_printf("</tbody></table>\n");
+
+       /* Free the list */
+       DeleteHash(&WC->disp_cal_items);
+       DeleteHashPos(&Pos);
+       return 0;
+}
+
+
+/*
+ * Display a task by itself (for editing)
+ */
+void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, char *from,
+                       int unread, calview *calv)
+{
+       icalcomponent *vtodo;
+       icalproperty *p;
+       struct icaltimetype IcalTime;
+       int created_new_vtodo = 0;
+       icalproperty_status todoStatus;
+
+       if (supplied_vtodo != NULL) {
+               vtodo = supplied_vtodo;
+
+               /*
+                * It's safe to convert to UTC here because there are no recurrences to worry about.
+                */
+               ical_dezonify(vtodo);
+
+               /*
+                * If we're looking at a fully encapsulated VCALENDAR
+                * rather than a VTODO component, attempt to use the first
+                * relevant VTODO subcomponent.  If there is none, the
+                * NULL returned by icalcomponent_get_first_component() will
+                * tell the next iteration of this function to create a
+                * new one.
+                */
+               if (icalcomponent_isa(vtodo) == ICAL_VCALENDAR_COMPONENT) {
+                       display_edit_individual_task(
+                               icalcomponent_get_first_component(
+                                       vtodo, ICAL_VTODO_COMPONENT
+                                       ), 
+                               msgnum, from, unread, calv
+                               );
+                       return;
+               }
+       }
+       else {
+               vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT);
+               created_new_vtodo = 1;
+       }
+       
+       /* TODO: Can we take all this and move it into a template?       */
+       output_headers(1, 1, 1, 0, 0, 0);
+       wc_printf("<!-- start task edit form -->");
+       p = icalcomponent_get_first_property(vtodo, ICAL_SUMMARY_PROPERTY);
+       /* Get summary early for title */
+       wc_printf("<div class=\"box\">\n");
+       wc_printf("<div class=\"boxlabel\">");
+       wc_printf(_("Edit task"));
+       wc_printf("- ");
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wc_printf("</div>");
+       
+       wc_printf("<div class=\"boxcontent\">\n");
+       wc_printf("<FORM METHOD=\"POST\" action=\"save_task\">\n");
+       wc_printf("<div style=\"display: none;\">\n     ");
+
+       wc_printf("<input type=\"hidden\" name=\"go\" value=\"");
+       StrEscAppend(WC->WBuf, WC->CurRoom.name, NULL, 0, 0);
+       wc_printf("\">\n");
+
+       wc_printf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
+       wc_printf("<INPUT TYPE=\"hidden\" NAME=\"msgnum\" VALUE=\"%ld\">\n", msgnum);
+       wc_printf("<INPUT TYPE=\"hidden\" NAME=\"return_to_summary\" VALUE=\"%d\">\n",
+               ibstr("return_to_summary"));
+       wc_printf("</div>");
+       wc_printf("<table class=\"calendar_background\"><tr><td>");
+       wc_printf("<TABLE STYLE=\"border: none;\">\n");
+
+       wc_printf("<TR><TD>");
+       wc_printf(_("Summary:"));
+       wc_printf("</TD><TD>"
+               "<INPUT TYPE=\"text\" NAME=\"summary\" "
+               "MAXLENGTH=\"64\" SIZE=\"64\" VALUE=\"");
+       p = icalcomponent_get_first_property(vtodo, ICAL_SUMMARY_PROPERTY);
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wc_printf("\"></TD></TR>\n");
+
+       wc_printf("<TR><TD>");
+       wc_printf(_("Start date:"));
+       wc_printf("</TD><TD>");
+       p = icalcomponent_get_first_property(vtodo, ICAL_DTSTART_PROPERTY);
+       wc_printf("<INPUT TYPE=\"CHECKBOX\" NAME=\"nodtstart\" ID=\"nodtstart\" VALUE=\"NODTSTART\" ");
+       if (p == NULL) {
+               wc_printf("CHECKED=\"CHECKED\"");
+       }
+       wc_printf(">");
+       wc_printf(_("No date"));
+       
+       wc_printf(" ");
+       wc_printf("<span ID=\"dtstart_date\">");
+       wc_printf(_("or"));
+       wc_printf(" ");
+       if (p != NULL) {
+               IcalTime = icalproperty_get_dtstart(p);
+       }
+       else
+               IcalTime = icaltime_current_time_with_zone(get_default_icaltimezone());
+       display_icaltimetype_as_webform(&IcalTime, "dtstart", 0);
+
+       wc_printf("<INPUT TYPE=\"CHECKBOX\" NAME=\"dtstart_time_assoc\" ID=\"dtstart_time_assoc\" VALUE=\"yes\"");
+       if (!IcalTime.is_date) {
+               wc_printf("CHECKED=\"CHECKED\"");
+       }
+       wc_printf(">");
+       wc_printf(_("Time associated"));
+       wc_printf("</span></TD></TR>\n");
+
+       wc_printf("<TR><TD>");
+       wc_printf(_("Due date:"));
+       wc_printf("</TD><TD>");
+       p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY);
+       wc_printf("<INPUT TYPE=\"CHECKBOX\" NAME=\"nodue\" ID=\"nodue\" VALUE=\"NODUE\"");
+       if (p == NULL) {
+               wc_printf("CHECKED=\"CHECKED\"");
+       }
+       wc_printf(">");
+       wc_printf(_("No date"));
+       wc_printf(" ");
+       wc_printf("<span ID=\"due_date\">\n");
+       wc_printf(_("or"));
+       wc_printf(" ");
+       if (p != NULL) {
+               IcalTime = icalproperty_get_due(p);
+       }
+       else
+               IcalTime = icaltime_current_time_with_zone(get_default_icaltimezone());
+       display_icaltimetype_as_webform(&IcalTime, "due", 0);
+
+       wc_printf("<INPUT TYPE=\"CHECKBOX\" NAME=\"due_time_assoc\" ID=\"due_time_assoc\" VALUE=\"yes\"");
+       if (!IcalTime.is_date) {
+               wc_printf("CHECKED=\"CHECKED\"");
+       }
+       wc_printf(">");
+       wc_printf(_("Time associated"));
+       wc_printf("</span></TD></TR>\n");
+       todoStatus = icalcomponent_get_status(vtodo);
+       wc_printf("<TR><TD>\n");
+       wc_printf(_("Completed:"));
+       wc_printf("</TD><TD>");
+       wc_printf("<INPUT TYPE=\"CHECKBOX\" NAME=\"status\" VALUE=\"COMPLETED\"");
+       if (todoStatus == ICAL_STATUS_COMPLETED) {
+               wc_printf(" CHECKED=\"CHECKED\"");
+       } 
+       wc_printf(" >");
+       wc_printf("</TD></TR>");
+       /* start category field */
+       p = icalcomponent_get_first_property(vtodo, ICAL_CATEGORIES_PROPERTY);
+       wc_printf("<TR><TD>");
+       wc_printf(_("Category:"));
+       wc_printf("</TD><TD>");
+       wc_printf("<INPUT TYPE=\"text\" NAME=\"category\" MAXLENGTH=\"32\" SIZE=\"32\" VALUE=\"");
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_categories(p));
+       }
+       wc_printf("\">");
+       wc_printf("</TD></TR>\n ");
+       /* end category field */
+       wc_printf("<TR><TD>");
+       wc_printf(_("Description:"));
+       wc_printf("</TD><TD>");
+       wc_printf("<TEXTAREA NAME=\"description\" "
+               "ROWS=\"10\" COLS=\"80\">\n"
+               );
+       p = icalcomponent_get_first_property(vtodo, ICAL_DESCRIPTION_PROPERTY);
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wc_printf("</TEXTAREA></TD></TR></TABLE>\n");
+
+       wc_printf("<SPAN STYLE=\"text-align: center;\">"
+               "<INPUT TYPE=\"submit\" NAME=\"save_button\" VALUE=\"%s\">"
+               "&nbsp;&nbsp;"
+               "<INPUT TYPE=\"submit\" NAME=\"delete_button\" VALUE=\"%s\">\n"
+               "&nbsp;&nbsp;"
+               "<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">\n"
+               "</SPAN>\n",
+               _("Save"),
+               _("Delete"),
+               _("Cancel")
+               );
+       wc_printf("</td></tr></table>");
+       wc_printf("</FORM>\n");
+       wc_printf("</div></div></div>\n");
+       wc_printf("<!-- end task edit form -->");
+       wDumpContent(1);
+
+       if (created_new_vtodo) {
+               icalcomponent_free(vtodo);
+       }
+}
+
+/*
+ * Save an edited task
+ *
+ * supplied_vtodo      the task to save
+ * msgnum              number of the mesage in our db
+ */
+void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from, int unread,
+                         calview *calv)
+{
+       char buf[SIZ];
+       int delete_existing = 0;
+       icalproperty *prop;
+       icalcomponent *vtodo, *encaps;
+       int created_new_vtodo = 0;
+       int i;
+       int sequence = 0;
+       struct icaltimetype t;
+
+       if (supplied_vtodo != NULL) {
+               vtodo = supplied_vtodo;
+               /**
+                * If we're looking at a fully encapsulated VCALENDAR
+                * rather than a VTODO component, attempt to use the first
+                * relevant VTODO subcomponent.  If there is none, the
+                * NULL returned by icalcomponent_get_first_component() will
+                * tell the next iteration of this function to create a
+                * new one.
+                */
+               if (icalcomponent_isa(vtodo) == ICAL_VCALENDAR_COMPONENT) {
+                       save_individual_task(
+                               icalcomponent_get_first_component(
+                                       vtodo, ICAL_VTODO_COMPONENT), 
+                               msgnum, from, unread, calv
+                               );
+                       return;
+               }
+       }
+       else {
+               vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT);
+               created_new_vtodo = 1;
+       }
+
+       if (havebstr("save_button")) {
+
+               /** Replace values in the component with ones from the form */
+
+               while (prop = icalcomponent_get_first_property(vtodo,
+                                                              ICAL_SUMMARY_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vtodo, prop);
+                       icalproperty_free(prop);
+               }
+               if (havebstr("summary")) {
+
+                       icalcomponent_add_property(vtodo,
+                                                  icalproperty_new_summary(bstr("summary")));
+               } else {
+                       icalcomponent_add_property(vtodo,
+                                                  icalproperty_new_summary(_("Untitled Task")));
+               }
+       
+               while (prop = icalcomponent_get_first_property(vtodo,
+                                                              ICAL_DESCRIPTION_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vtodo, prop);
+                       icalproperty_free(prop);
+               }
+               if (havebstr("description")) {
+                       icalcomponent_add_property(vtodo,
+                                                  icalproperty_new_description(bstr("description")));
+               }
+       
+               while (prop = icalcomponent_get_first_property(vtodo,
+                                                              ICAL_DTSTART_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vtodo, prop);
+                       icalproperty_free(prop);
+               }
+               if (IsEmptyStr(bstr("nodtstart"))) {
+                       if (yesbstr("dtstart_time")) {
+                               icaltime_from_webform(&t, "dtstart");
+                       }
+                       else {
+                               icaltime_from_webform_dateonly(&t, "dtstart");
+                       }
+                       icalcomponent_add_property(vtodo,
+                                                  icalproperty_new_dtstart(t)
+                               );
+               }
+               while(prop = icalcomponent_get_first_property(vtodo,
+                                                             ICAL_STATUS_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vtodo,prop);
+                       icalproperty_free(prop);
+               }
+               while(prop = icalcomponent_get_first_property(vtodo,
+                                                             ICAL_PERCENTCOMPLETE_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vtodo,prop);
+                       icalproperty_free(prop);
+               }
+
+               if (havebstr("status")) {
+                       icalproperty_status taskStatus = icalproperty_string_to_status(bstr("status"));
+                       icalcomponent_set_status(vtodo, taskStatus);
+                       icalcomponent_add_property(vtodo,
+                               icalproperty_new_percentcomplete(
+                                       (strcasecmp(bstr("status"), "completed") ? 0 : 100)
+                               )
+                       );
+               }
+               else {
+                       icalcomponent_add_property(vtodo, icalproperty_new_percentcomplete(0));
+               }
+               while (prop = icalcomponent_get_first_property(vtodo,
+                                                              ICAL_CATEGORIES_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vtodo,prop);
+                       icalproperty_free(prop);
+               }
+               if (!IsEmptyStr(bstr("category"))) {
+                       prop = icalproperty_new_categories(bstr("category"));
+                       icalcomponent_add_property(vtodo,prop);
+               }
+               while (prop = icalcomponent_get_first_property(vtodo,
+                                                              ICAL_DUE_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vtodo, prop);
+                       icalproperty_free(prop);
+               }
+               if (IsEmptyStr(bstr("nodue"))) {
+                       if (yesbstr("due_time")) {
+                               icaltime_from_webform(&t, "due");
+                       }
+                       else {
+                               icaltime_from_webform_dateonly(&t, "due");
+                       }
+                       icalcomponent_add_property(vtodo,
+                                                  icalproperty_new_due(t)
+                               );
+               }
+               /** Give this task a UID if it doesn't have one. */
+               syslog(LOG_DEBUG, "Give this task a UID if it doesn't have one.\n");
+               if (icalcomponent_get_first_property(vtodo,
+                                                    ICAL_UID_PROPERTY) == NULL) {
+                       generate_uuid(buf);
+                       icalcomponent_add_property(vtodo,
+                                                  icalproperty_new_uid(buf)
+                               );
+               }
+
+               /* Increment the sequence ID */
+               syslog(LOG_DEBUG, "Increment the sequence ID\n");
+               while (prop = icalcomponent_get_first_property(vtodo,
+                                                              ICAL_SEQUENCE_PROPERTY), (prop != NULL) ) {
+                       i = icalproperty_get_sequence(prop);
+                       syslog(LOG_DEBUG, "Sequence was %d\n", i);
+                       if (i > sequence) sequence = i;
+                       icalcomponent_remove_property(vtodo, prop);
+                       icalproperty_free(prop);
+               }
+               ++sequence;
+               syslog(LOG_DEBUG, "New sequence is %d.  Adding...\n", sequence);
+               icalcomponent_add_property(vtodo,
+                                          icalproperty_new_sequence(sequence)
+                       );
+
+               /*
+                * Encapsulate event into full VCALENDAR component.  Clone it first,
+                * for two reasons: one, it's easier to just free the whole thing
+                * when we're done instead of unbundling, but more importantly, we
+                * can't encapsulate something that may already be encapsulated
+                * somewhere else.
+                */
+               syslog(LOG_DEBUG, "Encapsulating into a full VCALENDAR component\n");
+               encaps = ical_encapsulate_subcomponent(icalcomponent_new_clone(vtodo));
+
+               /* Serialize it and save it to the message base */
+               serv_puts("ENT0 1|||4");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '4') {
+                       serv_puts("Content-type: text/calendar");
+                       serv_puts("");
+                       serv_puts(icalcomponent_as_ical_string(encaps));
+                       serv_puts("000");
+
+                       /*
+                        * Probably not necessary; the server will see the UID
+                        * of the object and delete the old one anyway, but
+                        * just in case...
+                        */
+                       delete_existing = 1;
+               }
+               icalcomponent_free(encaps);
+       }
+
+       /**
+        * If the user clicked 'Delete' then explicitly delete the message.
+        */
+       if (havebstr("delete_button")) {
+               delete_existing = 1;
+       }
+
+       if ( (delete_existing) && (msgnum > 0L) ) {
+               serv_printf("DELE %ld", lbstr("msgnum"));
+               serv_getln(buf, sizeof buf);
+       }
+
+       if (created_new_vtodo) {
+               icalcomponent_free(vtodo);
+       }
+
+       /* Go back to wherever we came from */
+       if (ibstr("return_to_summary") == 1) {
+               display_summary_page();
+       }
+       else {
+               readloop(readfwd, eUseDefault);
+       }
+}
+
+
+/*
+ * free memory allocated using libical
+ */
+void delete_task(void *vCal)
+{
+        disp_cal *Cal = (disp_cal*) vCal;
+        icalcomponent_free(Cal->cal);
+        free(Cal->from);
+        free(Cal);
+}
+
+
+/*
+ * Load a Task into a hash table for later display.
+ */
+void load_task(icalcomponent *event, long msgnum, char *from, int unread, calview *calv)
+{
+       icalproperty *ps = NULL;
+       struct icaltimetype dtstart, dtend;
+       disp_cal *Cal;
+       size_t len;
+       icalcomponent *cptr = NULL;
+
+       dtstart = icaltime_null_time();
+       dtend = icaltime_null_time();
+       
+       if (WC->disp_cal_items == NULL) {
+               WC->disp_cal_items = NewHash(0, Flathash);
+       }
+
+       Cal = (disp_cal*) malloc(sizeof(disp_cal));
+       memset(Cal, 0, sizeof(disp_cal));
+       Cal->cal = icalcomponent_new_clone(event);
+
+       /* Dezonify and decapsulate at the very last moment */
+       ical_dezonify(Cal->cal);
+       if (icalcomponent_isa(Cal->cal) != ICAL_VTODO_COMPONENT) {
+               cptr = icalcomponent_get_first_component(Cal->cal, ICAL_VTODO_COMPONENT);
+               if (cptr) {
+                       cptr = icalcomponent_new_clone(cptr);
+                       icalcomponent_free(Cal->cal);
+                       Cal->cal = cptr;
+               }
+       }
+
+       Cal->unread = unread;
+       len = strlen(from);
+       Cal->from = (char*)malloc(len+ 1);
+       memcpy(Cal->from, from, len + 1);
+       Cal->cal_msgnum = msgnum;
+
+       /* Precalculate the starting date and time of this event, and store it in our top-level
+        * structure.  Later, when we are rendering the calendar, we can just peek at these values
+        * without having to break apart every calendar item.
+        */
+       ps = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY);
+       if (ps != NULL) {
+               dtstart = icalproperty_get_dtstart(ps);
+               Cal->event_start = icaltime_as_timet(dtstart);
+       }
+
+       /* Do the same for the ending date and time.  It makes the day view much easier to render. */
+       ps = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY);
+       if (ps != NULL) {
+               dtend = icalproperty_get_dtend(ps);
+               Cal->event_end = icaltime_as_timet(dtend);
+       }
+
+       /* Store it in the hash list. */
+       /* syslog(LOG_DEBUG, "INITIAL: %s", ctime(&Cal->event_start)); */
+       Put(WC->disp_cal_items, 
+           (char*) &Cal->event_start,
+           sizeof(Cal->event_start), 
+           Cal, 
+           delete_task
+       );
+}
+
+
+
+/*
+ * Display task view
+ */
+int tasks_LoadMsgFromServer(SharedMessageStatus *Stat, 
+                           void **ViewSpecific, 
+                           message_summary* Msg, 
+                           int is_new, 
+                           int i)
+{
+       /* Not (yet?) needed here? calview *c = (calview *) *ViewSpecific; */
+
+       load_ical_object(Msg->msgnum, is_new, ICAL_VTODO_COMPONENT, load_task, NULL, 0);
+       return 0;
+}
+
+/*
+ * Display the editor component for a task
+ */
+void display_edit_task(void) {
+       long msgnum = 0L;
+                       
+       /* Force change the room if we have to */
+       if (havebstr("taskrm")) {
+               gotoroom(sbstr("taskrm"));
+       }
+
+       msgnum = lbstr("msgnum");
+       if (msgnum > 0L) {
+               /* existing task */
+               load_ical_object(msgnum, 0,
+                                ICAL_VTODO_COMPONENT,
+                                display_edit_individual_task,
+                                NULL, 0
+               );
+       }
+       else {
+               /* new task */
+               display_edit_individual_task(NULL, 0L, "", 0, NULL);
+       }
+}
+
+/*
+ * save an edited task
+ */
+void save_task(void) {
+       long msgnum = 0L;
+       msgnum = lbstr("msgnum");
+       if (msgnum > 0L) {
+               load_ical_object(msgnum, 0, ICAL_VTODO_COMPONENT, save_individual_task, NULL, 0);
+       }
+       else {
+               save_individual_task(NULL, 0L, "", 0, NULL);
+       }
+}
+
+
+
+int tasks_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                                void **ViewSpecific, 
+                                long oper, 
+                                char *cmd, 
+                                long len,
+                                char *filter,
+                                long flen)
+{
+       strcpy(cmd, "MSGS ALL");
+       Stat->maxmsgs = 32767;
+       return 200;
+}
+
+
+int tasks_Cleanup(void **ViewSpecific)
+{
+       wDumpContent(1);
+/* Tasks doesn't need the calview struct... 
+       free (*ViewSpecific);
+       *ViewSpecific = NULL;
+       */
+       return 0;
+}
+
+void 
+InitModule_TASKS
+(void)
+{
+       RegisterReadLoopHandlerset(
+               VIEW_TASKS,
+               tasks_GetParamsGetServerCall,
+               NULL,
+               NULL,
+               NULL,
+               tasks_LoadMsgFromServer,
+               tasks_RenderView_or_Tail,
+               tasks_Cleanup,
+               NULL);
+       WebcitAddUrlHandler(HKEY("save_task"), "", 0, save_task, 0);
+}
diff --git a/webcit/tiny_mce/langs/bg.js b/webcit/tiny_mce/langs/bg.js
new file mode 100644 (file)
index 0000000..5b1a630
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({bg:{common:{"more_colors":"\u041e\u0449\u0435 \u0446\u0432\u0435\u0442\u043e\u0432\u0435","invalid_data":"\u0413\u0440\u0435\u0448\u043a\u0430: \u0412\u044a\u0432\u0435\u0434\u0435\u043d\u0438 \u0441\u0430 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0438 \u0441\u0442\u043e\u0439\u043d\u043e\u0441\u0442\u0438, \u0442\u0435 \u0441\u0430 \u043c\u0430\u0440\u043a\u0438\u0440\u0430\u043d\u0438 \u0432 \u0447\u0435\u0440\u0432\u0435\u043d\u043e.","popup_blocked":"\u0421\u044a\u0436\u0430\u043b\u044f\u0432\u0430\u043c\u0435, \u043d\u043e \u0437\u0430\u0431\u0435\u043b\u044f\u0437\u0430\u0445\u043c\u0435, \u0447\u0435 \u0432\u0430\u0448\u0438\u044f\u0442 popup-blocker \u0435 \u0441\u043f\u0440\u044f\u043b \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 \u043a\u043e\u0439\u0442\u043e \u0441\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430 \u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430\u0442\u0430. \u0429\u0435 \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0438\u0437\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u043f\u043e\u043f\u044a\u043f\u0438 \u0437\u0430 \u0442\u043e\u0437\u0438 \u0441\u0430\u0439\u0442 \u0437\u0430 \u0434\u0430 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 \u043f\u044a\u043b\u043d\u0430\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043d\u043e\u0441\u0442.","clipboard_no_support":"\u041d\u0435 \u0441\u0435 \u043f\u043e\u0434\u0434\u044a\u0440\u0436\u0430 \u043e\u0442 \u0432\u0430\u0448\u0438\u044f\u0442 \u0431\u0440\u0430\u0443\u0437\u044a\u0440, \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043d\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0438.","clipboard_msg":"\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u0435/\u041e\u0442\u0440\u044f\u0437\u0432\u0430\u043d\u0435/\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435 \u043d\u0435 \u0435 \u0434\u043e\u0441\u0442\u044a\u043f\u043d\u043e \u043f\u043e\u0434 Mozilla \u0438 Firefox.\n\u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u043f\u043e\u0432\u0435\u0447\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430?","not_set":"-- \u041d\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0435\u043d\u043e --","class_name":"\u041a\u043b\u0430\u0441",browse:"Browse",close:"\u0417\u0430\u0442\u0432\u043e\u0440\u0438",cancel:"\u041e\u0442\u043a\u0430\u0436\u0438",update:"\u041e\u0431\u043d\u043e\u0432\u0438",insert:"\u0412\u043c\u044a\u043a\u043d\u0438",apply:"\u041f\u043e\u0442\u0432\u044a\u0440\u0434\u0438","edit_confirm":"\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 WYSIWYG \u0440\u0435\u0436\u0438\u043c \u0437\u0430 \u0442\u043e\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e \u043f\u043e\u043b\u0435?","invalid_data_number":"{#field} \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 \u0447\u0438\u0441\u043b\u043e","invalid_data_min":"{#field} \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e-\u0433\u043e\u043b\u044f\u043c\u043e \u043e\u0442 {#min}","invalid_data_size":"{#field} \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442",value:"(value)"},contextmenu:{full:"\u0414\u0432\u0443\u0441\u0442\u0440\u0430\u043d\u043d\u043e",right:"\u0414\u044f\u0441\u043d\u043e",center:"\u0426\u0435\u043d\u0442\u044a\u0440",left:"\u041b\u044f\u0432\u043e",align:"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435"},insertdatetime:{"day_short":"\u041d\u0434,\u041f\u043d,\u0412\u0442,\u0421\u0440,\u0427\u0442,\u041f\u0442,\u0421\u0431,\u041d\u0434","day_long":"\u041d\u0435\u0434\u0435\u043b\u044f,\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a,\u0412\u0442\u043e\u0440\u043d\u0438\u043a,\u0421\u0440\u044f\u0434\u0430,\u0427\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a,\u041f\u0435\u0442\u044a\u043a,\u0421\u044a\u0431\u043e\u0442\u0430,\u041d\u0435\u0434\u0435\u043b\u044f","months_short":"\u042f\u043d\u0443,\u0424\u0435\u0432,\u041c\u0430\u0440,\u0410\u043f\u0440,\u041c\u0430\u0439,\u042e\u043d\u0438,\u042e\u043b\u0438,\u0410\u0432\u0433,\u0421\u0435\u043f,\u041e\u043a\u0442,\u041d\u043e\u0435,\u0414\u0435\u043a","months_long":"\u042f\u043d\u0443\u0430\u0440\u0438,\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438,\u041c\u0430\u0440\u0442,\u0410\u043f\u0440\u0438\u043b,\u041c\u0430\u0439,\u042e\u043d\u0438,\u042e\u043b\u0438,\u0410\u0432\u0433\u0443\u0441\u0442,\u0421\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438,\u041e\u043a\u0442\u043e\u043c\u0432\u0440\u0438,\u041d\u043e\u0435\u043c\u0432\u0440\u0438,\u0414\u0435\u043a\u0435\u043c\u0432\u0440\u0438","inserttime_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u0432\u0440\u0435\u043c\u0435","insertdate_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u0434\u0430\u0442\u0430","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"\u041e\u0442\u043f\u0435\u0447\u0430\u0442\u0430\u0439"},preview:{"preview_desc":"\u041f\u0440\u0435\u0433\u043b\u0435\u0434"},directionality:{"rtl_desc":"\u041f\u043e\u0441\u043e\u043a\u0430 \u043e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e","ltr_desc":"\u041f\u043e\u0441\u043e\u043a\u0430 \u043e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e"},layer:{content:"\u041d\u043e\u0432 \u0441\u043b\u043e\u0439...","absolute_desc":"\u0412\u043a\u043b\u044e\u0447\u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0430\u043d\u0435","backward_desc":"\u041f\u043e\u043a\u0430\u0436\u0438 \u043e\u0442\u0437\u0430\u0434","forward_desc":"\u041f\u043e\u043a\u0430\u0436\u0438 \u043e\u0442\u043f\u0440\u0435\u0434","insertlayer_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u043d\u043e\u0432 \u0441\u043b\u043e\u0439"},save:{"save_desc":"\u0417\u0430\u043f\u0438\u0448\u0438","cancel_desc":"\u041e\u0442\u043a\u0430\u0436\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0438"},nonbreaking:{"nonbreaking_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u043d\u0435\u043f\u0440\u0435\u043a\u044a\u0441\u0432\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b"},iespell:{download:"ieSpell \u043d\u0435 \u0435 \u043e\u0442\u043a\u0440\u0438\u0442. \u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0433\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0442\u0435 \u0441\u0435\u0433\u0430?","iespell_desc":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430"},advhr:{"advhr_desc":"\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u0430 \u043b\u0438\u043d\u0438\u044f","delta_height":"","delta_width":""},emotions:{"emotions_desc":"\u0415\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"\u0422\u044a\u0440\u0441\u0438/\u0417\u0430\u043c\u0435\u0441\u0442\u0438","search_desc":"\u0422\u044a\u0440\u0441\u0438","delta_width":"","delta_height":""},advimage:{"image_desc":"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430","delta_width":"","delta_height":""},advlink:{"link_desc":"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438","ins_desc":"\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435","del_desc":"\u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435","acronym_desc":"\u0410\u043a\u0440\u043e\u043d\u0438\u043c","abbr_desc":"\u0421\u044a\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435","cite_desc":"\u0426\u0438\u0442\u0430\u0442","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 CSS \u0441\u0442\u0438\u043b","delta_height":"","delta_width":""},paste:{"plaintext_mode":"\u041f\u043e\u0441\u0442\u0430\u0432\u0435\u043d\u043e\u0442\u043e \u0435 \u0432 \u0438\u0437\u0447\u0438\u0441\u0442\u0435\u043d \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0440\u0435\u0436\u0438\u043c. \u0429\u0440\u0430\u043a\u043d\u0435\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e, \u0437\u0430 \u0434\u0430 \u043f\u0440\u0435\u043c\u0438\u043d\u0435\u0442\u0435 \u0432 \u043e\u0431\u0438\u043a\u043d\u043e\u0432\u0435\u043d \u0440\u0435\u0436\u0438\u043c \u043d\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435.","plaintext_mode_sticky":"\u041f\u043e\u0441\u0442\u0430\u0432\u0435\u043d\u043e\u0442\u043e \u0435 \u0432 \u0438\u0437\u0447\u0438\u0441\u0442\u0435\u043d \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0440\u0435\u0436\u0438\u043c. \u0429\u0440\u0430\u043a\u043d\u0435\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e, \u0437\u0430 \u0434\u0430 \u043f\u0440\u0435\u043c\u0438\u043d\u0435\u0442\u0435 \u0432 \u043e\u0431\u0438\u043a\u043d\u043e\u0432\u0435\u043d \u0440\u0435\u0436\u0438\u043c \u043d\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435. \u0421\u043b\u0435\u0434 \u043a\u0430\u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0449\u0435 \u0441\u0435 \u0432\u044a\u0440\u043d\u0435\u0442\u0435 \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u043d \u0440\u0435\u0436\u0438\u043c.","selectall_desc":"\u0418\u0437\u0431\u0435\u0440\u0438 \u0432\u0441\u0438\u0447\u043a\u0438","paste_word_desc":"\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043e\u0442 Word","paste_text_desc":"\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043a\u0430\u0442\u043e \u0442\u0435\u043a\u0441\u0442"},"paste_dlg":{"word_title":"\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 CTRL V \u043e\u0442 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0442\u0430, \u0437\u0430 \u0434\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446\u0430.","text_linebreaks":"\u0417\u0430\u043f\u0430\u0437\u0438 \u0437\u043d\u0430\u0446\u0438\u0442\u0435 \u0437\u0430 \u043d\u043e\u0432\u0438 \u0440\u0435\u0434\u043e\u0432\u0435","text_title":"\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 CTRL V \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0442\u0430, \u0437\u0430 \u0434\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446\u0430."},table:{cell:"\u041a\u043b\u0435\u0442\u043a\u0430",col:"\u041a\u043e\u043b\u043e\u043d\u0430",row:"\u0420\u0435\u0434",del:"\u0418\u0437\u0442\u0440\u0438\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0430","copy_row_desc":"\u041a\u043e\u043f\u0438\u0440\u0430\u0439 \u0440\u0435\u0434","cut_row_desc":"\u041e\u0442\u0440\u0435\u0436\u0438 \u0440\u0435\u0434","paste_row_after_desc":"\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u0440\u0435\u0434 \u0441\u043b\u0435\u0434","paste_row_before_desc":"\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u0440\u0435\u0434 \u043f\u0440\u0435\u0434\u0438","props_desc":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430","cell_desc":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430","row_desc":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0440\u0435\u0434\u0430","merge_cells_desc":"\u0421\u043b\u0435\u0439 \u043a\u043b\u0435\u0442\u043a\u0438","split_cells_desc":"\u0420\u0430\u0437\u0434\u0435\u043b\u0438 \u0441\u043b\u0435\u0442\u0438 \u043a\u043b\u0435\u0442\u043a\u0438","delete_col_desc":"\u0418\u0437\u0442\u0440\u0438\u0439 \u043a\u043e\u043b\u043e\u043d\u0430","col_after_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u043a\u043e\u043b\u043e\u043d\u0430 \u0441\u043b\u0435\u0434","col_before_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u043a\u043e\u043b\u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0438","delete_row_desc":"\u0418\u0437\u0442\u0440\u0438\u0439 \u0440\u0435\u0434","row_after_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u0440\u0435\u0434 \u0441\u043b\u0435\u0434","row_before_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u0440\u0435\u0434 \u043f\u0440\u0435\u0434\u0438",desc:"\u0412\u043c\u044a\u043a\u043d\u0438 \u043d\u043e\u0432\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"\u0412\u0441\u0438\u0447\u043a\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u0435\u043d\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0438 \u0449\u0435 \u0431\u044a\u0434\u0430\u0442 \u0437\u0430\u0433\u0443\u0431\u0435\u043d\u0438.\n\n\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u0432\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u0430\u043f\u0430\u0437\u0435\u043d\u043e\u0442\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435?.","restore_content":"\u0412\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u043f\u0430\u0437\u0435\u043d\u043e\u0442\u043e.","unload_msg":"\u041f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u043a\u043e\u0438\u0442\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0445\u0442\u0435 \u0449\u0435 \u0441\u0435 \u0437\u0430\u0433\u0443\u0431\u044f\u0442 \u0430\u043a\u043e \u043e\u0442\u0438\u0434\u0435\u0442\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430."},fullscreen:{desc:"\u0412\u043a\u043b./\u0418\u0437\u043a\u043b. \u0446\u044f\u043b \u0435\u043a\u0440\u0430\u043d"},media:{"delta_height":"\u0428\u0438\u0440\u0438\u043d\u0430","delta_width":"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430",edit:"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043c\u0435\u0434\u0438\u0430",desc:"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u0430"},fullpage:{desc:"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430","delta_width":"","delta_height":""},template:{desc:"\u0412\u043c\u044a\u043a\u043d\u0438 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435\u0442\u043e \u043d\u0430 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442"},visualchars:{desc:"\u0412\u043a\u043b./\u0418\u0437\u043a\u043b. \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0438."},spellchecker:{desc:"\u0412\u043a\u043b./\u0418\u0437\u043a\u043b. \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430",menu:"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u0442\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441","ignore_word":"\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0430\u0439 \u0434\u0443\u043c\u0430","ignore_words":"\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0430\u0439 \u0432\u0441\u0438\u0447\u043a\u0438",langs:"\u0415\u0437\u0438\u0446\u0438",wait:"\u041c\u043e\u043b\u044f \u0438\u0437\u0447\u0430\u043a\u0430\u0439\u0442\u0435...",sug:"\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f","no_sug":"\u041d\u044f\u043c\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f","no_mpell":"\u041d\u044f\u043c\u0430 \u0433\u0440\u0435\u0448\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438 \u0434\u0443\u043c\u0438.","learn_word":"\u041d\u0430\u0443\u0447\u0438 \u0434\u0443\u043c\u0430\u0442\u0430"},pagebreak:{desc:"\u0412\u043c\u044a\u043a\u043d\u0438 \u043d\u043e\u0432\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430."},advlist:{types:"\u0421\u0438\u043c\u0432\u043e\u043b\u0438",def:"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0438","lower_alpha":"\u041c\u0430\u043b\u043a\u0438 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438 \u0431\u0443\u043a\u0432\u0438","lower_greek":"\u041c\u0430\u043b\u043a\u0438 \u0433\u0440\u044a\u0446\u043a\u0438 \u0431\u0443\u043a\u0432\u0438","lower_roman":"\u041c\u0430\u043b\u043a\u0438 \u0440\u0438\u043c\u0441\u043a\u0438 \u0446\u0438\u0444\u0440\u0438","upper_alpha":"\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u0438 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438 \u0431\u0443\u043a\u0432\u0438","upper_roman":"\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u0438 \u0440\u0438\u043c\u0441\u043a\u0438 \u0446\u0438\u0444\u0440\u0438",circle:"\u041a\u0440\u044a\u0433",disc:"\u041e\u043a\u0440\u044a\u0436\u043d\u043e\u0441\u0442",square:"\u041a\u0432\u0430\u0434\u0440\u0430\u0442"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"\u041f\u043e\u043b\u0435 \u0437\u0430 \u0447\u0438\u0441\u0442 \u0442\u0435\u043a\u0441\u0442"},wordcount:{words:"\u0414\u0443\u043c\u0438:"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/cs.js b/webcit/tiny_mce/langs/cs.js
new file mode 100644 (file)
index 0000000..04cc44d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({cs:{common:{"more_colors":"Dal\u0161\u00ed barvy","invalid_data":"Chyba: Byly zad\u00e1ny neplatn\u00e9 hodnoty a tyto byly ozna\u010deny \u010derven\u011b.","popup_blocked":"Omlouv\u00e1me se, ale blokov\u00e1n\u00ed vyskakovac\u00edch oken neumo\u017enilo otev\u0159\u00edt okno, kter\u00e9 poskytuje funk\u010dnost aplikace. Pro pln\u00e9 vyu\u017eit\u00ed mo\u017enost\u00ed aplikace mus\u00edte vypnout blokov\u00e1n\u00ed vyskakovac\u00edch oken pro tento web.","clipboard_no_support":"Tato funkce nen\u00ed va\u0161\u00edm prohl\u00ed\u017ee\u010dem podporov\u00e1na. Pou\u017eijte m\u00edsto toho kl\u00e1vesov\u00e9 zkratky.","clipboard_msg":"Funkce kop\u00edrovat/vyjmout/vlo\u017eit nejsou podporovan\u00e9 v prohl\u00ed\u017ee\u010d\u00edch Mozilla a Firefox.\nChcete v\u00edce informac\u00ed o tomto probl\u00e9mu?","not_set":"- Nenastaveno -","class_name":"T\u0159\u00edda",browse:"Proch\u00e1zet",close:"Zav\u0159\u00edt",cancel:"Storno",update:"Aktualizovat",insert:"Vlo\u017eit",apply:"Pou\u017e\u00edt","edit_confirm":"Chcete pou\u017e\u00edt WYSIWYG re\u017eim pro tento text?","invalid_data_number":"{#field} mus\u00ed b\u00fdt \u010d\u00edslo","invalid_data_min":"{#field} mus\u00ed b\u00fdt \u010d\u00edslo v\u011bt\u0161\u00ed ne\u017e {#min}","invalid_data_size":"{#field} mus\u00ed b\u00fdt \u010d\u00edslo nebo v procentech",value:"(value)"},contextmenu:{full:"Do bloku",right:"Doprava",center:"Na st\u0159ed",left:"Doleva",align:"Zarovn\u00e1n\u00ed"},insertdatetime:{"day_short":"Ne,Po,\u00dat,St,\u010ct,P\u00e1,So,Ne","day_long":"Ned\u011ble,Pond\u011bl\u00ed,\u00dater\u00fd,St\u0159eda,\u010ctvrtek,P\u00e1tek,Sobota,Ned\u011ble","months_short":"Led,\u00dano,B\u0159e,Dub,Kv\u011b,\u010cer,\u010cvc,Srp,Z\u00e1\u0159,\u0158\u00edj,Lis,Pro","months_long":"Leden,\u00danor,B\u0159ezen,Duben,Kv\u011bten,\u010cerven,\u010cervenec,Srpen,Z\u00e1\u0159\u00ed,\u0158\u00edjen,Listopad,Prosinec","inserttime_desc":"Vlo\u017eit \u010das","insertdate_desc":"Vlo\u017eit datum","time_fmt":"%H:%M:%S","date_fmt":"%d.%m.%Y"},print:{"print_desc":"Tisk"},preview:{"preview_desc":"N\u00e1hled"},directionality:{"rtl_desc":"Sm\u011br zprava doleva","ltr_desc":"Sm\u011br zleva doprava"},layer:{content:"Nov\u00e1 vrstva...","absolute_desc":"P\u0159epnout na absolutn\u00ed pozicov\u00e1n\u00ed","backward_desc":"P\u0159esunout dozadu","forward_desc":"P\u0159esunout dop\u0159edu","insertlayer_desc":"Vlo\u017eit novou vrstvu"},save:{"save_desc":"Ulo\u017eit","cancel_desc":"Zru\u0161it v\u0161echny zm\u011bny"},nonbreaking:{"nonbreaking_desc":"Vlo\u017eit ned\u011blitelnou mezeru"},iespell:{download:"Slovn\u00edk ieSpell nebyl detekov\u00e1n. Chcete ho nainstalovat?","iespell_desc":"Spustit kontrolu pravopisu"},advhr:{"advhr_desc":"Vodorovn\u00fd odd\u011blova\u010d","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Emotikony","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Naj\u00edt/nahradit","search_desc":"Naj\u00edt","delta_width":"","delta_height":""},advimage:{"delta_width":"20","image_desc":"Vlo\u017eit/upravit obr\u00e1zek","delta_height":""},advlink:{"link_desc":"Vlo\u017eit/upravit odkaz","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Vlo\u017eit/upravit atributy","ins_desc":"P\u0159idan\u00fd text","del_desc":"Odstran\u011bn\u00fd text","acronym_desc":"Akronym","abbr_desc":"Zkratka","cite_desc":"Citace","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{"delta_width":"25",desc:"Upravit CSS styl","delta_height":""},paste:{"plaintext_mode":"Funkce vlo\u017eit je nyn\u00ed v re\u017eimu prost\u00fd text. Op\u011btovn\u00e9 kliknut\u00ed p\u0159epne tuto funkci zp\u011bt do norm\u00e1ln\u00edho re\u017eimu.","plaintext_mode_sticky":"Funkce vlo\u017eit je nyn\u00ed v re\u017eimu prost\u00fd text. Op\u011btovn\u00e9 kliknut\u00ed p\u0159epne tuto funkci zp\u011bt do norm\u00e1ln\u00edho re\u017eimu. Po vlo\u017een\u00ed \u010dehokoli bude tato funkce vr\u00e1cena zp\u011bt do norm\u00e1ln\u00edho re\u017eimu.","selectall_desc":"Vybrat v\u0161e","paste_word_desc":"Vlo\u017eit z Wordu","paste_text_desc":"Vlo\u017eit jako prost\u00fd text"},"paste_dlg":{"word_title":"Pou\u017eijte CTRL+V pro vlo\u017een\u00ed textu do okna.","text_linebreaks":"Zachovat zalamov\u00e1n\u00ed \u0159\u00e1dk\u016f","text_title":"Pou\u017eijte CTRL+V pro vlo\u017een\u00ed textu do okna."},table:{"table_delta_width":"50","cellprops_delta_width":"100",cell:"Bu\u0148ka",col:"Sloupec",row:"\u0158\u00e1dek",del:"Odstranit tabulku","copy_row_desc":"Kop\u00edrovat \u0159\u00e1dek tabulky","cut_row_desc":"Vyjmout \u0159\u00e1dek tabulky","paste_row_after_desc":"Vlo\u017eit \u0159\u00e1dek za","paste_row_before_desc":"Vlo\u017eit \u0159\u00e1dek p\u0159ed","props_desc":"Vlastnosti tabulky","cell_desc":"Vlastnosti bu\u0148ky","row_desc":"Vlastnosti \u0159\u00e1dku tabulky","merge_cells_desc":"Slou\u010dit bu\u0148ky","split_cells_desc":"Rozd\u011blit bu\u0148ky","delete_col_desc":"Odstranit sloupec tabulky","col_after_desc":"Vlo\u017eit sloupec za","col_before_desc":"Vlo\u017eit sloupec p\u0159ed","delete_row_desc":"Odstranit \u0159\u00e1dek tabulky","row_after_desc":"Vlo\u017eit \u0159\u00e1dek za","row_before_desc":"Vlo\u017eit \u0159\u00e1dek p\u0159ed",desc:"Vlo\u017eit novou tabulku","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","cellprops_delta_height":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Pokud obnov\u00edte ulo\u017een\u00fd obsah, ztrat\u00edte t\u00edm ve\u0161ker\u00fd obsah, kter\u00fd je pr\u00e1v\u011b v okn\u011b editoru.\n\nOpravdu chcete obnovit ulo\u017een\u00fd obsah?","restore_content":"Obnovit automaticky ulo\u017een\u00fd obsah.","unload_msg":"Proveden\u00e9 zm\u011bny mohou b\u00fdt ztraceny, jestli\u017ee opust\u00edte tuto str\u00e1nku."},fullscreen:{desc:"P\u0159epnout na celostr\u00e1nkov\u00e9 zobrazen\u00ed"},media:{"delta_width":"130",edit:"Upravit m\u00e9dia",desc:"Vlo\u017eit/upravit m\u00e9dia","delta_height":""},fullpage:{desc:"Vlastnosti dokumentu","delta_width":"110","delta_height":""},template:{desc:"Vlo\u017eit p\u0159eddefinovan\u00fd obsah ze \u0161ablony"},visualchars:{desc:"Zobrazen\u00ed skryt\u00fdch znak\u016f zap/vyp"},spellchecker:{desc:"P\u0159epnout kontrolu pravopisu",menu:"Nastaven\u00ed kontroly pravopisu","ignore_word":"Ignorovat slovo","ignore_words":"Ignorovat v\u0161e",langs:"Jazyky",wait:"\u010cekejte pros\u00edm...",sug:"N\u00e1pov\u011bda","no_sug":"\u017d\u00e1dn\u00e1 n\u00e1pov\u011bda","no_mpell":"Nebyly nalezeny \u017e\u00e1dn\u00e9 chyby.","learn_word":"Nau\u010dit slovo"},pagebreak:{desc:"Vlo\u017eit konec str\u00e1nky"},advlist:{types:"Typ",def:"V\u00fdchoz\u00ed","lower_alpha":"Mal\u00e1 p\u00edsmena","lower_greek":"Mal\u00e1 \u0159eck\u00e1 p\u00edsmena","lower_roman":"Mal\u00e9 \u0159\u00edmsk\u00e9 \u010d\u00edslice","upper_alpha":"Velk\u00e1 p\u00edsmena","upper_roman":"Velk\u00e9 \u0159\u00edmsk\u00e9 \u010d\u00edslice",circle:"Kole\u010dko",disc:"Punt\u00edk",square:"\u010ctvere\u010dek"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Oblast s form\u00e1tovan\u00fdm textem"},wordcount:{words:"Po\u010det slov: "}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/da.js b/webcit/tiny_mce/langs/da.js
new file mode 100644 (file)
index 0000000..60a6fe4
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({da:{common:{"more_colors":"Flere farver","invalid_data":"Fejl: Forkerte v\u00e6rdier indtastet i felter markeret med r\u00f8d.","popup_blocked":"Undskyld, men vi har noteret os, at din popup-blocker har forhindret et vindue, der giver programmet funktionalitet, at \u00e5bne op. Hvis du vil have  den fulde funktionalitet, m\u00e5 du sl\u00e5 popup-blockeren fra for dette websted.","clipboard_no_support":"P\u00e5 nuv\u00e6rende tidspunkt ikke supporteret af din browser. Anvend i stedet genvejene p\u00e5 tastaturet.","clipboard_msg":"Kopier/Klip/inds\u00e6t er ikke muligt i Mozilla eller Firefox.\nVil du have mere information om dette emne?","not_set":"-- Ikke sat --","class_name":"Klasse",browse:"Gennemse",close:"Luk",cancel:"Annuller",update:"Opdater",insert:"Inds\u00e6t",apply:"Anvend","edit_confirm":"Vil du bruge den avancerede tekstredigering?","invalid_data_number":"{#field} skal v\u00e6re et tal","invalid_data_min":"{#field} skal v\u00e6re et tal {#min}","invalid_data_size":"{#field} skal v\u00e6re et tal eller en procentsats",value:"(value)"},contextmenu:{full:"Lige marginer",right:"H\u00f8jre",center:"Centreret",left:"Venstre",align:"Justering"},insertdatetime:{"day_short":"S\u00f8n,Man,Tir,Ons,Tors,Fre,L\u00f8r,S\u00f8n","day_long":"S\u00f8ndag,Mandag,Tirsdag,Onsdag,Torsdag,Fredag,L\u00f8rdag,S\u00f8ndag","months_short":"Jan,Feb,Mar,Apr,Maj,Jun,Jul,Aug,Sep,Okt,Nov,Dec","months_long":"Januar,Februar,Marts,April,Maj,Juni,Juli,August,September,Oktober,November,December","inserttime_desc":"Inds\u00e6t klokkeslet","insertdate_desc":"Inds\u00e6t dato","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"Udskriv"},preview:{"preview_desc":"Vis udskrift"},directionality:{"rtl_desc":"Retning h\u00f8jre mod venstre","ltr_desc":"Retning venstre mod h\u00f8jre"},layer:{content:"Nyt lag...","absolute_desc":"Sl\u00e5 absolut positionering til/fra","backward_desc":"Flyt bagud","forward_desc":"Flyt fremad","insertlayer_desc":"Inds\u00e6t nyt lag"},save:{"save_desc":"Gem","cancel_desc":"Annuller alle \u00e6ndringer"},nonbreaking:{"nonbreaking_desc":"Inds\u00e6t et blanktegn"},iespell:{download:"ieSpell blev ikke fundet. Vil du installere det nu?","iespell_desc":"Udf\u00f8r stavekontrol"},advhr:{"advhr_desc":"Horisontal linie","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Hum\u00f8rikoner","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"S\u00f8g/erstat","search_desc":"S\u00f8g","delta_width":"","delta_height":""},advimage:{"image_desc":"Inds\u00e6t/rediger billede","delta_width":"","delta_height":""},advlink:{"delta_width":"40","link_desc":"Inds\u00e6t/rediger link","delta_height":""},xhtmlxtras:{"attribs_desc":"Inds\u00e6t/rediger attributter","ins_desc":"Inds\u00e6ttelse","del_desc":"Sletning","acronym_desc":"Akronym","abbr_desc":"Forkortelse","cite_desc":"Citat","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Rediger CSS stil","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Inds\u00e6t er nu i ikke-formateret modus. Klik igen for at skfite tilbage til almindelig inds\u00e6t modus.","plaintext_mode_sticky":"Inds\u00e6t er nu i ikke-formateret modus. Klik igen for at skfite tilbage til almindelig inds\u00e6t modus. Efter du har indsat noget s\u00e6ttes du automatisk tilbaeg til alminde inds\u00e6t modus.","selectall_desc":"V\u00e6lg alle","paste_word_desc":"Inds\u00e6t fra  Word","paste_text_desc":"Inds\u00e6t ikke-formatteret tekst"},"paste_dlg":{"word_title":"Anvend CTRL+V p\u00e5 tastaturet for at inds\u00e6tte teksten.","text_linebreaks":"Bevar linieskift","text_title":"Anvend CTRL+V p\u00e5 tastaturet for at inds\u00e6tte teksten."},table:{cell:"Celle",col:"Kolonne",row:"R\u00e6kke",del:"Slet tabel","copy_row_desc":"Kopier r\u00e6kke","cut_row_desc":"Klip r\u00e6kke","paste_row_after_desc":"Inds\u00e6t r\u00e6kke efter","paste_row_before_desc":"Inds\u00e6t r\u00e6kke f\u00f8r","props_desc":"Tabelegenskaber","cell_desc":"Celleegenskaber","row_desc":"R\u00e6kkeegenskaber","merge_cells_desc":"Flet celler","split_cells_desc":"Opdel flettede celler","delete_col_desc":"Slet kolonne","col_after_desc":"Inds\u00e6t kolonne efter","col_before_desc":"Inds\u00e6t kolonne f\u00f8r","delete_row_desc":"Slet r\u00e6kke","row_after_desc":"Inds\u00e6t r\u00e6kke efter","row_before_desc":"Inds\u00e6t r\u00e6kke f\u00f8r",desc:"Inds\u00e6t tabel","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Hvis du genskaber det gemte indhold vil du miste al det indhold der lige nu er i editoren.nnEr du sikker p\u00e5 du vil genskabe det gemte indhold?","restore_content":"Genskab det gemte indhold.","unload_msg":"Har du foretaget nogle \u00e6ndringer, vil de g\u00e5 tabt, hvis du navigerer v\u00e6k fra denne side."},fullscreen:{desc:"Vis/skjul fuldsk\u00e6rmstilstand"},media:{edit:"Rediger indlejret mediefil",desc:"Inds\u00e6t/rediger indlejret mediefil","delta_height":"","delta_width":""},fullpage:{desc:"Dokumentegenskaber","delta_width":"","delta_height":""},template:{desc:"Inds\u00e6t pr\u00e6defineret skabelonindhold"},visualchars:{desc:"Vis/Skjul visuelle kontroltegn."},spellchecker:{desc:"Vis/skjul stavekontrol",menu:"Indstillinger for stavekontrol","ignore_word":"Ignorer ord","ignore_words":"Ignorer alle",langs:"Sprog",wait:"Vent venligst...",sug:"Forslag","no_sug":"Ingen forslag","no_mpell":"Ingen stavefejl fundet.","learn_word":"L\u00e6r ordet"},pagebreak:{desc:"Inds\u00e6t sideskift."},advlist:{types:"Typer",def:"Standard","lower_alpha":"Sm\u00e5 alfa","lower_greek":"Sm\u00e5 gr\u00e6ske","lower_roman":"Sm\u00e5 romertal","upper_alpha":"Store alfa","upper_roman":"Store romertal",circle:"Cirkel",disc:"Prik",square:"Firkant"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Tekstomr\u00e5de med formatering"},wordcount:{words:"Ord:"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/de.js b/webcit/tiny_mce/langs/de.js
new file mode 100644 (file)
index 0000000..1494406
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({de:{common:{"more_colors":"Weitere Farben","invalid_data":"Fehler: Sie haben ung\u00fcltige Werte eingegeben (rot markiert).","popup_blocked":"Leider hat Ihr Popup-Blocker ein Fenster unterbunden, das f\u00fcr den Betrieb dieses Programms n\u00f6tig ist. Bitte deaktivieren Sie den Popup-Blocker f\u00fcr diese Seite.","clipboard_no_support":"Wird derzeit in Ihrem Browser nicht unterst\u00fctzt. Bitte benutzen Sie stattdessen die Tastenk\u00fcrzel.","clipboard_msg":"Kopieren, Ausschneiden und Einf\u00fcgen sind im Mozilla Firefox nicht m\u00f6glich.\nM\u00f6chten Sie mehr \u00fcber dieses Problem erfahren?","not_set":"- unbestimmt -","class_name":"CSS-Klasse",browse:"Durchsuchen",close:"Schlie\u00dfen",cancel:"Abbrechen",update:"Aktualisieren",insert:"Einf\u00fcgen",apply:"\u00dcbernehmen","edit_confirm":"M\u00f6chten Sie diesen Text jetzt bearbeiten?","invalid_data_number":"{#field} muss eine Zahl sein","invalid_data_min":"{#field} muss eine Zahl gr\u00f6\u00dfer als {#min} sein","invalid_data_size":"{#field} muss eine Zahl oder ein Prozentwert sein",value:"(Wert)"},contextmenu:{full:"Blocksatz",right:"Rechtsb\u00fcndig",center:"Zentriert",left:"Linksb\u00fcndig",align:"Ausrichtung"},insertdatetime:{"day_short":"So,Mo,Di,Mi,Do,Fr,Sa,So","day_long":"Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag","months_short":"Jan,Feb,M\u00e4r,Apr,Mai,Juni,Juli,Aug,Sept,Okt,Nov,Dez","months_long":"Januar,Februar,M\u00e4rz,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember","inserttime_desc":"Zeit einf\u00fcgen","insertdate_desc":"Datum einf\u00fcgen","time_fmt":"%H:%M:%S","date_fmt":"%d.%m.%Y"},print:{"print_desc":"Drucken"},preview:{"preview_desc":"Vorschau"},directionality:{"rtl_desc":"Schrift von rechts nach links","ltr_desc":"Schrift von links nach rechts"},layer:{content:"Neue Ebene...","absolute_desc":"Absolute Positionierung","backward_desc":"Nach hinten legen","forward_desc":"Nach vorne holen","insertlayer_desc":"Neue Ebene einf\u00fcgen"},save:{"save_desc":"Speichern","cancel_desc":"Alle \u00c4nderungen verwerfen"},nonbreaking:{"nonbreaking_desc":"Gesch\u00fctztes Leerzeichen einf\u00fcgen"},iespell:{download:"ieSpell konnte nicht gefunden werden. Wollen Sie es installieren?","iespell_desc":"Rechtschreibpr\u00fcfung"},advhr:{"advhr_desc":"Trennlinie","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Smilies","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Suchen/Ersetzen","search_desc":"Suchen","delta_width":"","delta_height":""},advimage:{"image_desc":"Bild einf\u00fcgen/ver\u00e4ndern","delta_width":"","delta_height":""},advlink:{"link_desc":"Link einf\u00fcgen/ver\u00e4ndern","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Attribute einf\u00fcgen/bearbeiten","ins_desc":"Eingef\u00fcgter Text","del_desc":"Entfernter Text","acronym_desc":"Akronym","abbr_desc":"Abk\u00fcrzung","cite_desc":"Quellenangabe","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"CSS-Styles bearbeiten","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Einf\u00fcgemodus ist nun \"Nur Text\". Erneut klicken stellt den Normalmodus wieder her.","plaintext_mode_sticky":"Einf\u00fcgemodus ist nun \"Nur Text\". Erneut klicken (oder das Einf\u00fcgen aus der Zwischenablage) stellt den Normalmodus wieder her.","selectall_desc":"Alles ausw\u00e4hlen","paste_word_desc":"Mit Formatierungen (aus Word) einf\u00fcgen","paste_text_desc":"Als einfachen Text einf\u00fcgen"},"paste_dlg":{"word_title":"Dr\u00fccken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00fcgen.","text_linebreaks":"Zeilenumbr\u00fcche beibehalten","text_title":"Dr\u00fccken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00fcgen."},table:{"cellprops_delta_width":"150",cell:"Zelle",col:"Spalte",row:"Zeile",del:"Tabelle l\u00f6schen","copy_row_desc":"Zeile kopieren","cut_row_desc":"Zeile ausschneiden","paste_row_after_desc":"Zeile unterhalb aus der Zwischenablage einf\u00fcgen","paste_row_before_desc":"Zeile oberhalb aus der Zwischenablage einf\u00fcgen","props_desc":"Eigenschaften der Tabelle","cell_desc":"Eigenschaften der Zelle","row_desc":"Eigenschaften der Zeile","merge_cells_desc":"Zellen verbinden","split_cells_desc":"Verbundene Zellen trennen","delete_col_desc":"Spalte l\u00f6schen","col_after_desc":"Spalte rechts einf\u00fcgen","col_before_desc":"Spalte links einf\u00fcgen","delete_row_desc":"Zeile l\u00f6schen","row_after_desc":"Zeile unterhalb einf\u00fcgen","row_before_desc":"Zeile oberhalb einf\u00fcgen",desc:"Tabelle erstellen/bearbeiten","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Wenn Sie den Inhalt wiederherstellen, gehen die aktuellen Daten im Editor verloren.\n\nSind sie sicher, dass Sie den Inhalt wiederherstellen m\u00f6chten?","restore_content":"Automatisch gespeicherten Inhalt wiederherstellen.","unload_msg":"Ihre \u00c4nderungen werden verloren gehen, wenn Sie die Seite verlassen."},fullscreen:{desc:"Vollbildschirm"},media:{edit:"Multimediaeinbettung bearbeiten",desc:"Multimedia einbetten/bearbeiten","delta_height":"","delta_width":""},fullpage:{desc:"Dokument-Eigenschaften","delta_width":"","delta_height":""},template:{desc:"Inhalt aus Vorlage einf\u00fcgen"},visualchars:{desc:"Sichtbarkeit der Steuerzeichen an/aus"},spellchecker:{desc:"Rechtschreibpr\u00fcfung an/aus",menu:"Einstellungen der Rechtschreibpr\u00fcfung","ignore_word":"Wort ignorieren","ignore_words":"Alle ignorieren",langs:"Sprachen",wait:"Bitte warten...",sug:"Vorschl\u00e4ge","no_sug":"Keine Vorschl\u00e4ge","no_mpell":"Keine Rechtschreibfehler gefunden.","learn_word":"Zum W\u00f6rterbuch hinzuf\u00fcgen"},pagebreak:{desc:"Seitenumbruch einf\u00fcgen"},advlist:{types:"Typen",def:"Standard","lower_alpha":"a. b. c.","lower_greek":"1. 2. 3.","lower_roman":"i. ii. iii.","upper_alpha":"A. B. C.","upper_roman":"I. II. III.",circle:"Kreis",disc:"Punkt",square:"Quadrat"},colors:{"333300":"Dunkeloliv","993300":"Orange","000000":"Schwarz","003300":"Dunkelgr\u00fcn","003366":"Dunkles himmelblau","000080":"Marineblau","333399":"Indigoblau","333333":"Sehr dunkelgrau","800000":"Kastanienbraun",FF6600:"Orange","808000":"Oliv","008000":"Gr\u00fcn","008080":"Blaugr\u00fcn","0000FF":"Blau","666699":"Graublau","808080":"Grau",FF0000:"Rot",FF9900:"Bernsteinfarben","99CC00":"Gelbgr\u00fcn","339966":"Meergr\u00fcn","33CCCC":"T\u00fcrkis","3366FF":"K\u00f6nigsblau","800080":"Violett","999999":"Mittelgrau",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Gelb","00FF00":"Hellgr\u00fcn","00FFFF":"Aquamarinblau","00CCFF":"Himmelblau","993366":"Braun",C0C0C0:"Silber",FF99CC:"Rosa",FFCC99:"Pfirsichfarben",FFFF99:"Hellgelb",CCFFCC:"Blassgr\u00fcn",CCFFFF:"Blasst\u00fcrkis","99CCFF":"Helles himmelblau",CC99FF:"Pflaumenblau",FFFFFF:"Wei\u00df"},aria:{"rich_text_area":"Rich Text Bereich"},wordcount:{words:"W\u00f6rter: "}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/el.js b/webcit/tiny_mce/langs/el.js
new file mode 100644 (file)
index 0000000..ac22f0a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({el:{common:{"more_colors":"\u03a0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b1 \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1","invalid_data":"Error: Invalid values entered, these are marked in red.","popup_blocked":"\u0388\u03bd\u03b1 popup-blocker \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03b9 \u03ad\u03bd\u03b1 \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03bf \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae. \u03a0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c4\u03bf \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b9\u03c3\u03c4\u03bf\u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03b1\u03c5\u03c4\u03ae \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c0\u03bb\u03ae\u03c1\u03c9\u03c2 \u03c4\u03b7\u03bd \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae.","clipboard_no_support":"\u0394\u03b5\u03bd \u03c5\u03c0\u03bf\u03c3\u03c4\u03b7\u03c1\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c6\u03c5\u03bb\u03bb\u03bf\u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ae \u03c3\u03b1\u03c2, \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03c3\u03c5\u03bd\u03c4\u03bf\u03bc\u03b5\u03cd\u03c3\u03b5\u03b9\u03c2 \u03c0\u03bb\u03b7\u03ba\u03c4\u03c1\u03bf\u03bb\u03bf\u03b3\u03af\u03bf\u03c5.","clipboard_msg":"\u039f\u03b9 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b5\u03c2 \u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae/\u0391\u03c0\u03bf\u03ba\u03bf\u03c0\u03ae/\u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b5\u03c2 \u03c3\u03b5 Mozilla \u03ba\u03b1\u03b9 Firefox.\n\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 ;","not_set":"-- \u039c\u03b7 \u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf --","class_name":"\u039a\u03bb\u03ac\u03c3\u03b7",browse:"\u0395\u03cd\u03c1\u03b5\u03c3\u03b7",close:"\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf",cancel:"\u0386\u03ba\u03c5\u03c1\u03bf",update:"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7",insert:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae",apply:"\u0395\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae","edit_confirm":"\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 WYSIWYG ;","invalid_data_number":"{#field} \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2","invalid_data_min":"{#field} \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03bc\u03b5\u03b3\u03b1\u03bb\u03cd\u03c4\u03b5\u03c1\u03bf\u03c2 \u03c4\u03bf\u03c5 {#min}","invalid_data_size":"{#field} \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03ae \u03c0\u03bf\u03c3\u03bf\u03c3\u03c4\u03cc",value:"(value)"},contextmenu:{full:"\u03a0\u03bb\u03ae\u03c1\u03b7\u03c2",right:"\u0394\u03b5\u03be\u03b9\u03ac",center:"\u039a\u03ad\u03bd\u03c4\u03c1\u03bf",left:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",align:"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7"},insertdatetime:{"day_short":"\u039a\u03c5,\u0394\u03b5,\u03a4\u03c1,\u03a4\u03b5\u03c4,\u03a0\u03ad\u03bc,\u03a0\u03b1\u03c1,\u03a3\u03b1\u03b2","day_long":"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae,\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1,\u03a4\u03c1\u03af\u03c4\u03b7,\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7,\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7,\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae,\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf","months_short":"\u0399\u03b1\u03bd,\u03a6\u03b5\u03b2,\u039c\u03ac\u03c1,\u0391\u03c0\u03c1,\u039c\u03ac\u03b9,\u0399\u03bf\u03cd\u03bd,\u0399\u03bf\u03cd\u03bb,\u0391\u03cd\u03b3,\u03a3\u03b5\u03c0,\u039f\u03ba\u03c4,\u039d\u03bf\u03ad,\u0394\u03b5\u03ba","months_long":"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2,\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2,\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2,\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2,\u039c\u03ac\u03b9\u03bf\u03c2,\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2,\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2,\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2,\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2,\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2,\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2,\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2","inserttime_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03ce\u03c1\u03b1\u03c2","insertdate_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b7\u03bc\u03ad\u03c1\u03b1\u03c2","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"\u0395\u03ba\u03c4\u03cd\u03c0\u03c9\u03c3\u03b7"},preview:{"preview_desc":"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7"},directionality:{"rtl_desc":"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b4\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","ltr_desc":"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac"},layer:{content:"\u039d\u03ad\u03bf layer...","absolute_desc":"\u0391\u03c0\u03cc\u03bb\u03c5\u03c4\u03b7/\u03a3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ae \u03c4\u03bf\u03c0\u03bf\u03b8\u03ad\u03c4\u03b7\u03c3\u03b7","backward_desc":"\u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03c3\u03c4\u03bf \u03c0\u03b1\u03c1\u03b1\u03c3\u03ba\u03ae\u03bd\u03b9\u03bf","forward_desc":"\u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03c3\u03c4\u03bf \u03c0\u03c1\u03bf\u03c3\u03ba\u03ae\u03bd\u03b9\u03bf","insertlayer_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03bd\u03ad\u03bf\u03c5 layer"},save:{"save_desc":"\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7","cancel_desc":"\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03b1\u03bb\u03bb\u03b1\u03b3\u03ce\u03bd"},nonbreaking:{"nonbreaking_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae non-breaking \u03ba\u03b5\u03bd\u03bf\u03cd \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b1"},iespell:{download:"\u03a4\u03bf ieSpell \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5. \u039d\u03b1 \u03ba\u03b1\u03c4\u03ad\u03b2\u03b5\u03b9 \u03c4\u03ce\u03c1\u03b1 ;","iespell_desc":"\u0395\u03ba\u03c4\u03ad\u03bb\u03b5\u03c3\u03b7 \u03b5\u03bb\u03ad\u03b3\u03c7\u03bf\u03c5 \u03bf\u03c1\u03b8\u03bf\u03b3\u03c1\u03b1\u03c6\u03af\u03b1\u03c2"},advhr:{"advhr_desc":"\u039f\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae","delta_height":"","delta_width":""},emotions:{"emotions_desc":"\u03a3\u03c5\u03bd\u03b1\u03b9\u03c3\u03b8\u03ae\u03bc\u03b1\u03c4\u03b1","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"\u0395\u03cd\u03c1\u03b5\u03c3\u03b7/\u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7","search_desc":"\u0395\u03cd\u03c1\u03b5\u03c3\u03b7","delta_width":"","delta_height":""},advimage:{"image_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2","delta_width":"","delta_height":""},advlink:{"delta_width":"50","link_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5","delta_height":""},xhtmlxtras:{"attribs_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b9\u03b4\u03b9\u03bf\u03c4\u03ae\u03c4\u03c9\u03bd","ins_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae","del_desc":"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae","acronym_desc":"\u0391\u03ba\u03c1\u03bf\u03bd\u03cd\u03bc\u03b9\u03bf","abbr_desc":"\u03a3\u03c5\u03bd\u03c4\u03bf\u03bc\u03bf\u03b3\u03c1\u03b1\u03c6\u03af\u03b1","cite_desc":"Citation","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03a3\u03c4\u03c5\u03bb CSS","delta_height":"","delta_width":""},paste:{"selectall_desc":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03cc\u03bb\u03c9\u03bd","paste_word_desc":"\u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03b1\u03c0\u03cc \u03c4\u03bf Word","paste_text_desc":"\u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03c9\u03c2 \u03b1\u03c0\u03bb\u03cc \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf","plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode_sticky":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode."},"paste_dlg":{"word_title":"\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 CTRL+V \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b5\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf.","text_linebreaks":"\u039d\u03b1 \u03ba\u03c1\u03b1\u03c4\u03b7\u03b8\u03bf\u03cd\u03bd \u03c4\u03b1 linebreaks","text_title":"\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 CTRL+V \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b5\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf."},table:{"cellprops_delta_width":"60",cell:"\u039a\u03b5\u03bb\u03af",col:"\u03a3\u03c4\u03ae\u03bb\u03b7",row:"\u0393\u03c1\u03b1\u03bc\u03bc\u03ae",del:"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","copy_row_desc":"\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","cut_row_desc":"\u0391\u03c0\u03bf\u03ba\u03bf\u03c0\u03ae \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","paste_row_after_desc":"\u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1 \u03bc\u03b5\u03c4\u03ac","paste_row_before_desc":"\u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1 \u03c0\u03c1\u03b9\u03bd","props_desc":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","cell_desc":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03ba\u03b5\u03bb\u03b9\u03bf\u03cd \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","row_desc":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","merge_cells_desc":"\u03a3\u03c5\u03b3\u03c7\u03ce\u03bd\u03b5\u03c5\u03c3\u03b7 \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","split_cells_desc":"\u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c3\u03c5\u03b3\u03c7\u03c9\u03bd\u03b5\u03c5\u03bc\u03ad\u03bd\u03c9\u03bd \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","delete_col_desc":"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03c4\u03ae\u03bb\u03b7\u03c2","col_after_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c3\u03c4\u03ae\u03bb\u03b7\u03c2 \u03bc\u03b5\u03c4\u03ac","col_before_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c3\u03c4\u03ae\u03bb\u03b7\u03c2 \u03c0\u03c1\u03b9\u03bd","delete_row_desc":"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2","row_after_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03bc\u03b5\u03c4\u03ac","row_before_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c0\u03c1\u03b9\u03bd",desc:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03bd\u03ad\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"\u0395\u03ac\u03bd \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c4\u03bf \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf, \u03b8\u03b1 \u03c7\u03ac\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf \u03c0\u03bf\u03c5 \u03b2\u03c1\u03af\u03c3\u03ba\u03b5\u03c4\u03b1\u03b9 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae \u03c3\u03c4\u03bf\u03bd editor.nn\u03a3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c4\u03bf\u03c5 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5;.","restore_content":"\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c0\u03bf\u03c5 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03b8\u03b7\u03ba\u03b5 \u03b1\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b1.","unload_msg":"\u039f\u03b9 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2 \u03c0\u03bf\u03c5 \u03ba\u03ac\u03bd\u03b1\u03c4\u03b5 \u03b8\u03b1 \u03c7\u03b1\u03b8\u03bf\u03cd\u03bd \u03b1\u03bd \u03c6\u03cd\u03b3\u03b5\u03c4\u03b5 \u03c3\u03b5 \u03ac\u03bb\u03bb\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1."},fullscreen:{desc:"\u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03c0\u03bb\u03ae\u03c1\u03bf\u03c5\u03c2 \u03bf\u03b8\u03cc\u03bd\u03b7\u03c2"},media:{"delta_width":"50",edit:"\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd media",desc:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd media","delta_height":""},fullpage:{desc:"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03b5\u03b3\u03b3\u03c1\u03ac\u03c6\u03bf\u03c5","delta_width":"140","delta_height":""},template:{desc:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5 \u03b3\u03b9\u03b1 \u03c0\u03c1\u03bf\u03ba\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03c0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf"},visualchars:{desc:"\u039f\u03c0\u03c4\u03b9\u03ba\u03bf\u03af \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b5\u03c2 \u03b5\u03bb\u03ad\u03b3\u03c7\u03bf\u03c5 \u03bd\u03b1\u03b9/\u03cc\u03c7\u03b9."},spellchecker:{desc:"\u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03bf\u03c1\u03b8\u03bf\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03bf\u03cd \u03b5\u03bb\u03ad\u03b3\u03c7\u03bf\u03c5",menu:"\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03bf\u03c1\u03b8\u03bf\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03bf\u03cd \u03b5\u03bb\u03ad\u03b3\u03c7\u03bf\u03c5","ignore_word":"\u03a0\u03b1\u03c1\u03ac\u03b2\u03bb\u03b5\u03c8\u03b7 \u03bb\u03ad\u03be\u03b7\u03c2","ignore_words":"\u03a0\u03b1\u03c1\u03ac\u03b2\u03bb\u03b5\u03c8\u03b7 \u03cc\u03bb\u03c9\u03bd",langs:"\u0393\u03bb\u03ce\u03c3\u03c3\u03b5\u03c2",wait:"\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c0\u03b5\u03c1\u03b9\u03bc\u03ad\u03bd\u03b5\u03c4\u03b5...",sug:"\u03a0\u03c1\u03bf\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2","no_sug":"\u03a7\u03c9\u03c1\u03af\u03c2 \u03c0\u03c1\u03bf\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2","no_mpell":"\u0394\u03b5 \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03bf\u03c1\u03b8\u03bf\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03ac \u03bb\u03ac\u03b8\u03b7.","learn_word":"\u0395\u03ba\u03bc\u03ac\u03b8\u03b7\u03c3\u03b7 \u03bb\u03ad\u03be\u03b7\u03c2"},pagebreak:{desc:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1\u03c2."},advlist:{types:"Types",def:"Default","lower_alpha":"Lower Alpha","lower_greek":"Lower Greek","lower_roman":"Lower Roman","upper_alpha":"Upper Alpha","upper_roman":"Upper Roman",circle:"Circle",disc:"Disc",square:"Square"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Rich Text Area"},wordcount:{words:"\u039b\u03ad\u03be\u03b5\u03b9\u03c2:"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/en.js b/webcit/tiny_mce/langs/en.js
new file mode 100644 (file)
index 0000000..0b8ebc0
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({en:{common:{"more_colors":"More Colors...","invalid_data":"Error: Invalid values entered, these are marked in red.","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.","clipboard_no_support":"Currently not supported by your browser, use keyboard shortcuts instead.","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","not_set":"-- Not Set --","class_name":"Class",browse:"Browse",close:"Close",cancel:"Cancel",update:"Update",insert:"Insert",apply:"Apply","edit_confirm":"Do you want to use the WYSIWYG mode for this textarea?","invalid_data_number":"{#field} must be a number","invalid_data_min":"{#field} must be a number greater than {#min}","invalid_data_size":"{#field} must be a number or percentage",value:"(value)"},contextmenu:{full:"Full",right:"Right",center:"Center",left:"Left",align:"Alignment"},insertdatetime:{"day_short":"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun","day_long":"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","months_short":"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec","months_long":"January,February,March,April,May,June,July,August,September,October,November,December","inserttime_desc":"Insert Time","insertdate_desc":"Insert Date","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"Print"},preview:{"preview_desc":"Preview"},directionality:{"rtl_desc":"Direction Right to Left","ltr_desc":"Direction Left to Right"},layer:{content:"New layer...","absolute_desc":"Toggle Absolute Positioning","backward_desc":"Move Backward","forward_desc":"Move Forward","insertlayer_desc":"Insert New Layer"},save:{"save_desc":"Save","cancel_desc":"Cancel All Changes"},nonbreaking:{"nonbreaking_desc":"Insert Non-Breaking Space Character"},iespell:{download:"ieSpell not detected. Do you want to install it now?","iespell_desc":"Check Spelling"},advhr:{"delta_height":"","delta_width":"","advhr_desc":"Insert Horizontal Line"},emotions:{"delta_height":"","delta_width":"","emotions_desc":"Emotions"},searchreplace:{"replace_desc":"Find/Replace","delta_width":"","delta_height":"","search_desc":"Find"},advimage:{"delta_width":"","image_desc":"Insert/Edit Image","delta_height":""},advlink:{"delta_height":"","delta_width":"","link_desc":"Insert/Edit Link"},xhtmlxtras:{"attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":"","attribs_desc":"Insert/Edit Attributes","ins_desc":"Insertion","del_desc":"Deletion","acronym_desc":"Acronym","abbr_desc":"Abbreviation","cite_desc":"Citation"},style:{"delta_height":"","delta_width":"",desc:"Edit CSS Style"},paste:{"plaintext_mode_stick":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"Select All","paste_word_desc":"Paste from Word","paste_text_desc":"Paste as Plain Text"},"paste_dlg":{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."},table:{"merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":"",cell:"Cell",col:"Column",row:"Row",del:"Delete Table","copy_row_desc":"Copy Table Row","cut_row_desc":"Cut Table Row","paste_row_after_desc":"Paste Table Row After","paste_row_before_desc":"Paste Table Row Before","props_desc":"Table Properties","cell_desc":"Table Cell Properties","row_desc":"Table Row Properties","merge_cells_desc":"Merge Table Cells","split_cells_desc":"Split Merged Table Cells","delete_col_desc":"Delete Column","col_after_desc":"Insert Column After","col_before_desc":"Insert Column Before","delete_row_desc":"Delete Row","row_after_desc":"Insert Row After","row_before_desc":"Insert Row Before",desc:"Insert/Edit Table"},autosave:{"warning_message":"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?","restore_content":"Restore auto-saved content.","unload_msg":"The changes you made will be lost if you navigate away from this page."},fullscreen:{desc:"Toggle Full Screen Mode"},media:{"delta_height":"","delta_width":"",edit:"Edit Embedded Media",desc:"Insert/Edit Embedded Media"},fullpage:{desc:"Document Properties","delta_width":"","delta_height":""},template:{desc:"Insert Predefined Template Content"},visualchars:{desc:"Show/Hide Visual Control Characters"},spellchecker:{desc:"Toggle Spell Checker",menu:"Spell Checker Settings","ignore_word":"Ignore Word","ignore_words":"Ignore All",langs:"Languages",wait:"Please wait...",sug:"Suggestions","no_sug":"No Suggestions","no_mpell":"No misspellings found.","learn_word":"Learn word"},pagebreak:{desc:"Insert Page Break for Printing"},advlist:{types:"Types",def:"Default","lower_alpha":"Lower Alpha","lower_greek":"Lower Greek","lower_roman":"Lower Roman","upper_alpha":"Upper Alpha","upper_roman":"Upper Roman",circle:"Circle",disc:"Disc",square:"Square"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Rich Text Area"},wordcount:{words:"Words"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/es.js b/webcit/tiny_mce/langs/es.js
new file mode 100644 (file)
index 0000000..b2b477e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({es:{common:{"more_colors":"M\u00e1s colores","invalid_data":"Error: Introdujo un valor no v\u00e1lido, est\u00e1n marcados en rojo.","popup_blocked":"Lo sentimos, su bloqueo de ventanas emergentes ha deshabilitado una ventana que provee funcionalidades a la aplicaci\u00f3n. Necesita deshabilitar este bloqueo en este sitio para poder utilizar todas las funciones.","clipboard_no_support":"Su navegador no soporta las funciones de cortapapeles, use los accesos por teclado.","clipboard_msg":"Copiar/Cortar/Pegar no se encuentra disponible en Mozilla y Firefox.\n \u00bfDesea obtener m\u00e1s informaci\u00f3n acerca de este tema?","not_set":"-- Ninguno --","class_name":"Clase",browse:"Examinar",close:"Cerrar",cancel:"Cancelar",update:"Actualizar",insert:"Insertar",apply:"Aplicar","edit_confirm":" \u00bfDesea utilizar el modo WYSIWYG para esta caja de texto?","invalid_data_number":"{#field} debe ser un n\u00famero","invalid_data_min":"{#field} debe ser un n\u00famero mayor que {#min}","invalid_data_size":"{#field} debe ser un n\u00famero o tanto por ciento",value:"(value)"},contextmenu:{full:"Justificado",right:"Derecha",center:"Centrado",left:"Izquierda",align:"Alineaci\u00f3n"},insertdatetime:{"day_short":"Dom,Lun,Mar,Mie,Jue,Vie,Sab,Dom","day_long":"Domingo,Lunes,Martes,Mi\u00e9rcoles,Jueves,Viernes,S\u00e1bado,Domingo","months_short":"Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic","months_long":"Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre","inserttime_desc":"Insertar hora","insertdate_desc":"Insertar fecha","time_fmt":"%H:%M:%S","date_fmt":"%d-%m-%Y"},print:{"print_desc":"Imprimir"},preview:{"preview_desc":"Vista previa"},directionality:{"rtl_desc":"Direcci\u00f3n derecha a izquierda","ltr_desc":"Direcci\u00f3n izquierda a derecha"},layer:{content:"Nueva capa...","absolute_desc":"Cambiar a posici\u00f3n absoluta","backward_desc":"Retroceder","forward_desc":"Avanzar","insertlayer_desc":"Insertar nueva capa"},save:{"save_desc":"Guardar","cancel_desc":"Cancelar todos los cambios"},nonbreaking:{"nonbreaking_desc":"Insertar caracter de espacio \'non-breaking\'"},iespell:{download:"No se detect\u00f3 \'ieSpell\'.  \u00bfDesea instalarlo ahora?","iespell_desc":"Corrector ortogr\u00e1fico"},advhr:{"advhr_desc":"Regla horizontal","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Emoticones","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Buscar/Reemplazar","search_desc":"Buscar","delta_width":"","delta_height":""},advimage:{"image_desc":"Insertar/editar imagen","delta_width":"","delta_height":""},advlink:{"link_desc":"Insertar/editar hiperv\u00ednculo","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Insertar/Editar atributos","ins_desc":"Inserci\u00f3n","del_desc":"Borrado","acronym_desc":"Acr\u00f3nimo","abbr_desc":"Abreviatura","cite_desc":"Cita","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Editar Estilo CSS","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode_sticky":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"Elegir todo","paste_word_desc":"Pegar desde Word","paste_text_desc":"Pegar como texto plano"},"paste_dlg":{"word_title":"Use CTRL+V en su teclado para pegar el texto en la ventana.","text_linebreaks":"Keep linebreaks","text_title":"Use CTRL+V en su teclado para pegar el texto en la ventana."},table:{cell:"Celda",col:"Columna",row:"Fila",del:"Eliminar tabla","copy_row_desc":"Copiar fila","cut_row_desc":"Cortar fila","paste_row_after_desc":"Pegar filas (despu\u00e9s)","paste_row_before_desc":"Pegar filas (antes)","props_desc":"Propiedades de la tabla","cell_desc":"Propiedades de la celda","row_desc":"Propiedades de la fila","merge_cells_desc":"Vincular celdas","split_cells_desc":"Dividir celdas","delete_col_desc":"Suprimir columna","col_after_desc":"Insertar columna (despu\u00e9s)","col_before_desc":"Insertar columna (antes)","delete_row_desc":"Suprimir fila","row_after_desc":"Insertar fila (despu\u00e9s)","row_before_desc":"Insertar fila (antes)",desc:"Inserta una nueva tabla","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Se reestablece en contenido guardado, perder\u00e1 todo el contenido que est\u00e1 actualmente en el editor.\n\nEst\u00e1 seguro de que quiere reestablecer el contenido guardado.","restore_content":"Reestablecer contenido guardado autom\u00e1ticamente","unload_msg":"Los cambios realizados se perder\u00e1n si sale de esta p\u00e1gina."},fullscreen:{desc:"Cambiar a modo Pantalla Completa"},media:{edit:"Editar medio embebido",desc:"Insertar/editar medio embebido","delta_height":"","delta_width":""},fullpage:{desc:"Propiedades del documento","delta_width":"Ancho","delta_height":"Alto"},template:{desc:"Insertar contenido de plantilla predefinida"},visualchars:{desc:"Caracteres de control ON/OFF."},spellchecker:{desc:"Cambiar a corrector ortogr\u00e1fico",menu:"Configuraci\u00f3n de corrector ortogr\u00e1fico","ignore_word":"Ignorar","ignore_words":"Ignorar todo",langs:"Idiomas",wait:"Espere...",sug:"Sugerencias","no_sug":"Sin sugerencias","no_mpell":"No se encontraron errores.","learn_word":"Aprender palabra"},pagebreak:{desc:"Insertar fin de p\u00e1gina"},advlist:{types:"Tipo",def:"Preestablecido","lower_alpha":"Menos opaco","lower_greek":"Menos greek","lower_roman":"Menos roman","upper_alpha":"M\u00e1s opaco","upper_roman":"M\u00e1s roman",circle:"Circulo",disc:"Disc",square:"Cuadro"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"\u00c1rea de Texto Rico"},wordcount:{words:"Palabras:"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/et.js b/webcit/tiny_mce/langs/et.js
new file mode 100644 (file)
index 0000000..0a167be
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({et:{common:{"more_colors":"Rohkem v\u00e4rve","invalid_data":"Viga: Kehtetud v\u00e4\u00e4rtused sisestatud, need on m\u00e4rgitud punasega.","popup_blocked":"Vabandust, aga Teie h\u00fcpikakna t\u00f5kestaja on blokeerinud akna, mis varustab rakenduse funktsionaalsust. Palun lubage h\u00fcpikaknad sellel kodulehel, et t\u00e4ielikult kasutada seda vahendit.","clipboard_no_support":"Hetkel ei ole toetatud Teie lehitseja poolt, kasutage klaviatuuri otseteid selle asemel.","clipboard_msg":"Kopeeri/L\u00f5ika/Kleebi ei ole saadaval Mozillas ja Firefoxis.\nKas soovite rohkem infot selle probleemi kohta?","not_set":"-- Seadmata --","class_name":"Klass",browse:"Sirvi",close:"Sule",cancel:"T\u00fchista",update:"Uuenda",insert:"Sisesta",apply:"Rakenda","edit_confirm":"Kas soovite kasutada WYSIWYG re\u017eiimi sellel tekstialal?","invalid_data_number":"{#field} must be a number","invalid_data_min":"{#field} must be a number greater than {#min}","invalid_data_size":"{#field} must be a number or percentage",value:"(value)"},contextmenu:{full:"T\u00e4is",right:"Parem",center:"Kesk",left:"Vasak",align:"Joondus"},insertdatetime:{"day_short":"P,E,T,K,N,R,L,P","day_long":"P\u00fchap\u00e4ev,Esmasp\u00e4ev,Teisip\u00e4ev,Kolmap\u00e4ev,Neljap\u00e4ev,Reede,Laup\u00e4ev,P\u00fchap\u00e4ev","months_short":"Jaan,Veeb,M\u00e4rts,Apr,Mai,Juuni,Juuli,Aug,Sept,Okt,Nov,Dets","months_long":"Jaanuar,Veebruar,M\u00e4rts,Aprill,Mai,Juuni,Juuli,August,September,Oktoober,November,Detsember","inserttime_desc":"Sisesta aeg","insertdate_desc":"Sisesta kuup\u00e4ev","time_fmt":"%T:%M:%S","date_fmt":"%A-%k-%p"},print:{"print_desc":"Print"},preview:{"preview_desc":"Eelvaade"},directionality:{"rtl_desc":"Suund paremalt vasakule","ltr_desc":"Suund vasakult paremale"},layer:{content:"Uus kiht...","absolute_desc":"L\u00fclita \u00fcmber absoluutne positsioneerimine","backward_desc":"Liiguta tagasi","forward_desc":"Liiguta edasi","insertlayer_desc":"Sisesta uus kiht"},save:{"save_desc":"Salvesta","cancel_desc":"T\u00fchista k\u00f5ik muudatused"},nonbreaking:{"nonbreaking_desc":"Sisesta mittekatkestav t\u00fchik"},iespell:{download:"ie\u00d5igekiri tuvastamata. Kas soovite paigaldada n\u00fc\u00fcd?","iespell_desc":"\u00d5igekirja kontroll"},advhr:{"advhr_desc":"Horisontaalne joonlaud","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Emotsioonid","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Otsi/Asenda","search_desc":"Otsi","delta_width":"","delta_height":""},advimage:{"image_desc":"Sisesta/redigeeri pilt","delta_width":"","delta_height":""},advlink:{"link_desc":"Sisesta/redigeeri link","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Sisesta muuda atribuute","ins_desc":"Lisandus","del_desc":"Kustutus","acronym_desc":"Akron\u00fc\u00fcm","abbr_desc":"L\u00fchend","cite_desc":"Tsitaat","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Redigeeri CSS stiili","delta_height":"","delta_width":""},paste:{"selectall_desc":"Vali k\u00f5ik","paste_word_desc":"Kleebi Wordist","paste_text_desc":"Kleebi tavalise tekstina","plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode_sticky":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode."},"paste_dlg":{"word_title":"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks.","text_linebreaks":"J\u00e4ta reavahetused","text_title":"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks."},table:{cell:"Lahter",col:"Veerg",row:"Rida",del:"Kustuta tabel","copy_row_desc":"Kopeeri tabeli rida","cut_row_desc":"L\u00f5ika tabeli rida","paste_row_after_desc":"Kleebi tabeli rida j\u00e4rgi","paste_row_before_desc":"Kleebi tabeli rida ette","props_desc":"Tabeli omadused","cell_desc":"Tabeli lahtri omadused","row_desc":"Tabeli rea omadused","merge_cells_desc":"\u00dchenda tabeli lahtrid","split_cells_desc":"Eralda \u00fchendatud tabeli lahtrid","delete_col_desc":"Kustuta veerg","col_after_desc":"Sisesta veerg j\u00e4rgi","col_before_desc":"Sisesta veerg ette","delete_row_desc":"Kustuta rida","row_after_desc":"Sisesta rida j\u00e4rgi","row_before_desc":"Sisesta rida ette",desc:"Sisestab uue tabeli","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"unload_msg":"Tehtud muudatused kaovad, kui lahkute siit lehelt.","warning_message":"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?","restore_content":"Restore auto-saved content."},fullscreen:{desc:"L\u00fclita \u00fcmber t\u00e4isekraani re\u017eiim"},media:{edit:"Redigeeri manustatud meedia",desc:"Sisesta / redigeeri manustatud meedia","delta_height":"","delta_width":""},fullpage:{desc:"Dokumendi omadused","delta_width":"","delta_height":""},template:{desc:"Sisesta eeldefineeritud \u0161ablooni sisu"},visualchars:{desc:"Visuaalsed kontrollt\u00e4hem\u00e4rgid sisse/v\u00e4lja"},spellchecker:{desc:"L\u00fclita \u00fcmber \u00f5igekirja kontroll",menu:"\u00d5igekirja kontrolli seaded","ignore_word":"J\u00e4ta s\u00f5na vahele","ignore_words":"J\u00e4ra k\u00f5ik vahele",langs:"Keeled",wait:"Palun oota...",sug:"Soovitused","no_sug":"Soovitusi pole","no_mpell":"Valesti kirjutamisi ei leitud.","learn_word":"Learn word"},pagebreak:{desc:"Sisesta lehevahetus."},advlist:{types:"Types",def:"Default","lower_alpha":"Lower Alpha","lower_greek":"Lower Greek","lower_roman":"Lower Roman","upper_alpha":"Upper Alpha","upper_roman":"Upper Roman",circle:"Circle",disc:"Disc",square:"Square"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Rich Text Area"},wordcount:{words:"Words"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/fi.js b/webcit/tiny_mce/langs/fi.js
new file mode 100644 (file)
index 0000000..08eea14
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({fi:{common:{"more_colors":"Enemm\u00e4n v\u00e4rej\u00e4","invalid_data":"Virhe: Sy\u00f6tit virheellisi\u00e4 arvoja, ne n\u00e4kyv\u00e4t punaisina.","popup_blocked":"Sinulla on k\u00e4yt\u00f6ss\u00e4si ohjelma, joka est\u00e4\u00e4 ponnahdusikkunoiden n\u00e4yt\u00f6n. Sinun t\u00e4ytyy kytke\u00e4 ponnahdusikkunoiden esto pois p\u00e4\u00e4lt\u00e4 voidaksesi hy\u00f6dynt\u00e4\u00e4 t\u00e4ysin t\u00e4t\u00e4 ty\u00f6kalua.","clipboard_no_support":"Selaimesi ei ole tuettu, k\u00e4yt\u00e4 sen sijaan n\u00e4pp\u00e4inoikoteit\u00e4.","clipboard_msg":"Kopioi/Leikkaa/Liit\u00e4 ei ole k\u00e4ytett\u00e4viss\u00e4 Mozilla ja Firefox -selaimilla.\nHaluatko lis\u00e4tietoa t\u00e4st\u00e4 ongelmasta?","not_set":"-- Ei m\u00e4\u00e4ritetty --","class_name":"Luokka",browse:"Selaa",close:"Sulje",cancel:"Peru",update:"P\u00e4ivit\u00e4",insert:"Lis\u00e4\u00e4",apply:"K\u00e4yt\u00e4","edit_confirm":"Haluatko k\u00e4ytt\u00e4\u00e4 WYSIWYG-tilaa t\u00e4ss\u00e4 tekstikent\u00e4ss\u00e4?","invalid_data_number":"{#field} t\u00e4ytyy olla numero","invalid_data_min":"{#field} t\u00e4ytyy olla suurempi numero kuin {#min}","invalid_data_size":"{#field} t\u00e4ytyy olla numero tai prosentti",value:"(arvo)"},contextmenu:{full:"Molemmille puolille",right:"Oikealle",center:"Keskelle",left:"Vasemmalle",align:"Tasaus"},insertdatetime:{"day_short":"su,ma,ti,ke,to,pe,la,su","day_long":"sunnuntai,maanantai,tiistai,keskiviikko,torstai,perjantai,lauantai,sunnuntai","months_short":"tammi,helmi,maalis,huhti,touko,kes\u00e4,hein\u00e4,elo,syys,loka,marras,joulu","months_long":"tammikuu,helmikuu,maaliskuu,huhtikuu,toukokuu,kes\u00e4kuu,hein\u00e4kuu,elokuu,syyskuu,lokakuu,marraskuu,joulukuu","inserttime_desc":"Lis\u00e4\u00e4 kellonaika","insertdate_desc":"Lis\u00e4\u00e4 p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4","time_fmt":"%H:%M:%S","date_fmt":"%d.%m.%Y"},print:{"print_desc":"Tulosta"},preview:{"preview_desc":"Esikatselu"},directionality:{"rtl_desc":"Suunta oikealta vasemmalle","ltr_desc":"Suunta vasemmalta oikealle"},layer:{content:"Uusi taso...","absolute_desc":"Absoluuttinen sijainti","backward_desc":"Siirr\u00e4 taaksep\u00e4in","forward_desc":"Siirr\u00e4 eteenp\u00e4in","insertlayer_desc":"Lis\u00e4\u00e4 uusi taso"},save:{"save_desc":"Tallenna","cancel_desc":"Peru kaikki muutokset"},nonbreaking:{"nonbreaking_desc":"Lis\u00e4\u00e4 tyhj\u00e4 merkki (nbsp)"},iespell:{download:"ieSpell-ohjelmaa ei havaittu. Haluatko asentaa sen nyt?","iespell_desc":"Oikeinkirjoituksen tarkistus"},advhr:{"advhr_desc":"Vaakatasoviivain","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Hymi\u00f6t","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Etsi ja korvaa","search_desc":"Etsi","delta_width":"","delta_height":""},advimage:{"image_desc":"Lis\u00e4\u00e4/muokkaa kuvaa","delta_width":"","delta_height":""},advlink:{"link_desc":"Lis\u00e4\u00e4/muokkaa linkki\u00e4","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Lis\u00e4\u00e4/muokkaa attribuutteja","ins_desc":"Lis\u00e4ys","del_desc":"Poisto","acronym_desc":"Kirjainlyhenne","abbr_desc":"Lyhenne","cite_desc":"Sitaatti","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Muokkaa CSS-tyylej\u00e4","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Liitt\u00e4minen on nyt pelkk\u00e4n\u00e4 tekstin\u00e4. Klikkaa uudelleen vaihtaaksesi takaisin tavalliseen tilaan.","plaintext_mode_sticky":"Liitt\u00e4minen on nyt pelkk\u00e4n\u00e4 tekstin\u00e4. Klikkaa uudelleen vaihtaaksesi takaisin tavalliseen tilaan. Palaat takaisin tavalliseen tilaan liitetty\u00e4si jotakin.","selectall_desc":"Valitse kaikki","paste_word_desc":"Liit\u00e4 Wordist\u00e4","paste_text_desc":"Liit\u00e4 pelkk\u00e4n\u00e4 tekstin\u00e4"},"paste_dlg":{"word_title":"Paina Ctrl+V liitt\u00e4\u00e4ksesi sis\u00e4ll\u00f6n ikkunaan.","text_linebreaks":"S\u00e4ilyt\u00e4 rivinvaihdot","text_title":"Paina Ctrl+V liitt\u00e4\u00e4ksesi sis\u00e4ll\u00f6n ikkunaan."},table:{"cellprops_delta_width":"80",cell:"Solu",col:"Sarake",row:"Rivi",del:"Poista taulukko","copy_row_desc":"Kopioi taulukon rivi","cut_row_desc":"Leikkaa taulukon rivi","paste_row_after_desc":"Liit\u00e4 taulukon rivi j\u00e4lkeen","paste_row_before_desc":"Liit\u00e4 taulukon rivi ennen","props_desc":"Taulukon asetukset","cell_desc":"Taulukon solun asetukset","row_desc":"Taulukon rivin asetukset","merge_cells_desc":"Yhdist\u00e4 taulukon solut","split_cells_desc":"Jaa yhdistetyt taulukon solut","delete_col_desc":"Poista sarake","col_after_desc":"Lis\u00e4\u00e4 sarake j\u00e4lkeen","col_before_desc":"Lis\u00e4\u00e4 sarake ennen","delete_row_desc":"Poista rivi","row_after_desc":"Lis\u00e4\u00e4 rivi j\u00e4lkeen","row_before_desc":"Lis\u00e4\u00e4 rivi ennen",desc:"Lis\u00e4\u00e4 uusi taulukko","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Jos palautat automaattisesti tallennetun sis\u00e4ll\u00f6n, menet\u00e4t t\u00e4ll\u00e4 hetkell\u00e4 editorissa olevan sis\u00e4ll\u00f6n.\n\nHaluatko varmasti palauttaa tallennetun sis\u00e4ll\u00f6n?","restore_content":"Palauta automaattisesti tallennettu sis\u00e4lt\u00f6.","unload_msg":"Tekem\u00e4si muutokset menetet\u00e4\u00e4n jos poistut t\u00e4lt\u00e4 sivulta."},fullscreen:{desc:"Kokoruututila"},media:{edit:"Muokkaa upotettua mediaa",desc:"Lis\u00e4\u00e4/muokkaa upotettua mediaa","delta_height":"","delta_width":""},fullpage:{desc:"Tiedoston asetukset","delta_width":"","delta_height":""},template:{desc:"Lis\u00e4\u00e4 esim\u00e4\u00e4ritetty\u00e4 sivupohjasis\u00e4lt\u00f6\u00e4"},visualchars:{desc:"N\u00e4yt\u00e4/piilota muotoilumerkit."},spellchecker:{desc:"Oikeinkirjoituksen tarkistus",menu:"Oikeinkirjoituksen asetukset","ignore_word":"Ohita sana","ignore_words":"Ohita kaikki",langs:"Kielet",wait:"Odota ole hyv\u00e4...",sug:"Ehdotukset","no_sug":"Ei ehdotuksia","no_mpell":"Virheit\u00e4 ei l\u00f6ytynyt.","learn_word":"Opettele sana"},pagebreak:{desc:"Lis\u00e4\u00e4 sivunvaihto."},advlist:{types:"Tyypit",def:"Oletus","lower_alpha":"pienet kirjaimet: a, b, c","lower_greek":"pienet kirjaimet: \u03b1, \u03b2, \u03b3","lower_roman":"pienet kirjaimet: i, ii, iii","upper_alpha":"isot kirjaimet: A, B, C","upper_roman":"isot kirjaimet: I, II, III",circle:"Pallo",disc:"Ympyr\u00e4",square:"Neli\u00f6"},colors:{"333300":"Tummanoliivi","993300":"Tummanoranssi","000000":"Musta","003300":"Tummanvihre\u00e4","003366":"Tummantaivaansininen","000080":"Laivaston sininen","333399":"Indigonsininen","333333":"Hyvin tummanharmaa","800000":"Punaruskea",FF6600:"Oranssi","808000":"Oliivi","008000":"Vihre\u00e4","008080":"Sinivihre\u00e4","0000FF":"Sininen","666699":"Harmaansininen","808080":"Harmaa",FF0000:"Punainen",FF9900:"Kullanruskea","99CC00":"Keltaisenvihre\u00e4","339966":"Merenvihre\u00e4","33CCCC":"Turkoosi","3366FF":"Syv\u00e4n sininen","800080":"Violetti","999999":"Keskiharmaa",FF00FF:"Magenta",FFCC00:"Kulta",FFFF00:"Keltainen","00FF00":"Lime","00FFFF":"Sinivihre\u00e4","00CCFF":"Taivaansininen","993366":"Ruskea",C0C0C0:"Hopea",FF99CC:"Vaaleanpunainen",FFCC99:"Persikka",FFFF99:"Vaaleankeltainen",CCFFCC:"Haalistuneen vihre\u00e4",CCFFFF:"Haalistuneen syaani","99CCFF":"Vaaleantaivaansininen",CC99FF:"Luumunpunainen",FFFFFF:"Valkoinen"},aria:{"rich_text_area":"Rikastettu tekstialue"},wordcount:{words:"Sanaa:"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/fr.js b/webcit/tiny_mce/langs/fr.js
new file mode 100644 (file)
index 0000000..7042832
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({fr:{common:{"more_colors":"Plus de couleurs","invalid_data":"Erreur : saisie de valeurs incorrectes. Elles sont mises en \u00e9vidence en rouge.","popup_blocked":"D\u00e9sol\u00e9, nous avons d\u00e9tect\u00e9 que votre bloqueur de popup a bloqu\u00e9 une fen\u00eatre dont l\'application a besoin. Vous devez d\u00e9sactiver votre bloqueur de popup pour pouvoir utiliser cet outil.","clipboard_no_support":"Actuellement non support\u00e9 par votre navigateur.\n Veuillez utiliser les raccourcis clavier \u00e0 la place.","clipboard_msg":"Les fonctions Copier/Couper/Coller ne sont pas valables sur Mozilla et Firefox.\nSouhaitez-vous avoir plus d\'informations sur ce sujet ?","not_set":"-- non d\u00e9fini --","class_name":"Classe",browse:"parcourir",close:"Fermer",cancel:"Annuler",update:"Mettre \u00e0 jour",insert:"Ins\u00e9rer",apply:"Appliquer","edit_confirm":"Souhaitez-vous utiliser le mode WYSIWYG pour cette zone de texte ?","invalid_data_number":"{#field} doit \u00eatre un nombre","invalid_data_min":"{#field} doit \u00eatre un nombre plus grand que {#min}","invalid_data_size":"{#field} doit \u00eatre un nombre ou un pourcentage",value:"(value)"},contextmenu:{full:"Justifi\u00e9",right:"Droite",center:"Centr\u00e9",left:"Gauche",align:"Alignement"},insertdatetime:{"day_short":"Dim,Lun,Mar,Mer,Jeu,Ven,Sam,Dim","day_long":"Dimanche,Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche","months_short":"Jan,F\u00e9v,Mar,Avr,Mai,Juin,Juil,Ao\u00fbt,Sep,Oct,Nov,D\u00e9c","months_long":"Janvier,F\u00e9vrier,Mars,Avril,Mai,Juin,Juillet,Ao\u00fbt,Septembre,Octobre,Novembre,D\u00e9cembre","inserttime_desc":"Ins\u00e9rer l\'heure","insertdate_desc":"Ins\u00e9rer la date","time_fmt":"%H:%M:%S","date_fmt":"%d-%m-%Y"},print:{"print_desc":"Imprimer"},preview:{"preview_desc":"Pr\u00e9visualiser"},directionality:{"rtl_desc":"\u00c9criture de droite \u00e0 gauche","ltr_desc":"\u00c9criture de gauche \u00e0 droite"},layer:{content:"Nouvelle couche\u2026","absolute_desc":"Activer le positionnement absolu","backward_desc":"D\u00e9placer vers l\'arri\u00e8re","forward_desc":"D\u00e9placer vers l\'avant","insertlayer_desc":"Ins\u00e9rer une nouvelle couche"},save:{"save_desc":"Enregistrer","cancel_desc":"Annuler toutes les modifications"},nonbreaking:{"nonbreaking_desc":"Ins\u00e9rer une espace ins\u00e9cable"},iespell:{download:"ieSpell n\'est pas install\u00e9. Souhaitez-vous l\'installer maintenant ?","iespell_desc":"Lancer le v\u00e9rificateur d\'orthographe"},advhr:{"delta_height":"Ecart de hauteur","delta_width":"Ecart de largeur","advhr_desc":"Ins\u00e9rer un trait horizontal"},emotions:{"emotions_desc":"\u00c9motic\u00f4nes","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Rechercher / remplacer","search_desc":"Rechercher","delta_width":"","delta_height":""},advimage:{"image_desc":"Ins\u00e9rer / \u00e9diter une image","delta_width":"","delta_height":""},advlink:{"link_desc":"Ins\u00e9rer / \u00e9diter un lien","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Ins\u00e9rer / \u00e9diter les attributs","ins_desc":"Ins\u00e9r\u00e9","del_desc":"Barr\u00e9","acronym_desc":"Acronyme","abbr_desc":"Abr\u00e9viation","cite_desc":"Citation","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"\u00c9diter la feuille de style (CSS)","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Le collage est actuellement en mode texte non format\u00e9. Cliquez \u00e0 nouveau pour revenir en mode de collage ordinaire.","plaintext_mode_sticky":"Le collage est actuellement en mode texte non format\u00e9. Cliquez \u00e0 nouveau pour revenir en mode de collage ordinaire. Apr\u00e8s avoir coll\u00e9 quelque chose, vous retournerez en mode de collage ordinaire.","selectall_desc":"Tout s\u00e9lectionner","paste_word_desc":"Coller un texte cr\u00e9\u00e9 sous Word","paste_text_desc":"Coller comme texte brut"},"paste_dlg":{"word_title":"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre.","text_linebreaks":"Conserver les retours \u00e0 la ligne","text_title":"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre."},table:{cell:"Cellule",col:"Colonne",row:"Ligne",del:"Effacer le tableau","copy_row_desc":"Copier la ligne","cut_row_desc":"Couper la ligne","paste_row_after_desc":"Coller la ligne apr\u00e8s","paste_row_before_desc":"Coller la ligne avant","props_desc":"Propri\u00e9t\u00e9s du tableau","cell_desc":"Propri\u00e9t\u00e9s de la cellule","row_desc":"Propri\u00e9t\u00e9s de la ligne","merge_cells_desc":"Fusionner les cellules","split_cells_desc":"Scinder les cellules fusionn\u00e9es","delete_col_desc":"Effacer la colonne","col_after_desc":"Ins\u00e9rer une colonne apr\u00e8s","col_before_desc":"Ins\u00e9rer une colonne avant","delete_row_desc":"Effacer la ligne","row_after_desc":"Ins\u00e9rer une ligne apr\u00e8s","row_before_desc":"Ins\u00e9rer une ligne avant",desc:"Ins\u00e9rer un nouveau tableau","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Si vous restaurez le contenu sauv\u00e9, vous perdrez le contenu qui est actuellement dans l\'\u00e9diteur.\n\n\u00cates-vous s\u00fbr de vouloir restaurer le contenu sauv\u00e9 ?","restore_content":"Restaurer le contenu auto-sauvegard\u00e9.","unload_msg":"Les modifications apport\u00e9es seront perdues si vous quittez cette page."},fullscreen:{desc:"Passer en mode plein \u00e9cran"},media:{edit:"\u00c9diter un m\u00e9dia incorpor\u00e9",desc:"Ins\u00e9rer / \u00e9diter un m\u00e9dia incorpor\u00e9","delta_height":"","delta_width":""},fullpage:{desc:"Propri\u00e9t\u00e9s du document","delta_width":"","delta_height":""},template:{desc:"Ins\u00e9rer un mod\u00e8le pr\u00e9d\u00e9fini."},visualchars:{desc:"Activer les caract\u00e8res de mise en page."},spellchecker:{desc:"Activer le v\u00e9rificateur d\'orthographe",menu:"Param\u00e8tres du v\u00e9rificateur d\'orthographe","ignore_word":"Ignorer le mot","ignore_words":"Tout ignorer",langs:"Langues",wait:"Veuillez patienter\u2026",sug:"Suggestions","no_sug":"Aucune suggestion","no_mpell":"Aucune erreur trouv\u00e9e.","learn_word":"Apprendre le mot"},pagebreak:{desc:"Ins\u00e9rer un saut de page."},advlist:{types:"Types",def:"D\u00e9faut","lower_alpha":"Alpha minuscule","lower_greek":"Grec minuscule","lower_roman":"Romain minuscule","upper_alpha":"Alpha majuscule","upper_roman":"Romain majuscule",circle:"Cercle",disc:"Disque",square:"Carr\u00e9"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Texte riche"},wordcount:{words:"Mots:"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/hu.js b/webcit/tiny_mce/langs/hu.js
new file mode 100644 (file)
index 0000000..7428345
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({hu:{common:{"more_colors":"Tov\u00e1bbi sz\u00ednek","invalid_data":"Hiba: \u00c9rv\u00e9nytelen adatok, pirossal jel\u00f6lve.","popup_blocked":"A felugr\u00f3 ablakok tilt\u00e1sa miatt nem siker\u00fclt megjelen\u00edteni egy, az alkalmaz\u00e1shoz sz\u00fcks\u00e9ges ablakot. Enged\u00e9lyezze a b\u00f6ng\u00e9sz\u0151j\u00e9ben a felugr\u00f3 ablakokat, hogy minden funkci\u00f3t haszn\u00e1lhasson.","clipboard_no_support":"Jelenleg nem t\u00e1mogatja a b\u00f6ng\u00e9sz\u0151je, haszn\u00e1lja a billenty\u0171kombin\u00e1ci\u00f3kat helyette.","clipboard_msg":"A M\u00e1sol\u00e1s/Kiv\u00e1g\u00e1s/Besz\u00far\u00e1s funkci\u00f3k nem \u00e9rhet\u0151ek el Mozilla \u00e9s Firefox alatt.\nK\u00edv\u00e1n t\u00f6bbet tudni err\u0151l a t\u00e9m\u00e1r\u00f3l?","not_set":"-- Nincs megadva --","class_name":"Oszt\u00e1ly",browse:"Tall\u00f3z\u00e1s",close:"Bez\u00e1r\u00e1s",cancel:"M\u00e9gsem",update:"Friss\u00edt\u00e9s",insert:"Besz\u00far\u00e1s",apply:"Alkalmaz\u00e1s","edit_confirm":"Haszn\u00e1lni k\u00edv\u00e1nja a sz\u00f6vegszerkeszt\u0151 m\u00f3dot ebben a sz\u00f6vegdobozban?","invalid_data_number":"{#field} sz\u00e1m kell legyen","invalid_data_min":"{#field} egy nagyobb sz\u00e1m kell legyen, mint {#min}","invalid_data_size":"{#field} egy sz\u00e1m vagy sz\u00e1zal\u00e9k kell legyen",value:"(value)"},contextmenu:{full:"Sorkiz\u00e1rt",right:"Jobbra",center:"K\u00f6z\u00e9pre",left:"Balra",align:"Igaz\u00edt\u00e1s"},insertdatetime:{"day_short":"V,H,K,Sze,Cs,P,Szo,V","day_long":"vas\u00e1rnap,h\u00e9tf\u0151,kedd,szerda,cs\u00fct\u00f6rt\u00f6k,p\u00e9ntek,szombat,vas\u00e1rnap","months_short":"jan,feb,m\u00e1r,\u00e1pr,m\u00e1j,j\u00fan,j\u00fal,aug,szept,okt,nov,dec","months_long":"janu\u00e1r,febru\u00e1r,m\u00e1rcius,\u00e1prilis,m\u00e1jus,j\u00fanius,j\u00falius,augusztus,szeptember,okt\u00f3ber,november,december","inserttime_desc":"Id\u0151 besz\u00far\u00e1sa","insertdate_desc":"D\u00e1tum besz\u00far\u00e1sa","time_fmt":"%H:%M:%S","date_fmt":"%Y. %m. %d."},print:{"print_desc":"Nyomtat\u00e1s"},preview:{"preview_desc":"El\u0151n\u00e9zet"},directionality:{"rtl_desc":"Jobbr\u00f3l balra","ltr_desc":"Balr\u00f3l jobbra"},layer:{content:"\u00daj r\u00e9teg...","absolute_desc":"Abszol\u00fat poz\u00edci\u00f3 ki-/bekapcsol\u00e1sa","backward_desc":"Mozgat\u00e1s h\u00e1tra","forward_desc":"Mozgat\u00e1s el\u0151re","insertlayer_desc":"\u00daj r\u00e9teg besz\u00far\u00e1sa"},save:{"save_desc":"Ment\u00e9s","cancel_desc":"Minden m\u00f3dos\u00edt\u00e1s visszavon\u00e1sa"},nonbreaking:{"nonbreaking_desc":"Nemsort\u00f6r\u0151 sz\u00f3k\u00f6z besz\u00far\u00e1sa"},iespell:{download:"ieSpell nem tal\u00e1lhat\u00f3. Telep\u00edti most?","iespell_desc":"Helyes\u00edr\u00e1s-ellen\u0151rz\u00e9s futtat\u00e1sa"},advhr:{"advhr_desc":"V\u00edzszintes vonal","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Hangulatjelek","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Keres\u00e9s/Csere","search_desc":"Keres\u00e9s","delta_width":"","delta_height":""},advimage:{"image_desc":"K\u00e9p besz\u00far\u00e1sa/szerkeszt\u00e9se","delta_width":"","delta_height":""},advlink:{"link_desc":"Link besz\u00far\u00e1sa/szerkeszt\u00e9se","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Tulajdons\u00e1gok besz\u00far\u00e1sa/szerkeszt\u00e9se","ins_desc":"Besz\u00fart","del_desc":"T\u00f6r\u00f6lt","acronym_desc":"Bet\u0171sz\u00f3","abbr_desc":"R\u00f6vid\u00edt\u00e9s","cite_desc":"Id\u00e9zet","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"CSS st\u00edlus szerkeszt\u00e9se","delta_height":"","delta_width":""},paste:{"plaintext_mode":"A besz\u00far\u00e1s mostant\u00f3l egyszer\u0171 sz\u00f6veg m\u00f3dban van. Kattintson ide \u00fajra ezen m\u00f3d ki/be kapcsol\u00e1s\u00e1hoz.","plaintext_mode_sticky":"A besz\u00far\u00e1s mostant\u00f3l egyszer\u0171 sz\u00f6veg m\u00f3dban van. Kattintson ide \u00fajra ezen m\u00f3d ki/be kapcsol\u00e1s\u00e1hoz. Miut\u00e1n besz\u00far valamit, visszaker\u00fcl norm\u00e1l m\u00f3dba.","selectall_desc":"Mindent kijel\u00f6l","paste_word_desc":"Besz\u00far\u00e1s Wordb\u0151l","paste_text_desc":"Besz\u00far\u00e1s sz\u00f6vegk\u00e9nt"},"paste_dlg":{"word_title":"Haszn\u00e1lja a Ctrl+V-t a billenty\u0171zet\u00e9n a beilleszt\u00e9shez.","text_linebreaks":"Sort\u00f6r\u00e9sek megtart\u00e1sa","text_title":"Haszn\u00e1lja a Ctrl+V-t a billenty\u0171zet\u00e9n a beilleszt\u00e9shez."},table:{cell:"Cella",col:"Oszlop",row:"Sor",del:"T\u00e1bl\u00e1zat t\u00f6rl\u00e9se","copy_row_desc":"Sor m\u00e1sol\u00e1sa","cut_row_desc":"Sor kiv\u00e1g\u00e1sa","paste_row_after_desc":"Sor bem\u00e1sol\u00e1sa ut\u00e1na","paste_row_before_desc":"Sor bem\u00e1sol\u00e1sa el\u00e9","props_desc":"T\u00e1bl\u00e1zat tulajdons\u00e1gai","cell_desc":"Cella tulajdons\u00e1gai","row_desc":"Sor tulajdons\u00e1gai","merge_cells_desc":"Cell\u00e1k \u00f6sszevon\u00e1sa","split_cells_desc":"Cell\u00e1k feloszt\u00e1sa","delete_col_desc":"Oszlop t\u00f6rl\u00e9se","col_after_desc":"Oszlop besz\u00far\u00e1sa ut\u00e1na","col_before_desc":"Oszlop besz\u00far\u00e1sa el\u00e9","delete_row_desc":"Sor t\u00f6rl\u00e9se","row_after_desc":"Sor besz\u00far\u00e1sa ut\u00e1na","row_before_desc":"Sor besz\u00far\u00e1sa el\u00e9",desc:"T\u00e1bl\u00e1zat besz\u00far\u00e1sa/szerkeszt\u00e9se","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Ha visszat\u00f6lti a mentett be\u00e1ll\u00edt\u00e1sokat, a jelenlegi \u00e1llapot elv\u00e9sz.\n\nBiztosan visszat\u00f6lti a mentett \u00e1llapotot?.","restore_content":"Automatikus ment\u00e9s bet\u00f6lt\u00e9se.","unload_msg":"A m\u00f3dos\u00edt\u00e1sok nem lesznek mentve, ha elhagyja az oldalt."},fullscreen:{desc:"Teljesk\u00e9perny\u0151s m\u00f3d ki-/bekapcsol\u00e1sa"},media:{edit:"Be\u00e1gyazott m\u00e9dia szerkeszt\u00e9se",desc:"Be\u00e1gyazott m\u00e9dia besz\u00far\u00e1sa/szerkeszt\u00e9se","delta_height":"","delta_width":""},fullpage:{desc:"Dokumentum tulajdons\u00e1gai","delta_width":"","delta_height":""},template:{desc:"Sablon beilleszt\u00e9se"},visualchars:{desc:"Vizu\u00e1lis vez\u00e9rl\u0151karakterek be/ki."},spellchecker:{desc:"Helyes\u00edr\u00e1s-ellen\u0151rz\u0151 ki-/bekapcsol\u00e1sa",menu:"Helyes\u00edr\u00e1s-ellen\u0151rz\u0151 tulajdons\u00e1gai","ignore_word":"Sz\u00f3 kihagy\u00e1sa","ignore_words":"Mindet kihagy",langs:"Nyelvek",wait:"K\u00e9rem, v\u00e1rjon...",sug:"Aj\u00e1nl\u00e1sok","no_sug":"Nincs aj\u00e1nl\u00e1s","no_mpell":"Nem tal\u00e1ltam helyes\u00edr\u00e1si hib\u00e1t.","learn_word":"Sz\u00f3 megjegyz\u00e9se"},pagebreak:{desc:"Oldalt\u00f6r\u00e9s besz\u00far\u00e1sa"},advlist:{types:"T\u00edpusok",def:"Alap\u00e9rtelmezett","lower_alpha":"Kisbet\u0171s abc","lower_greek":"Kisbet\u0171s g\u00f6r\u00f6g","lower_roman":"Kisbet\u0171s r\u00f3mai","upper_alpha":"Nagybet\u0171s ABC","upper_roman":"Nagybet\u0171s r\u00f3mai",circle:"Karika",disc:"P\u00f6tty",square:"N\u00e9gyzet"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Rich Text mez\u0151"},wordcount:{words:"Szavak sz\u00e1ma: "}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/it.js b/webcit/tiny_mce/langs/it.js
new file mode 100644 (file)
index 0000000..59acac9
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({it:{common:{"more_colors":"Colori aggiuntivi","invalid_data":"Errore: valori inseriti non validi, sono marcati in rosso.","popup_blocked":"Spiacente, ma il blocco popup ha disabilitato una finestra che fornisce funzionalit\u00e0 dell\'applicazione. Si deve disabilitare il blocco popup per questo sito per poter utlizzare appieno questo strumento.","clipboard_no_support":"Attualmente non supportato dal  browser in uso, usare le scorciatoie da tastiera.","clipboard_msg":"Copia/Taglia/Incolla non \u00e8 disponibile in Mozilla e Firefox.\nSi desidera avere maggiori informazioni su questo problema?","not_set":"-- Non impostato --","class_name":"Classe",browse:"Sfoglia",close:"Chiudi",cancel:"Annulla",update:"Aggiorna",insert:"Inserisci",apply:"Applica","edit_confirm":"Usare la modalit\u00e0 WYSIWYG per questa textarea?","invalid_data_number":"{#field} deve essere un numero","invalid_data_min":"{#field} deve essere un numero maggiore di {#min}","invalid_data_size":"{#field} deve essere un numero o una percentuale",value:"(value)"},contextmenu:{full:"Giustifica",right:"Allinea a destra",center:"Centra",left:"Allinea a sinistra",align:"Allineamento"},insertdatetime:{"day_short":"Dom,Lun,Mar,Mer,Gio,Ven,Sab,Dom","day_long":"Domenica,Luned\u00ec,Marted\u00ec,Mercoled\u00ec,Gioved\u00ec,Venerd\u00ec,Sabato,Domenica","months_short":"Gen,Feb,Mar,Apr,Mag,Giu,Lug,Ago,Set,Ott,Nov,Dic","months_long":"Gennaio,Febbraio,Marzo,Aprile,Maggio,Giugno,Luglio,Agosto,Settembre,Ottobre,Novembre,Dicembre","inserttime_desc":"Inserisci ora","insertdate_desc":"Inserisci data","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"Stampa"},preview:{"preview_desc":"Anteprima"},directionality:{"rtl_desc":"Direzione da destra a sinistra","ltr_desc":"Direzione da sinistra a destra"},layer:{content:"Nuovo layer...","absolute_desc":"Attiva/Disattiva posizionamento assoluto","backward_desc":"Porta in sfondo","forward_desc":"Porta in rilievo","insertlayer_desc":"Inserisci nuovo layer"},save:{"save_desc":"Salva","cancel_desc":"Cancella tutte le modifiche"},nonbreaking:{"nonbreaking_desc":"Inserisci uno spazio"},iespell:{download:"ieSpell non rilevato. Installarlo ora?","iespell_desc":"Esegui controllo ortografico"},advhr:{"advhr_desc":"Riga orizzontale","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Faccine","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Trova/Sostituisci","search_desc":"Trova","delta_width":"","delta_height":""},advimage:{"image_desc":"Inserisci/modifica immagine","delta_width":"","delta_height":""},advlink:{"link_desc":"Inserisci/modifica collegamento","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Inserisci/modifica attributi","ins_desc":"Inserimento","del_desc":"Cancellamento","acronym_desc":"Acronimo","abbr_desc":"Abbreviazione","cite_desc":"Citazione","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Modifica stile CSS","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Incolla adesso e in modalit\u00e0 testo. Clicca nuovamente per tornare alla modalit\u00e0 normale.","plaintext_mode_sticky":"Incolla adesso e in modalit\u00e0 testo. Clicca nuovamente per tornare alla modalit\u00e0 normale. Dopo che avrai incollato qualcosa tornerai alla modalit\u00e0 normale","selectall_desc":"Seleziona tutto","paste_word_desc":"Incolla da Word","paste_text_desc":"Incolla come testo semplice"},"paste_dlg":{"word_title":"Premere CTRL+V sulla tastiera per incollare il testo nella finestra.","text_linebreaks":"Mantieni interruzioni di riga","text_title":"Premere CTRL+V sulla tastiera per incollare il testo nella finestra."},table:{cell:"Cella",col:"Colonna",row:"Riga",del:"Elimina tabella","copy_row_desc":"Copia riga","cut_row_desc":"Taglia riga","paste_row_after_desc":"Incolla riga dopo","paste_row_before_desc":"Incolla riga prima","props_desc":"Propriet\u00e0 tabella","cell_desc":"Propriet\u00e0 cella","row_desc":"Propriet\u00e0 riga","merge_cells_desc":"Unisci celle","split_cells_desc":"Separa celle","delete_col_desc":"Elimina colonna","col_after_desc":"Inserisci colonna dopo","col_before_desc":"Inserisci colonna prima","delete_row_desc":"Elimina riga","row_after_desc":"Inserisci riga dopo","row_before_desc":"Inserisci riga prima",desc:"Inserisci una nuova tabella","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Se ripristini i dati salvati automaticamente perderai i dati attuali dell\'editor\n\nSei sicuro di voler ripristinare i dati?.","restore_content":"Ripristina i dati salvati automaticamente","unload_msg":"I cambiamenti effettuati saranno persi se si abbandona la pagina corrente."},fullscreen:{desc:"Attiva/disattiva modalit\u00e0 a tutto schermo"},media:{edit:"Modifica file multimediale",desc:"Inserisci/modifica file multimediale","delta_height":"","delta_width":""},fullpage:{desc:"Propriet\u00e0 Documento","delta_width":"","delta_height":""},template:{desc:"Inserisci contenuto da modello predefinito"},visualchars:{desc:"Attiva/disattiva caratteri di controllo visuale."},spellchecker:{desc:"Attiva/disattiva controllo ortografico",menu:"Impostazioni controllo ortografico","ignore_word":"Ignora parola","ignore_words":"Ignora tutto",langs:"Lingue",wait:"Attendere prego...",sug:"Suggerimenti","no_sug":"Nessun suggerimento","no_mpell":"Nessun errore rilevato.","learn_word":"Learn word"},pagebreak:{desc:"Inserisci intterruzione di pagina."},advlist:{types:"Tipi",def:"Default","lower_alpha":"Minuscolo alfanumerico","lower_greek":"Minuscolo lettera greca","lower_roman":"Minuscolo lettere romane","upper_alpha":"Maiuscolo alfanumerico","upper_roman":"Maiuscolo lettere romane",circle:"Cerchio",disc:"Punto",square:"Quadrato"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Area testo formattato"},wordcount:{words:"Parole:"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/zh-cn.js b/webcit/tiny_mce/langs/zh-cn.js
new file mode 100644 (file)
index 0000000..42f7abb
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n({"zh-cn":{common:{"more_colors":"\u66f4\u591a\u989c\u8272","invalid_data":"\u9519\u8bef\uff1a\u6807\u8bb0\u4e3a\u7ea2\u8272\u7684\u90e8\u5206\u6709\u8bef\u3002","popup_blocked":"\u62b1\u6b49\uff0c\u60a8\u7981\u7528\u4e86\u5f39\u51fa\u7a97\u53e3\u529f\u80fd\u3002\u4e3a\u4e86\u4f7f\u7528\u8be5\u5de5\u5177\u7684\u5168\u90e8\u529f\u80fd\uff0c\u60a8\u9700\u8981\u5141\u8bb8\u5f39\u51fa\u7a97\u53e3\u3002","clipboard_no_support":"\u60a8\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\uff0c\u4f7f\u7528\u5feb\u6377\u952e\u4ee3\u66ff\u3002","clipboard_msg":"\u5728Mozilla\u548cFirefox\u4e2d\u4e0d\u80fd\u4f7f\u7528\u590d\u5236/\u7c98\u8d34/\u526a\u5207\u3002\u60a8\u8981\u67e5\u770b\u8be5\u95ee\u9898\u66f4\u591a\u7684\u4fe1\u606f\u5417\uff1f","not_set":"-- \u672a\u8bbe\u7f6e --","class_name":"\u7c7b\u522b",browse:"\u6d4f\u89c8",close:"\u5173\u95ed",cancel:"\u53d6\u6d88",update:"\u66f4\u65b0",insert:"\u63d2\u5165",apply:"\u5e94\u7528","edit_confirm":"\u8be5\u6587\u672c\u57df\u662f\u5426\u9700\u8981\u4f7f\u7528\u6240\u89c1\u5373\u6240\u5f97\u6a21\u5f0f\uff1f","invalid_data_number":"{#field} \u5fc5\u987b\u4e3a\u6570\u5b57","invalid_data_min":"{#field} \u5fc5\u987b\u4e3a\u5927\u4e8e {#min} \u7684\u6570\u5b57","invalid_data_size":"{#field} \u5fc5\u987b\u4e3a\u6570\u5b57\u6216\u767e\u5206\u6570",value:"(value)"},contextmenu:{full:"\u4e24\u7aef\u5bf9\u9f50",right:"\u53f3\u5bf9\u9f50",center:"\u5c45\u4e2d",left:"\u5de6\u5bf9\u9f50",align:"\u5bf9\u9f50"},insertdatetime:{"day_short":"\u5468\u65e5,\u5468\u4e00,\u5468\u4e8c,\u5468\u4e09,\u5468\u56db,\u5468\u4e94,\u5468\u516d,\u5468\u65e5","day_long":"\u661f\u671f\u65e5,\u661f\u671f\u4e00,\u661f\u671f\u4e8c,\u661f\u671f\u4e09,\u661f\u671f\u56db,\u661f\u671f\u4e94,\u661f\u671f\u516d,\u661f\u671f\u65e5","months_short":"1\u6708,2\u6708,3\u6708,4\u6708,5\u6708,6\u6708,7\u6708,8\u6708,9\u6708,10\u6708,11\u6708,12\u6708","months_long":"\u4e00\u6708,\u4e8c\u6708,\u4e09\u6708,\u56db\u6708,\u4e94\u6708,\u516d\u6708,\u4e03\u6708,\u516b\u6708,\u4e5d\u6708,\u5341\u6708,\u5341\u4e00\u6708,\u5341\u4e8c\u6708","inserttime_desc":"\u63d2\u5165\u65f6\u95f4","insertdate_desc":"\u63d2\u5165\u65e5\u671f","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"\u6253\u5370"},preview:{"preview_desc":"\u9884\u89c8"},directionality:{"rtl_desc":"\u6587\u5b57\u65b9\u5411\u4e3a\u4ece\u53f3\u5230\u5de6","ltr_desc":"\u6587\u5b57\u65b9\u5411\u4e3a\u4ece\u5de6\u5230\u53f3"},layer:{content:"\u65b0\u5efa\u5c42...","absolute_desc":"\u5207\u6362\u5230\u7edd\u5bf9\u4f4d\u7f6e","backward_desc":"\u7f6e\u540e","forward_desc":"\u7f6e\u524d","insertlayer_desc":"\u63d2\u5165\u65b0\u5c42"},save:{"save_desc":"\u4fdd\u5b58","cancel_desc":"\u53d6\u6d88\u66f4\u6539"},nonbreaking:{"nonbreaking_desc":"\u63d2\u5165\u4e0d\u95f4\u65ad\u7a7a\u683c\u7b26"},iespell:{download:"\u62fc\u5199\u68c0\u67e5\u672a\u5b89\u88c5\uff0c\u662f\u5426\u9a6c\u4e0a\u5b89\u88c5\uff1f","iespell_desc":"\u62fc\u5199\u68c0\u67e5"},advhr:{"delta_height":"\u9ad8\u5ea6","delta_width":"\u5bbd\u5ea6","advhr_desc":"\u6c34\u5e73\u7ebf"},emotions:{"emotions_desc":"\u8868\u60c5","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"\u67e5\u627e/\u66ff\u6362","search_desc":"\u67e5\u627e","delta_width":"","delta_height":""},advimage:{"image_desc":"\u63d2\u5165/\u7f16\u8f91 \u56fe\u7247","delta_width":"","delta_height":""},advlink:{"link_desc":"\u63d2\u5165/\u7f16\u8f91 \u8d85\u94fe\u63a5","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"\u63d2\u5165/\u7f16\u8f91\u5c5e\u6027","ins_desc":"\u63d2\u5165","del_desc":"\u5220\u9664","acronym_desc":"\u9996\u5b57\u6bcd\u7f29\u5199","abbr_desc":"\u7f29\u5199","cite_desc":"\u5f15\u7528","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"\u7f16\u8f91CSS\u6837\u5f0f","delta_height":"","delta_width":""},paste:{"plaintext_mode":"\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u6a21\u5f0f\u7c98\u8d34\uff0c\u518d\u6b21\u70b9\u51fb\u8fd4\u56de\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002","plaintext_mode_sticky":"\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u6a21\u5f0f\u7c98\u8d34\u3002\u518d\u6b21\u70b9\u51fb\u8fd4\u56de\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\uff0c\u5728\u60a8\u7c98\u8d34\u5185\u5bb9\u540e\u5c06\u8fd4\u56de\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002","selectall_desc":"\u5168\u9009","paste_word_desc":"\u4eceWord\u7c98\u8d34","paste_text_desc":"\u4ee5\u7eaf\u6587\u672c\u7c98\u8d34"},"paste_dlg":{"word_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u6587\u672c\u5230\u7a97\u53e3\u4e2d\u3002","text_linebreaks":"\u4fdd\u7559\u65ad\u884c","text_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u6587\u672c\u5230\u7a97\u53e3\u4e2d\u3002"},table:{cell:"\u5355\u5143\u683c",col:"\u5217",row:"\u884c",del:"\u5220\u9664\u8868\u683c","copy_row_desc":"\u590d\u5236\u884c","cut_row_desc":"\u526a\u5207\u884c","paste_row_after_desc":"\u5728\u4e0b\u65b9\u7c98\u8d34\u884c","paste_row_before_desc":"\u5728\u4e0a\u65b9\u7c98\u8d34\u884c","props_desc":"\u8868\u683c\u5c5e\u6027","cell_desc":"\u5355\u5143\u683c\u5c5e\u6027","row_desc":"\u884c\u5c5e\u6027","merge_cells_desc":"\u5408\u5e76\u5355\u5143\u683c","split_cells_desc":"\u5206\u5272\u5355\u5143\u683c","delete_col_desc":"\u5220\u9664\u5217","col_after_desc":"\u5728\u53f3\u4fa7\u63d2\u5165\u5217","col_before_desc":"\u5728\u5de6\u4fa7\u63d2\u5165\u5217","delete_row_desc":"\u5220\u9664\u884c","row_after_desc":"\u5728\u4e0b\u65b9\u63d2\u5165\u884c","row_before_desc":"\u5728\u4e0a\u65b9\u63d2\u5165\u884c",desc:"\u63d2\u5165\u65b0\u8868\u683c","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"\u5982\u679c\u6062\u590d\u4fdd\u5b58\u7684\u5185\u5bb9\uff0c\u60a8\u5f53\u524d\u7f16\u8f91\u7684\u6240\u6709\u7684\u5185\u5bb9\u5c06\u4e22\u5931\u3002nn\u60a8\u786e\u5b9a\u8981\u6062\u590d\u4fdd\u5b58\u7684\u5185\u5bb9\u5417\uff1f","restore_content":"\u6062\u590d\u81ea\u52a8\u4fdd\u5b58\u7684\u5185\u5bb9\u3002","unload_msg":"\u5982\u679c\u9000\u51fa\u8be5\u9875\uff0c\u60a8\u6240\u505a\u7684\u66f4\u6539\u5c06\u4e22\u5931\u3002"},fullscreen:{desc:"\u5207\u6362\u5168\u5c4f\u6a21\u5f0f"},media:{edit:"\u7f16\u8f91\u5d4c\u5165\u5f0f\u5a92\u4f53",desc:"\u63d2\u5165/\u7f16\u8f91 \u5d4c\u5165\u5f0f\u5a92\u4f53","delta_height":"","delta_width":""},fullpage:{desc:"\u6587\u4ef6\u5c5e\u6027","delta_width":"\u5bbd\u5ea6","delta_height":"\u9ad8\u5ea6"},template:{desc:"\u63d2\u5165\u9884\u8bbe\u7684\u6a21\u677f\u5185\u5bb9"},visualchars:{desc:"\u663e\u793a/\u9690\u85cf \u975e\u53ef\u89c1\u5b57\u7b26"},spellchecker:{desc:"\u62fc\u5199\u68c0\u67e5",menu:"\u62fc\u5199\u68c0\u67e5\u8bbe\u7f6e","ignore_word":"\u5ffd\u7565","ignore_words":"\u5168\u90e8\u5ffd\u7565",langs:"\u8bed\u8a00",wait:"\u8bf7\u7a0d\u5019...",sug:"\u5efa\u8bae","no_sug":"\u65e0\u5efa\u8bae","no_mpell":"\u65e0\u62fc\u5199\u9519\u8bef","learn_word":"\u5b66\u4e60\u8bcd\u7ec4"},pagebreak:{desc:"\u63d2\u5165\u5206\u9875\u7b26"},advlist:{types:"\u6837\u5f0f",def:"\u9ed8\u8ba4","lower_alpha":"\u5c0f\u5199\u5b57\u6bcd","lower_greek":"\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd","lower_roman":"\u5c0f\u5199\u7f57\u9a6c\u6570\u5b57","upper_alpha":"\u5927\u5199\u5b57\u6bcd","upper_roman":"\u5927\u5199\u7f57\u9a6c\u6570\u5b57",circle:"\u5706\u5708",disc:"\u5706\u70b9",square:"\u65b9\u5757"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"\u5bcc\u6587\u672c\u57df"},wordcount:{words:"\u5b57\u6570:"}}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/license.txt b/webcit/tiny_mce/license.txt
new file mode 100644 (file)
index 0000000..d111efb
--- /dev/null
@@ -0,0 +1,504 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE\r
+                      Version 2.1, February 1999\r
+\r
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
+ Everyone is permitted to copy and distribute verbatim copies\r
+ of this license document, but changing it is not allowed.\r
+\r
+[This is the first released version of the Lesser GPL.  It also counts\r
+ as the successor of the GNU Library Public License, version 2, hence\r
+ the version number 2.1.]\r
+\r
+                           Preamble\r
+\r
+  The licenses for most software are designed to take away your\r
+freedom to share and change it.  By contrast, the GNU General Public\r
+Licenses are intended to guarantee your freedom to share and change\r
+free software--to make sure the software is free for all its users.\r
+\r
+  This license, the Lesser General Public License, applies to some\r
+specially designated software packages--typically libraries--of the\r
+Free Software Foundation and other authors who decide to use it.  You\r
+can use it too, but we suggest you first think carefully about whether\r
+this license or the ordinary General Public License is the better\r
+strategy to use in any particular case, based on the explanations below.\r
+\r
+  When we speak of free software, we are referring to freedom of use,\r
+not price.  Our General Public Licenses are designed to make sure that\r
+you have the freedom to distribute copies of free software (and charge\r
+for this service if you wish); that you receive source code or can get\r
+it if you want it; that you can change the software and use pieces of\r
+it in new free programs; and that you are informed that you can do\r
+these things.\r
+\r
+  To protect your rights, we need to make restrictions that forbid\r
+distributors to deny you these rights or to ask you to surrender these\r
+rights.  These restrictions translate to certain responsibilities for\r
+you if you distribute copies of the library or if you modify it.\r
+\r
+  For example, if you distribute copies of the library, whether gratis\r
+or for a fee, you must give the recipients all the rights that we gave\r
+you.  You must make sure that they, too, receive or can get the source\r
+code.  If you link other code with the library, you must provide\r
+complete object files to the recipients, so that they can relink them\r
+with the library after making changes to the library and recompiling\r
+it.  And you must show them these terms so they know their rights.\r
+\r
+  We protect your rights with a two-step method: (1) we copyright the\r
+library, and (2) we offer you this license, which gives you legal\r
+permission to copy, distribute and/or modify the library.\r
+\r
+  To protect each distributor, we want to make it very clear that\r
+there is no warranty for the free library.  Also, if the library is\r
+modified by someone else and passed on, the recipients should know\r
+that what they have is not the original version, so that the original\r
+author's reputation will not be affected by problems that might be\r
+introduced by others.\r
+\r
+  Finally, software patents pose a constant threat to the existence of\r
+any free program.  We wish to make sure that a company cannot\r
+effectively restrict the users of a free program by obtaining a\r
+restrictive license from a patent holder.  Therefore, we insist that\r
+any patent license obtained for a version of the library must be\r
+consistent with the full freedom of use specified in this license.\r
+\r
+  Most GNU software, including some libraries, is covered by the\r
+ordinary GNU General Public License.  This license, the GNU Lesser\r
+General Public License, applies to certain designated libraries, and\r
+is quite different from the ordinary General Public License.  We use\r
+this license for certain libraries in order to permit linking those\r
+libraries into non-free programs.\r
+\r
+  When a program is linked with a library, whether statically or using\r
+a shared library, the combination of the two is legally speaking a\r
+combined work, a derivative of the original library.  The ordinary\r
+General Public License therefore permits such linking only if the\r
+entire combination fits its criteria of freedom.  The Lesser General\r
+Public License permits more lax criteria for linking other code with\r
+the library.\r
+\r
+  We call this license the "Lesser" General Public License because it\r
+does Less to protect the user's freedom than the ordinary General\r
+Public License.  It also provides other free software developers Less\r
+of an advantage over competing non-free programs.  These disadvantages\r
+are the reason we use the ordinary General Public License for many\r
+libraries.  However, the Lesser license provides advantages in certain\r
+special circumstances.\r
+\r
+  For example, on rare occasions, there may be a special need to\r
+encourage the widest possible use of a certain library, so that it becomes\r
+a de-facto standard.  To achieve this, non-free programs must be\r
+allowed to use the library.  A more frequent case is that a free\r
+library does the same job as widely used non-free libraries.  In this\r
+case, there is little to gain by limiting the free library to free\r
+software only, so we use the Lesser General Public License.\r
+\r
+  In other cases, permission to use a particular library in non-free\r
+programs enables a greater number of people to use a large body of\r
+free software.  For example, permission to use the GNU C Library in\r
+non-free programs enables many more people to use the whole GNU\r
+operating system, as well as its variant, the GNU/Linux operating\r
+system.\r
+\r
+  Although the Lesser General Public License is Less protective of the\r
+users' freedom, it does ensure that the user of a program that is\r
+linked with the Library has the freedom and the wherewithal to run\r
+that program using a modified version of the Library.\r
+\r
+  The precise terms and conditions for copying, distribution and\r
+modification follow.  Pay close attention to the difference between a\r
+"work based on the library" and a "work that uses the library".  The\r
+former contains code derived from the library, whereas the latter must\r
+be combined with the library in order to run.\r
+\r
+                 GNU LESSER GENERAL PUBLIC LICENSE\r
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+\r
+  0. This License Agreement applies to any software library or other\r
+program which contains a notice placed by the copyright holder or\r
+other authorized party saying it may be distributed under the terms of\r
+this Lesser General Public License (also called "this License").\r
+Each licensee is addressed as "you".\r
+\r
+  A "library" means a collection of software functions and/or data\r
+prepared so as to be conveniently linked with application programs\r
+(which use some of those functions and data) to form executables.\r
+\r
+  The "Library", below, refers to any such software library or work\r
+which has been distributed under these terms.  A "work based on the\r
+Library" means either the Library or any derivative work under\r
+copyright law: that is to say, a work containing the Library or a\r
+portion of it, either verbatim or with modifications and/or translated\r
+straightforwardly into another language.  (Hereinafter, translation is\r
+included without limitation in the term "modification".)\r
+\r
+  "Source code" for a work means the preferred form of the work for\r
+making modifications to it.  For a library, complete source code means\r
+all the source code for all modules it contains, plus any associated\r
+interface definition files, plus the scripts used to control compilation\r
+and installation of the library.\r
+\r
+  Activities other than copying, distribution and modification are not\r
+covered by this License; they are outside its scope.  The act of\r
+running a program using the Library is not restricted, and output from\r
+such a program is covered only if its contents constitute a work based\r
+on the Library (independent of the use of the Library in a tool for\r
+writing it).  Whether that is true depends on what the Library does\r
+and what the program that uses the Library does.\r
+  \r
+  1. You may copy and distribute verbatim copies of the Library's\r
+complete source code as you receive it, in any medium, provided that\r
+you conspicuously and appropriately publish on each copy an\r
+appropriate copyright notice and disclaimer of warranty; keep intact\r
+all the notices that refer to this License and to the absence of any\r
+warranty; and distribute a copy of this License along with the\r
+Library.\r
+\r
+  You may charge a fee for the physical act of transferring a copy,\r
+and you may at your option offer warranty protection in exchange for a\r
+fee.\r
+\r
+  2. You may modify your copy or copies of the Library or any portion\r
+of it, thus forming a work based on the Library, and copy and\r
+distribute such modifications or work under the terms of Section 1\r
+above, provided that you also meet all of these conditions:\r
+\r
+    a) The modified work must itself be a software library.\r
+\r
+    b) You must cause the files modified to carry prominent notices\r
+    stating that you changed the files and the date of any change.\r
+\r
+    c) You must cause the whole of the work to be licensed at no\r
+    charge to all third parties under the terms of this License.\r
+\r
+    d) If a facility in the modified Library refers to a function or a\r
+    table of data to be supplied by an application program that uses\r
+    the facility, other than as an argument passed when the facility\r
+    is invoked, then you must make a good faith effort to ensure that,\r
+    in the event an application does not supply such function or\r
+    table, the facility still operates, and performs whatever part of\r
+    its purpose remains meaningful.\r
+\r
+    (For example, a function in a library to compute square roots has\r
+    a purpose that is entirely well-defined independent of the\r
+    application.  Therefore, Subsection 2d requires that any\r
+    application-supplied function or table used by this function must\r
+    be optional: if the application does not supply it, the square\r
+    root function must still compute square roots.)\r
+\r
+These requirements apply to the modified work as a whole.  If\r
+identifiable sections of that work are not derived from the Library,\r
+and can be reasonably considered independent and separate works in\r
+themselves, then this License, and its terms, do not apply to those\r
+sections when you distribute them as separate works.  But when you\r
+distribute the same sections as part of a whole which is a work based\r
+on the Library, the distribution of the whole must be on the terms of\r
+this License, whose permissions for other licensees extend to the\r
+entire whole, and thus to each and every part regardless of who wrote\r
+it.\r
+\r
+Thus, it is not the intent of this section to claim rights or contest\r
+your rights to work written entirely by you; rather, the intent is to\r
+exercise the right to control the distribution of derivative or\r
+collective works based on the Library.\r
+\r
+In addition, mere aggregation of another work not based on the Library\r
+with the Library (or with a work based on the Library) on a volume of\r
+a storage or distribution medium does not bring the other work under\r
+the scope of this License.\r
+\r
+  3. You may opt to apply the terms of the ordinary GNU General Public\r
+License instead of this License to a given copy of the Library.  To do\r
+this, you must alter all the notices that refer to this License, so\r
+that they refer to the ordinary GNU General Public License, version 2,\r
+instead of to this License.  (If a newer version than version 2 of the\r
+ordinary GNU General Public License has appeared, then you can specify\r
+that version instead if you wish.)  Do not make any other change in\r
+these notices.\r
+\r
+  Once this change is made in a given copy, it is irreversible for\r
+that copy, so the ordinary GNU General Public License applies to all\r
+subsequent copies and derivative works made from that copy.\r
+\r
+  This option is useful when you wish to copy part of the code of\r
+the Library into a program that is not a library.\r
+\r
+  4. You may copy and distribute the Library (or a portion or\r
+derivative of it, under Section 2) in object code or executable form\r
+under the terms of Sections 1 and 2 above provided that you accompany\r
+it with the complete corresponding machine-readable source code, which\r
+must be distributed under the terms of Sections 1 and 2 above on a\r
+medium customarily used for software interchange.\r
+\r
+  If distribution of object code is made by offering access to copy\r
+from a designated place, then offering equivalent access to copy the\r
+source code from the same place satisfies the requirement to\r
+distribute the source code, even though third parties are not\r
+compelled to copy the source along with the object code.\r
+\r
+  5. A program that contains no derivative of any portion of the\r
+Library, but is designed to work with the Library by being compiled or\r
+linked with it, is called a "work that uses the Library".  Such a\r
+work, in isolation, is not a derivative work of the Library, and\r
+therefore falls outside the scope of this License.\r
+\r
+  However, linking a "work that uses the Library" with the Library\r
+creates an executable that is a derivative of the Library (because it\r
+contains portions of the Library), rather than a "work that uses the\r
+library".  The executable is therefore covered by this License.\r
+Section 6 states terms for distribution of such executables.\r
+\r
+  When a "work that uses the Library" uses material from a header file\r
+that is part of the Library, the object code for the work may be a\r
+derivative work of the Library even though the source code is not.\r
+Whether this is true is especially significant if the work can be\r
+linked without the Library, or if the work is itself a library.  The\r
+threshold for this to be true is not precisely defined by law.\r
+\r
+  If such an object file uses only numerical parameters, data\r
+structure layouts and accessors, and small macros and small inline\r
+functions (ten lines or less in length), then the use of the object\r
+file is unrestricted, regardless of whether it is legally a derivative\r
+work.  (Executables containing this object code plus portions of the\r
+Library will still fall under Section 6.)\r
+\r
+  Otherwise, if the work is a derivative of the Library, you may\r
+distribute the object code for the work under the terms of Section 6.\r
+Any executables containing that work also fall under Section 6,\r
+whether or not they are linked directly with the Library itself.\r
+\r
+  6. As an exception to the Sections above, you may also combine or\r
+link a "work that uses the Library" with the Library to produce a\r
+work containing portions of the Library, and distribute that work\r
+under terms of your choice, provided that the terms permit\r
+modification of the work for the customer's own use and reverse\r
+engineering for debugging such modifications.\r
+\r
+  You must give prominent notice with each copy of the work that the\r
+Library is used in it and that the Library and its use are covered by\r
+this License.  You must supply a copy of this License.  If the work\r
+during execution displays copyright notices, you must include the\r
+copyright notice for the Library among them, as well as a reference\r
+directing the user to the copy of this License.  Also, you must do one\r
+of these things:\r
+\r
+    a) Accompany the work with the complete corresponding\r
+    machine-readable source code for the Library including whatever\r
+    changes were used in the work (which must be distributed under\r
+    Sections 1 and 2 above); and, if the work is an executable linked\r
+    with the Library, with the complete machine-readable "work that\r
+    uses the Library", as object code and/or source code, so that the\r
+    user can modify the Library and then relink to produce a modified\r
+    executable containing the modified Library.  (It is understood\r
+    that the user who changes the contents of definitions files in the\r
+    Library will not necessarily be able to recompile the application\r
+    to use the modified definitions.)\r
+\r
+    b) Use a suitable shared library mechanism for linking with the\r
+    Library.  A suitable mechanism is one that (1) uses at run time a\r
+    copy of the library already present on the user's computer system,\r
+    rather than copying library functions into the executable, and (2)\r
+    will operate properly with a modified version of the library, if\r
+    the user installs one, as long as the modified version is\r
+    interface-compatible with the version that the work was made with.\r
+\r
+    c) Accompany the work with a written offer, valid for at\r
+    least three years, to give the same user the materials\r
+    specified in Subsection 6a, above, for a charge no more\r
+    than the cost of performing this distribution.\r
+\r
+    d) If distribution of the work is made by offering access to copy\r
+    from a designated place, offer equivalent access to copy the above\r
+    specified materials from the same place.\r
+\r
+    e) Verify that the user has already received a copy of these\r
+    materials or that you have already sent this user a copy.\r
+\r
+  For an executable, the required form of the "work that uses the\r
+Library" must include any data and utility programs needed for\r
+reproducing the executable from it.  However, as a special exception,\r
+the materials to be distributed need not include anything that is\r
+normally distributed (in either source or binary form) with the major\r
+components (compiler, kernel, and so on) of the operating system on\r
+which the executable runs, unless that component itself accompanies\r
+the executable.\r
+\r
+  It may happen that this requirement contradicts the license\r
+restrictions of other proprietary libraries that do not normally\r
+accompany the operating system.  Such a contradiction means you cannot\r
+use both them and the Library together in an executable that you\r
+distribute.\r
+\r
+  7. You may place library facilities that are a work based on the\r
+Library side-by-side in a single library together with other library\r
+facilities not covered by this License, and distribute such a combined\r
+library, provided that the separate distribution of the work based on\r
+the Library and of the other library facilities is otherwise\r
+permitted, and provided that you do these two things:\r
+\r
+    a) Accompany the combined library with a copy of the same work\r
+    based on the Library, uncombined with any other library\r
+    facilities.  This must be distributed under the terms of the\r
+    Sections above.\r
+\r
+    b) Give prominent notice with the combined library of the fact\r
+    that part of it is a work based on the Library, and explaining\r
+    where to find the accompanying uncombined form of the same work.\r
+\r
+  8. You may not copy, modify, sublicense, link with, or distribute\r
+the Library except as expressly provided under this License.  Any\r
+attempt otherwise to copy, modify, sublicense, link with, or\r
+distribute the Library is void, and will automatically terminate your\r
+rights under this License.  However, parties who have received copies,\r
+or rights, from you under this License will not have their licenses\r
+terminated so long as such parties remain in full compliance.\r
+\r
+  9. You are not required to accept this License, since you have not\r
+signed it.  However, nothing else grants you permission to modify or\r
+distribute the Library or its derivative works.  These actions are\r
+prohibited by law if you do not accept this License.  Therefore, by\r
+modifying or distributing the Library (or any work based on the\r
+Library), you indicate your acceptance of this License to do so, and\r
+all its terms and conditions for copying, distributing or modifying\r
+the Library or works based on it.\r
+\r
+  10. Each time you redistribute the Library (or any work based on the\r
+Library), the recipient automatically receives a license from the\r
+original licensor to copy, distribute, link with or modify the Library\r
+subject to these terms and conditions.  You may not impose any further\r
+restrictions on the recipients' exercise of the rights granted herein.\r
+You are not responsible for enforcing compliance by third parties with\r
+this License.\r
+\r
+  11. If, as a consequence of a court judgment or allegation of patent\r
+infringement or for any other reason (not limited to patent issues),\r
+conditions are imposed on you (whether by court order, agreement or\r
+otherwise) that contradict the conditions of this License, they do not\r
+excuse you from the conditions of this License.  If you cannot\r
+distribute so as to satisfy simultaneously your obligations under this\r
+License and any other pertinent obligations, then as a consequence you\r
+may not distribute the Library at all.  For example, if a patent\r
+license would not permit royalty-free redistribution of the Library by\r
+all those who receive copies directly or indirectly through you, then\r
+the only way you could satisfy both it and this License would be to\r
+refrain entirely from distribution of the Library.\r
+\r
+If any portion of this section is held invalid or unenforceable under any\r
+particular circumstance, the balance of the section is intended to apply,\r
+and the section as a whole is intended to apply in other circumstances.\r
+\r
+It is not the purpose of this section to induce you to infringe any\r
+patents or other property right claims or to contest validity of any\r
+such claims; this section has the sole purpose of protecting the\r
+integrity of the free software distribution system which is\r
+implemented by public license practices.  Many people have made\r
+generous contributions to the wide range of software distributed\r
+through that system in reliance on consistent application of that\r
+system; it is up to the author/donor to decide if he or she is willing\r
+to distribute software through any other system and a licensee cannot\r
+impose that choice.\r
+\r
+This section is intended to make thoroughly clear what is believed to\r
+be a consequence of the rest of this License.\r
+\r
+  12. If the distribution and/or use of the Library is restricted in\r
+certain countries either by patents or by copyrighted interfaces, the\r
+original copyright holder who places the Library under this License may add\r
+an explicit geographical distribution limitation excluding those countries,\r
+so that distribution is permitted only in or among countries not thus\r
+excluded.  In such case, this License incorporates the limitation as if\r
+written in the body of this License.\r
+\r
+  13. The Free Software Foundation may publish revised and/or new\r
+versions of the Lesser General Public License from time to time.\r
+Such new versions will be similar in spirit to the present version,\r
+but may differ in detail to address new problems or concerns.\r
+\r
+Each version is given a distinguishing version number.  If the Library\r
+specifies a version number of this License which applies to it and\r
+"any later version", you have the option of following the terms and\r
+conditions either of that version or of any later version published by\r
+the Free Software Foundation.  If the Library does not specify a\r
+license version number, you may choose any version ever published by\r
+the Free Software Foundation.\r
+\r
+  14. If you wish to incorporate parts of the Library into other free\r
+programs whose distribution conditions are incompatible with these,\r
+write to the author to ask for permission.  For software which is\r
+copyrighted by the Free Software Foundation, write to the Free\r
+Software Foundation; we sometimes make exceptions for this.  Our\r
+decision will be guided by the two goals of preserving the free status\r
+of all derivatives of our free software and of promoting the sharing\r
+and reuse of software generally.\r
+\r
+                           NO WARRANTY\r
+\r
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY\r
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r
+\r
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r
+DAMAGES.\r
+\r
+                    END OF TERMS AND CONDITIONS\r
+\r
+           How to Apply These Terms to Your New Libraries\r
+\r
+  If you develop a new library, and you want it to be of the greatest\r
+possible use to the public, we recommend making it free software that\r
+everyone can redistribute and change.  You can do so by permitting\r
+redistribution under these terms (or, alternatively, under the terms of the\r
+ordinary General Public License).\r
+\r
+  To apply these terms, attach the following notices to the library.  It is\r
+safest to attach them to the start of each source file to most effectively\r
+convey the exclusion of warranty; and each file should have at least the\r
+"copyright" line and a pointer to where the full notice is found.\r
+\r
+    <one line to give the library's name and a brief idea of what it does.>\r
+    Copyright (C) <year>  <name of author>\r
+\r
+    This library is free software; you can redistribute it and/or\r
+    modify it under the terms of the GNU Lesser General Public\r
+    License as published by the Free Software Foundation; either\r
+    version 2.1 of the \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/webcit/tiny_mce/plugins/advhr/css/advhr.css b/webcit/tiny_mce/plugins/advhr/css/advhr.css
new file mode 100644 (file)
index 0000000..0e22834
--- /dev/null
@@ -0,0 +1,5 @@
+input.radio {border:1px none #000; background:transparent; vertical-align:middle;}\r
+.panel_wrapper div.current {height:80px;}\r
+#width {width:50px; vertical-align:middle;}\r
+#width2 {width:50px; vertical-align:middle;}\r
+#size {width:100px;}\r
diff --git a/webcit/tiny_mce/plugins/advhr/editor_plugin.js b/webcit/tiny_mce/plugins/advhr/editor_plugin.js
new file mode 100644 (file)
index 0000000..4d3b062
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AdvancedHRPlugin",{init:function(a,b){a.addCommand("mceAdvancedHr",function(){a.windowManager.open({file:b+"/rule.htm",width:250+parseInt(a.getLang("advhr.delta_width",0)),height:160+parseInt(a.getLang("advhr.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("advhr",{title:"advhr.advhr_desc",cmd:"mceAdvancedHr"});a.onNodeChange.add(function(d,c,e){c.setActive("advhr",e.nodeName=="HR")});a.onClick.add(function(c,d){d=d.target;if(d.nodeName==="HR"){c.selection.select(d)}})},getInfo:function(){return{longname:"Advanced HR",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advhr",tinymce.plugins.AdvancedHRPlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/editor_plugin_src.js b/webcit/tiny_mce/plugins/advhr/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..0c652d3
--- /dev/null
@@ -0,0 +1,57 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.AdvancedHRPlugin', {\r
+               init : function(ed, url) {\r
+                       // Register commands\r
+                       ed.addCommand('mceAdvancedHr', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/rule.htm',\r
+                                       width : 250 + parseInt(ed.getLang('advhr.delta_width', 0)),\r
+                                       height : 160 + parseInt(ed.getLang('advhr.delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('advhr', {\r
+                               title : 'advhr.advhr_desc',\r
+                               cmd : 'mceAdvancedHr'\r
+                       });\r
+\r
+                       ed.onNodeChange.add(function(ed, cm, n) {\r
+                               cm.setActive('advhr', n.nodeName == 'HR');\r
+                       });\r
+\r
+                       ed.onClick.add(function(ed, e) {\r
+                               e = e.target;\r
+\r
+                               if (e.nodeName === 'HR')\r
+                                       ed.selection.select(e);\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Advanced HR',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('advhr', tinymce.plugins.AdvancedHRPlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/js/rule.js b/webcit/tiny_mce/plugins/advhr/js/rule.js
new file mode 100644 (file)
index 0000000..b6cbd66
--- /dev/null
@@ -0,0 +1,43 @@
+var AdvHRDialog = {\r
+       init : function(ed) {\r
+               var dom = ed.dom, f = document.forms[0], n = ed.selection.getNode(), w;\r
+\r
+               w = dom.getAttrib(n, 'width');\r
+               f.width.value = w ? parseInt(w) : (dom.getStyle('width') || '');\r
+               f.size.value = dom.getAttrib(n, 'size') || parseInt(dom.getStyle('height')) || '';\r
+               f.noshade.checked = !!dom.getAttrib(n, 'noshade') || !!dom.getStyle('border-width');\r
+               selectByValue(f, 'width2', w.indexOf('%') != -1 ? '%' : 'px');\r
+       },\r
+\r
+       update : function() {\r
+               var ed = tinyMCEPopup.editor, h, f = document.forms[0], st = '';\r
+\r
+               h = '<hr';\r
+\r
+               if (f.size.value) {\r
+                       h += ' size="' + f.size.value + '"';\r
+                       st += ' height:' + f.size.value + 'px;';\r
+               }\r
+\r
+               if (f.width.value) {\r
+                       h += ' width="' + f.width.value + (f.width2.value == '%' ? '%' : '') + '"';\r
+                       st += ' width:' + f.width.value + (f.width2.value == '%' ? '%' : 'px') + ';';\r
+               }\r
+\r
+               if (f.noshade.checked) {\r
+                       h += ' noshade="noshade"';\r
+                       st += ' border-width: 1px; border-style: solid; border-color: #CCCCCC; color: #ffffff;';\r
+               }\r
+\r
+               if (ed.settings.inline_styles)\r
+                       h += ' style="' + tinymce.trim(st) + '"';\r
+\r
+               h += ' />';\r
+\r
+               ed.execCommand("mceInsertContent", false, h);\r
+               tinyMCEPopup.close();\r
+       }\r
+};\r
+\r
+tinyMCEPopup.requireLangPack();\r
+tinyMCEPopup.onInit.add(AdvHRDialog.init, AdvHRDialog);\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/bg_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..6981772
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.advhr_dlg',{size:"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430",noshade:"\u0411\u0435\u0437 \u0441\u044f\u043d\u043a\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/cs_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..967c6d3
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.advhr_dlg',{size:"V\u00fd\u0161ka",noshade:"Bez st\u00ednu",width:"\u0160\u00ed\u0159ka",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/da_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..6cfdd43
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.advhr_dlg',{size:"H\u00f8jde",noshade:"Ingen skygge",width:"Bredde",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/de_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..7c5143e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.advhr_dlg',{size:"H\u00f6he",noshade:"Kein Schatten",width:"Breite",normal:"Normal",widthunits:"Einheiten"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/el_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..3ca3adf
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.advhr_dlg',{size:"\u038e\u03c8\u03bf\u03c2",noshade:"\u03a7\u03c9\u03c1\u03af\u03c2 \u03c3\u03ba\u03b9\u03ac",width:"\u03a0\u03bb\u03ac\u03c4\u03bf\u03c2",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/en_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..0c3bf15
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advhr_dlg',{size:"Height",noshade:"No Shadow",width:"Width",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/es_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..0eeed6e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.advhr_dlg',{size:"Alto",noshade:"Sin sombra",width:"Ancho",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/et_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..fce2559
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.advhr_dlg',{size:"K\u00f5rgus",noshade:"Ilma varjuta",width:"Laius",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/fi_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..3318d1f
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.advhr_dlg',{size:"Korkeus",noshade:"Ei varjoa",width:"Leveys",normal:"Normaali",widthunits:"Yksik\u00f6t"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/fr_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..b4fcd2a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.advhr_dlg',{size:"Hauteur",noshade:"Pas d\'ombre",width:"Largeur",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/hu_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..4b26ac0
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.advhr_dlg',{size:"Magass\u00e1g",noshade:"\u00c1rny\u00e9k n\u00e9lk\u00fcl",width:"Sz\u00e9less\u00e9g",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/it_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..f013f11
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.advhr_dlg',{size:"Altezza",noshade:"Senza ombreggiatura",width:"Larghezza",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/advhr/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..c891216
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.advhr_dlg',{size:"\u9ad8\u5ea6",noshade:"\u65e0\u9634\u5f71",width:"\u5bbd\u5ea6",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/rule.htm b/webcit/tiny_mce/plugins/advhr/rule.htm
new file mode 100644 (file)
index 0000000..843e1f8
--- /dev/null
@@ -0,0 +1,58 @@
+<!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>{#advhr.advhr_desc}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/rule.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <link href="css/advhr.css" rel="stylesheet" type="text/css" />\r
+</head>\r
+<body role="application">\r
+<form onsubmit="AdvHRDialog.update();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advhr.advhr_desc}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                       <tr role="group" aria-labelledby="width_label">\r
+                                               <td><label id="width_label" for="width">{#advhr_dlg.width}</label></td>\r
+                                               <td class="nowrap">\r
+                                                       <input id="width" name="width" type="text" value="" class="mceFocus" />\r
+                                                       <span style="display:none;" id="width_unit_label">{#advhr_dlg.widthunits}</span>\r
+                                                       <select name="width2" id="width2" aria-labelledby="width_unit_label">\r
+                                                               <option value="">px</option>\r
+                                                               <option value="%">%</option>\r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td><label for="size">{#advhr_dlg.size}</label></td>\r
+                                               <td><select id="size" name="size">\r
+                                                       <option value="">{#advhr_dlg.normal}</option>\r
+                                                       <option value="1">1</option>\r
+                                                       <option value="2">2</option>\r
+                                                       <option value="3">3</option>\r
+                                                       <option value="4">4</option>\r
+                                                       <option value="5">5</option>\r
+                                               </select></td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td><label for="noshade">{#advhr_dlg.noshade}</label></td>\r
+                                               <td><input type="checkbox" name="noshade" id="noshade" class="radio" /></td>\r
+                                       </tr>\r
+                       </table>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/advimage/css/advimage.css b/webcit/tiny_mce/plugins/advimage/css/advimage.css
new file mode 100644 (file)
index 0000000..0a6251a
--- /dev/null
@@ -0,0 +1,13 @@
+#src_list, #over_list, #out_list {width:280px;}\r
+.mceActionPanel {margin-top:7px;}\r
+.alignPreview {border:1px solid #000; width:140px; height:140px; overflow:hidden; padding:5px;}\r
+.checkbox {border:0;}\r
+.panel_wrapper div.current {height:305px;}\r
+#prev {margin:0; border:1px solid #000; width:428px; height:150px; overflow:auto;}\r
+#align, #classlist {width:150px;}\r
+#width, #height {vertical-align:middle; width:50px; text-align:center;}\r
+#vspace, #hspace, #border {vertical-align:middle; width:30px; text-align:center;}\r
+#class_list {width:180px;}\r
+input {width: 280px;}\r
+#constrain, #onmousemovecheck {width:auto;}\r
+#id, #dir, #lang, #usemap, #longdesc {width:200px;}\r
diff --git a/webcit/tiny_mce/plugins/advimage/editor_plugin.js b/webcit/tiny_mce/plugins/advimage/editor_plugin.js
new file mode 100644 (file)
index 0000000..d613a61
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class","").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/editor_plugin_src.js b/webcit/tiny_mce/plugins/advimage/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..d2678cb
--- /dev/null
@@ -0,0 +1,50 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.AdvancedImagePlugin', {\r
+               init : function(ed, url) {\r
+                       // Register commands\r
+                       ed.addCommand('mceAdvImage', function() {\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
+                                       file : url + '/image.htm',\r
+                                       width : 480 + parseInt(ed.getLang('advimage.delta_width', 0)),\r
+                                       height : 385 + parseInt(ed.getLang('advimage.delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('image', {\r
+                               title : 'advimage.image_desc',\r
+                               cmd : 'mceAdvImage'\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Advanced image',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('advimage', tinymce.plugins.AdvancedImagePlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/image.htm b/webcit/tiny_mce/plugins/advimage/image.htm
new file mode 100644 (file)
index 0000000..ed16b3d
--- /dev/null
@@ -0,0 +1,235 @@
+<!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>{#advimage_dlg.dialog_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/image.js"></script>\r
+       <link href="css/advimage.css" rel="stylesheet" type="text/css" />\r
+</head>\r
+<body id="advimage" style="display: none" role="application" aria-labelledby="app_title">\r
+       <span id="app_title" style="display:none">{#advimage_dlg.dialog_title}</span>\r
+       <form onsubmit="ImageDialog.insert();return false;" action="#"> \r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advimage_dlg.tab_general}</a></span></li>\r
+                               <li id="appearance_tab" aria-controls="appearance_panel"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#advimage_dlg.tab_appearance}</a></span></li>\r
+                               <li id="advanced_tab" aria-controls="advanced_panel"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advimage_dlg.tab_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>{#advimage_dlg.general}</legend>\r
+\r
+                                               <table role="presentation" class="properties">\r
+                                                       <tr>\r
+                                                               <td class="column1"><label id="srclabel" for="src">{#advimage_dlg.src}</label></td>\r
+                                                               <td colspan="2"><table role="presentation" border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr> \r
+                                                                               <td><input name="src" type="text" id="src" value="" class="mceFocus" onchange="ImageDialog.showPreviewImage(this.value);" aria-required="true" /></td> \r
+                                                                               <td id="srcbrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><label for="src_list">{#advimage_dlg.image_list}</label></td>\r
+                                                               <td><select id="src_list" name="src_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;document.getElementById('title').value=this.options[this.selectedIndex].text;ImageDialog.showPreviewImage(this.options[this.selectedIndex].value);"><option value=""></option></select></td>\r
+                                                       </tr>\r
+                                                       <tr> \r
+                                                               <td class="column1"><label id="altlabel" for="alt">{#advimage_dlg.alt}</label></td> \r
+                                                               <td colspan="2"><input id="alt" name="alt" type="text" value="" /></td> \r
+                                                       </tr> \r
+                                                       <tr> \r
+                                                               <td class="column1"><label id="titlelabel" for="title">{#advimage_dlg.title}</label></td> \r
+                                                               <td colspan="2"><input id="title" name="title" type="text" value="" /></td> \r
+                                                       </tr>\r
+                                               </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{#advimage_dlg.preview}</legend>\r
+                                       <div id="prev"></div>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="appearance_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{#advimage_dlg.tab_appearance}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr> \r
+                                                       <td class="column1"><label id="alignlabel" for="align">{#advimage_dlg.align}</label></td> \r
+                                                       <td><select id="align" name="align" onchange="ImageDialog.updateStyle('align');ImageDialog.changeAppearance();"> \r
+                                                                       <option value="">{#not_set}</option> \r
+                                                                       <option value="baseline">{#advimage_dlg.align_baseline}</option>\r
+                                                                       <option value="top">{#advimage_dlg.align_top}</option>\r
+                                                                       <option value="middle">{#advimage_dlg.align_middle}</option>\r
+                                                                       <option value="bottom">{#advimage_dlg.align_bottom}</option>\r
+                                                                       <option value="text-top">{#advimage_dlg.align_texttop}</option>\r
+                                                                       <option value="text-bottom">{#advimage_dlg.align_textbottom}</option>\r
+                                                                       <option value="left">{#advimage_dlg.align_left}</option>\r
+                                                                       <option value="right">{#advimage_dlg.align_right}</option>\r
+                                                               </select> \r
+                                                       </td>\r
+                                                       <td rowspan="6" valign="top">\r
+                                                               <div class="alignPreview">\r
+                                                                       <img id="alignSampleImg" src="img/sample.gif" alt="{#advimage_dlg.example_img}" />\r
+                                                                       Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam\r
+                                                                       nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum\r
+                                                                       edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam\r
+                                                                       erat volutpat.\r
+                                                               </div>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr role="group" aria-labelledby="widthlabel">\r
+                                                       <td class="column1"><label id="widthlabel" for="width">{#advimage_dlg.dimensions}</label></td>\r
+                                                       <td class="nowrap">\r
+                                                               <span style="display:none" id="width_voiceLabel">{#advimage_dlg.width}</span>\r
+                                                               <input name="width" type="text" id="width" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeHeight();" aria-labelledby="width_voiceLabel" /> x \r
+                                                               <span style="display:none" id="height_voiceLabel">{#advimage_dlg.height}</span>\r
+                                                               <input name="height" type="text" id="height" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeWidth();" aria-labelledby="height_voiceLabel" /> px\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td>&nbsp;</td>\r
+                                                       <td><table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td>\r
+                                                                               <td><label id="constrainlabel" for="constrain">{#advimage_dlg.constrain_proportions}</label></td>\r
+                                                                       </tr>\r
+                                                               </table></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="vspacelabel" for="vspace">{#advimage_dlg.vspace}</label></td> \r
+                                                       <td><input name="vspace" type="text" id="vspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" />\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr> \r
+                                                       <td class="column1"><label id="hspacelabel" for="hspace">{#advimage_dlg.hspace}</label></td> \r
+                                                       <td><input name="hspace" type="text" id="hspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="borderlabel" for="border">{#advimage_dlg.border}</label></td> \r
+                                                       <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="class_list">{#class_name}</label></td>\r
+                                                       <td colspan="2"><select id="class_list" name="class_list" class="mceEditableSelect"><option value=""></option></select></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="stylelabel" for="style">{#advimage_dlg.style}</label></td> \r
+                                                       <td colspan="2"><input id="style" name="style" type="text" value="" onchange="ImageDialog.changeAppearance();" /></td> \r
+                                               </tr>\r
+\r
+                                               <!-- <tr>\r
+                                                       <td class="column1"><label id="classeslabel" for="classes">{#advimage_dlg.classes}</label></td> \r
+                                                       <td colspan="2"><input id="classes" name="classes" type="text" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td> \r
+                                               </tr> -->\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{#advimage_dlg.swap_image}</legend>\r
+\r
+                                       <input type="checkbox" id="onmousemovecheck" name="onmousemovecheck" class="checkbox" onclick="ImageDialog.setSwapImage(this.checked);" aria-controls="onmouseoversrc onmouseoutsrc" />\r
+                                       <label id="onmousemovechecklabel" for="onmousemovecheck">{#advimage_dlg.alt_image}</label>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                                       <tr>\r
+                                                               <td class="column1"><label id="onmouseoversrclabel" for="onmouseoversrc">{#advimage_dlg.mouseover}</label></td> \r
+                                                               <td><table role="presentation" border="0" cellspacing="0" cellpadding="0"> \r
+                                                                       <tr> \r
+                                                                               <td><input id="onmouseoversrc" name="onmouseoversrc" type="text" value="" /></td> \r
+                                                                               <td id="onmouseoversrccontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><label for="over_list">{#advimage_dlg.image_list}</label></td>\r
+                                                               <td><select id="over_list" name="over_list" onchange="document.getElementById('onmouseoversrc').value=this.options[this.selectedIndex].value;"><option value=""></option></select></td>\r
+                                                       </tr>\r
+                                                       <tr> \r
+                                                               <td class="column1"><label id="onmouseoutsrclabel" for="onmouseoutsrc">{#advimage_dlg.mouseout}</label></td> \r
+                                                               <td class="column2"><table role="presentation" border="0" cellspacing="0" cellpadding="0"> \r
+                                                                       <tr> \r
+                                                                               <td><input id="onmouseoutsrc" name="onmouseoutsrc" type="text" value="" /></td> \r
+                                                                               <td id="onmouseoutsrccontainer">&nbsp;</td>\r
+                                                                       </tr> \r
+                                                               </table></td> \r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><label for="out_list">{#advimage_dlg.image_list}</label></td>\r
+                                                               <td><select id="out_list" name="out_list" onchange="document.getElementById('onmouseoutsrc').value=this.options[this.selectedIndex].value;"><option value=""></option></select></td>\r
+                                                       </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{#advimage_dlg.misc}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="idlabel" for="id">{#advimage_dlg.id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="dirlabel" for="dir">{#advimage_dlg.langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" onchange="ImageDialog.changeAppearance();"> \r
+                                                                               <option value="">{#not_set}</option> \r
+                                                                               <option value="ltr">{#advimage_dlg.ltr}</option> \r
+                                                                               <option value="rtl">{#advimage_dlg.rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="langlabel" for="lang">{#advimage_dlg.langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="usemaplabel" for="usemap">{#advimage_dlg.map}</label></td> \r
+                                                       <td>\r
+                                                               <input id="usemap" name="usemap" type="text" value="" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="longdesclabel" for="longdesc">{#advimage_dlg.long_desc}</label></td>\r
+                                                       <td><table role="presentation" border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="longdesc" name="longdesc" type="text" value="" /></td>\r
+                                                                               <td id="longdesccontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                       </table></td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </form>\r
+</body> \r
+</html> \r
diff --git a/webcit/tiny_mce/plugins/advimage/img/sample.gif b/webcit/tiny_mce/plugins/advimage/img/sample.gif
new file mode 100644 (file)
index 0000000..53bf689
Binary files /dev/null and b/webcit/tiny_mce/plugins/advimage/img/sample.gif differ
diff --git a/webcit/tiny_mce/plugins/advimage/js/image.js b/webcit/tiny_mce/plugins/advimage/js/image.js
new file mode 100644 (file)
index 0000000..546b69c
--- /dev/null
@@ -0,0 +1,462 @@
+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(ed) {\r
+               var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(), fl = tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList');\r
+\r
+               tinyMCEPopup.resizeToInnerSize();\r
+               this.fillClassList('class_list');\r
+               this.fillFileList('src_list', fl);\r
+               this.fillFileList('over_list', fl);\r
+               this.fillFileList('out_list', fl);\r
+               TinyMCE_EditableSelects.init();\r
+\r
+               if (n.nodeName == 'IMG') {\r
+                       nl.src.value = dom.getAttrib(n, 'src');\r
+                       nl.width.value = dom.getAttrib(n, 'width');\r
+                       nl.height.value = dom.getAttrib(n, 'height');\r
+                       nl.alt.value = dom.getAttrib(n, 'alt');\r
+                       nl.title.value = dom.getAttrib(n, 'title');\r
+                       nl.vspace.value = this.getAttrib(n, 'vspace');\r
+                       nl.hspace.value = this.getAttrib(n, 'hspace');\r
+                       nl.border.value = this.getAttrib(n, 'border');\r
+                       selectByValue(f, 'align', this.getAttrib(n, 'align'));\r
+                       selectByValue(f, 'class_list', dom.getAttrib(n, 'class'), true, true);\r
+                       nl.style.value = dom.getAttrib(n, 'style');\r
+                       nl.id.value = dom.getAttrib(n, 'id');\r
+                       nl.dir.value = dom.getAttrib(n, 'dir');\r
+                       nl.lang.value = dom.getAttrib(n, 'lang');\r
+                       nl.usemap.value = dom.getAttrib(n, 'usemap');\r
+                       nl.longdesc.value = dom.getAttrib(n, 'longdesc');\r
+                       nl.insert.value = ed.getLang('update');\r
+\r
+                       if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseover')))\r
+                               nl.onmouseoversrc.value = dom.getAttrib(n, 'onmouseover').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');\r
+\r
+                       if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseout')))\r
+                               nl.onmouseoutsrc.value = dom.getAttrib(n, 'onmouseout').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');\r
+\r
+                       if (ed.settings.inline_styles) {\r
+                               // Move attribs to styles\r
+                               if (dom.getAttrib(n, 'align'))\r
+                                       this.updateStyle('align');\r
+\r
+                               if (dom.getAttrib(n, 'hspace'))\r
+                                       this.updateStyle('hspace');\r
+\r
+                               if (dom.getAttrib(n, 'border'))\r
+                                       this.updateStyle('border');\r
+\r
+                               if (dom.getAttrib(n, 'vspace'))\r
+                                       this.updateStyle('vspace');\r
+                       }\r
+               }\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 = '260px';\r
+\r
+               // Setup browse button\r
+               document.getElementById('onmouseoversrccontainer').innerHTML = getBrowserHTML('overbrowser','onmouseoversrc','image','theme_advanced_image');\r
+               if (isVisible('overbrowser'))\r
+                       document.getElementById('onmouseoversrc').style.width = '260px';\r
+\r
+               // Setup browse button\r
+               document.getElementById('onmouseoutsrccontainer').innerHTML = getBrowserHTML('outbrowser','onmouseoutsrc','image','theme_advanced_image');\r
+               if (isVisible('outbrowser'))\r
+                       document.getElementById('onmouseoutsrc').style.width = '260px';\r
+\r
+               // If option enabled default contrain proportions to checked\r
+               if (ed.getParam("advimage_constrain_proportions", true))\r
+                       f.constrain.checked = true;\r
+\r
+               // Check swap image if valid data\r
+               if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value)\r
+                       this.setSwapImage(true);\r
+               else\r
+                       this.setSwapImage(false);\r
+\r
+               this.changeAppearance();\r
+               this.showPreviewImage(nl.src.value, 1);\r
+       },\r
+\r
+       insert : function(file, title) {\r
+               var ed = tinyMCEPopup.editor, t = this, f = document.forms[0];\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 (tinyMCEPopup.getParam("accessibility_warnings", 1)) {\r
+                       if (!f.alt.value) {\r
+                               tinyMCEPopup.confirm(tinyMCEPopup.getLang('advimage_dlg.missing_alt'), function(s) {\r
+                                       if (s)\r
+                                               t.insertAndClose();\r
+                               });\r
+\r
+                               return;\r
+                       }\r
+               }\r
+\r
+               t.insertAndClose();\r
+       },\r
+\r
+       insertAndClose : function() {\r
+               var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el;\r
+\r
+               tinyMCEPopup.restoreSelection();\r
+\r
+               // Fixes crash in Safari\r
+               if (tinymce.isWebKit)\r
+                       ed.getWin().focus();\r
+\r
+               if (!ed.settings.inline_styles) {\r
+                       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
+                       // Remove deprecated values\r
+                       args = {\r
+                               vspace : '',\r
+                               hspace : '',\r
+                               border : '',\r
+                               align : ''\r
+                       };\r
+               }\r
+\r
+               tinymce.extend(args, {\r
+                       src : nl.src.value.replace(/ /g, '%20'),\r
+                       width : nl.width.value,\r
+                       height : nl.height.value,\r
+                       alt : nl.alt.value,\r
+                       title : nl.title.value,\r
+                       'class' : getSelectValue(f, 'class_list'),\r
+                       style : nl.style.value,\r
+                       id : nl.id.value,\r
+                       dir : nl.dir.value,\r
+                       lang : nl.lang.value,\r
+                       usemap : nl.usemap.value,\r
+                       longdesc : nl.longdesc.value\r
+               });\r
+\r
+               args.onmouseover = args.onmouseout = '';\r
+\r
+               if (f.onmousemovecheck.checked) {\r
+                       if (nl.onmouseoversrc.value)\r
+                               args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';";\r
+\r
+                       if (nl.onmouseoutsrc.value)\r
+                               args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';";\r
+               }\r
+\r
+               el = ed.selection.getNode();\r
+\r
+               if (el && el.nodeName == 'IMG') {\r
+                       ed.dom.setAttribs(el, args);\r
+               } else {\r
+                       tinymce.each(args, function(value, name) {\r
+                               if (value === "") {\r
+                                       delete args[name];\r
+                               }\r
+                       });\r
+\r
+                       ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1});\r
+                       ed.undoManager.add();\r
+               }\r
+\r
+               tinyMCEPopup.editor.execCommand('mceRepaint');\r
+               tinyMCEPopup.editor.focus();\r
+               tinyMCEPopup.close();\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
+\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
+       setSwapImage : function(st) {\r
+               var f = document.forms[0];\r
+\r
+               f.onmousemovecheck.checked = st;\r
+               setBrowserDisabled('overbrowser', !st);\r
+               setBrowserDisabled('outbrowser', !st);\r
+\r
+               if (f.over_list)\r
+                       f.over_list.disabled = !st;\r
+\r
+               if (f.out_list)\r
+                       f.out_list.disabled = !st;\r
+\r
+               f.onmouseoversrc.disabled = !st;\r
+               f.onmouseoutsrc.disabled  = !st;\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.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
+       fillFileList : function(id, l) {\r
+               var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;\r
+\r
+               l = typeof(l) === 'function' ? l() : window[l];\r
+               lst.options.length = 0;\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
+       resetImageData : function() {\r
+               var f = document.forms[0];\r
+\r
+               f.elements.width.value = f.elements.height.value = '';\r
+       },\r
+\r
+       updateImageData : function(img, st) {\r
+               var f = document.forms[0];\r
+\r
+               if (!st) {\r
+                       f.elements.width.value = img.width;\r
+                       f.elements.height.value = img.height;\r
+               }\r
+\r
+               this.preloadImg = img;\r
+       },\r
+\r
+       changeAppearance : function() {\r
+               var ed = tinyMCEPopup.editor, f = document.forms[0], img = document.getElementById('alignSampleImg');\r
+\r
+               if (img) {\r
+                       if (ed.getParam('inline_styles')) {\r
+                               ed.dom.setAttrib(img, 'style', f.style.value);\r
+                       } else {\r
+                               img.align = f.align.value;\r
+                               img.border = f.border.value;\r
+                               img.hspace = f.hspace.value;\r
+                               img.vspace = f.vspace.value;\r
+                       }\r
+               }\r
+       },\r
+\r
+       changeHeight : function() {\r
+               var f = document.forms[0], tp, t = this;\r
+\r
+               if (!f.constrain.checked || !t.preloadImg) {\r
+                       return;\r
+               }\r
+\r
+               if (f.width.value == "" || f.height.value == "")\r
+                       return;\r
+\r
+               tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * t.preloadImg.height;\r
+               f.height.value = tp.toFixed(0);\r
+       },\r
+\r
+       changeWidth : function() {\r
+               var f = document.forms[0], tp, t = this;\r
+\r
+               if (!f.constrain.checked || !t.preloadImg) {\r
+                       return;\r
+               }\r
+\r
+               if (f.width.value == "" || f.height.value == "")\r
+                       return;\r
+\r
+               tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * t.preloadImg.width;\r
+               f.width.value = tp.toFixed(0);\r
+       },\r
+\r
+       updateStyle : function(ty) {\r
+               var dom = tinyMCEPopup.dom, b, bStyle, bColor, v, isIE = tinymce.isIE, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value});\r
+\r
+               if (tinyMCEPopup.editor.settings.inline_styles) {\r
+                       // Handle align\r
+                       if (ty == 'align') {\r
+                               dom.setStyle(img, 'float', '');\r
+                               dom.setStyle(img, 'vertical-align', '');\r
+\r
+                               v = getSelectValue(f, 'align');\r
+                               if (v) {\r
+                                       if (v == 'left' || v == 'right')\r
+                                               dom.setStyle(img, 'float', v);\r
+                                       else\r
+                                               img.style.verticalAlign = v;\r
+                               }\r
+                       }\r
+\r
+                       // Handle border\r
+                       if (ty == 'border') {\r
+                               b = img.style.border ? img.style.border.split(' ') : [];\r
+                               bStyle = dom.getStyle(img, 'border-style');\r
+                               bColor = dom.getStyle(img, 'border-color');\r
+\r
+                               dom.setStyle(img, 'border', '');\r
+\r
+                               v = f.border.value;\r
+                               if (v || v == '0') {\r
+                                       if (v == '0')\r
+                                               img.style.border = isIE ? '0' : '0 none none';\r
+                                       else {\r
+                                               if (b.length == 3 && b[isIE ? 2 : 1])\r
+                                                       bStyle = b[isIE ? 2 : 1];\r
+                                               else if (!bStyle || bStyle == 'none')\r
+                                                       bStyle = 'solid';\r
+                                               if (b.length == 3 && b[isIE ? 0 : 2])\r
+                                                       bColor = b[isIE ? 0 : 2];\r
+                                               else if (!bColor || bColor == 'none')\r
+                                                       bColor = 'black';\r
+                                               img.style.border = v + 'px ' + bStyle + ' ' + bColor;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Handle hspace\r
+                       if (ty == 'hspace') {\r
+                               dom.setStyle(img, 'marginLeft', '');\r
+                               dom.setStyle(img, 'marginRight', '');\r
+\r
+                               v = f.hspace.value;\r
+                               if (v) {\r
+                                       img.style.marginLeft = v + 'px';\r
+                                       img.style.marginRight = v + 'px';\r
+                               }\r
+                       }\r
+\r
+                       // Handle vspace\r
+                       if (ty == 'vspace') {\r
+                               dom.setStyle(img, 'marginTop', '');\r
+                               dom.setStyle(img, 'marginBottom', '');\r
+\r
+                               v = f.vspace.value;\r
+                               if (v) {\r
+                                       img.style.marginTop = v + 'px';\r
+                                       img.style.marginBottom = v + 'px';\r
+                               }\r
+                       }\r
+\r
+                       // Merge\r
+                       dom.get('style').value = dom.serializeStyle(dom.parseStyle(img.style.cssText), 'img');\r
+               }\r
+       },\r
+\r
+       changeMouseMove : function() {\r
+       },\r
+\r
+       showPreviewImage : function(u, st) {\r
+               if (!u) {\r
+                       tinyMCEPopup.dom.setHTML('prev', '');\r
+                       return;\r
+               }\r
+\r
+               if (!st && tinyMCEPopup.getParam("advimage_update_dimensions_onchange", true))\r
+                       this.resetImageData();\r
+\r
+               u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u);\r
+\r
+               if (!st)\r
+                       tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this);" onerror="ImageDialog.resetImageData();" />');\r
+               else\r
+                       tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this, 1);" />');\r
+       }\r
+};\r
+\r
+ImageDialog.preInit();\r
+tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/bg_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..572df46
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.advimage_dlg',{"image_list":"\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438","align_right":"\u0414\u044f\u0441\u043d\u043e","align_left":"\u041b\u044f\u0432\u043e","align_textbottom":"\u0422\u0435\u043a\u0441\u0442 \u0434\u043e\u043b\u0443","align_texttop":"\u0422\u0435\u043a\u0441\u0442 \u0433\u043e\u0440\u0435","align_bottom":"\u0414\u043e\u043b\u0443","align_middle":"\u0426\u0435\u043d\u0442\u044a\u0440","align_top":"\u0413\u043e\u0440\u0435","align_baseline":"\u0411\u0430\u0437\u043e\u0432\u0430 \u043b\u0438\u043d\u0438\u044f",align:"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",hspace:"\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435",vspace:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435",dimensions:"\u0420\u0430\u0437\u043c\u0435\u0440\u0438",border:"\u0420\u0430\u043c\u043a\u0430",list:"\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438",alt:"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",src:"URL \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430","dialog_title":"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430","missing_alt":"\u0421\u0438\u0433\u0443\u0440\u0435\u043d \u043b\u0438 \u0441\u0442\u0435 \u0447\u0435 \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u0431\u0435\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0442\u0430? \u0411\u0435\u0437 \u043d\u0435\u0433\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0442\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u044a\u043f\u043d\u0430 \u0437\u0430 \u043d\u044f\u043a\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0441 \u043d\u0435\u0434\u044a\u0437\u0438, \u0438\u043b\u0438 \u0437\u0430 \u0442\u0435\u0437\u0438 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0449\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0431\u0440\u0430\u0443\u0437\u044a\u0440, \u0438\u043b\u0438 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0449\u0438 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0441 \u0438\u0437\u043a\u043b\u044e\u0447\u0435\u043d\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.","example_img":"\u041f\u0440\u0435\u0433\u043b\u0435\u0434 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0442\u0430",misc:"\u0420\u0430\u0437\u043d\u0438",mouseout:"\u0437\u0430 mouse out",mouseover:"\u0437\u0430 mouse over","alt_image":"\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430","swap_image":"\u0421\u043c\u0435\u043d\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",map:"\u041a\u0430\u0440\u0442\u0438\u043d\u0430 \u043a\u0430\u0440\u0442\u0430",id:"Id",rtl:"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e",ltr:"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e",classes:"\u041a\u043b\u0430\u0441\u043e\u0432\u0435",style:"\u0421\u0442\u0438\u043b","long_desc":"\u0425\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 \u043a\u044a\u043c \u0434\u044a\u043b\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",langcode:"\u041a\u043e\u0434 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",langdir:"\u041f\u043e\u0441\u043e\u043a\u0430 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430","constrain_proportions":"\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438\u0442\u0435",preview:"\u041f\u0440\u0435\u0433\u043b\u0435\u0434",title:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435",general:"\u041e\u0431\u0449\u0438","tab_advanced":"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438","tab_appearance":"\u0412\u044a\u043d\u0448\u0435\u043d \u0432\u0438\u0434","tab_general":"\u041e\u0431\u0449\u0438",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/cs_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..79cd082
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.advimage_dlg',{"image_list":"Seznam obr\u00e1zk\u016f","align_right":"Vpravo","align_left":"Vlevo","align_textbottom":"Se spodkem \u0159\u00e1dku","align_texttop":"S vrchem \u0159\u00e1dku","align_bottom":"Dol\u016f","align_middle":"Na st\u0159ed \u0159\u00e1dku","align_top":"Nahoru","align_baseline":"Na z\u00e1kladnu",align:"Zarovn\u00e1n\u00ed",hspace:"Horizont\u00e1ln\u00ed odsazen\u00ed",vspace:"Vertik\u00e1ln\u00ed odsazen\u00ed",dimensions:"Rozm\u011bry",border:"R\u00e1me\u010dek",list:"Seznam obr\u00e1zk\u016f",alt:"Popis obr\u00e1zku",src:"URL obr\u00e1zku","dialog_title":"Vlo\u017eit/upravit obr\u00e1zek","missing_alt":"Skute\u010dn\u011b chcete pokra\u010dovat bez vlo\u017een\u00e9ho popisu obr\u00e1zku? Bez popisu m\u016f\u017ee b\u00fdt obr\u00e1zek nep\u0159\u00edstupn\u00fd u\u017eivatel\u016fm se zrakov\u00fdm posti\u017een\u00edm, u\u017eivatel\u016fm textov\u00fdch prohl\u00ed\u017ee\u010d\u016f nebo u\u017eivatel\u016fm, kte\u0159\u00ed maj\u00ed vypnuto zobrazov\u00e1n\u00ed obr\u00e1zk\u016f.","example_img":"P\u0159\u00edklad obr\u00e1zku",misc:"R\u016fzn\u00e9",mouseout:"Po odjet\u00ed my\u0161i...",mouseover:"P\u0159i najet\u00ed my\u0161i...","alt_image":"Alternativn\u00ed obr\u00e1zek","swap_image":"P\u0159epnout obr\u00e1zek",map:"Obr\u00e1zkov\u00e1 mapa",id:"ID",rtl:"Zprava doleva",ltr:"Zleva doprava",classes:"T\u0159\u00eddy",style:"Styl","long_desc":"Dlouh\u00fd popis",langcode:"K\u00f3d jazyka",langdir:"Sm\u011br textu","constrain_proportions":"Zachovat proporce",preview:"N\u00e1hled",title:"Titulek",general:"Obecn\u00e9 parametry","tab_advanced":"Roz\u0161\u00ed\u0159en\u00e9","tab_appearance":"Vzhled","tab_general":"Obecn\u00e9",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/da_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..b51ef3c
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.advimage_dlg',{"image_list":"Billedliste","align_right":"H\u00f8jre","align_left":"Venstre","align_textbottom":"Tekstbund","align_texttop":"Teksttop","align_bottom":"Bund","align_middle":"Midte","align_top":"Top","align_baseline":"Grundlinje",align:"Justering",hspace:"Horisontal afstand",vspace:"Vertikal afstand",dimensions:"Dimentioner",border:"Kant",list:"Billedliste",alt:"Billedbeskrivelse",src:"Billed-URL","dialog_title":"Inds\u00e6t/rediger billede","missing_alt":"Er du sikker p\u00e5, at du vil forts\u00e6tte uden at inkludere en billedebeskrivelse? Uden denne er billedet m\u00e5ske ikke tilg\u00e6ngeligt for nogle brugere med handicaps, eller for dem der bruger en tekstbrowser, eller som browser internettet med billeder sl\u00e5et fra.","example_img":"Forh\u00e5ndsvisning af billede",misc:"Diverse",mouseout:"for mus-ud",mouseover:"for mus-over","alt_image":"Alternativt billede","swap_image":"Byt billede",map:"Billede map",id:"Id",rtl:"H\u00f8jre til venstre",ltr:"Venstre til h\u00f8jre",classes:"Klasser",style:"Stil","long_desc":"Lang beskrivelseslink",langcode:"Sprogkode",langdir:"Sprogretning","constrain_proportions":"Bibehold proportioner",preview:"Vis",title:"Titel",general:"Generelt","tab_advanced":"Avanceret","tab_appearance":"Udseende","tab_general":"Generelt",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/de_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..fc0f6d1
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.advimage_dlg',{"image_list":"Bilderliste","align_right":"Rechts","align_left":"Links","align_textbottom":"Unten im Text","align_texttop":"Oben im Text","align_bottom":"Unten","align_middle":"Mittig","align_top":"Oben","align_baseline":"Zeile",align:"Ausrichtung",hspace:"Horizontaler Abstand",vspace:"Vertikaler Abstand",dimensions:"Ausma\u00dfe",border:"Rahmen",list:"Bilderliste",alt:"Beschreibung",src:"Adresse","dialog_title":"Bild einf\u00fcgen/ver\u00e4ndern","missing_alt":"Wollen Sie wirklich keine Beschreibung eingeben? Bestimmte Benutzer mit k\u00f6rperlichen Einschr\u00e4nkungen k\u00f6nnen so nicht darauf zugreifen, ebenso solche, die einen Textbrowser benutzen oder die Anzeige von Bildern deaktiviert haben.","example_img":"Vorschau auf das Aussehen",misc:"Verschiedenes",mouseout:"bei keinem Mauskontakt",mouseover:"bei Mauskontakt","alt_image":"Alternatives Bild","swap_image":"Bild austauschen",map:"Image-Map",id:"ID",rtl:"Rechts nach links",ltr:"Links nach rechts",classes:"Klassen",style:"Format","long_desc":"Ausf\u00fchrliche Beschreibung",langcode:"Sprachcode",langdir:"Schriftrichtung","constrain_proportions":"Seitenverh\u00e4ltnis beibehalten",preview:"Vorschau",title:"Titel",general:"Allgemein","tab_advanced":"Erweitert","tab_appearance":"Aussehen","tab_general":"Allgemein",width:"Breite",height:"H\u00f6he"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/el_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..17aa55e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.advimage_dlg',{"image_list":"\u039b\u03af\u03c3\u03c4\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03c9\u03bd","align_right":"\u0394\u03b5\u03be\u03b9\u03ac","align_left":"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","align_textbottom":"\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03ba\u03ac\u03c4\u03c9","align_texttop":"\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03c0\u03ac\u03bd\u03c9","align_bottom":"\u039a\u03ac\u03c4\u03c9","align_middle":"\u039c\u03ad\u03c3\u03b7","align_top":"\u03a0\u03ac\u03bd\u03c9","align_baseline":"\u0393\u03c1\u03b1\u03bc\u03bc\u03ae \u03c3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ac\u03c4\u03c9\u03bd",align:"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7",hspace:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1",vspace:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03ba\u03ac\u03b8\u03b5\u03c4\u03b7",dimensions:"\u0394\u03b9\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2",border:"\u03a0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf",list:"\u039b\u03af\u03c3\u03c4\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03c9\u03bd",alt:"\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",src:"\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2","dialog_title":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2","missing_alt":"\u03a3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5 \u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2; \u03a7\u03c9\u03c1\u03af\u03c2 \u03b1\u03c5\u03c4\u03ae\u03bd\u03b7 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03bc\u03b7\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03b2\u03ac\u03c3\u03b9\u03bc\u03b7 \u03c3\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03c5\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 \u03bc\u03b5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1, \u03ae \u03c3\'\u03b1\u03c5\u03c4\u03bf\u03cd\u03c2 \u03c0\u03bf\u03c5 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03bf\u03cd\u03bd \u03c6\u03c5\u03bb\u03bb\u03bf\u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ae \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5, \u03ae \u03b2\u03bb\u03ad\u03c0\u03bf\u03c5\u03bd \u03c4\u03bf \u0399\u03bd\u03c4\u03b5\u03c1\u03bd\u03b5\u03c4 \u03c7\u03c9\u03c1\u03af\u03c2 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b5\u03c2.","example_img":"\u0394\u03bf\u03ba\u03b9\u03bc\u03b1\u03c3\u03c4\u03b9\u03ba\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1",misc:"\u0394\u03b9\u03ac\u03c6\u03bf\u03c1\u03b1",mouseout:"\u03b3\u03b9\u03b1 mouse out",mouseover:"\u03b3\u03b9\u03b1 mouse over","alt_image":"\u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03ba\u03c4\u03b9\u03ba\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1","swap_image":"\u0391\u03bd\u03c4\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",map:"\u03a7\u03ac\u03c1\u03c4\u03b7\u03c2 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",id:"Id",rtl:"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",ltr:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac",classes:"\u039a\u03bb\u03ac\u03c3\u03b5\u03b9\u03c2",style:"\u03a3\u03c4\u03c5\u03bb","long_desc":"\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2 \u03c0\u03bb\u03ae\u03c1\u03bf\u03c5\u03c2 \u03c0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2",langcode:"\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",langdir:"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2","constrain_proportions":"\u0394\u03b9\u03b1\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 \u03b1\u03bd\u03b1\u03bb\u03bf\u03b3\u03af\u03b1\u03c2 \u03c0\u03bb. - \u03cd\u03c8\u03bf\u03c5\u03c2",preview:"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7",title:"\u03a4\u03af\u03c4\u03bb\u03bf\u03c2",general:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac","tab_advanced":"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2","tab_appearance":"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7","tab_general":"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/en_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..5f122e2
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advimage_dlg',{"image_list":"Image List","align_right":"Right","align_left":"Left","align_textbottom":"Text Bottom","align_texttop":"Text Top","align_bottom":"Bottom","align_middle":"Middle","align_top":"Top","align_baseline":"Baseline",align:"Alignment",hspace:"Horizontal Space",vspace:"Vertical Space",dimensions:"Dimensions",border:"Border",list:"Image List",alt:"Image Description",src:"Image URL","dialog_title":"Insert/Edit Image","missing_alt":"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.","example_img":"Appearance Preview Image",misc:"Miscellaneous",mouseout:"For Mouse Out",mouseover:"For Mouse Over","alt_image":"Alternative Image","swap_image":"Swap Image",map:"Image Map",id:"ID",rtl:"Right to Left",ltr:"Left to Right",classes:"Classes",style:"Style","long_desc":"Long Description Link",langcode:"Language Code",langdir:"Language Direction","constrain_proportions":"Constrain Proportions",preview:"Preview",title:"Title",general:"General","tab_advanced":"Advanced","tab_appearance":"Appearance","tab_general":"General",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/es_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..c02e9c4
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.advimage_dlg',{"image_list":"Lista de imagen","align_right":"Derecha","align_left":"Izquierda","align_textbottom":"Texto abajo","align_texttop":"Texto arriba","align_bottom":"Debajo","align_middle":"Medio","align_top":"Arriba","align_baseline":"L\u00ednea base",align:"Alineaci\u00f3n",hspace:"Espacio horizontal",vspace:"Espacio vertical",dimensions:"Dimensiones",border:"Bordes",list:"Lista de imagen",alt:"Descripci\u00f3n de la imagen",src:"URL de la imagen","dialog_title":"Insertar/editar imagen","missing_alt":" \u00bfEsta seguro de continuar sin introducir una descripci\u00f3n a la imagen? Sin ella puede no ser accesible para usuarios con discapacidades, o para aquellos que usen navegadores de modo texto, o tengan deshabilitadas las im\u00e1genes de la p\u00e1gina.","example_img":"Vista previa de la imagen",misc:"Miscel\u00e1neo",mouseout:"para mouseout",mouseover:"para mouseover","alt_image":"Imagen alternativa","swap_image":"Intercambiar imagen",map:"Mapa de imagen",id:"Id",rtl:"Derecha a izquierda",ltr:"Izquierda a derecha",classes:"Clases",style:"Estilos","long_desc":"V\u00ednculo para descripci\u00f3n larga",langcode:"C\u00f3digo del lenguaje",langdir:"Direcci\u00f3n del lenguaje","constrain_proportions":"Bloquear relaci\u00f3n de aspecto",preview:"Vista previa",title:"T\u00edtulo",general:"General","tab_advanced":"Avanzado","tab_appearance":"Apariencia","tab_general":"General",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/et_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..6c7e124
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.advimage_dlg',{"image_list":"Piltide nimekiri","align_right":"Paremal","align_left":"Vasakul","align_textbottom":"Tekst all","align_texttop":"Tekst \u00fcleval","align_bottom":"All","align_middle":"Keskel","align_top":"\u00dcleval","align_baseline":"Baas",align:"Joondus",hspace:"Horisontaalne vahe",vspace:"Vertikaalne vahe",dimensions:"M\u00f5\u00f5tmed",border:"Raam",list:"Piltide nimekiri",alt:"Pildi kirjeldus",src:"Pildi URL","dialog_title":"Sisesta/muuda pilti","missing_alt":"Oled kindel, et soovid j\u00e4tkata pildile kirjeldust lisamata?","example_img":"Eelvaate pildi v\u00e4limus",misc:"Mitmesugune",mouseout:"\u201eKursor maas\u201c",mouseover:"\u201eKursor peal\u201c","alt_image":"Alternatiivne pilt","swap_image":"Vaheta pilti",map:"Pildi kaart",id:"ID",rtl:"Paremalt vasakule",ltr:"Vasakult paremale",classes:"Klassid",style:"Stiil","long_desc":"Pikk kirjelduse link",langcode:"Keele kood",langdir:"Keele suund","constrain_proportions":"Piira proportioone",preview:"Eelvaade",title:"Pealkiri",general:"\u00dcldine","tab_advanced":"P\u00f5hjalikum","tab_appearance":"V\u00e4limus","tab_general":"\u00dcldine",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/fi_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..f85c1ec
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.advimage_dlg',{"image_list":"Kuvalista","align_right":"Oikealla","align_left":"Vasemmalla","align_textbottom":"Teksti alhaalla","align_texttop":"Teksti ylh\u00e4\u00e4ll\u00e4","align_bottom":"Alhaalla","align_middle":"Keskell\u00e4","align_top":"Ylh\u00e4\u00e4ll\u00e4","align_baseline":"Rivill\u00e4",align:"Tasaus",hspace:"vaakasuora tila",vspace:"pystysuora tila",dimensions:"Mitat",border:"Kehys",list:"Kuvalista",alt:"Kuvan kuvaus",src:"Kuvan URL","dialog_title":"Lis\u00e4\u00e4/muokkaa kuvaa","missing_alt":"Haluatko varmasti jatkaa lis\u00e4\u00e4m\u00e4tt\u00e4 kuvausta? Kuvauksen puuttuminen saattaa h\u00e4irit\u00e4 sellaisia, jotka k\u00e4ytt\u00e4v\u00e4t tekstipohjaista selainta tai ovat kytkeneet kuvien n\u00e4kymisen pois p\u00e4\u00e4lt\u00e4.","example_img":"Ulkoasun esikatselukuva",misc:"Sekalaiset",mouseout:"mouseoutille",mouseover:"mouseoverille","alt_image":"Vaihtoehtoinen kuva","swap_image":"Vaihda kuva",map:"Kuvakartta",id:"Id",rtl:"Oikealta vasemmalle",ltr:"Vasemmalta oikealle",classes:"Luokat",style:"Tyyli","long_desc":"Pitk\u00e4n kuvauksen linkki",langcode:"Kielen koodi",langdir:"Kielen suunta","constrain_proportions":"S\u00e4ilyt\u00e4 mittasuhteet",preview:"Esikatselu",title:"Otsikko",general:"Yleiset","tab_advanced":"Edistynyt","tab_appearance":"N\u00e4kyminen","tab_general":"Yleiset",width:"Leveys",height:"Korkeus"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/fr_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..ecf3d95
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.advimage_dlg',{"image_list":"Liste d\'images","align_right":"Droite (flottant)","align_left":"Gauche (flottant)","align_textbottom":"Texte en bas","align_texttop":"Texte en haut","align_bottom":"En bas","align_middle":"Au milieu","align_top":"En haut","align_baseline":"Normal",align:"Alignement",hspace:"Espacement horizontal",vspace:"Espacement vertical",dimensions:"Dimensions",border:"Bordure",list:"Liste d\'images",alt:"Description de l\'image",src:"URL de l\'image","dialog_title":"Ins\u00e9rer / \u00e9diter une image","missing_alt":"\u00cates-vous s\u00fbr de vouloir continuer sans d\u00e9finir de description pour l\'image ? Sans elle, l\'image peut ne pas \u00eatre accessible \u00e0 certains utilisateurs handicap\u00e9s, ceux utilisant un navigateur texte ou ceux qui naviguent sans affichage des images.","example_img":"Apparence de l\'image",misc:"Divers",mouseout:"\u00e0 la sortie de la souris",mouseover:"au survol de la souris","alt_image":"Image alternative","swap_image":"Image de remplacement",map:"Image cliquable",id:"Id",rtl:"De droite \u00e0 gauche",ltr:"De gauche \u00e0 droite",classes:"Classes",style:"Style","long_desc":"Description longue du lien",langcode:"Code de la langue",langdir:"Sens de lecture","constrain_proportions":"Conserver les proportions",preview:"Pr\u00e9visualisation",title:"Titre",general:"G\u00e9n\u00e9ral","tab_advanced":"Avanc\u00e9","tab_appearance":"Apparence","tab_general":"G\u00e9n\u00e9ral",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/hu_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..b43b0dc
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.advimage_dlg',{"image_list":"K\u00e9plista","align_right":"Jobbra","align_left":"Balra","align_textbottom":"Sz\u00f6veg alj\u00e1hoz","align_texttop":"Sz\u00f6veg tetej\u00e9hez","align_bottom":"Lentre","align_middle":"K\u00f6z\u00e9pre","align_top":"Fentre","align_baseline":"Alapvonalhoz",align:"Igaz\u00edt\u00e1s",hspace:"V\u00edzszintes t\u00e1vols\u00e1g",vspace:"F\u00fcgg\u0151leges t\u00e1vols\u00e1g",dimensions:"M\u00e9retek",border:"Keret",list:"K\u00e9plista",alt:"K\u00e9p helyettes\u00edt\u0151 sz\u00f6vege",src:"K\u00e9p internet c\u00edme","dialog_title":"K\u00e9p besz\u00far\u00e1sa/szerkeszt\u00e9se","missing_alt":"Biztosan folytatja helyettes\u00edt\u0151 sz\u00f6veg n\u00e9lk\u00fcl? En\u00e9lk\u00fcl a korl\u00e1toz\u00e1ssal \u00e9l\u0151k, sz\u00f6veges b\u00f6ng\u00e9sz\u0151t haszn\u00e1l\u00f3k \u00e9s a k\u00e9pek megjelen\u00edt\u00e9s\u00e9t letilt\u00f3 felhaszn\u00e1l\u00f3k h\u00e1tr\u00e1nyban lesznek.","example_img":"El\u0151n\u00e9zeti k\u00e9p",misc:"Vegyes",mouseout:"K\u00e9p az eg\u00e9rkurzor lev\u00e9telekor",mouseover:"K\u00e9p az eg\u00e9rkurzor f\u00f6l\u00e9vitelekor","alt_image":"Alternat\u00edv k\u00e9p","swap_image":"K\u00e9pcsere",map:"K\u00e9p t\u00e9rk\u00e9p",id:"Id",rtl:"Jobbr\u00f3l balra",ltr:"Balr\u00f3l jobbra",classes:"Oszt\u00e1lyok",style:"CSS St\u00edlus","long_desc":"B\u0151vebb le\u00edr\u00e1s link",langcode:"Nyelv k\u00f3d",langdir:"Nyelv \u00edr\u00e1s ir\u00e1ny","constrain_proportions":"Ar\u00e1nytart\u00e1s",preview:"El\u0151n\u00e9zet",title:"C\u00edm",general:"\u00c1ltal\u00e1nos","tab_advanced":"Halad\u00f3","tab_appearance":"Megjelen\u00e9s","tab_general":"\u00c1ltal\u00e1nos",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/it_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..684369d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.advimage_dlg',{"image_list":"Lista immagini","align_right":"A destra","align_left":"A sinistra","align_textbottom":"In basso al testo","align_texttop":"In alto al testo","align_bottom":"In basso","align_middle":"In mezzo","align_top":"In alto","align_baseline":"Alla base",align:"Allineamento",hspace:"Spaziatura orizzontale",vspace:"Spaziatura verticale",dimensions:"Dimensioni",border:"Bordo",list:"Lista immagini",alt:"Descrizione immagine",src:"URL immagine","dialog_title":"Inserisci/modifica immagine","missing_alt":"Sicuro di continuare senza includere una descrizione dell\'immagine? Senza di essa l\'immagine pu\u00f2 non essere accessibile ad alcuni utenti con disabilit\u00e0, o per coloro che usano un browser testuale oppure che hanno disabilitato la visualizzazione delle immagini nel loro browser.","example_img":"Anteprima aspetto immagine",misc:"Impostazioni varie",mouseout:"quando mouse fuori",mouseover:"quando mouse sopra","alt_image":"Immagine alternativa","swap_image":"Sostituisci immagine",map:"Immagine come mappa",id:"Id",rtl:"Destra verso sinistraa",ltr:"Sinistra verso destra",classes:"Classe",style:"Stile","long_desc":"Descrizione del collegamento",langcode:"codice lingua",langdir:"Direzione testo","constrain_proportions":"Mantieni proporzioni",preview:"Anteprima",title:"Titolo",general:"Generale","tab_advanced":"Avanzate","tab_appearance":"Aspetto","tab_general":"Generale",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advimage/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/advimage/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..5cf6bf5
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.advimage_dlg',{"image_list":"\u56fe\u7247\u5217\u8868","align_right":"\u53f3\u5bf9\u9f50","align_left":"\u5de6\u5bf9\u9f50","align_textbottom":"\u6587\u5b57\u4e0b\u65b9","align_texttop":"\u6587\u5b57\u4e0a\u65b9","align_bottom":"\u5e95\u7aef\u5bf9\u9f50","align_middle":"\u5c45\u4e2d\u5bf9\u9f50","align_top":"\u9876\u7aef\u5bf9\u9f50","align_baseline":"\u5e95\u7ebf",align:"\u5bf9\u9f50",hspace:"\u6c34\u5e73\u8ddd\u79bb",vspace:"\u5782\u76f4\u8ddd\u79bb",dimensions:"\u5c3a\u5bf8",border:"\u8fb9\u6846",list:"\u56fe\u7247\u5217\u8868",alt:"\u56fe\u7247\u63cf\u8ff0",src:"\u56fe\u7247\u94fe\u63a5","dialog_title":"\u63d2\u5165/\u7f16\u8f91 \u56fe\u7247","missing_alt":"\u56fe\u7247\u6ca1\u6709\u8bf4\u660e\u6587\u5b57\uff0c\u60a8\u662f\u5426\u8981\u7ee7\u7eed\uff1f\u6ca1\u6709\u8bf4\u660e\u6587\u5b57\u7684\u56fe\u7247\uff0c\u53ef\u80fd\u7ed9\u6b8b\u75be\u4eba\u58eb\u3001\u6587\u672c\u6d4f\u89c8\u5668\u6216\u5173\u95ed\u56fe\u7247\u529f\u80fd\u7684\u6d4f\u89c8\u5668\u8bbf\u95ee\u9020\u6210\u56f0\u96be\u3002","example_img":"\u5916\u89c2\u9884\u89c8\u56fe",misc:"\u5176\u4ed6",mouseout:"\u9f20\u6807\u6ed1\u51fa",mouseover:"\u9f20\u6807\u6ed1\u5165","alt_image":"\u66ff\u6362\u56fe\u7247","swap_image":"\u56fe\u7247\u5207\u6362",map:"\u56fe\u7247map",id:"ID",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",classes:"\u7c7b\u522b",style:"\u6837\u5f0f","long_desc":"\u957f\u63cf\u8ff0\u94fe\u63a5",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u6587\u5b57\u65b9\u5411","constrain_proportions":"\u4fdd\u6301\u6bd4\u4f8b",preview:"\u9884\u89c8",title:"\u6807\u9898",general:"\u666e\u901a","tab_advanced":"\u9ad8\u7ea7","tab_appearance":"\u5916\u89c2","tab_general":"\u666e\u901a",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/css/advlink.css b/webcit/tiny_mce/plugins/advlink/css/advlink.css
new file mode 100644 (file)
index 0000000..1436431
--- /dev/null
@@ -0,0 +1,8 @@
+.mceLinkList, .mceAnchorList, #targetlist {width:280px;}\r
+.mceActionPanel {margin-top:7px;}\r
+.panel_wrapper div.current {height:320px;}\r
+#classlist, #title, #href {width:280px;}\r
+#popupurl, #popupname {width:200px;}\r
+#popupwidth, #popupheight, #popupleft, #popuptop {width:30px;vertical-align:middle;text-align:center;}\r
+#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {width:200px;}\r
+#events_panel input {width:200px;}\r
diff --git a/webcit/tiny_mce/plugins/advlink/editor_plugin.js b/webcit/tiny_mce/plugins/advlink/editor_plugin.js
new file mode 100644 (file)
index 0000000..983fe5a
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AdvancedLinkPlugin",{init:function(a,b){this.editor=a;a.addCommand("mceAdvLink",function(){var c=a.selection;if(c.isCollapsed()&&!a.dom.getParent(c.getNode(),"A")){return}a.windowManager.open({file:b+"/link.htm",width:480+parseInt(a.getLang("advlink.delta_width",0)),height:400+parseInt(a.getLang("advlink.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("link",{title:"advlink.link_desc",cmd:"mceAdvLink"});a.addShortcut("ctrl+k","advlink.advlink_desc","mceAdvLink");a.onNodeChange.add(function(d,c,f,e){c.setDisabled("link",e&&f.nodeName!="A");c.setActive("link",f.nodeName=="A"&&!f.name)})},getInfo:function(){return{longname:"Advanced link",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlink",tinymce.plugins.AdvancedLinkPlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/editor_plugin_src.js b/webcit/tiny_mce/plugins/advlink/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..14e46a7
--- /dev/null
@@ -0,0 +1,61 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.AdvancedLinkPlugin', {\r
+               init : function(ed, url) {\r
+                       this.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceAdvLink', function() {\r
+                               var se = ed.selection;\r
+\r
+                               // No selection and not in link\r
+                               if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A'))\r
+                                       return;\r
+\r
+                               ed.windowManager.open({\r
+                                       file : url + '/link.htm',\r
+                                       width : 480 + parseInt(ed.getLang('advlink.delta_width', 0)),\r
+                                       height : 400 + parseInt(ed.getLang('advlink.delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('link', {\r
+                               title : 'advlink.link_desc',\r
+                               cmd : 'mceAdvLink'\r
+                       });\r
+\r
+                       ed.addShortcut('ctrl+k', 'advlink.advlink_desc', 'mceAdvLink');\r
+\r
+                       ed.onNodeChange.add(function(ed, cm, n, co) {\r
+                               cm.setDisabled('link', co && n.nodeName != 'A');\r
+                               cm.setActive('link', n.nodeName == 'A' && !n.name);\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Advanced link',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('advlink', tinymce.plugins.AdvancedLinkPlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/js/advlink.js b/webcit/tiny_mce/plugins/advlink/js/advlink.js
new file mode 100644 (file)
index 0000000..837c937
--- /dev/null
@@ -0,0 +1,532 @@
+/* Functions for the advlink plugin popup */\r
+\r
+tinyMCEPopup.requireLangPack();\r
+\r
+var templates = {\r
+       "window.open" : "window.open('${url}','${target}','${options}')"\r
+};\r
+\r
+function preinit() {\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
+function changeClass() {\r
+       var f = document.forms[0];\r
+\r
+       f.classes.value = getSelectValue(f, 'classlist');\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+       var inst = tinyMCEPopup.editor;\r
+       var elm = inst.selection.getNode();\r
+       var action = "insert";\r
+       var html;\r
+\r
+       document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink');\r
+       document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink');\r
+       document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target');\r
+\r
+       // Link list\r
+       html = getLinkListHTML('linklisthref','href');\r
+       if (html == "")\r
+               document.getElementById("linklisthrefrow").style.display = 'none';\r
+       else\r
+               document.getElementById("linklisthrefcontainer").innerHTML = html;\r
+\r
+       // Anchor list\r
+       html = getAnchorListHTML('anchorlist','href');\r
+       if (html == "")\r
+               document.getElementById("anchorlistrow").style.display = 'none';\r
+       else\r
+               document.getElementById("anchorlistcontainer").innerHTML = html;\r
+\r
+       // Resize some elements\r
+       if (isVisible('hrefbrowser'))\r
+               document.getElementById('href').style.width = '260px';\r
+\r
+       if (isVisible('popupurlbrowser'))\r
+               document.getElementById('popupurl').style.width = '180px';\r
+\r
+       elm = inst.dom.getParent(elm, "A");\r
+       if (elm != null && elm.nodeName == "A")\r
+               action = "update";\r
+\r
+       formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); \r
+\r
+       setPopupControlsDisabled(true);\r
+\r
+       if (action == "update") {\r
+               var href = inst.dom.getAttrib(elm, 'href');\r
+               var onclick = inst.dom.getAttrib(elm, 'onclick');\r
+\r
+               // Setup form data\r
+               setFormValue('href', href);\r
+               setFormValue('title', inst.dom.getAttrib(elm, 'title'));\r
+               setFormValue('id', inst.dom.getAttrib(elm, 'id'));\r
+               setFormValue('style', inst.dom.getAttrib(elm, "style"));\r
+               setFormValue('rel', inst.dom.getAttrib(elm, 'rel'));\r
+               setFormValue('rev', inst.dom.getAttrib(elm, 'rev'));\r
+               setFormValue('charset', inst.dom.getAttrib(elm, 'charset'));\r
+               setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang'));\r
+               setFormValue('dir', inst.dom.getAttrib(elm, 'dir'));\r
+               setFormValue('lang', inst.dom.getAttrib(elm, 'lang'));\r
+               setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));\r
+               setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));\r
+               setFormValue('type', inst.dom.getAttrib(elm, 'type'));\r
+               setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus'));\r
+               setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur'));\r
+               setFormValue('onclick', onclick);\r
+               setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick'));\r
+               setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown'));\r
+               setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup'));\r
+               setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover'));\r
+               setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove'));\r
+               setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout'));\r
+               setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress'));\r
+               setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown'));\r
+               setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup'));\r
+               setFormValue('target', inst.dom.getAttrib(elm, 'target'));\r
+               setFormValue('classes', inst.dom.getAttrib(elm, 'class'));\r
+\r
+               // Parse onclick data\r
+               if (onclick != null && onclick.indexOf('window.open') != -1)\r
+                       parseWindowOpen(onclick);\r
+               else\r
+                       parseFunction(onclick);\r
+\r
+               // Select by the values\r
+               selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir'));\r
+               selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel'));\r
+               selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev'));\r
+               selectByValue(formObj, 'linklisthref', href);\r
+\r
+               if (href.charAt(0) == '#')\r
+                       selectByValue(formObj, 'anchorlist', href);\r
+\r
+               addClassesToList('classlist', 'advlink_styles');\r
+\r
+               selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true);\r
+               selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true);\r
+       } else\r
+               addClassesToList('classlist', 'advlink_styles');\r
+}\r
+\r
+function checkPrefix(n) {\r
+       if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email')))\r
+               n.value = 'mailto:' + n.value;\r
+\r
+       if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external')))\r
+               n.value = 'http://' + n.value;\r
+}\r
+\r
+function setFormValue(name, value) {\r
+       document.forms[0].elements[name].value = value;\r
+}\r
+\r
+function parseWindowOpen(onclick) {\r
+       var formObj = document.forms[0];\r
+\r
+       // Preprocess center code\r
+       if (onclick.indexOf('return false;') != -1) {\r
+               formObj.popupreturn.checked = true;\r
+               onclick = onclick.replace('return false;', '');\r
+       } else\r
+               formObj.popupreturn.checked = false;\r
+\r
+       var onClickData = parseLink(onclick);\r
+\r
+       if (onClickData != null) {\r
+               formObj.ispopup.checked = true;\r
+               setPopupControlsDisabled(false);\r
+\r
+               var onClickWindowOptions = parseOptions(onClickData['options']);\r
+               var url = onClickData['url'];\r
+\r
+               formObj.popupname.value = onClickData['target'];\r
+               formObj.popupurl.value = url;\r
+               formObj.popupwidth.value = getOption(onClickWindowOptions, 'width');\r
+               formObj.popupheight.value = getOption(onClickWindowOptions, 'height');\r
+\r
+               formObj.popupleft.value = getOption(onClickWindowOptions, 'left');\r
+               formObj.popuptop.value = getOption(onClickWindowOptions, 'top');\r
+\r
+               if (formObj.popupleft.value.indexOf('screen') != -1)\r
+                       formObj.popupleft.value = "c";\r
+\r
+               if (formObj.popuptop.value.indexOf('screen') != -1)\r
+                       formObj.popuptop.value = "c";\r
+\r
+               formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes";\r
+               formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes";\r
+               formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes";\r
+               formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes";\r
+               formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes";\r
+               formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes";\r
+               formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes";\r
+\r
+               buildOnClick();\r
+       }\r
+}\r
+\r
+function parseFunction(onclick) {\r
+       var formObj = document.forms[0];\r
+       var onClickData = parseLink(onclick);\r
+\r
+       // TODO: Add stuff here\r
+}\r
+\r
+function getOption(opts, name) {\r
+       return typeof(opts[name]) == "undefined" ? "" : opts[name];\r
+}\r
+\r
+function setPopupControlsDisabled(state) {\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.popupname.disabled = state;\r
+       formObj.popupurl.disabled = state;\r
+       formObj.popupwidth.disabled = state;\r
+       formObj.popupheight.disabled = state;\r
+       formObj.popupleft.disabled = state;\r
+       formObj.popuptop.disabled = state;\r
+       formObj.popuplocation.disabled = state;\r
+       formObj.popupscrollbars.disabled = state;\r
+       formObj.popupmenubar.disabled = state;\r
+       formObj.popupresizable.disabled = state;\r
+       formObj.popuptoolbar.disabled = state;\r
+       formObj.popupstatus.disabled = state;\r
+       formObj.popupreturn.disabled = state;\r
+       formObj.popupdependent.disabled = state;\r
+\r
+       setBrowserDisabled('popupurlbrowser', state);\r
+}\r
+\r
+function parseLink(link) {\r
+       link = link.replace(new RegExp('&#39;', 'g'), "'");\r
+\r
+       var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1");\r
+\r
+       // Is function name a template function\r
+       var template = templates[fnName];\r
+       if (template) {\r
+               // Build regexp\r
+               var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi"));\r
+               var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\(";\r
+               var replaceStr = "";\r
+               for (var i=0; i<variableNames.length; i++) {\r
+                       // Is string value\r
+                       if (variableNames[i].indexOf("'${") != -1)\r
+                               regExp += "'(.*)'";\r
+                       else // Number value\r
+                               regExp += "([0-9]*)";\r
+\r
+                       replaceStr += "$" + (i+1);\r
+\r
+                       // Cleanup variable name\r
+                       variableNames[i] = variableNames[i].replace(new RegExp("[^A-Za-z0-9]", "gi"), "");\r
+\r
+                       if (i != variableNames.length-1) {\r
+                               regExp += "\\s*,\\s*";\r
+                               replaceStr += "<delim>";\r
+                       } else\r
+                               regExp += ".*";\r
+               }\r
+\r
+               regExp += "\\);?";\r
+\r
+               // Build variable array\r
+               var variables = [];\r
+               variables["_function"] = fnName;\r
+               var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('<delim>');\r
+               for (var i=0; i<variableNames.length; i++)\r
+                       variables[variableNames[i]] = variableValues[i];\r
+\r
+               return variables;\r
+       }\r
+\r
+       return null;\r
+}\r
+\r
+function parseOptions(opts) {\r
+       if (opts == null || opts == "")\r
+               return [];\r
+\r
+       // Cleanup the options\r
+       opts = opts.toLowerCase();\r
+       opts = opts.replace(/;/g, ",");\r
+       opts = opts.replace(/[^0-9a-z=,]/g, "");\r
+\r
+       var optionChunks = opts.split(',');\r
+       var options = [];\r
+\r
+       for (var i=0; i<optionChunks.length; i++) {\r
+               var parts = optionChunks[i].split('=');\r
+\r
+               if (parts.length == 2)\r
+                       options[parts[0]] = parts[1];\r
+       }\r
+\r
+       return options;\r
+}\r
+\r
+function buildOnClick() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (!formObj.ispopup.checked) {\r
+               formObj.onclick.value = "";\r
+               return;\r
+       }\r
+\r
+       var onclick = "window.open('";\r
+       var url = formObj.popupurl.value;\r
+\r
+       onclick += url + "','";\r
+       onclick += formObj.popupname.value + "','";\r
+\r
+       if (formObj.popuplocation.checked)\r
+               onclick += "location=yes,";\r
+\r
+       if (formObj.popupscrollbars.checked)\r
+               onclick += "scrollbars=yes,";\r
+\r
+       if (formObj.popupmenubar.checked)\r
+               onclick += "menubar=yes,";\r
+\r
+       if (formObj.popupresizable.checked)\r
+               onclick += "resizable=yes,";\r
+\r
+       if (formObj.popuptoolbar.checked)\r
+               onclick += "toolbar=yes,";\r
+\r
+       if (formObj.popupstatus.checked)\r
+               onclick += "status=yes,";\r
+\r
+       if (formObj.popupdependent.checked)\r
+               onclick += "dependent=yes,";\r
+\r
+       if (formObj.popupwidth.value != "")\r
+               onclick += "width=" + formObj.popupwidth.value + ",";\r
+\r
+       if (formObj.popupheight.value != "")\r
+               onclick += "height=" + formObj.popupheight.value + ",";\r
+\r
+       if (formObj.popupleft.value != "") {\r
+               if (formObj.popupleft.value != "c")\r
+                       onclick += "left=" + formObj.popupleft.value + ",";\r
+               else\r
+                       onclick += "left='+(screen.availWidth/2-" + (formObj.popupwidth.value/2) + ")+',";\r
+       }\r
+\r
+       if (formObj.popuptop.value != "") {\r
+               if (formObj.popuptop.value != "c")\r
+                       onclick += "top=" + formObj.popuptop.value + ",";\r
+               else\r
+                       onclick += "top='+(screen.availHeight/2-" + (formObj.popupheight.value/2) + ")+',";\r
+       }\r
+\r
+       if (onclick.charAt(onclick.length-1) == ',')\r
+               onclick = onclick.substring(0, onclick.length-1);\r
+\r
+       onclick += "');";\r
+\r
+       if (formObj.popupreturn.checked)\r
+               onclick += "return false;";\r
+\r
+       // tinyMCE.debug(onclick);\r
+\r
+       formObj.onclick.value = onclick;\r
+\r
+       if (formObj.href.value == "")\r
+               formObj.href.value = url;\r
+}\r
+\r
+function setAttrib(elm, attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib.toLowerCase()];\r
+       var dom = tinyMCEPopup.editor.dom;\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       // Clean up the style\r
+       if (attrib == 'style')\r
+               value = dom.serializeStyle(dom.parseStyle(value), 'a');\r
+\r
+       dom.setAttrib(elm, attrib, value);\r
+}\r
+\r
+function getAnchorListHTML(id, target) {\r
+       var ed = tinyMCEPopup.editor, nodes = ed.dom.select('a'), name, i, len, html = "";\r
+\r
+       for (i=0, len=nodes.length; i<len; i++) {\r
+               if ((name = ed.dom.getAttrib(nodes[i], "name")) != "")\r
+                       html += '<option value="#' + name + '">' + name + '</option>';\r
+       }\r
+\r
+       if (html == "")\r
+               return "";\r
+\r
+       html = '<select id="' + id + '" name="' + id + '" class="mceAnchorList"'\r
+               + ' onchange="this.form.' + target + '.value=this.options[this.selectedIndex].value"'\r
+               + '>'\r
+               + '<option value="">---</option>'\r
+               + html\r
+               + '</select>';\r
+\r
+       return html;\r
+}\r
+\r
+function insertAction() {\r
+       var inst = tinyMCEPopup.editor;\r
+       var elm, elementArray, i;\r
+\r
+       elm = inst.selection.getNode();\r
+       checkPrefix(document.forms[0].href);\r
+\r
+       elm = inst.dom.getParent(elm, "A");\r
+\r
+       // Remove element if there is no href\r
+       if (!document.forms[0].href.value) {\r
+               i = inst.selection.getBookmark();\r
+               inst.dom.remove(elm, 1);\r
+               inst.selection.moveToBookmark(i);\r
+               tinyMCEPopup.execCommand("mceEndUndoLevel");\r
+               tinyMCEPopup.close();\r
+               return;\r
+       }\r
+\r
+       // Create new anchor elements\r
+       if (elm == null) {\r
+               inst.getDoc().execCommand("unlink", false, null);\r
+               tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1});\r
+\r
+               elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';});\r
+               for (i=0; i<elementArray.length; i++)\r
+                       setAllAttribs(elm = elementArray[i]);\r
+       } else\r
+               setAllAttribs(elm);\r
+\r
+       // Don't move caret if selection was image\r
+       if (elm.childNodes.length != 1 || elm.firstChild.nodeName != 'IMG') {\r
+               inst.focus();\r
+               inst.selection.select(elm);\r
+               inst.selection.collapse(0);\r
+               tinyMCEPopup.storeSelection();\r
+       }\r
+\r
+       tinyMCEPopup.execCommand("mceEndUndoLevel");\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function setAllAttribs(elm) {\r
+       var formObj = document.forms[0];\r
+       var href = formObj.href.value.replace(/ /g, '%20');\r
+       var target = getSelectValue(formObj, 'targetlist');\r
+\r
+       setAttrib(elm, 'href', href);\r
+       setAttrib(elm, 'title');\r
+       setAttrib(elm, 'target', target == '_self' ? '' : target);\r
+       setAttrib(elm, 'id');\r
+       setAttrib(elm, 'style');\r
+       setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));\r
+       setAttrib(elm, 'rel');\r
+       setAttrib(elm, 'rev');\r
+       setAttrib(elm, 'charset');\r
+       setAttrib(elm, 'hreflang');\r
+       setAttrib(elm, 'dir');\r
+       setAttrib(elm, 'lang');\r
+       setAttrib(elm, 'tabindex');\r
+       setAttrib(elm, 'accesskey');\r
+       setAttrib(elm, 'type');\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 getSelectValue(form_obj, field_name) {\r
+       var elm = form_obj.elements[field_name];\r
+\r
+       if (!elm || elm.options == null || elm.selectedIndex == -1)\r
+               return "";\r
+\r
+       return elm.options[elm.selectedIndex].value;\r
+}\r
+\r
+function getLinkListHTML(elm_id, target_form_element, onchange_func) {\r
+       if (typeof(tinyMCELinkList) == "undefined" || tinyMCELinkList.length == 0)\r
+               return "";\r
+\r
+       var html = "";\r
+\r
+       html += '<select id="' + elm_id + '" name="' + elm_id + '"';\r
+       html += ' class="mceLinkList" onfoc2us="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';\r
+       html += 'this.options[this.selectedIndex].value;';\r
+\r
+       if (typeof(onchange_func) != "undefined")\r
+               html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);';\r
+\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>';\r
+\r
+       return html;\r
+\r
+       // tinyMCE.debug('-- image list start --', html, '-- image list end --');\r
+}\r
+\r
+function getTargetListHTML(elm_id, target_form_element) {\r
+       var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';');\r
+       var html = '';\r
+\r
+       html += '<select id="' + elm_id + '" name="' + elm_id + '" onf2ocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';\r
+       html += 'this.options[this.selectedIndex].value;">';\r
+       html += '<option value="_self">' + tinyMCEPopup.getLang('advlink_dlg.target_same') + '</option>';\r
+       html += '<option value="_blank">' + tinyMCEPopup.getLang('advlink_dlg.target_blank') + ' (_blank)</option>';\r
+       html += '<option value="_parent">' + tinyMCEPopup.getLang('advlink_dlg.target_parent') + ' (_parent)</option>';\r
+       html += '<option value="_top">' + tinyMCEPopup.getLang('advlink_dlg.target_top') + ' (_top)</option>';\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="' + key + '">' + value + ' (' + key + ')</option>';\r
+       }\r
+\r
+       html += '</select>';\r
+\r
+       return html;\r
+}\r
+\r
+// While loading\r
+preinit();\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/bg_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..3f4b72d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.advlink_dlg',{"target_name":"\u0418\u043c\u0435 \u043d\u0430 \u0446\u0435\u043b",classes:"\u041a\u043b\u0430\u0441\u043e\u0432\u0435",style:"\u0421\u0442\u0438\u043b",id:"Id","popup_position":"\u041f\u043e\u0437\u0438\u0446\u0438\u044f (X/Y)",langdir:"\u041f\u043e\u0441\u043e\u043a\u0430 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430","popup_size":"\u0420\u0430\u0437\u043c\u0435\u0440","popup_dependent":"\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u0438 (Mozilla/Firefox only)","popup_resizable":"\u0420\u0430\u0437\u0440\u0435\u0448\u0438 \u043f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u0440\u043e\u0437\u043e\u0440\u0446\u0438\u0442\u0435","popup_location":"\u041f\u043e\u043a\u0430\u0436\u0438 location bar","popup_menubar":"\u041f\u043e\u043a\u0430\u0436\u0438 \u043b\u0435\u043d\u0442\u0430\u0442\u0430 \u0441 \u043c\u0435\u043d\u044e\u0442\u0430","popup_toolbar":"\u041f\u043e\u043a\u0430\u0436\u0438 \u043b\u0435\u043d\u0442\u0438\u0442\u0435 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438","popup_statusbar":"\u041f\u043e\u043a\u0430\u0436\u0438 status bar","popup_scrollbars":"\u041f\u043e\u043a\u0430\u0436\u0438 \u0441\u043a\u0440\u043e\u043b\u0435\u0440\u0438","popup_return":"\u0412\u043c\u044a\u043a\u043d\u0438 \'return false\'","popup_name":"\u0418\u043c\u0435 \u043d\u0430 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446\u0430","popup_url":"URL \u043d\u0430 popup-\u0430",popup:"Javascript popup","target_blank":"\u041e\u0442\u0432\u043e\u0440\u0438 \u0432 \u043d\u043e\u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446","target_top":"\u041e\u0442\u0432\u043e\u0440\u0438 \u0432 \u043d\u0430\u0439-\u0433\u043e\u0440\u043d\u0438\u044f \u0444\u0440\u0435\u0439\u043c (\u0437\u0430\u043c\u0435\u0441\u0442\u0432\u0430 \u0432\u0441\u0438\u0447\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u043e\u0432\u0435)","target_parent":"\u041e\u0442\u0432\u043e\u0440\u0438 \u0432 \u0433\u043e\u0440\u043d\u0438\u044f \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 / \u0444\u0440\u0435\u0439\u043c","target_same":"\u041e\u0442\u0432\u043e\u0440\u0438 \u0432 \u0442\u043e\u0437\u0438 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 / \u0444\u0440\u0435\u0439\u043c","anchor_names":"\u041a\u043e\u0442\u0432\u0438","popup_opts":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438","advanced_props":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438","event_props":"\u0421\u044a\u0431\u0438\u0442\u0438\u044f","popup_props":"Popup \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438","general_props":"\u041e\u0431\u0449\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438","advanced_tab":"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438","events_tab":"\u0421\u044a\u0431\u0438\u0442\u0438\u044f","popup_tab":"Popup","general_tab":"\u041e\u0431\u0449\u0438",list:"\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438","is_external":"URL-\u0442\u043e, \u043a\u043e\u0435\u0442\u043e \u0432\u044a\u0432\u0435\u0434\u043e\u0445\u0442\u0435 \u0435 \u0432\u044a\u043d\u0448\u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430, \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u0438\u044f\u0442 http:// \u043f\u0440\u0435\u0444\u0438\u043a\u0441?","is_email":"URL-\u0442\u043e, \u043a\u043e\u0435\u0442\u043e \u0432\u044a\u0432\u0435\u0434\u043e\u0445\u0442\u0435 \u0435 email \u0430\u0434\u0440\u0435\u0441, \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u0438\u044f\u0442 mailto: \u043f\u0440\u0435\u0444\u0438\u043a\u0441?",titlefield:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435",target:"\u0426\u0435\u043b",url:"URL \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430",title:"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430","link_list":"\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438",rtl:"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e",ltr:"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e",accesskey:"\u041a\u043b\u0430\u0432\u0438\u0448",tabindex:"\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u043d\u043e\u0441\u0442",rev:"\u0412\u0437\u0430\u0438\u043c\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0446\u0435\u043b - \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430",rel:"\u0412\u0437\u0430\u0438\u043c\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0446\u0435\u043b",mime:"MIME \u0442\u0438\u043f",encoding:"\u041a\u043e\u0434\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0442\u0435",langcode:"\u041a\u043e\u0434 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430","target_langcode":"\u0415\u0437\u0438\u043a",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/cs_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..39eeee9
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.advlink_dlg',{"target_name":"N\u00e1zev c\u00edle",classes:"T\u0159\u00eddy",style:"Styl",id:"ID","popup_position":"Um\u00edst\u011bn\u00ed (X/Y)",langdir:"Sm\u011br textu","popup_size":"Velikost","popup_dependent":"Z\u00e1vislost (pouze Mozilla/Firefox)","popup_resizable":"Umo\u017enit zm\u011bnu velikosti","popup_location":"Zobrazit pole s adresou","popup_menubar":"Zobrazit nab\u00eddku","popup_toolbar":"Zobrazit panel n\u00e1stroj\u016f","popup_statusbar":"Zobrazit stavov\u00fd \u0159\u00e1dek","popup_scrollbars":"Zobrazit posuvn\u00edky","popup_return":"Vlo\u017eit \'return false\'","popup_name":"N\u00e1zev okna","popup_url":"URL vyskakovac\u00edho okna",popup:"Javascriptov\u00e9 okno","target_blank":"Otev\u0159\u00edt v nov\u00e9m okn\u011b/r\u00e1mu","target_top":"Otev\u0159\u00edt v hlavn\u00edm okn\u011b/r\u00e1mu (nahradit v\u0161echny r\u00e1my)","target_parent":"Otev\u0159\u00edt v nad\u0159azen\u00e9m okn\u011b/r\u00e1mu","target_same":"Otev\u0159\u00edt v tomto okn\u011b/r\u00e1mu","anchor_names":"Z\u00e1lo\u017eka","popup_opts":"Mo\u017enosti","advanced_props":"Roz\u0161\u00ed\u0159en\u00e9 parametry","event_props":"Ud\u00e1losti","popup_props":"Vlastnosti vyskakovac\u00edho okna","general_props":"Obecn\u00e9 parametry","advanced_tab":"Roz\u0161\u00ed\u0159en\u00e9","events_tab":"Ud\u00e1losti","popup_tab":"Vyskakovac\u00ed okno","general_tab":"Obecn\u00e9",list:"Seznam odkaz\u016f","is_external":"Zadan\u00e9 URL vypad\u00e1 jako extern\u00ed odkaz, chcete doplnit povinn\u00fd prefix http://?","is_email":"Zadan\u00e9 URL vypad\u00e1 jako e-mailov\u00e1 adresa, chcete doplnit povinn\u00fd prefix mailto:?",titlefield:"Titulek",target:"C\u00edl",url:"URL odkazu",title:"Vlo\u017eit/upravit odkaz","link_list":"Seznam odkaz\u016f",rtl:"Zprava doleva",ltr:"Zleva doprava",accesskey:"Kl\u00e1vesov\u00e1 zkratka",tabindex:"Po\u0159ad\u00ed pro tabul\u00e1tor",rev:"Vztah c\u00edle ke str\u00e1nce",rel:"Vztah str\u00e1nky k c\u00edli",mime:"MIME typ",encoding:"K\u00f3dov\u00e1n\u00ed",langcode:"K\u00f3d jazyka","target_langcode":"Jazyk c\u00edle",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/da_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..9f92eb2
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.advlink_dlg',{"target_name":"Destinationsnavn",classes:"Klasser",style:"Stil",id:"Id","popup_position":"Position (X/Y)",langdir:"Sprogretning","popup_size":"St\u00f8rrelse","popup_dependent":"Afh\u00e6ngig (Kun Mozilla/Firefox)","popup_resizable":"Lad det v\u00e6re muligt at \u00e6ndre st\u00f8rrelsen p\u00e5 vinduet","popup_location":"Vis adresselinje","popup_menubar":"Vis menulinje","popup_toolbar":"Vis v\u00e6rkt\u00f8jslinjer","popup_statusbar":"Vis statuslinje","popup_scrollbars":"Vis rullepanel","popup_return":"Inds\u00e6t \'return false\'","popup_name":"Vinduesnavn","popup_url":"Popup URL",popup:"Javascript popup","target_blank":"\u00c5ben i nyt vindue","target_top":"\u00c5ben i \u00f8verste vindue / ramme (erstatter alle rammer)","target_parent":"\u00c5ben i overliggende vindue / ramme","target_same":"\u00c5ben i dette vindue / ramme","anchor_names":"Ankre","popup_opts":"Indstillinger","advanced_props":"Avancerede egenskaber","event_props":"H\u00e6ndelser","popup_props":"Popup egenskaber","general_props":"Generelle egenskaber","advanced_tab":"Advanceret","events_tab":"H\u00e6ndelser","popup_tab":"Popup","general_tab":"Generelt",list:"Liste over links","is_external":"Den URL, der er indtastet, ser ud til at v\u00e6re et eksternt link. Vil du have tilf\u00f8jet det p\u00e5kr\u00e6vede http:// foran?","is_email":"Den URL, der er indtastet, ser ud til at v\u00e6re en emailadresse. Vil du have tilf\u00f8jet det p\u00e5kr\u00e6vede mailto: foran?",titlefield:"Titel",target:"M\u00e5l",url:"Link URL",title:"Inds\u00e6t/rediger link","link_list":"Liste over links",rtl:"H\u00f8jre mod venstre",ltr:"Venstre mod h\u00f8jre",accesskey:"Genvejstast",tabindex:"Tabindex",rev:"Relativ destination til side",rel:"Relativ side til destination",mime:"Destinations-MIME-type",encoding:"Destinationstegns\u00e6t",langcode:"Sprogkode","target_langcode":"Destinationssprog",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/de_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..bb0d3e3
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.advlink_dlg',{"target_name":"Name der Zielseite",classes:"Klassen",style:"Format",id:"ID","popup_position":"Position (X/Y)",langdir:"Schriftrichtung","popup_size":"Gr\u00f6\u00dfe","popup_dependent":"Vom Elternfenster abh\u00e4ngig <br /> (nur Mozilla/Firefox) ","popup_resizable":"Vergr\u00f6\u00dfern des Fenster zulassen","popup_location":"Adressleiste anzeigen","popup_menubar":"Browsermen\u00fc anzeigen","popup_toolbar":"Werkzeugleisten anzeigen","popup_statusbar":"Statusleiste anzeigen","popup_scrollbars":"Scrollbalken anzeigen","popup_return":"Link trotz Popup folgen","popup_name":"Name des Fensters","popup_url":"Popup-Adresse",popup:"JavaScript-Popup","target_blank":"In neuem Fenster \u00f6ffnen","target_top":"Im obersten Frame \u00f6ffnen (sprengt das Frameset)","target_parent":"Im \u00fcbergeordneten Fenster/Frame \u00f6ffnen","target_same":"Im selben Fenster/Frame \u00f6ffnen","anchor_names":"Anker","popup_opts":"Optionen","advanced_props":"Erweiterte Eigenschaften","event_props":"Ereignisse","popup_props":"Popup-Eigenschaften","general_props":"Allemeine Eigenschaften","advanced_tab":"Erweitert","events_tab":"Ereignisse","popup_tab":"Popup","general_tab":"Allgemein",list:"Linkliste","is_external":"Diese Adresse scheint ein externer Link zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"http://\" voranstellen?","is_email":"Diese Adresse scheint eine E-Mail-Adresse zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"mailto:\" voranstellen?",titlefield:"Titel",target:"Fenster",url:"Adresse",title:"Link einf\u00fcgen/bearbeiten","link_list":"Linkliste",rtl:"Rechts nach links",ltr:"Links nach rechts",accesskey:"Tastenk\u00fcrzel",tabindex:"Tabindex",rev:"Beziehung des Linkziels zur Seite",rel:"Beziehung der Seite zum Linkziel",mime:"MIME-Type der Zielseite",encoding:"Zeichenkodierung der Zielseite",langcode:"Sprachcode","target_langcode":"Sprache der Zielseite",width:"Breite",height:"H\u00f6he"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/el_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..79e4ae7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.advlink_dlg',{"target_name":"\u038c\u03bd\u03bf\u03bc\u03b1 \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",classes:"\u039a\u03bb\u03ac\u03c3\u03b5\u03b9\u03c2",style:"\u03a3\u03c4\u03c5\u03bb",id:"Id","popup_position":"\u0398\u03ad\u03c3\u03b7 (X/Y)",langdir:"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2","popup_size":"\u039c\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2","popup_dependent":"\u0395\u03be\u03b1\u03c1\u03c4\u03ce\u03bc\u03b5\u03bd\u03bf (\u03bc\u03cc\u03bd\u03bf \u03b3\u03b9\u03b1 Mozilla/Firefox)","popup_resizable":"\u039d\u03b1 \u03b1\u03bb\u03bb\u03ac\u03b6\u03bf\u03c5\u03bd \u03bf\u03b9 \u03b4\u03b9\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03b1\u03c1\u03b1\u03b8\u03cd\u03c1\u03bf\u03c5","popup_location":"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2","popup_menubar":"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03bc\u03b5\u03bd\u03bf\u03cd","popup_toolbar":"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03c9\u03bd","popup_statusbar":"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2","popup_scrollbars":"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c1\u03ac\u03b2\u03b4\u03c9\u03bd \u03ba\u03cd\u03bb\u03b9\u03c3\u03b7\u03c2","popup_return":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \'return false\'","popup_name":"\u038c\u03bd\u03bf\u03bc\u03b1 \u03c0\u03b1\u03c1\u03b1\u03b8\u03cd\u03c1\u03bf\u03c5","popup_url":"\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c4\u03bf\u03c5 Popup",popup:"Javascript popup","target_blank":"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03b5 \u03bd\u03ad\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf","target_top":"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03c4\u03bf \u03c0\u03b9\u03bf \u03c0\u03ac\u03bd\u03c9 frame (\u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03b8\u03b9\u03c3\u03c4\u03ac \u03cc\u03bb\u03b1 \u03c4\u03b1 frames)","target_parent":"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03c4\u03bf \u03b3\u03bf\u03bd\u03b9\u03ba\u03cc window / frame","target_same":"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03b5 \u03af\u03b4\u03b9\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf / frame","anchor_names":"Anchors","popup_opts":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2","advanced_props":"\u03a0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2","event_props":"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1","popup_props":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 Popup","general_props":"\u0393\u03b5\u03bd\u03b9\u03ba\u03ad\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2","advanced_tab":"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2","events_tab":"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1","popup_tab":"Popup","general_tab":"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac",list:"\u039b\u03af\u03c3\u03c4\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03c9\u03bd","is_external":"\u0397 \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c0\u03bf\u03c5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03be\u03c9\u03c4\u03b5\u03c1\u03b9\u03ba\u03cc\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2, \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b5\u03b8\u03b5\u03af \u03c4\u03bf \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03bf http:// ;","is_email":"\u0397 \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c0\u03bf\u03c5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 email, \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b5\u03b8\u03b5\u03af \u03c4\u03bf \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03bf mailto: ;",titlefield:"\u03a4\u03af\u03c4\u03bb\u03bf\u03c2",target:"\u03a3\u03c4\u03cc\u03c7\u03bf\u03c2",url:"\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5",title:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5","link_list":"\u039b\u03af\u03c3\u03c4\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03c9\u03bd",rtl:"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",ltr:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac",accesskey:"\u03a0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",tabindex:"Tabindex",rev:"\u03a3\u03c7\u03ad\u03c3\u03b7 \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c2 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 (REV)",rel:"\u03a3\u03c7\u03ad\u03c3\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1\u03c2 \u03c0\u03c1\u03bf\u03c2 \u03c3\u03c4\u03cc\u03c7\u03bf (REL)",mime:"\u03a4\u03cd\u03c0\u03bf\u03c2 MIME \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",encoding:"\u039a\u03c9\u03b4\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03c9\u03bd \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",langcode:"\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2","target_langcode":"\u0393\u03bb\u03ce\u03c3\u03c3\u03b1 \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/en_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..3169a56
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advlink_dlg',{"target_name":"Target Name",classes:"Classes",style:"Style",id:"ID","popup_position":"Position (X/Y)",langdir:"Language Direction","popup_size":"Size","popup_dependent":"Dependent (Mozilla/Firefox Only)","popup_resizable":"Make Window Resizable","popup_location":"Show Location Bar","popup_menubar":"Show Menu Bar","popup_toolbar":"Show Toolbars","popup_statusbar":"Show Status Bar","popup_scrollbars":"Show Scrollbars","popup_return":"Insert \'return false\'","popup_name":"Window Name","popup_url":"Popup URL",popup:"JavaScript Popup","target_blank":"Open in New Window","target_top":"Open in Top Frame (Replaces All Frames)","target_parent":"Open in Parent Window/Frame","target_same":"Open in This Window/Frame","anchor_names":"Anchors","popup_opts":"Options","advanced_props":"Advanced Properties","event_props":"Events","popup_props":"Popup Properties","general_props":"General Properties","advanced_tab":"Advanced","events_tab":"Events","popup_tab":"Popup","general_tab":"General",list:"Link List","is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/Edit Link","link_list":"Link List",rtl:"Right to Left",ltr:"Left to Right",accesskey:"AccessKey",tabindex:"TabIndex",rev:"Relationship Target to Page",rel:"Relationship Page to Target",mime:"Target MIME Type",encoding:"Target Character Encoding",langcode:"Language Code","target_langcode":"Target Language",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/es_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..de7165e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.advlink_dlg',{"target_name":"Nombre del Target",classes:"Clases",style:"Estilo",id:"Id","popup_position":"Posici\u00f3n (X/Y)",langdir:"Direcci\u00f3n del lenguaje","popup_size":"Tama\u00f1o","popup_dependent":"Dependientes (s\u00f3lo Mozilla/Firefox)","popup_resizable":"Permitir cambiar el tama\u00f1o de la ventana","popup_location":"Barra de localizaci\u00f3n","popup_menubar":"Barra de men\u00fa","popup_toolbar":"Barra de herramientas","popup_statusbar":"Barra de estado","popup_scrollbars":"Barras de desplazamiento","popup_return":"Insertar \'return false\'","popup_name":"Nombre de la ventana","popup_url":"URL de la ventana emergente",popup:"Javascript popup","target_blank":"Abrir en ventana nueva","target_top":"Abrir en el marco superior (reemplaza todos los marcos)","target_parent":"Abrir en ventana padre / marco","target_same":"Abrir en esta ventana / marco","anchor_names":"Anclas","popup_opts":"Opciones","advanced_props":"Propiedades avanzadas","event_props":"Eventos","popup_props":"Propiedades de ventanas emergentes","general_props":"Propiedades generales","advanced_tab":"Avanzado","events_tab":"Eventos","popup_tab":"Ventana emergente","general_tab":"General",list:"Lista de v\u00ednculos","is_external":"La URL que ha introducido parece ser un v\u00ednculo externo,  \u00bfdesea agregar el prefijo http:// necesario?","is_email":"La URL que ha introducido parece ser una direci\u00f3n de correo,  \u00bfdesea agregar el prefijo mailto: necesario?",titlefield:"T\u00edtulo",target:"Destino",url:"URL del hiperv\u00ednculo",title:"Insertar/editar hiperv\u00ednculo","link_list":"Lista de v\u00ednculo",rtl:"Derecha a izquierda",ltr:"Izquierda a derecha",accesskey:"Tecla de acceso",tabindex:"Indice de tabulaci\u00f3n",rev:"Relaci\u00f3n target a p\u00e1gina",rel:"Relaci\u00f3n p\u00e1gina a target",mime:"Tipo MIME del Target",encoding:"Codificaci\u00f3n de caracteres del Target",langcode:"C\u00f3digo del lenguaje","target_langcode":"Lenguaje del Target",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/et_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..565a8f5
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.advlink_dlg',{"target_name":"Sihtm\u00e4rgi nimi",classes:"Klassid",style:"Stiil",id:"ID","popup_position":"Positsioon (X/Y)",langdir:"Keele suund","popup_size":"Suurus","popup_dependent":"S\u00f5ltuv (ainult Mozilla/Firefox)","popup_resizable":"Muuda akna suurus muudetavaks","popup_location":"N\u00e4ita asukohariba","popup_menubar":"N\u00e4ita men\u00fc\u00fcriba","popup_toolbar":"N\u00e4ita seadistusriba","popup_statusbar":"N\u00e4ita staatuse riba","popup_scrollbars":"N\u00e4ita kerimisribasid","popup_return":"Sisesta \'tagasiminek eba\u00f5nnestus\'","popup_name":"Akna nimi","popup_url":"Pop-up\u2019i URL",popup:"Javascript\u2019i pop-up","target_blank":"Ava uues aknas","target_top":"Ava k\u00f5rgeimas raamis (asenda k\u00f5ik raamid)","target_parent":"Ava pea-aknas/raamis","target_same":"Ava selles aknas/raamis","anchor_names":"Ankrud","popup_opts":"Valikud","advanced_props":"\u00dcldised seadistused","event_props":"S\u00fcndmused","popup_props":"Pop-up\u2019i seadistus","general_props":"\u00dcldised seadistused","advanced_tab":"P\u00f5hjalikum","events_tab":"S\u00fcndmused","popup_tab":"Pop-up","general_tab":"\u00dcldine",list:"Linkide nimekiri","is_external":"URL, mille sisestasid, tundub olevat v\u00e4line link, kas soovid sellele lisada http://?","is_email":" URL, mille sisestasid, tundub olevat e-posti aadress, kas soovid sellele lisada mailto: funktsiooni?",titlefield:"Pealkiri",target:"Sihtm\u00e4rk",url:" URL\u2019i link",title:"Sisesta muuda linki","link_list":"Linkide list",rtl:"Paremalt vasakule",ltr:"Vasakult paremale",accesskey:"Ligip\u00e4\u00e4suklahv",tabindex:"Sisujuht",rev:"Seo sihtm\u00e4rk lehega",rel:"Seo leht sihtm\u00e4rgiga",mime:"M\u00e4rgista MIME t\u00fc\u00fcp",encoding:"Sihtm\u00e4rgi kodeering",langcode:"Keele kood","target_langcode":"Sihtm\u00e4rgi keel",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/fi_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..e49488e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.advlink_dlg',{"target_name":"Kohteen nimi",classes:"Luokat",style:"Tyyli",id:"Id","popup_position":"Sijainti (X/Y)",langdir:"Kielen suunta","popup_size":"Koko","popup_dependent":"Riippuvainen (vain Mozilla/Firefox)","popup_resizable":"Tee ikkunan koko muokattavaksi","popup_location":"N\u00e4yt\u00e4 sijaintipalkki","popup_menubar":"N\u00e4yt\u00e4 valikkopalkki","popup_toolbar":"N\u00e4yt\u00e4 ty\u00f6kalut","popup_statusbar":"N\u00e4yt\u00e4 tilapalkki","popup_scrollbars":"N\u00e4yt\u00e4 vierityspalkit","popup_return":"Lis\u00e4\u00e4 \'return false\'","popup_name":"Ikkunan nimi","popup_url":"Ponnahdusikkunan URL",popup:"JavaScript-ponnahdusikkuna","target_blank":"Avaa uudessa ikkunassa","target_top":"Avaa ylimm\u00e4ss\u00e4 ruudussa (korvaa kaikki ruudut)","target_parent":"Avaa ylemm\u00e4ss\u00e4 ikkunassa","target_same":"Avaa t\u00e4ss\u00e4 ikkunassa","anchor_names":"Ankkurit","popup_opts":"Valinta","advanced_props":"Edistyneet asetukset","event_props":"Tapahtumat (events)","popup_props":"Ponnahdusikkunan asetukset","general_props":"Yleiset asetukset","advanced_tab":"Edistynyt","events_tab":"Tapahtumat","popup_tab":"Ponnahdusikkuna","general_tab":"Yleiset",list:"Linkkilista","is_external":"Sy\u00f6tt\u00e4m\u00e4si URL n\u00e4ytt\u00e4\u00e4 olevan sivuston ulkoinen osoite, haluatko lis\u00e4t\u00e4 http://-etuliitteen?","is_email":"Sy\u00f6tt\u00e4m\u00e4si URL n\u00e4ytt\u00e4\u00e4 olevan s\u00e4hk\u00f6postiosoite, haluatko lis\u00e4t\u00e4 mailto:-etuliitteen?",titlefield:"Otsikko",target:"Kohde (target)",url:"Linkin URL",title:"Lis\u00e4\u00e4/muokkaa linkki\u00e4","link_list":"Linkkilista",rtl:"Oikealta vasemmalle",ltr:"Vasemmalta oikealle",accesskey:"Pikan\u00e4pp\u00e4in",tabindex:"Tabulaattori-indeksi",rev:"Kohteen suhde sivuun",rel:"Sivun suhde kohteeseen",mime:"Kohteen MIME-tyyppi",encoding:"Kohteen merkist\u00f6koodaus",langcode:"Kielen koodi","target_langcode":"Kohteen kieli",width:"Leveys",height:"Korkeus"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/fr_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..f22e960
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.advlink_dlg',{"target_name":"Nom de la cible",classes:"Classes",style:"Style",id:"Id","popup_position":"Position (X/Y)",langdir:"Sens de lecture","popup_size":"Taille","popup_dependent":"D\u00e9pendante (seulement sous Mozilla/Firefox)","popup_resizable":"Autoriser le redimensionnement de la fen\u00eatre","popup_location":"Afficher la barre d\'adresse","popup_menubar":"Afficher la barre de menu","popup_toolbar":"Afficher la barre d\'outils","popup_statusbar":"Afficher la barre d\'\u00e9tat","popup_scrollbars":"Afficher les ascenseurs","popup_return":"Ins\u00e9rer \'return false\'","popup_name":"Nom de la fen\u00eatre","popup_url":"URL de la popup",popup:"Popup Javascript","target_blank":"Ouvrir dans une nouvelle fen\u00eatre","target_top":"Ouvrir dans le cadre principal (remplace tous les cadres)","target_parent":"Ouvrir dans la fen\u00eatre / le cadre parent","target_same":"Ouvrir dans cette fen\u00eatre / dans ce cadre","anchor_names":"Ancres","popup_opts":"Options","advanced_props":"Propri\u00e9t\u00e9s avanc\u00e9es","event_props":"\u00c9v\u00e8nements","popup_props":"Propri\u00e9t\u00e9s de la popup","general_props":"Propri\u00e9t\u00e9s g\u00e9n\u00e9rales","advanced_tab":"Avanc\u00e9","events_tab":"\u00c9v\u00e8nements","popup_tab":"Popup","general_tab":"G\u00e9n\u00e9ral",list:"Liste de liens","is_external":"L\'URL que vous avez saisie semble \u00eatre une adresse web externe. Souhaitez-vous ajouter le pr\u00e9fixe \u00ab http:// \u00bb ?","is_email":"L\'URL que vous avez saisie semble \u00eatre une adresse e-mail, souhaitez-vous ajouter le pr\u00e9fixe \u00ab mailto: \u00bb ?",titlefield:"Titre",target:"Cible",url:"URL du lien",title:"Ins\u00e9rer / \u00e9diter un lien","link_list":"Liste des liens",rtl:"Droite \u00e0 gauche",ltr:"Gauche \u00e0 droite",accesskey:"Touche d\'acc\u00e8s rapide",tabindex:"Tabindex",rev:"Relation de la cible \u00e0 la page",rel:"Relation de la page \u00e0 la cible",mime:"Type MIME de la cible",encoding:"Encodage de la cible",langcode:"Code de la langue","target_langcode":"Langue de la cible",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/hu_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..845182a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.advlink_dlg',{"target_name":"C\u00e9l neve",classes:"Class-ok",style:"Style",id:"Id","popup_position":"Poz\u00edci\u00f3 (X/Y)",langdir:"Nyelv \u00edr\u00e1s ir\u00e1ny","popup_size":"M\u00e9ret","popup_dependent":"F\u00fcgg\u0151 (csak Mozilla/Firefox)","popup_resizable":"\u00c1tm\u00e9retezhet\u0151 ablak","popup_location":"C\u00edm mez\u0151 mutat\u00e1sa","popup_menubar":"Men\u00fcsor mutat\u00e1sa","popup_toolbar":"Eszk\u00f6zsor mutat\u00e1sa","popup_statusbar":"St\u00e1tuszsor mutat\u00e1sa","popup_scrollbars":"G\u00f6rget\u0151s\u00e1vok mutat\u00e1sa","popup_return":"\'return false\' besz\u00far\u00e1sa","popup_name":"Ablakn\u00e9v","popup_url":"Felugr\u00f3 ablak URL",popup:"JavaScript felugr\u00f3 ablak","target_blank":"\u00daj ablakban megnyit\u00e1s","target_top":"Azonos ablakban/keretben megnyit\u00e1s legfel\u00fcl","target_parent":"Sz\u00fcl\u0151 ablakban/keretben megnyit\u00e1s","target_same":"Azonos ablakban/keretben megnyit\u00e1s","anchor_names":"Horgonyok","popup_opts":"Be\u00e1ll\u00edt\u00e1sok","advanced_props":"Halad\u00f3 tulajdons\u00e1gok","event_props":"Esem\u00e9nyek","popup_props":"Felugr\u00f3 ablak tulajdons\u00e1gai","general_props":"\u00c1ltal\u00e1nos tulajdons\u00e1gok","advanced_tab":"Halad\u00f3","events_tab":"Esem\u00e9nyek","popup_tab":"Felugr\u00f3 ablak","general_tab":"\u00c1ltal\u00e1nos",list:"Link lista","is_external":"A be\u00edrt URL k\u00fcls\u0151 hivatkoz\u00e1snak t\u0171nik, k\u00edv\u00e1nja a sz\u00fcks\u00e9ges http://-t el\u00e9 tenni?","is_email":"A be\u00edrt URL e-mail c\u00edmnek t\u0171nik, k\u00edv\u00e1nja a sz\u00fcks\u00e9ges mailto:-t el\u00e9 tenni?",titlefield:"C\u00edm",target:"Target",url:"Link URL",title:"Link besz\u00far\u00e1s/szerkeszt\u00e9s","link_list":"Link lista",rtl:"Jobbr\u00f3l balra",ltr:"Balr\u00f3l jobbra",accesskey:"Gyorsgomb",tabindex:"Tabindex",rev:"C\u00e9l kapcsolata az oldallal",rel:"Oldal kapcsolata a c\u00e9llal",mime:"C\u00e9l MIME t\u00edpus",encoding:"C\u00e9l karakterk\u00f3dol\u00e1s",langcode:"Nyelv k\u00f3d","target_langcode":"C\u00e9l nyelv",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/it_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..1a59f88
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.advlink_dlg',{"target_name":"Nome target",classes:"Classe",style:"Stile",id:"Id","popup_position":"Posizione (X/Y)",langdir:"Direzione del testo","popup_size":"Dimensioni","popup_dependent":"Dipendente (Solo in Mozilla/Firefox)","popup_resizable":"Rendi la finestra ridimensionabile","popup_location":"Mostra barra navigazione","popup_menubar":"Mostra barra menu","popup_toolbar":"Mostra barre strumenti","popup_statusbar":"Mostra barra di stato","popup_scrollbars":"Mostra barre di scorrimento","popup_return":"Inserisci \'return false\'","popup_name":"Nome finestra","popup_url":"URL Popup",popup:"Popup Javascript","target_blank":"Apri in una nuova finestra","target_top":"Apri nella cornice superiore (sostituisce tutte le cornici)","target_parent":"Apri nella finestra / cornice genitore","target_same":"Apri in questa finestra / cornice","anchor_names":"Ancore","popup_opts":"Opzioni","advanced_props":"Propriet\u00e0 avanzate","event_props":"Eventi","popup_props":"Propriet\u00e0 popup","general_props":"Propriet\u00e0 generali","advanced_tab":"Avanzate","events_tab":"Eventi","popup_tab":"Popup","general_tab":"Generale",list:"Lista collegamenti","is_external":"L\'URL inserito sembra essere un link esterno. Aggiungere il necessario prefisso http:// ?","is_email":"L\'URL inserito sembra essere un indirizzo email. Aggiungere il necessario prefisso mailto: ?",titlefield:"Titolo",target:"Target",url:"URL collegamento",title:"Inserisci/modifica link","link_list":"Lista collegamenti",rtl:"Destra verso sinistra",ltr:"Sinistra verso destra",accesskey:"Carattere di accesso",tabindex:"Indice tabulazione",rev:"Relazione da target a pagina",rel:"Relazione da pagina a target",mime:"Tipo MIME del target",encoding:"Codifica carattere del target",langcode:"Lingua","target_langcode":"Lingua del target",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/advlink/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..fb228f5
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.advlink_dlg',{"target_name":"\u76ee\u6807\u540d\u79f0",classes:"\u7c7b\u522b",style:"\u6837\u5f0f",id:"ID","popup_position":"\u4f4d\u7f6e(X/Y)",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411","popup_size":"\u5927\u5c0f","popup_dependent":"\u9650\u5236(\u4ec5\u652f\u6301Mozilla/Firefox)","popup_resizable":"\u7a97\u53e3\u53ef\u8c03\u6574\u5927\u5c0f","popup_location":"\u663e\u793a\u5730\u5740\u680f","popup_menubar":"\u663e\u793a\u83dc\u5355\u680f","popup_toolbar":"\u663e\u793a\u5de5\u5177\u680f","popup_statusbar":"\u663e\u793a\u72b6\u6001\u680f","popup_scrollbars":"\u663e\u793a\u6eda\u52a8\u6761","popup_return":"\u63d2\u5165\'return false\'","popup_name":"\u7a97\u53e3\u540d\u79f0","popup_url":"\u5f39\u51faURL",popup:"Javascript\u5f39\u7a97","target_blank":"\u5728\u65b0\u7a97\u53e3\u6253\u5f00","target_top":"\u5728\u9876\u90e8\u6846\u67b6\u6253\u5f00\uff08\u91cd\u7f6e\u6240\u6709\u6846\u67b6\uff09","target_parent":"\u5728\u7236\u7a97\u53e3/\u6846\u67b6\u6253\u5f00","target_same":"\u5728\u5f53\u524d\u7a97\u53e3/\u6846\u67b6\u6253\u5f00","anchor_names":"\u951a","popup_opts":"\u9009\u9879","advanced_props":"\u9ad8\u7ea7\u5c5e\u6027","event_props":"\u4e8b\u4ef6","popup_props":"\u5f39\u51fa\u5c5e\u6027","general_props":"\u666e\u901a\u5c5e\u6027","advanced_tab":"\u9ad8\u7ea7","events_tab":"\u4e8b\u4ef6","popup_tab":"\u5f39\u51fa","general_tab":"\u666e\u901a",list:"\u94fe\u63a5\u5217\u8868","is_external":"\u60a8\u8f93\u5165\u7684URL\u662f\u4e00\u4e2a\u5916\u90e8\u94fe\u63a5\uff0c\u662f\u5426\u8981\u52a0\u4e0a\"http://\"\u524d\u7f00\uff1f","is_email":"\u60a8\u8f93\u5165URL\u662f\u7535\u5b50\u90ae\u4ef6\u5730\u5740\uff0c\u662f\u5426\u9700\u8981\u52a0\"mailto:\"\u524d\u7f00\uff1f",titlefield:"\u6807\u9898",target:"\u6253\u5f00\u65b9\u5f0f",url:"\u8d85\u94fe\u63a5URL",title:"\u63d2\u5165/\u7f16\u8f91 \u8d85\u94fe\u63a5","link_list":"\u94fe\u63a5\u5217\u8868",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",accesskey:"\u5feb\u6377\u952e",tabindex:"Tab\u7d22\u5f15",rev:"\u76ee\u6807\u5230\u7f51\u9875\u7684\u5173\u7cfb",rel:"\u7f51\u9875\u5230\u76ee\u6807\u7684\u5173\u7cfb",mime:"\u76ee\u6807MIME\u7c7b\u578b",encoding:"\u76ee\u6807\u8bed\u8a00\u7f16\u7801",langcode:"\u8bed\u8a00\u7f16\u7801","target_langcode":"\u76ee\u6807\u8bed\u8a00",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/link.htm b/webcit/tiny_mce/plugins/advlink/link.htm
new file mode 100644 (file)
index 0000000..8ab7c2a
--- /dev/null
@@ -0,0 +1,338 @@
+<!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>{#advlink_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="js/advlink.js"></script>\r
+       <link href="css/advlink.css" rel="stylesheet" type="text/css" />\r
+</head>\r
+<body id="advlink" style="display: none" role="application" onload="javascript:mcTabs.displayTab('general_tab','general_panel', true);" aria-labelledby="app_label">\r
+       <span class="mceVoiceLabel" id="app_label" style="display:none;">{#advlink_dlg.title}</span>\r
+       <form onsubmit="insertAction();return false;" action="#">\r
+               <div class="tabs" role="presentation">\r
+                       <ul>\r
+                               <li id="general_tab" class="current" aria-controls="general_panel" ><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advlink_dlg.general_tab}</a></span></li>\r
+                               <li id="popup_tab" aria-controls="popup_panel" ><span><a href="javascript:mcTabs.displayTab('popup_tab','popup_panel');" onmousedown="return false;">{#advlink_dlg.popup_tab}</a></span></li>\r
+                               <li id="events_tab" aria-controls="events_panel"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#advlink_dlg.events_tab}</a></span></li>\r
+                               <li id="advanced_tab" aria-controls="advanced_panel"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advlink_dlg.advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper" role="presentation">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{#advlink_dlg.general_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0" role="presentation">\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label id="hreflabel" for="href">{#advlink_dlg.url}</label></td>\r
+                                                               <td><table border="0" cellspacing="0" cellpadding="0">\r
+                                                       <tr>\r
+                                                               <td><input id="href" name="href" type="text" class="mceFocus" value="" onchange="selectByValue(this.form,'linklisthref',this.value);" aria-required="true" /></td>\r
+                                                               <td id="hrefbrowsercontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                                       </table></td>\r
+                                               </tr>\r
+                                               <tr id="linklisthrefrow">\r
+                                                       <td class="column1"><label for="linklisthref">{#advlink_dlg.list}</label></td>\r
+                                                       <td colspan="2" id="linklisthrefcontainer"><select id="linklisthref"><option value=""></option></select></td>\r
+                                               </tr>\r
+                                               <tr id="anchorlistrow">\r
+                                                       <td class="column1"><label for="anchorlist">{#advlink_dlg.anchor_names}</label></td>\r
+                                                       <td colspan="2" id="anchorlistcontainer"><select id="anchorlist"><option value=""></option></select></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td><label id="targetlistlabel" for="targetlist">{#advlink_dlg.target}</label></td>\r
+                                                       <td id="targetlistcontainer"><select id="targetlist"><option value=""></option></select></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label id="titlelabel" for="title">{#advlink_dlg.titlefield}</label></td>\r
+                                                       <td><input id="title" name="title" 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" onchange="changeClass();">\r
+                                                                       <option value="" selected="selected">{#not_set}</option>\r
+                                                                </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="popup_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{#advlink_dlg.popup_props}</legend>\r
+\r
+                                       <input type="checkbox" id="ispopup" name="ispopup" class="radio" onclick="setPopupControlsDisabled(!this.checked);buildOnClick();" />\r
+                                       <label id="ispopuplabel" for="ispopup">{#advlink_dlg.popup}</label>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4" role="presentation" >\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="popupurl">{#advlink_dlg.popup_url}</label>&nbsp;</td>\r
+                                                       <td>\r
+                                                               <table border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" name="popupurl" id="popupurl" value="" onchange="buildOnClick();" /></td>\r
+                                                                               <td id="popupurlbrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="popupname">{#advlink_dlg.popup_name}</label>&nbsp;</td>\r
+                                                       <td><input type="text" name="popupname" id="popupname" value="" onchange="buildOnClick();" /></td>\r
+                                               </tr>\r
+                                               <tr role="group" aria-labelledby="popup_size_label">\r
+                                                       <td class="nowrap"><label id="popup_size_label">{#advlink_dlg.popup_size}</label>&nbsp;</td>\r
+                                                       <td class="nowrap">\r
+                                                               <span style="display:none" id="width_voiceLabel">{#advlink_dlg.width}</span>\r
+                                                               <input type="text" id="popupwidth" name="popupwidth" value="" onchange="buildOnClick();" aria-labelledby="width_voiceLabel" /> x\r
+                                                               <span style="display:none" id="height_voiceLabel">{#advlink_dlg.height}</span>\r
+                                                               <input type="text" id="popupheight" name="popupheight" value="" onchange="buildOnClick();" aria-labelledby="height_voiceLabel" /> px\r
+                                                       </td>\r
+                                               </tr>\r
+                                               <tr role="group" aria-labelledby="popup_position_label center_hint">\r
+                                                       <td class="nowrap" id="labelleft"><label id="popup_position_label">{#advlink_dlg.popup_position}</label>&nbsp;</td>\r
+                                                       <td class="nowrap">\r
+                                                               <span style="display:none" id="x_voiceLabel">X</span>\r
+                                                               <input type="text" id="popupleft" name="popupleft" value="" onchange="buildOnClick();" aria-labelledby="x_voiceLabel" /> /                                \r
+                                                               <span style="display:none" id="y_voiceLabel">Y</span>\r
+                                                               <input type="text" id="popuptop" name="popuptop" value="" onchange="buildOnClick();" aria-labelledby="y_voiceLabel" /> <span id="center_hint">(c /c = center)</span>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <fieldset>\r
+                                               <legend>{#advlink_dlg.popup_opts}</legend>\r
+\r
+                                               <table border="0" cellpadding="0" cellspacing="4" role="presentation" >\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popuplocation" name="popuplocation" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td class="nowrap"><label id="popuplocationlabel" for="popuplocation">{#advlink_dlg.popup_location}</label></td>\r
+                                                               <td><input type="checkbox" id="popupscrollbars" name="popupscrollbars" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td class="nowrap"><label id="popupscrollbarslabel" for="popupscrollbars">{#advlink_dlg.popup_scrollbars}</label></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popupmenubar" name="popupmenubar" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td class="nowrap"><label id="popupmenubarlabel" for="popupmenubar">{#advlink_dlg.popup_menubar}</label></td>\r
+                                                               <td><input type="checkbox" id="popupresizable" name="popupresizable" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td class="nowrap"><label id="popupresizablelabel" for="popupresizable">{#advlink_dlg.popup_resizable}</label></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popuptoolbar" name="popuptoolbar" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td class="nowrap"><label id="popuptoolbarlabel" for="popuptoolbar">{#advlink_dlg.popup_toolbar}</label></td>\r
+                                                               <td><input type="checkbox" id="popupdependent" name="popupdependent" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td class="nowrap"><label id="popupdependentlabel" for="popupdependent">{#advlink_dlg.popup_dependent}</label></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popupstatus" name="popupstatus" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td class="nowrap"><label id="popupstatuslabel" for="popupstatus">{#advlink_dlg.popup_statusbar}</label></td>\r
+                                                               <td><input type="checkbox" id="popupreturn" name="popupreturn" class="checkbox" onchange="buildOnClick();" checked="checked" /></td>\r
+                                                               <td class="nowrap"><label id="popupreturnlabel" for="popupreturn">{#advlink_dlg.popup_return}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </fieldset>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                       <fieldset>\r
+                                       <legend>{#advlink_dlg.advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4" role="presentation" >\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="idlabel" for="id">{#advlink_dlg.id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="stylelabel" for="style">{#advlink_dlg.style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="classeslabel" for="classes">{#advlink_dlg.classes}</label></td>\r
+                                                       <td><input type="text" id="classes" name="classes" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="targetlabel" for="target">{#advlink_dlg.target_name}</label></td>\r
+                                                       <td><input type="text" id="target" name="target" value="" onchange="selectByValue(this.form,'targetlist',this.value,true);" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="dirlabel" for="dir">{#advlink_dlg.langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir"> \r
+                                                                               <option value="">{#not_set}</option> \r
+                                                                               <option value="ltr">{#advlink_dlg.ltr}</option> \r
+                                                                               <option value="rtl">{#advlink_dlg.rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="hreflanglabel" for="hreflang">{#advlink_dlg.target_langcode}</label></td>\r
+                                                       <td><input type="text" id="hreflang" name="hreflang" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="langlabel" for="lang">{#advlink_dlg.langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="charsetlabel" for="charset">{#advlink_dlg.encoding}</label></td>\r
+                                                       <td><input type="text" id="charset" name="charset" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="typelabel" for="type">{#advlink_dlg.mime}</label></td>\r
+                                                       <td><input type="text" id="type" name="type" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="rellabel" for="rel">{#advlink_dlg.rel}</label></td>\r
+                                                       <td><select id="rel" name="rel"> \r
+                                                                       <option value="">{#not_set}</option> \r
+                                                                       <option value="lightbox">Lightbox</option> \r
+                                                                       <option value="alternate">Alternate</option> \r
+                                                                       <option value="designates">Designates</option> \r
+                                                                       <option value="stylesheet">Stylesheet</option> \r
+                                                                       <option value="start">Start</option> \r
+                                                                       <option value="next">Next</option> \r
+                                                                       <option value="prev">Prev</option> \r
+                                                                       <option value="contents">Contents</option> \r
+                                                                       <option value="index">Index</option> \r
+                                                                       <option value="glossary">Glossary</option> \r
+                                                                       <option value="copyright">Copyright</option> \r
+                                                                       <option value="chapter">Chapter</option> \r
+                                                                       <option value="subsection">Subsection</option> \r
+                                                                       <option value="appendix">Appendix</option> \r
+                                                                       <option value="help">Help</option> \r
+                                                                       <option value="bookmark">Bookmark</option>\r
+                                                                       <option value="nofollow">No Follow</option>\r
+                                                                       <option value="tag">Tag</option>\r
+                                                               </select> \r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="revlabel" for="rev">{#advlink_dlg.rev}</label></td>\r
+                                                       <td><select id="rev" name="rev"> \r
+                                                                       <option value="">{#not_set}</option> \r
+                                                                       <option value="alternate">Alternate</option> \r
+                                                                       <option value="designates">Designates</option> \r
+                                                                       <option value="stylesheet">Stylesheet</option> \r
+                                                                       <option value="start">Start</option> \r
+                                                                       <option value="next">Next</option> \r
+                                                                       <option value="prev">Prev</option> \r
+                                                                       <option value="contents">Contents</option> \r
+                                                                       <option value="index">Index</option> \r
+                                                                       <option value="glossary">Glossary</option> \r
+                                                                       <option value="copyright">Copyright</option> \r
+                                                                       <option value="chapter">Chapter</option> \r
+                                                                       <option value="subsection">Subsection</option> \r
+                                                                       <option value="appendix">Appendix</option> \r
+                                                                       <option value="help">Help</option> \r
+                                                                       <option value="bookmark">Bookmark</option> \r
+                                                               </select> \r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="tabindexlabel" for="tabindex">{#advlink_dlg.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">{#advlink_dlg.accesskey}</label></td>\r
+                                                       <td><input type="text" id="accesskey" name="accesskey" value="" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                                       <legend>{#advlink_dlg.event_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4" role="presentation" >\r
+                                               <tr>\r
+                                                       <td class="column1"><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="column1"><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="column1"><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="column1"><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="column1"><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="column1"><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="column1"><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="column1"><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="column1"><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="column1"><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="column1"><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="column1"><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
+\r
+               <div class="mceActionPanel">\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/advlist/editor_plugin.js b/webcit/tiny_mce/plugins/advlist/editor_plugin.js
new file mode 100644 (file)
index 0000000..57ecce6
--- /dev/null
@@ -0,0 +1 @@
+(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.AdvListPlugin",{init:function(b,c){var d=this;d.editor=b;function e(g){var f=[];a(g.split(/,/),function(h){f.push({title:"advlist."+(h=="default"?"def":h.replace(/-/g,"_")),styles:{listStyleType:h=="default"?"":h}})});return f}d.numlist=b.getParam("advlist_number_styles")||e("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");d.bullist=b.getParam("advlist_bullet_styles")||e("default,circle,disc,square");if(tinymce.isIE&&/MSIE [2-7]/.test(navigator.userAgent)){d.isIE7=true}},createControl:function(d,b){var f=this,e,i,g=f.editor;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){i=f[d][0]}function c(j,l){var k=true;a(l.styles,function(n,m){if(g.dom.getStyle(j,m)!=n){k=false;return false}});return k}function h(){var k,l=g.dom,j=g.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,i)){g.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(i){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,i.styles);k.removeAttribute("data-mce-style")}}g.focus()}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){h()}});e.onRenderMenu.add(function(j,k){k.onHideMenu.add(function(){if(f.bookmark){g.selection.moveToBookmark(f.bookmark);f.bookmark=0}});k.onShowMenu.add(function(){var n=g.dom,m=n.getParent(g.selection.getNode(),"ol,ul"),l;if(m||i){l=f[d];a(k.items,function(o){var p=true;o.setSelected(0);if(m&&!o.isDisabled()){a(l,function(q){if(q.id==o.id){if(!c(m,q)){p=false;return false}}});if(p){o.setSelected(1)}}});if(!m){k.items[i.id].setSelected(1)}}g.focus();if(tinymce.isIE){f.bookmark=g.selection.getBookmark(1)}});k.add({id:g.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle",titleItem:true}).setDisabled(1);a(f[d],function(l){if(f.isIE7&&l.styles.listStyleType=="lower-greek"){return}l.id=g.dom.uniqueId();k.add({id:l.id,title:l.title,onclick:function(){i=l;h()}})})});return e}},getInfo:function(){return{longname:"Advanced lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlist",tinymce.plugins.AdvListPlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlist/editor_plugin_src.js b/webcit/tiny_mce/plugins/advlist/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..a8f046b
--- /dev/null
@@ -0,0 +1,176 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.plugins.AdvListPlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+\r
+                       function buildFormats(str) {\r
+                               var formats = [];\r
+\r
+                               each(str.split(/,/), function(type) {\r
+                                       formats.push({\r
+                                               title : 'advlist.' + (type == 'default' ? 'def' : type.replace(/-/g, '_')),\r
+                                               styles : {\r
+                                                       listStyleType : type == 'default' ? '' : type\r
+                                               }\r
+                                       });\r
+                               });\r
+\r
+                               return formats;\r
+                       };\r
+\r
+                       // Setup number formats from config or default\r
+                       t.numlist = ed.getParam("advlist_number_styles") || buildFormats("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");\r
+                       t.bullist = ed.getParam("advlist_bullet_styles") || buildFormats("default,circle,disc,square");\r
+\r
+                       if (tinymce.isIE && /MSIE [2-7]/.test(navigator.userAgent))\r
+                               t.isIE7 = true;\r
+               },\r
+\r
+               createControl: function(name, cm) {\r
+                       var t = this, btn, format, editor = t.editor;\r
+\r
+                       if (name == 'numlist' || name == 'bullist') {\r
+                               // Default to first item if it's a default item\r
+                               if (t[name][0].title == 'advlist.def')\r
+                                       format = t[name][0];\r
+\r
+                               function hasFormat(node, format) {\r
+                                       var state = true;\r
+\r
+                                       each(format.styles, function(value, name) {\r
+                                               // Format doesn't match\r
+                                               if (editor.dom.getStyle(node, name) != value) {\r
+                                                       state = false;\r
+                                                       return false;\r
+                                               }\r
+                                       });\r
+\r
+                                       return state;\r
+                               };\r
+\r
+                               function applyListFormat() {\r
+                                       var list, dom = editor.dom, sel = editor.selection;\r
+\r
+                                       // Check for existing list element\r
+                                       list = dom.getParent(sel.getNode(), 'ol,ul');\r
+\r
+                                       // Switch/add list type if needed\r
+                                       if (!list || list.nodeName == (name == 'bullist' ? 'OL' : 'UL') || hasFormat(list, format))\r
+                                               editor.execCommand(name == 'bullist' ? 'InsertUnorderedList' : 'InsertOrderedList');\r
+\r
+                                       // Append styles to new list element\r
+                                       if (format) {\r
+                                               list = dom.getParent(sel.getNode(), 'ol,ul');\r
+                                               if (list) {\r
+                                                       dom.setStyles(list, format.styles);\r
+                                                       list.removeAttribute('data-mce-style');\r
+                                               }\r
+                                       }\r
+\r
+                                       editor.focus();\r
+                               };\r
+\r
+                               btn = cm.createSplitButton(name, {\r
+                                       title : 'advanced.' + name + '_desc',\r
+                                       'class' : 'mce_' + name,\r
+                                       onclick : function() {\r
+                                               applyListFormat();\r
+                                       }\r
+                               });\r
+\r
+                               btn.onRenderMenu.add(function(btn, menu) {\r
+                                       menu.onHideMenu.add(function() {\r
+                                               if (t.bookmark) {\r
+                                                       editor.selection.moveToBookmark(t.bookmark);\r
+                                                       t.bookmark = 0;\r
+                                               }\r
+                                       });\r
+\r
+                                       menu.onShowMenu.add(function() {\r
+                                               var dom = editor.dom, list = dom.getParent(editor.selection.getNode(), 'ol,ul'), fmtList;\r
+\r
+                                               if (list || format) {\r
+                                                       fmtList = t[name];\r
+\r
+                                                       // Unselect existing items\r
+                                                       each(menu.items, function(item) {\r
+                                                               var state = true;\r
+\r
+                                                               item.setSelected(0);\r
+\r
+                                                               if (list && !item.isDisabled()) {\r
+                                                                       each(fmtList, function(fmt) {\r
+                                                                               if (fmt.id == item.id) {\r
+                                                                                       if (!hasFormat(list, fmt)) {\r
+                                                                                               state = false;\r
+                                                                                               return false;\r
+                                                                                       }\r
+                                                                               }\r
+                                                                       });\r
+\r
+                                                                       if (state)\r
+                                                                               item.setSelected(1);\r
+                                                               }\r
+                                                       });\r
+\r
+                                                       // Select the current format\r
+                                                       if (!list)\r
+                                                               menu.items[format.id].setSelected(1);\r
+                                               }\r
+       \r
+                                               editor.focus();\r
+\r
+                                               // IE looses it's selection so store it away and restore it later\r
+                                               if (tinymce.isIE) {\r
+                                                       t.bookmark = editor.selection.getBookmark(1);\r
+                                               }\r
+                                       });\r
+\r
+                                       menu.add({id : editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle', titleItem: true}).setDisabled(1);\r
+\r
+                                       each(t[name], function(item) {\r
+                                               // IE<8 doesn't support lower-greek, skip it\r
+                                               if (t.isIE7 && item.styles.listStyleType == 'lower-greek')\r
+                                                       return;\r
+\r
+                                               item.id = editor.dom.uniqueId();\r
+\r
+                                               menu.add({id : item.id, title : item.title, onclick : function() {\r
+                                                       format = item;\r
+                                                       applyListFormat();\r
+                                               }});\r
+                                       });\r
+                               });\r
+\r
+                               return btn;\r
+                       }\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Advanced lists',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('advlist', tinymce.plugins.AdvListPlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/autolink/editor_plugin.js b/webcit/tiny_mce/plugins/autolink/editor_plugin.js
new file mode 100644 (file)
index 0000000..fd293dc
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AutolinkPlugin",{init:function(a,b){var c=this;if(tinyMCE.isIE){return}a.onKeyDown.add(function(d,f){if(f.keyCode==13){return c.handleEnter(d)}});a.onKeyPress.add(function(d,f){if(f.which==41){return c.handleEclipse(d)}});a.onKeyUp.add(function(d,f){if(f.keyCode==32){return c.handleSpacebar(d)}})},handleEclipse:function(a){this.parseCurrentLine(a,-1,"(",true)},handleSpacebar:function(a){this.parseCurrentLine(a,0,"",true)},handleEnter:function(a){this.parseCurrentLine(a,-1,"",false)},parseCurrentLine:function(i,d,b,g){var a,f,c,n,k,m,h,e,j;a=i.selection.getRng().cloneRange();if(a.startOffset<5){e=a.endContainer.previousSibling;if(e==null){if(a.endContainer.firstChild==null||a.endContainer.firstChild.nextSibling==null){return}e=a.endContainer.firstChild.nextSibling}j=e.length;a.setStart(e,j);a.setEnd(e,j);if(a.endOffset<5){return}f=a.endOffset;n=e}else{n=a.endContainer;if(n.nodeType!=3&&n.firstChild){while(n.nodeType!=3&&n.firstChild){n=n.firstChild}a.setStart(n,0);a.setEnd(n,n.nodeValue.length)}if(a.endOffset==1){f=2}else{f=a.endOffset-1-d}}c=f;do{a.setStart(n,f-2);a.setEnd(n,f-1);f-=1}while(a.toString()!=" "&&a.toString()!=""&&a.toString().charCodeAt(0)!=160&&(f-2)>=0&&a.toString()!=b);if(a.toString()==b||a.toString().charCodeAt(0)==160){a.setStart(n,f);a.setEnd(n,c);f+=1}else{if(a.startOffset==0){a.setStart(n,0);a.setEnd(n,c)}else{a.setStart(n,f);a.setEnd(n,c)}}m=a.toString();h=m.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)(.+)$/i);if(h){if(h[1]=="www."){h[1]="http://www."}k=i.selection.getBookmark();i.selection.setRng(a);tinyMCE.execCommand("createlink",false,h[1]+h[2]);i.selection.moveToBookmark(k);if(tinyMCE.isWebKit){i.selection.collapse(false);var l=Math.min(n.length,c+1);a.setStart(n,l);a.setEnd(n,l);i.selection.setRng(a)}}},getInfo:function(){return{longname:"Autolink",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autolink",tinymce.plugins.AutolinkPlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/autolink/editor_plugin_src.js b/webcit/tiny_mce/plugins/autolink/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..604da8b
--- /dev/null
@@ -0,0 +1,172 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2011, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+       tinymce.create('tinymce.plugins.AutolinkPlugin', {
+       /**
+       * Initializes the plugin, this will be executed after the plugin has been created.
+       * This call is done before the editor instance has finished it's initialization so use the onInit event
+       * of the editor instance to intercept that event.
+       *
+       * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
+       * @param {string} url Absolute URL to where the plugin is located.
+       */
+
+       init : function(ed, url) {
+               var t = this;
+
+               // Internet Explorer has built-in automatic linking
+               if (tinyMCE.isIE)
+                       return;
+
+               // Add a key down handler
+               ed.onKeyDown.add(function(ed, e) {
+                       if (e.keyCode == 13)
+                               return t.handleEnter(ed);
+                       });
+
+               ed.onKeyPress.add(function(ed, e) {
+                       if (e.which == 41)
+                               return t.handleEclipse(ed);
+               });
+
+               // Add a key up handler
+               ed.onKeyUp.add(function(ed, e) {
+                       if (e.keyCode == 32)
+                               return t.handleSpacebar(ed);
+                       });
+              },
+
+               handleEclipse : function(ed) {
+                       this.parseCurrentLine(ed, -1, '(', true);
+               },
+
+               handleSpacebar : function(ed) {
+                        this.parseCurrentLine(ed, 0, '', true);
+                },
+
+               handleEnter : function(ed) {
+                       this.parseCurrentLine(ed, -1, '', false);
+               },
+
+               parseCurrentLine : function(ed, end_offset, delimiter, goback) {
+                       var r, end, start, endContainer, bookmark, text, matches, prev, len;
+
+                       // We need at least five characters to form a URL,
+                       // hence, at minimum, five characters from the beginning of the line.
+                       r = ed.selection.getRng().cloneRange();
+                       if (r.startOffset < 5) {
+                               // During testing, the caret is placed inbetween two text nodes. 
+                               // The previous text node contains the URL.
+                               prev = r.endContainer.previousSibling;
+                               if (prev == null) {
+                                       if (r.endContainer.firstChild == null || r.endContainer.firstChild.nextSibling == null)
+                                               return;
+
+                                       prev = r.endContainer.firstChild.nextSibling;
+                               }
+                               len = prev.length;
+                               r.setStart(prev, len);
+                               r.setEnd(prev, len);
+
+                               if (r.endOffset < 5)
+                                       return;
+
+                               end = r.endOffset;
+                               endContainer = prev;
+                       } else {
+                               endContainer = r.endContainer;
+
+                               // Get a text node
+                               if (endContainer.nodeType != 3 && endContainer.firstChild) {
+                                       while (endContainer.nodeType != 3 && endContainer.firstChild)
+                                               endContainer = endContainer.firstChild;
+
+                                       r.setStart(endContainer, 0);
+                                       r.setEnd(endContainer, endContainer.nodeValue.length);
+                               }
+
+                               if (r.endOffset == 1)
+                                       end = 2;
+                               else
+                                       end = r.endOffset - 1 - end_offset;
+                       }
+
+                       start = end;
+
+                       do
+                       {
+                               // Move the selection one character backwards.
+                               r.setStart(endContainer, end - 2);
+                               r.setEnd(endContainer, end - 1);
+                               end -= 1;
+
+                               // Loop until one of the following is found: a blank space, &nbsp;, delimeter, (end-2) >= 0
+                       } while (r.toString() != ' ' && r.toString() != '' && r.toString().charCodeAt(0) != 160 && (end -2) >= 0 && r.toString() != delimiter);
+
+                       if (r.toString() == delimiter || r.toString().charCodeAt(0) == 160) {
+                               r.setStart(endContainer, end);
+                               r.setEnd(endContainer, start);
+                               end += 1;
+                       } else if (r.startOffset == 0) {
+                               r.setStart(endContainer, 0);
+                               r.setEnd(endContainer, start);
+                       }
+                       else {
+                               r.setStart(endContainer, end);
+                               r.setEnd(endContainer, start);
+                       }
+
+                       text = r.toString();
+                       matches = text.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)(.+)$/i);
+
+                       if (matches) {
+                               if (matches[1] == 'www.') {
+                                       matches[1] = 'http://www.';
+                               }
+
+                               bookmark = ed.selection.getBookmark();
+
+                               ed.selection.setRng(r);
+                               tinyMCE.execCommand('createlink',false, matches[1] + matches[2]);
+                               ed.selection.moveToBookmark(bookmark);
+
+                               // TODO: Determine if this is still needed.
+                               if (tinyMCE.isWebKit) {
+                                       // move the caret to its original position
+                                       ed.selection.collapse(false);
+                                       var max = Math.min(endContainer.length, start + 1);
+                                       r.setStart(endContainer, max);
+                                       r.setEnd(endContainer, max);
+                                       ed.selection.setRng(r);
+                               }
+                       }
+               },
+
+               /**
+               * Returns information about the plugin as a name/value array.
+               * The current keys are longname, author, authorurl, infourl and version.
+               *
+               * @return {Object} Name/value array containing information about the plugin.
+               */
+               getInfo : function() {
+                       return {
+                               longname : 'Autolink',
+                               author : 'Moxiecode Systems AB',
+                               authorurl : 'http://tinymce.moxiecode.com',
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink',
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion
+                       };
+               }
+       });
+
+       // Register plugin
+       tinymce.PluginManager.add('autolink', tinymce.plugins.AutolinkPlugin);
+})();
diff --git a/webcit/tiny_mce/plugins/autoresize/editor_plugin.js b/webcit/tiny_mce/plugins/autoresize/editor_plugin.js
new file mode 100644 (file)
index 0000000..6c4ff0d
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this,e=0;if(a.getParam("fullscreen_is_enabled")){return}function b(){var i=a.getDoc(),f=i.body,k=i.documentElement,h=tinymce.DOM,j=d.autoresize_min_height,g;g=tinymce.isIE?f.scrollHeight:i.body.offsetHeight;if(g>d.autoresize_min_height){j=g}if(d.autoresize_max_height&&g>d.autoresize_max_height){j=d.autoresize_max_height;a.getBody().style.overflowY="auto"}else{a.getBody().style.overflowY="hidden"}if(j!==e){h.setStyle(h.get(a.id+"_ifr"),"height",j+"px");e=j}if(d.throbbing){a.setProgressState(false);a.setProgressState(true)}}d.editor=a;d.autoresize_min_height=parseInt(a.getParam("autoresize_min_height",a.getElement().offsetHeight));d.autoresize_max_height=parseInt(a.getParam("autoresize_max_height",0));a.onInit.add(function(f){f.dom.setStyle(f.getBody(),"paddingBottom",f.getParam("autoresize_bottom_margin",50)+"px")});a.onChange.add(b);a.onSetContent.add(b);a.onPaste.add(b);a.onKeyUp.add(b);a.onPostRender.add(b);if(a.getParam("autoresize_on_init",true)){a.onInit.add(function(g,f){g.setProgressState(true);d.throbbing=true;g.getBody().style.overflowY="hidden"});a.onLoadContent.add(function(g,f){b();setTimeout(function(){b();g.setProgressState(false);d.throbbing=false},1250)})}a.addCommand("mceAutoResize",b)},getInfo:function(){return{longname:"Auto Resize",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autoresize",tinymce.plugins.AutoResizePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/autoresize/editor_plugin_src.js b/webcit/tiny_mce/plugins/autoresize/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..7d11341
--- /dev/null
@@ -0,0 +1,137 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+       /**
+        * Auto Resize
+        * 
+        * This plugin automatically resizes the content area to fit its content height.
+        * It will retain a minimum height, which is the height of the content area when
+        * it's initialized.
+        */
+       tinymce.create('tinymce.plugins.AutoResizePlugin', {
+               /**
+                * Initializes the plugin, this will be executed after the plugin has been created.
+                * This call is done before the editor instance has finished it's initialization so use the onInit event
+                * of the editor instance to intercept that event.
+                *
+                * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
+                * @param {string} url Absolute URL to where the plugin is located.
+                */
+               init : function(ed, url) {
+                       var t = this, oldSize = 0;
+
+                       if (ed.getParam('fullscreen_is_enabled'))
+                               return;
+
+                       /**
+                        * This method gets executed each time the editor needs to resize.
+                        */
+                       function resize() {
+                               var d = ed.getDoc(), b = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight;
+
+                               // Get height differently depending on the browser used
+                               myHeight = tinymce.isIE ? b.scrollHeight : d.body.offsetHeight;
+
+                               // Don't make it smaller than the minimum height
+                               if (myHeight > t.autoresize_min_height)
+                                       resizeHeight = myHeight;
+
+                               // If a maximum height has been defined don't exceed this height
+                               if (t.autoresize_max_height && myHeight > t.autoresize_max_height) {
+                                       resizeHeight = t.autoresize_max_height;
+                                       ed.getBody().style.overflowY = "auto";
+                               } else
+                                       ed.getBody().style.overflowY = "hidden";
+
+                               // Resize content element
+                               if (resizeHeight !== oldSize) {
+                                       DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px');
+                                       oldSize = resizeHeight;
+                               }
+
+                               // if we're throbbing, we'll re-throb to match the new size
+                               if (t.throbbing) {
+                                       ed.setProgressState(false);
+                                       ed.setProgressState(true);
+                               }
+                       };
+
+                       t.editor = ed;
+
+                       // Define minimum height
+                       t.autoresize_min_height = parseInt( ed.getParam('autoresize_min_height', ed.getElement().offsetHeight) );
+
+                       // Define maximum height        
+                       t.autoresize_max_height = parseInt( ed.getParam('autoresize_max_height', 0) );
+
+                       // Add padding at the bottom for better UX
+                       ed.onInit.add(function(ed){
+                               ed.dom.setStyle(ed.getBody(), 'paddingBottom', ed.getParam('autoresize_bottom_margin', 50) + 'px');
+                       });
+
+                       // Add appropriate listeners for resizing content area
+                       ed.onChange.add(resize);
+                       ed.onSetContent.add(resize);
+                       ed.onPaste.add(resize);
+                       ed.onKeyUp.add(resize);
+                       ed.onPostRender.add(resize);
+
+                       if (ed.getParam('autoresize_on_init', true)) {
+                               // Things to do when the editor is ready
+                               ed.onInit.add(function(ed, l) {
+                                       // Show throbber until content area is resized properly
+                                       ed.setProgressState(true);
+                                       t.throbbing = true;
+
+                                       // Hide scrollbars
+                                       ed.getBody().style.overflowY = "hidden";
+                               });
+
+                               ed.onLoadContent.add(function(ed, l) {
+                                       resize();
+
+                                       // Because the content area resizes when its content CSS loads,
+                                       // and we can't easily add a listener to its onload event,
+                                       // we'll just trigger a resize after a short loading period
+                                       setTimeout(function() {
+                                               resize();
+
+                                               // Disable throbber
+                                               ed.setProgressState(false);
+                                               t.throbbing = false;
+                                       }, 1250);
+                               });
+                       }
+
+                       // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');
+                       ed.addCommand('mceAutoResize', resize);
+               },
+
+               /**
+                * Returns information about the plugin as a name/value array.
+                * The current keys are longname, author, authorurl, infourl and version.
+                *
+                * @return {Object} Name/value array containing information about the plugin.
+                */
+               getInfo : function() {
+                       return {
+                               longname : 'Auto Resize',
+                               author : 'Moxiecode Systems AB',
+                               authorurl : 'http://tinymce.moxiecode.com',
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize',
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion
+                       };
+               }
+       });
+
+       // Register plugin
+       tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin);
+})();
diff --git a/webcit/tiny_mce/plugins/autosave/editor_plugin.js b/webcit/tiny_mce/plugins/autosave/editor_plugin.js
new file mode 100644 (file)
index 0000000..f7d0576
--- /dev/null
@@ -0,0 +1 @@
+(function(e){var c="autosave",g="restoredraft",b=true,f,d,a=e.util.Dispatcher;e.create("tinymce.plugins.AutoSave",{init:function(i,j){var h=this,l=i.settings;h.editor=i;function k(n){var m={s:1000,m:60000};n=/^(\d+)([ms]?)$/.exec(""+n);return(n[2]?m[n[2]]:1)*parseInt(n)}e.each({ask_before_unload:b,interval:"30s",retention:"20m",minlength:50},function(n,m){m=c+"_"+m;if(l[m]===f){l[m]=n}});l.autosave_interval=k(l.autosave_interval);l.autosave_retention=k(l.autosave_retention);i.addButton(g,{title:c+".restore_content",onclick:function(){if(i.getContent({draft:true}).replace(/\s|&nbsp;|<\/?p[^>]*>|<br[^>]*>/gi,"").length>0){i.windowManager.confirm(c+".warning_message",function(m){if(m){h.restoreDraft()}})}else{h.restoreDraft()}}});i.onNodeChange.add(function(){var m=i.controlManager;if(m.get(g)){m.setDisabled(g,!h.hasDraft())}});i.onInit.add(function(){if(i.controlManager.get(g)){h.setupStorage(i);setInterval(function(){h.storeDraft();i.nodeChanged()},l.autosave_interval)}});h.onStoreDraft=new a(h);h.onRestoreDraft=new a(h);h.onRemoveDraft=new a(h);if(!d){window.onbeforeunload=e.plugins.AutoSave._beforeUnloadHandler;d=b}},getInfo:function(){return{longname:"Auto save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave",version:e.majorVersion+"."+e.minorVersion}},getExpDate:function(){return new Date(new Date().getTime()+this.editor.settings.autosave_retention).toUTCString()},setupStorage:function(i){var h=this,k=c+"_test",j="OK";h.key=c+i.id;e.each([function(){if(localStorage){localStorage.setItem(k,j);if(localStorage.getItem(k)===j){localStorage.removeItem(k);return localStorage}}},function(){if(sessionStorage){sessionStorage.setItem(k,j);if(sessionStorage.getItem(k)===j){sessionStorage.removeItem(k);return sessionStorage}}},function(){if(e.isIE){i.getElement().style.behavior="url('#default#userData')";return{autoExpires:b,setItem:function(l,n){var m=i.getElement();m.setAttribute(l,n);m.expires=h.getExpDate();try{m.save("TinyMCE")}catch(o){}},getItem:function(l){var m=i.getElement();try{m.load("TinyMCE");return m.getAttribute(l)}catch(n){return null}},removeItem:function(l){i.getElement().removeAttribute(l)}}}},],function(l){try{h.storage=l();if(h.storage){return false}}catch(m){}})},storeDraft:function(){var i=this,l=i.storage,j=i.editor,h,k;if(l){if(!l.getItem(i.key)&&!j.isDirty()){return}k=j.getContent({draft:true});if(k.length>j.settings.autosave_minlength){h=i.getExpDate();if(!i.storage.autoExpires){i.storage.setItem(i.key+"_expires",h)}i.storage.setItem(i.key,k);i.onStoreDraft.dispatch(i,{expires:h,content:k})}}},restoreDraft:function(){var h=this,j=h.storage,i;if(j){i=j.getItem(h.key);if(i){h.editor.setContent(i);h.onRestoreDraft.dispatch(h,{content:i})}}},hasDraft:function(){var h=this,k=h.storage,i,j;if(k){j=!!k.getItem(h.key);if(j){if(!h.storage.autoExpires){i=new Date(k.getItem(h.key+"_expires"));if(new Date().getTime()<i.getTime()){return b}h.removeDraft()}else{return b}}}return false},removeDraft:function(){var h=this,k=h.storage,i=h.key,j;if(k){j=k.getItem(i);k.removeItem(i);k.removeItem(i+"_expires");if(j){h.onRemoveDraft.dispatch(h,{content:j})}}},"static":{_beforeUnloadHandler:function(h){var i;e.each(tinyMCE.editors,function(j){if(j.plugins.autosave){j.plugins.autosave.storeDraft()}if(j.getParam("fullscreen_is_enabled")){return}if(!i&&j.isDirty()&&j.getParam("autosave_ask_before_unload")){i=j.getLang("autosave.unload_msg")}});return i}}});e.PluginManager.add("autosave",e.plugins.AutoSave)})(tinymce);
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/autosave/editor_plugin_src.js b/webcit/tiny_mce/plugins/autosave/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..8311483
--- /dev/null
@@ -0,0 +1,431 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ *\r
+ * Adds auto-save capability to the TinyMCE text editor to rescue content\r
+ * inadvertently lost. This plugin was originally developed by Speednet\r
+ * and that project can be found here: http://code.google.com/p/tinyautosave/\r
+ *\r
+ * TECHNOLOGY DISCUSSION:\r
+ * \r
+ * The plugin attempts to use the most advanced features available in the current browser to save\r
+ * as much content as possible.  There are a total of four different methods used to autosave the\r
+ * content.  In order of preference, they are:\r
+ * \r
+ * 1. localStorage - A new feature of HTML 5, localStorage can store megabytes of data per domain\r
+ * on the client computer. Data stored in the localStorage area has no expiration date, so we must\r
+ * manage expiring the data ourselves.  localStorage is fully supported by IE8, and it is supposed\r
+ * to be working in Firefox 3 and Safari 3.2, but in reality is is flaky in those browsers.  As\r
+ * HTML 5 gets wider support, the AutoSave plugin will use it automatically. In Windows Vista/7,\r
+ * localStorage is stored in the following folder:\r
+ * C:\Users\[username]\AppData\Local\Microsoft\Internet Explorer\DOMStore\[tempFolder]\r
+ * \r
+ * 2. sessionStorage - A new feature of HTML 5, sessionStorage works similarly to localStorage,\r
+ * except it is designed to expire after a certain amount of time.  Because the specification\r
+ * around expiration date/time is very loosely-described, it is preferrable to use locaStorage and\r
+ * manage the expiration ourselves.  sessionStorage has similar storage characteristics to\r
+ * localStorage, although it seems to have better support by Firefox 3 at the moment.  (That will\r
+ * certainly change as Firefox continues getting better at HTML 5 adoption.)\r
+ * \r
+ * 3. UserData - A very under-exploited feature of Microsoft Internet Explorer, UserData is a\r
+ * way to store up to 128K of data per "document", or up to 1MB of data per domain, on the client\r
+ * computer.  The feature is available for IE 5+, which makes it available for every version of IE\r
+ * supported by TinyMCE.  The content is persistent across browser restarts and expires on the\r
+ * date/time specified, just like a cookie.  However, the data is not cleared when the user clears\r
+ * cookies on the browser, which makes it well-suited for rescuing autosaved content.  UserData,\r
+ * like other Microsoft IE browser technologies, is implemented as a behavior attached to a\r
+ * specific DOM object, so in this case we attach the behavior to the same DOM element that the\r
+ * TinyMCE editor instance is attached to.\r
+ */\r
+\r
+(function(tinymce) {\r
+       // Setup constants to help the compressor to reduce script size\r
+       var PLUGIN_NAME = 'autosave',\r
+               RESTORE_DRAFT = 'restoredraft',\r
+               TRUE = true,\r
+               undefined,\r
+               unloadHandlerAdded,\r
+               Dispatcher = tinymce.util.Dispatcher;\r
+\r
+       /**\r
+        * This plugin adds auto-save capability to the TinyMCE text editor to rescue content\r
+        * inadvertently lost. By using localStorage.\r
+        *\r
+        * @class tinymce.plugins.AutoSave\r
+        */\r
+       tinymce.create('tinymce.plugins.AutoSave', {\r
+               /**\r
+                * Initializes the plugin, this will be executed after the plugin has been created.\r
+                * This call is done before the editor instance has finished it's initialization so use the onInit event\r
+                * of the editor instance to intercept that event.\r
+                *\r
+                * @method init\r
+                * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.\r
+                * @param {string} url Absolute URL to where the plugin is located.\r
+                */\r
+               init : function(ed, url) {\r
+                       var self = this, settings = ed.settings;\r
+\r
+                       self.editor = ed;\r
+\r
+                       // Parses the specified time string into a milisecond number 10m, 10s etc.\r
+                       function parseTime(time) {\r
+                               var multipels = {\r
+                                       s : 1000,\r
+                                       m : 60000\r
+                               };\r
+\r
+                               time = /^(\d+)([ms]?)$/.exec('' + time);\r
+\r
+                               return (time[2] ? multipels[time[2]] : 1) * parseInt(time);\r
+                       };\r
+\r
+                       // Default config\r
+                       tinymce.each({\r
+                               ask_before_unload : TRUE,\r
+                               interval : '30s',\r
+                               retention : '20m',\r
+                               minlength : 50\r
+                       }, function(value, key) {\r
+                               key = PLUGIN_NAME + '_' + key;\r
+\r
+                               if (settings[key] === undefined)\r
+                                       settings[key] = value;\r
+                       });\r
+\r
+                       // Parse times\r
+                       settings.autosave_interval = parseTime(settings.autosave_interval);\r
+                       settings.autosave_retention = parseTime(settings.autosave_retention);\r
+\r
+                       // Register restore button\r
+                       ed.addButton(RESTORE_DRAFT, {\r
+                               title : PLUGIN_NAME + ".restore_content",\r
+                               onclick : function() {\r
+                                       if (ed.getContent({draft: true}).replace(/\s|&nbsp;|<\/?p[^>]*>|<br[^>]*>/gi, "").length > 0) {\r
+                                               // Show confirm dialog if the editor isn't empty\r
+                                               ed.windowManager.confirm(\r
+                                                       PLUGIN_NAME + ".warning_message",\r
+                                                       function(ok) {\r
+                                                               if (ok)\r
+                                                                       self.restoreDraft();\r
+                                                       }\r
+                                               );\r
+                                       } else\r
+                                               self.restoreDraft();\r
+                               }\r
+                       });\r
+\r
+                       // Enable/disable restoredraft button depending on if there is a draft stored or not\r
+                       ed.onNodeChange.add(function() {\r
+                               var controlManager = ed.controlManager;\r
+\r
+                               if (controlManager.get(RESTORE_DRAFT))\r
+                                       controlManager.setDisabled(RESTORE_DRAFT, !self.hasDraft());\r
+                       });\r
+\r
+                       ed.onInit.add(function() {\r
+                               // Check if the user added the restore button, then setup auto storage logic\r
+                               if (ed.controlManager.get(RESTORE_DRAFT)) {\r
+                                       // Setup storage engine\r
+                                       self.setupStorage(ed);\r
+\r
+                                       // Auto save contents each interval time\r
+                                       setInterval(function() {\r
+                                               self.storeDraft();\r
+                                               ed.nodeChanged();\r
+                                       }, settings.autosave_interval);\r
+                               }\r
+                       });\r
+\r
+                       /**\r
+                        * This event gets fired when a draft is stored to local storage.\r
+                        *\r
+                        * @event onStoreDraft\r
+                        * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.\r
+                        * @param {Object} draft Draft object containing the HTML contents of the editor.\r
+                        */\r
+                       self.onStoreDraft = new Dispatcher(self);\r
+\r
+                       /**\r
+                        * This event gets fired when a draft is restored from local storage.\r
+                        *\r
+                        * @event onStoreDraft\r
+                        * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.\r
+                        * @param {Object} draft Draft object containing the HTML contents of the editor.\r
+                        */\r
+                       self.onRestoreDraft = new Dispatcher(self);\r
+\r
+                       /**\r
+                        * This event gets fired when a draft removed/expired.\r
+                        *\r
+                        * @event onRemoveDraft\r
+                        * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.\r
+                        * @param {Object} draft Draft object containing the HTML contents of the editor.\r
+                        */\r
+                       self.onRemoveDraft = new Dispatcher(self);\r
+\r
+                       // Add ask before unload dialog only add one unload handler\r
+                       if (!unloadHandlerAdded) {\r
+                               window.onbeforeunload = tinymce.plugins.AutoSave._beforeUnloadHandler;\r
+                               unloadHandlerAdded = TRUE;\r
+                       }\r
+               },\r
+\r
+               /**\r
+                * Returns information about the plugin as a name/value array.\r
+                * The current keys are longname, author, authorurl, infourl and version.\r
+                *\r
+                * @method getInfo\r
+                * @return {Object} Name/value array containing information about the plugin.\r
+                */\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Auto save',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               /**\r
+                * Returns an expiration date UTC string.\r
+                *\r
+                * @method getExpDate\r
+                * @return {String} Expiration date UTC string.\r
+                */\r
+               getExpDate : function() {\r
+                       return new Date(\r
+                               new Date().getTime() + this.editor.settings.autosave_retention\r
+                       ).toUTCString();\r
+               },\r
+\r
+               /**\r
+                * This method will setup the storage engine. If the browser has support for it.\r
+                *\r
+                * @method setupStorage\r
+                */\r
+               setupStorage : function(ed) {\r
+                       var self = this, testKey = PLUGIN_NAME + '_test', testVal = "OK";\r
+\r
+                       self.key = PLUGIN_NAME + ed.id;\r
+\r
+                       // Loop though each storage engine type until we find one that works\r
+                       tinymce.each([\r
+                               function() {\r
+                                       // Try HTML5 Local Storage\r
+                                       if (localStorage) {\r
+                                               localStorage.setItem(testKey, testVal);\r
+\r
+                                               if (localStorage.getItem(testKey) === testVal) {\r
+                                                       localStorage.removeItem(testKey);\r
+\r
+                                                       return localStorage;\r
+                                               }\r
+                                       }\r
+                               },\r
+\r
+                               function() {\r
+                                       // Try HTML5 Session Storage\r
+                                       if (sessionStorage) {\r
+                                               sessionStorage.setItem(testKey, testVal);\r
+\r
+                                               if (sessionStorage.getItem(testKey) === testVal) {\r
+                                                       sessionStorage.removeItem(testKey);\r
+\r
+                                                       return sessionStorage;\r
+                                               }\r
+                                       }\r
+                               },\r
+\r
+                               function() {\r
+                                       // Try IE userData\r
+                                       if (tinymce.isIE) {\r
+                                               ed.getElement().style.behavior = "url('#default#userData')";\r
+\r
+                                               // Fake localStorage on old IE\r
+                                               return {\r
+                                                       autoExpires : TRUE,\r
+\r
+                                                       setItem : function(key, value) {\r
+                                                               var userDataElement = ed.getElement();\r
+\r
+                                                               userDataElement.setAttribute(key, value);\r
+                                                               userDataElement.expires = self.getExpDate();\r
+\r
+                                                               try {\r
+                                                                       userDataElement.save("TinyMCE");\r
+                                                               } catch (e) {\r
+                                                                       // Ignore, saving might fail if "Userdata Persistence" is disabled in IE\r
+                                                               }\r
+                                                       },\r
+\r
+                                                       getItem : function(key) {\r
+                                                               var userDataElement = ed.getElement();\r
+\r
+                                                               try {\r
+                                                                       userDataElement.load("TinyMCE");\r
+                                                                       return userDataElement.getAttribute(key);\r
+                                                               } catch (e) {\r
+                                                                       // Ignore, loading might fail if "Userdata Persistence" is disabled in IE\r
+                                                                       return null;\r
+                                                               }\r
+                                                       },\r
+\r
+                                                       removeItem : function(key) {\r
+                                                               ed.getElement().removeAttribute(key);\r
+                                                       }\r
+                                               };\r
+                                       }\r
+                               },\r
+                       ], function(setup) {\r
+                               // Try executing each function to find a suitable storage engine\r
+                               try {\r
+                                       self.storage = setup();\r
+\r
+                                       if (self.storage)\r
+                                               return false;\r
+                               } catch (e) {\r
+                                       // Ignore\r
+                               }\r
+                       });\r
+               },\r
+\r
+               /**\r
+                * This method will store the current contents in the the storage engine.\r
+                *\r
+                * @method storeDraft\r
+                */\r
+               storeDraft : function() {\r
+                       var self = this, storage = self.storage, editor = self.editor, expires, content;\r
+\r
+                       // Is the contents dirty\r
+                       if (storage) {\r
+                               // If there is no existing key and the contents hasn't been changed since\r
+                               // it's original value then there is no point in saving a draft\r
+                               if (!storage.getItem(self.key) && !editor.isDirty())\r
+                                       return;\r
+\r
+                               // Store contents if the contents if longer than the minlength of characters\r
+                               content = editor.getContent({draft: true});\r
+                               if (content.length > editor.settings.autosave_minlength) {\r
+                                       expires = self.getExpDate();\r
+\r
+                                       // Store expiration date if needed IE userData has auto expire built in\r
+                                       if (!self.storage.autoExpires)\r
+                                               self.storage.setItem(self.key + "_expires", expires);\r
+\r
+                                       self.storage.setItem(self.key, content);\r
+                                       self.onStoreDraft.dispatch(self, {\r
+                                               expires : expires,\r
+                                               content : content\r
+                                       });\r
+                               }\r
+                       }\r
+               },\r
+\r
+               /**\r
+                * This method will restore the contents from the storage engine back to the editor.\r
+                *\r
+                * @method restoreDraft\r
+                */\r
+               restoreDraft : function() {\r
+                       var self = this, storage = self.storage, content;\r
+\r
+                       if (storage) {\r
+                               content = storage.getItem(self.key);\r
+\r
+                               if (content) {\r
+                                       self.editor.setContent(content);\r
+                                       self.onRestoreDraft.dispatch(self, {\r
+                                               content : content\r
+                                       });\r
+                               }\r
+                       }\r
+               },\r
+\r
+               /**\r
+                * This method will return true/false if there is a local storage draft available.\r
+                *\r
+                * @method hasDraft\r
+                * @return {boolean} true/false state if there is a local draft.\r
+                */\r
+               hasDraft : function() {\r
+                       var self = this, storage = self.storage, expDate, exists;\r
+\r
+                       if (storage) {\r
+                               // Does the item exist at all\r
+                               exists = !!storage.getItem(self.key);\r
+                               if (exists) {\r
+                                       // Storage needs autoexpire\r
+                                       if (!self.storage.autoExpires) {\r
+                                               expDate = new Date(storage.getItem(self.key + "_expires"));\r
+\r
+                                               // Contents hasn't expired\r
+                                               if (new Date().getTime() < expDate.getTime())\r
+                                                       return TRUE;\r
+\r
+                                               // Remove it if it has\r
+                                               self.removeDraft();\r
+                                       } else\r
+                                               return TRUE;\r
+                               }\r
+                       }\r
+\r
+                       return false;\r
+               },\r
+\r
+               /**\r
+                * Removes the currently stored draft.\r
+                *\r
+                * @method removeDraft\r
+                */\r
+               removeDraft : function() {\r
+                       var self = this, storage = self.storage, key = self.key, content;\r
+\r
+                       if (storage) {\r
+                               // Get current contents and remove the existing draft\r
+                               content = storage.getItem(key);\r
+                               storage.removeItem(key);\r
+                               storage.removeItem(key + "_expires");\r
+\r
+                               // Dispatch remove event if we had any contents\r
+                               if (content) {\r
+                                       self.onRemoveDraft.dispatch(self, {\r
+                                               content : content\r
+                                       });\r
+                               }\r
+                       }\r
+               },\r
+\r
+               "static" : {\r
+                       // Internal unload handler will be called before the page is unloaded\r
+                       _beforeUnloadHandler : function(e) {\r
+                               var msg;\r
+\r
+                               tinymce.each(tinyMCE.editors, function(ed) {\r
+                                       // Store a draft for each editor instance\r
+                                       if (ed.plugins.autosave)\r
+                                               ed.plugins.autosave.storeDraft();\r
+\r
+                                       // Never ask in fullscreen mode\r
+                                       if (ed.getParam("fullscreen_is_enabled"))\r
+                                               return;\r
+\r
+                                       // Setup a return message if the editor is dirty\r
+                                       if (!msg && ed.isDirty() && ed.getParam("autosave_ask_before_unload"))\r
+                                               msg = ed.getLang("autosave.unload_msg");\r
+                               });\r
+\r
+                               return msg;\r
+                       }\r
+               }\r
+       });\r
+\r
+       tinymce.PluginManager.add('autosave', tinymce.plugins.AutoSave);\r
+})(tinymce);\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/en.js b/webcit/tiny_mce/plugins/autosave/langs/en.js
new file mode 100644 (file)
index 0000000..fce6bd3
--- /dev/null
@@ -0,0 +1,4 @@
+tinyMCE.addI18n('en.autosave',{\r
+restore_content: "Restore auto-saved content",\r
+warning_message: "If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?"\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/bbcode/editor_plugin.js b/webcit/tiny_mce/plugins/bbcode/editor_plugin.js
new file mode 100644 (file)
index 0000000..8f8821f
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a,b){var d=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.onBeforeSetContent.add(function(e,f){f.content=d["_"+c+"_bbcode2html"](f.content)});a.onPostProcess.add(function(e,f){if(f.set){f.content=d["_"+c+"_bbcode2html"](f.content)}if(f.get){f.content=d["_"+c+"_html2bbcode"](f.content)}})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_punbb_html2bbcode:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");b(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");b(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");b(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");b(/<font>(.*?)<\/font>/gi,"$1");b(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");b(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");b(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");b(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");b(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");b(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");b(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");b(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");b(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");b(/<\/(strong|b)>/gi,"[/b]");b(/<(strong|b)>/gi,"[b]");b(/<\/(em|i)>/gi,"[/i]");b(/<(em|i)>/gi,"[i]");b(/<\/u>/gi,"[/u]");b(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");b(/<u>/gi,"[u]");b(/<blockquote[^>]*>/gi,"[quote]");b(/<\/blockquote>/gi,"[/quote]");b(/<br \/>/gi,"\n");b(/<br\/>/gi,"\n");b(/<br>/gi,"\n");b(/<p>/gi,"");b(/<\/p>/gi,"\n");b(/&nbsp;|\u00a0/gi," ");b(/&quot;/gi,'"');b(/&lt;/gi,"<");b(/&gt;/gi,">");b(/&amp;/gi,"&");return a},_punbb_bbcode2html:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/\n/gi,"<br />");b(/\[b\]/gi,"<strong>");b(/\[\/b\]/gi,"</strong>");b(/\[i\]/gi,"<em>");b(/\[\/i\]/gi,"</em>");b(/\[u\]/gi,"<u>");b(/\[\/u\]/gi,"</u>");b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>');b(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>');b(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />');b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>');b(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span>&nbsp;');b(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span>&nbsp;');return a}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/bbcode/editor_plugin_src.js b/webcit/tiny_mce/plugins/bbcode/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..4e7eb33
--- /dev/null
@@ -0,0 +1,120 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.BBCodePlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this, dialect = ed.getParam('bbcode_dialect', 'punbb').toLowerCase();\r
+\r
+                       ed.onBeforeSetContent.add(function(ed, o) {\r
+                               o.content = t['_' + dialect + '_bbcode2html'](o.content);\r
+                       });\r
+\r
+                       ed.onPostProcess.add(function(ed, o) {\r
+                               if (o.set)\r
+                                       o.content = t['_' + dialect + '_bbcode2html'](o.content);\r
+\r
+                               if (o.get)\r
+                                       o.content = t['_' + dialect + '_html2bbcode'](o.content);\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'BBCode Plugin',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               // Private methods\r
+\r
+               // HTML -> BBCode in PunBB dialect\r
+               _punbb_html2bbcode : function(s) {\r
+                       s = tinymce.trim(s);\r
+\r
+                       function rep(re, str) {\r
+                               s = s.replace(re, str);\r
+                       };\r
+\r
+                       // example: <strong> to [b]\r
+                       rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");\r
+                       rep(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");\r
+                       rep(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");\r
+                       rep(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");\r
+                       rep(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");\r
+                       rep(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");\r
+                       rep(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");\r
+                       rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");\r
+                       rep(/<font>(.*?)<\/font>/gi,"$1");\r
+                       rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");\r
+                       rep(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");\r
+                       rep(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");\r
+                       rep(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");\r
+                       rep(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");\r
+                       rep(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");\r
+                       rep(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");\r
+                       rep(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");\r
+                       rep(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");\r
+                       rep(/<\/(strong|b)>/gi,"[/b]");\r
+                       rep(/<(strong|b)>/gi,"[b]");\r
+                       rep(/<\/(em|i)>/gi,"[/i]");\r
+                       rep(/<(em|i)>/gi,"[i]");\r
+                       rep(/<\/u>/gi,"[/u]");\r
+                       rep(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");\r
+                       rep(/<u>/gi,"[u]");\r
+                       rep(/<blockquote[^>]*>/gi,"[quote]");\r
+                       rep(/<\/blockquote>/gi,"[/quote]");\r
+                       rep(/<br \/>/gi,"\n");\r
+                       rep(/<br\/>/gi,"\n");\r
+                       rep(/<br>/gi,"\n");\r
+                       rep(/<p>/gi,"");\r
+                       rep(/<\/p>/gi,"\n");\r
+                       rep(/&nbsp;|\u00a0/gi," ");\r
+                       rep(/&quot;/gi,"\"");\r
+                       rep(/&lt;/gi,"<");\r
+                       rep(/&gt;/gi,">");\r
+                       rep(/&amp;/gi,"&");\r
+\r
+                       return s; \r
+               },\r
+\r
+               // BBCode -> HTML from PunBB dialect\r
+               _punbb_bbcode2html : function(s) {\r
+                       s = tinymce.trim(s);\r
+\r
+                       function rep(re, str) {\r
+                               s = s.replace(re, str);\r
+                       };\r
+\r
+                       // example: [b] to <strong>\r
+                       rep(/\n/gi,"<br />");\r
+                       rep(/\[b\]/gi,"<strong>");\r
+                       rep(/\[\/b\]/gi,"</strong>");\r
+                       rep(/\[i\]/gi,"<em>");\r
+                       rep(/\[\/i\]/gi,"</em>");\r
+                       rep(/\[u\]/gi,"<u>");\r
+                       rep(/\[\/u\]/gi,"</u>");\r
+                       rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");\r
+                       rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");\r
+                       rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");\r
+                       rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<font color=\"$1\">$2</font>");\r
+                       rep(/\[code\](.*?)\[\/code\]/gi,"<span class=\"codeStyle\">$1</span>&nbsp;");\r
+                       rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<span class=\"quoteStyle\">$1</span>&nbsp;");\r
+\r
+                       return s; \r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/contextmenu/editor_plugin.js b/webcit/tiny_mce/plugins/contextmenu/editor_plugin.js
new file mode 100644 (file)
index 0000000..af7ae54
--- /dev/null
@@ -0,0 +1 @@
+(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(e){var h=this,f,d,i;h.editor=e;d=e.settings.contextmenu_never_use_native;h.onContextMenu=new tinymce.util.Dispatcher(this);f=e.onContextMenu.add(function(j,k){if((i!==0?i:k.ctrlKey)&&!d){return}a.cancel(k);if(k.target.nodeName=="IMG"){j.selection.select(k.target)}h._getMenu(j).showMenu(k.clientX||k.pageX,k.clientY||k.pageY);a.add(j.getDoc(),"click",function(l){g(j,l)});j.nodeChanged()});e.onRemove.add(function(){if(h._menu){h._menu.removeAll()}});function g(j,k){i=0;if(k&&k.button==2){i=k.ctrlKey;return}if(h._menu){h._menu.removeAll();h._menu.destroy();a.remove(j.getDoc(),"click",g)}}e.onMouseDown.add(g);e.onKeyDown.add(g);e.onKeyDown.add(function(j,k){if(k.shiftKey&&!k.ctrlKey&&!k.altKey&&k.keyCode===121){a.cancel(k);f(j,k)}})},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(e){var g=this,d=g._menu,j=e.selection,f=j.isCollapsed(),h=j.getNode()||e.getBody(),i,k;if(d){d.removeAll();d.destroy()}k=b.getPos(e.getContentAreaContainer());d=e.controlManager.createDropMenu("contextmenu",{offset_x:k.x+e.getParam("contextmenu_offset_x",0),offset_y:k.y+e.getParam("contextmenu_offset_y",0),constrain:1,keyboard_focus:true});g._menu=d;d.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(f);d.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(f);d.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((h.nodeName=="A"&&!e.dom.getAttrib(h,"name"))||!f){d.addSeparator();d.add({title:"advanced.link_desc",icon:"link",cmd:e.plugins.advlink?"mceAdvLink":"mceLink",ui:true});d.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}d.addSeparator();d.add({title:"advanced.image_desc",icon:"image",cmd:e.plugins.advimage?"mceAdvImage":"mceImage",ui:true});d.addSeparator();i=d.addMenu({title:"contextmenu.align"});i.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});i.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});i.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});i.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});g.onContextMenu.dispatch(g,d,h,f);return d}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/webcit/tiny_mce/plugins/contextmenu/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..956fbea
--- /dev/null
@@ -0,0 +1,160 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM;\r
+\r
+       /**\r
+        * This plugin a context menu to TinyMCE editor instances.\r
+        *\r
+        * @class tinymce.plugins.ContextMenu\r
+        */\r
+       tinymce.create('tinymce.plugins.ContextMenu', {\r
+               /**\r
+                * Initializes the plugin, this will be executed after the plugin has been created.\r
+                * This call is done before the editor instance has finished it's initialization so use the onInit event\r
+                * of the editor instance to intercept that event.\r
+                *\r
+                * @method init\r
+                * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.\r
+                * @param {string} url Absolute URL to where the plugin is located.\r
+                */\r
+               init : function(ed) {\r
+                       var t = this, showMenu, contextmenuNeverUseNative, realCtrlKey;\r
+\r
+                       t.editor = ed;\r
+\r
+                       contextmenuNeverUseNative = ed.settings.contextmenu_never_use_native;\r
+\r
+                       /**\r
+                        * This event gets fired when the context menu is shown.\r
+                        *\r
+                        * @event onContextMenu\r
+                        * @param {tinymce.plugins.ContextMenu} sender Plugin instance sending the event.\r
+                        * @param {tinymce.ui.DropMenu} menu Drop down menu to fill with more items if needed.\r
+                        */\r
+                       t.onContextMenu = new tinymce.util.Dispatcher(this);\r
+\r
+                       showMenu = ed.onContextMenu.add(function(ed, e) {\r
+                               // Block TinyMCE menu on ctrlKey and work around Safari issue\r
+                               if ((realCtrlKey !== 0 ? realCtrlKey : e.ctrlKey) && !contextmenuNeverUseNative)\r
+                                       return;\r
+\r
+                               Event.cancel(e);\r
+\r
+                               // Select the image if it's clicked. WebKit would other wise expand the selection\r
+                               if (e.target.nodeName == 'IMG')\r
+                                       ed.selection.select(e.target);\r
+\r
+                               t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageY);\r
+                               Event.add(ed.getDoc(), 'click', function(e) {\r
+                                       hide(ed, e);\r
+                               });\r
+\r
+                               ed.nodeChanged();\r
+                       });\r
+\r
+                       ed.onRemove.add(function() {\r
+                               if (t._menu)\r
+                                       t._menu.removeAll();\r
+                       });\r
+\r
+                       function hide(ed, e) {\r
+                               realCtrlKey = 0;\r
+\r
+                               // Since the contextmenu event moves\r
+                               // the selection we need to store it away\r
+                               if (e && e.button == 2) {\r
+                                       realCtrlKey = e.ctrlKey;\r
+                                       return;\r
+                               }\r
+\r
+                               if (t._menu) {\r
+                                       t._menu.removeAll();\r
+                                       t._menu.destroy();\r
+                                       Event.remove(ed.getDoc(), 'click', hide);\r
+                               }\r
+                       };\r
+\r
+                       ed.onMouseDown.add(hide);\r
+                       ed.onKeyDown.add(hide);\r
+                       ed.onKeyDown.add(function(ed, e) {\r
+                               if (e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode === 121) {\r
+                                       Event.cancel(e);\r
+                                       showMenu(ed, e);\r
+                               }\r
+                       });\r
+               },\r
+\r
+               /**\r
+                * Returns information about the plugin as a name/value array.\r
+                * The current keys are longname, author, authorurl, infourl and version.\r
+                *\r
+                * @method getInfo\r
+                * @return {Object} Name/value array containing information about the plugin.\r
+                */\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Contextmenu',\r
+                               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, p;\r
+\r
+                       if (m) {\r
+                               m.removeAll();\r
+                               m.destroy();\r
+                       }\r
+\r
+                       p = DOM.getPos(ed.getContentAreaContainer());\r
+\r
+                       m = ed.controlManager.createDropMenu('contextmenu', {\r
+                               offset_x : p.x + ed.getParam('contextmenu_offset_x', 0),\r
+                               offset_y : p.y + ed.getParam('contextmenu_offset_y', 0),\r
+                               constrain : 1,\r
+                               keyboard_focus: true\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
+})();\r
diff --git a/webcit/tiny_mce/plugins/directionality/editor_plugin.js b/webcit/tiny_mce/plugins/directionality/editor_plugin.js
new file mode 100644 (file)
index 0000000..bce8e73
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Directionality",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceDirectionLTR",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="ltr"){a.dom.setAttrib(d,"dir","ltr")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addCommand("mceDirectionRTL",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="rtl"){a.dom.setAttrib(d,"dir","rtl")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addButton("ltr",{title:"directionality.ltr_desc",cmd:"mceDirectionLTR"});a.addButton("rtl",{title:"directionality.rtl_desc",cmd:"mceDirectionRTL"});a.onNodeChange.add(c._nodeChange,c)},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(b,a,e){var d=b.dom,c;e=d.getParent(e,d.isBlock);if(!e){a.setDisabled("ltr",1);a.setDisabled("rtl",1);return}c=d.getAttrib(e,"dir");a.setActive("ltr",c=="ltr");a.setDisabled("ltr",0);a.setActive("rtl",c=="rtl");a.setDisabled("rtl",0)}});tinymce.PluginManager.add("directionality",tinymce.plugins.Directionality)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/directionality/editor_plugin_src.js b/webcit/tiny_mce/plugins/directionality/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..4444959
--- /dev/null
@@ -0,0 +1,82 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       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
diff --git a/webcit/tiny_mce/plugins/emotions/editor_plugin.js b/webcit/tiny_mce/plugins/emotions/editor_plugin.js
new file mode 100644 (file)
index 0000000..dbdd8ff
--- /dev/null
@@ -0,0 +1 @@
+(function(a){a.create("tinymce.plugins.EmotionsPlugin",{init:function(b,c){b.addCommand("mceEmotion",function(){b.windowManager.open({file:c+"/emotions.htm",width:250+parseInt(b.getLang("emotions.delta_width",0)),height:160+parseInt(b.getLang("emotions.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("emotions",{title:"emotions.emotions_desc",cmd:"mceEmotion"})},getInfo:function(){return{longname:"Emotions",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("emotions",a.plugins.EmotionsPlugin)})(tinymce);
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/editor_plugin_src.js b/webcit/tiny_mce/plugins/emotions/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..71d5416
--- /dev/null
@@ -0,0 +1,43 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function(tinymce) {\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
+       // Register plugin\r
+       tinymce.PluginManager.add('emotions', tinymce.plugins.EmotionsPlugin);\r
+})(tinymce);
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/emotions.htm b/webcit/tiny_mce/plugins/emotions/emotions.htm
new file mode 100644 (file)
index 0000000..2c91002
--- /dev/null
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\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
+</head>\r
+<body style="display: none" role="application" aria-labelledby="app_title">\r
+<span style="display:none;" id="app_title">{#emotions_dlg.title}</span>\r
+<div align="center">\r
+       <div class="title">{#emotions_dlg.title}:<br /><br /></div>\r
+\r
+       <table role="presentation" border="0" cellspacing="0" cellpadding="4">\r
+               <tr>\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: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: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: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
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-cool.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-cool.gif
new file mode 100644 (file)
index 0000000..ba90cc3
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-cool.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-cry.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-cry.gif
new file mode 100644 (file)
index 0000000..74d897a
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-cry.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-embarassed.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-embarassed.gif
new file mode 100644 (file)
index 0000000..963a96b
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-embarassed.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif
new file mode 100644 (file)
index 0000000..c7cf101
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-frown.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-frown.gif
new file mode 100644 (file)
index 0000000..716f55e
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-frown.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-innocent.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-innocent.gif
new file mode 100644 (file)
index 0000000..334d49e
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-innocent.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-kiss.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-kiss.gif
new file mode 100644 (file)
index 0000000..4efd549
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-kiss.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-laughing.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-laughing.gif
new file mode 100644 (file)
index 0000000..82c5b18
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-laughing.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif
new file mode 100644 (file)
index 0000000..ca2451e
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-sealed.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-sealed.gif
new file mode 100644 (file)
index 0000000..fe66220
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-sealed.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-smile.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-smile.gif
new file mode 100644 (file)
index 0000000..fd27edf
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-smile.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-surprised.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-surprised.gif
new file mode 100644 (file)
index 0000000..0cc9bb7
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-surprised.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif
new file mode 100644 (file)
index 0000000..2075dc1
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-undecided.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-undecided.gif
new file mode 100644 (file)
index 0000000..bef7e25
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-undecided.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-wink.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-wink.gif
new file mode 100644 (file)
index 0000000..0631c76
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-wink.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/img/smiley-yell.gif b/webcit/tiny_mce/plugins/emotions/img/smiley-yell.gif
new file mode 100644 (file)
index 0000000..648e6e8
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/img/smiley-yell.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/js/emotions.js b/webcit/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/webcit/tiny_mce/plugins/emotions/langs/bg_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..91d1cca
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.emotions_dlg',{cry:"Cry",cool:"Cool",desc:"\u0415\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438",title:"\u0412\u043c\u044a\u043a\u043d\u0438 \u0435\u043c\u043e\u0442\u0438\u043a\u043e\u043d",yell:"Yell",wink:"Wink",undecided:"Undecided","tongue_out":"Tongue out",surprised:"Surprised",smile:"Smile",sealed:"Sealed","money_mouth":"Money mouth",laughing:"Laughing",kiss:"Kiss",innocent:"Innocent",frown:"Frown","foot_in_mouth":"Foot in mouth",embarassed:"Embarassed"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/cs_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..4fd5b22
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.emotions_dlg',{cry:"Pla\u010d\u00edc\u00ed",cool:"\u00da\u017easn\u00fd",desc:"Emotikony",title:"Vlo\u017eit emotikonu",yell:"K\u0159i\u010d\u00edc\u00ed",wink:"Mrkaj\u00edc\u00ed",undecided:"Nerozhodn\u00fd","tongue_out":"S vyplazen\u00fdm jazykem",surprised:"P\u0159ekvapen\u00fd",smile:"Usm\u00edvaj\u00edc\u00ed se",sealed:"Ml\u010d\u00edc\u00ed","money_mouth":"Je na prachy",laughing:"Sm\u011bj\u00edc\u00ed se",kiss:"L\u00edbaj\u00edc\u00ed",innocent:"Nevinn\u00fd",frown:"Zamra\u010den\u00fd","foot_in_mouth":"\u0160l\u00e1pnul vedle",embarassed:"Rozpa\u010dit\u00fd"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/da_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..7c3cd0e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.emotions_dlg',{cry:"Gr\u00e6de",cool:"Cool",desc:"Hum\u00f8rikoner",title:"Inds\u00e6t hum\u00f8rikon",yell:"R\u00e5be",wink:"Vink",undecided:"Ubeslutsom","tongue_out":"Tunge ud",surprised:"Overrasket",smile:"Smil",sealed:"Lukket","money_mouth":"Pengemund",laughing:"Grine",kiss:"Kys",innocent:"Uskyldig",frown:"Forskr\u00e6kket","foot_in_mouth":"Fod i munden",embarassed:"Flov"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/de_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..0aa2d67
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.emotions_dlg',{cry:"Weinend",cool:"Cool",desc:"Smilies",title:"Smiley einf\u00fcgen",yell:"Br\u00fcllend",wink:"Zwinkernd",undecided:"Unentschlossen","tongue_out":"Zunge raus",surprised:"\u00dcberrascht",smile:"L\u00e4chelnd",sealed:"Verschlossen","money_mouth":"Geld",laughing:"Lachend",kiss:"K\u00fcssend",innocent:"Unschuldig",frown:"Stirnrunzelnd","foot_in_mouth":"Reingefallen",embarassed:"Verlegen"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/el_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..e881de2
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.emotions_dlg',{cry:"\u0394\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2",cool:"\u0386\u03bd\u03b5\u03c4\u03bf\u03c2",desc:"\u03a3\u03c5\u03bd\u03b1\u03b9\u03c3\u03b8\u03ae\u03bc\u03b1\u03c4\u03b1",title:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c3\u03c5\u03bd\u03b1\u03b9\u03c3\u03b8\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",yell:"\u03a6\u03c9\u03bd\u03ac\u03b6\u03c9",wink:"\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03bc\u03b1\u03c4\u03b9\u03bf\u03cd",undecided:"\u0391\u03bd\u03b1\u03c0\u03bf\u03c6\u03ac\u03c3\u03b9\u03c3\u03c4\u03bf\u03c2","tongue_out":"\u0393\u03bb\u03ce\u03c3\u03c3\u03b1 \u03ad\u03be\u03c9",surprised:"\u0388\u03ba\u03c0\u03bb\u03b7\u03ba\u03c4\u03bf\u03c2",smile:"\u03a7\u03b1\u03bc\u03cc\u03b3\u03b5\u03bb\u03bf",sealed:"\u03a3\u03c6\u03c1\u03b1\u03b3\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03c3\u03c4\u03cc\u03bc\u03b1","money_mouth":"\u039b\u03b5\u03c6\u03c4\u03ac \u03c9\u03c2 \u03c3\u03c4\u03cc\u03bc\u03b1",laughing:"\u0393\u03ad\u03bb\u03b9\u03bf",kiss:"\u03a6\u03b9\u03bb\u03af",innocent:"\u0391\u03b8\u03ce\u03bf\u03c2",frown:"\u039a\u03b1\u03c4\u03c3\u03bf\u03c5\u03c6\u03b9\u03b1\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2","foot_in_mouth":"\u039a\u03bb\u03c9\u03c4\u03c3\u03b9\u03ac \u03c3\u03c4\u03bf \u03c3\u03c4\u03cc\u03bc\u03b1",embarassed:"\u0391\u03bc\u03ae\u03c7\u03b1\u03bd\u03bf\u03c2"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/en_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..500cffb
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.emotions_dlg',{cry:"Cry",cool:"Cool",desc:"Emotions",title:"Insert Emotion",yell:"Yell",wink:"Wink",undecided:"Undecided","tongue_out":"Tongue Out",surprised:"Surprised",smile:"Smile",sealed:"Sealed","money_mouth":"Money Mouth",laughing:"Laughing",kiss:"Kiss",innocent:"Innocent",frown:"Frown","foot_in_mouth":"Foot in Mouth",embarassed:"Embarassed"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/es_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..3b4f24b
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.emotions_dlg',{cry:"Llora",cool:"Todo bien",desc:"Emoticones",title:"Insertar emoticon",yell:"Enfadado",wink:"Gui\u00f1o",undecided:"Indeciso","tongue_out":"Lengua fuera",surprised:"Sorprendido",smile:"Sonrisa",sealed:"Sellado","money_mouth":"Dinero boca",laughing:"Risa",kiss:"Beso",innocent:"Inocente",frown:"Triste","foot_in_mouth":"Pie en la boca",embarassed:"Verg\u00fcenza"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/et_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..f826e0a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.emotions_dlg',{cry:"Nutt",cool:"Lahe",desc:"Emotsioonid",title:"Sisesta emotsioon",yell:"Karje",wink:"Silmapilgutus",undecided:"K\u00f5hklev","tongue_out":"Keel v\u00e4ljas",surprised:"\u00dcllatunud",smile:"Naeratus",sealed:"Suletud","money_mouth":"Rahasuu",laughing:"Naermine",kiss:"Suudlus",innocent:"S\u00fc\u00fctu",frown:"Kulmu kortsutamine","foot_in_mouth":"Jalg suus",embarassed:"H\u00e4bitunne"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/fi_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..b969181
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.emotions_dlg',{cry:"Itku",cool:"Cool",desc:"Hymi\u00f6t",title:"Lis\u00e4\u00e4 hymi\u00f6",yell:"Huuto",wink:"Silm\u00e4nisku",undecided:"P\u00e4\u00e4tt\u00e4m\u00e4t\u00f6n","tongue_out":"Kieli ulkona",surprised:"Yll\u00e4ttynyt",smile:"Hymy",sealed:"Tukittu","money_mouth":"Klink Klink (raha)",laughing:"Nauru",kiss:"Pusu",innocent:"Viaton",frown:"Otsan rypistys","foot_in_mouth":"Jalka suussa",embarassed:"Nolostunut"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/fr_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..b312b0d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.emotions_dlg',{cry:"En pleurs",cool:"Cool",desc:"\u00c9motic\u00f4nes",title:"Ins\u00e9rer une \u00e9motic\u00f4ne",yell:"Criant",wink:"Clin d\'\u0153il",undecided:"Incertain","tongue_out":"Langue tir\u00e9e",surprised:"Surpris",smile:"Sourire",sealed:"Bouche cousue","money_mouth":"Avare",laughing:"Rigolant",kiss:"Bisou",innocent:"Innocent",frown:"D\u00e9\u00e7u","foot_in_mouth":"Pied de nez",embarassed:"Embarrass\u00e9"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/hu_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..14b6e57
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.emotions_dlg',{cry:"S\u00edr\u00f3s",cool:"Kir\u00e1ly",desc:"Hangulatjelek",title:"Hangulatjel besz\u00far\u00e1sa",yell:"\u00dcv\u00f6lt\u00e9s",wink:"Kacsint\u00e1s",undecided:"Hat\u00e1rozatlan","tongue_out":"Nyelv\u00f6lt\u00e9s",surprised:"Meglepett",smile:"Vigyor",sealed:"Lakat a sz\u00e1j\u00e1n","money_mouth":"P\u00e9nz besz\u00e9l",laughing:"Nevet\u00e9s",kiss:"Cs\u00f3k",innocent:"\u00c1rtatlan",frown:"Rosszall","foot_in_mouth":"L\u00e1b a sz\u00e1jban",embarassed:"Zavarban van"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/it_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..64c8e5a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.emotions_dlg',{cry:"Piango",cool:"Fico",desc:"Faccina",title:"Inserisci faccina",yell:"Arrabbiato",wink:"Occhiolino",undecided:"Indeciso","tongue_out":"Linguaccia",surprised:"Sorpreso",smile:"Sorridente",sealed:"Bocca sigillata","money_mouth":"Bocca danarosa",laughing:"Risatona",kiss:"Bacio",innocent:"Santarellino",frown:"Triste","foot_in_mouth":"Piede in bocca",embarassed:"Imbarazzato"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/emotions/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..1dece2c
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.emotions_dlg',{cry:"\u54ed",cool:"\u9177",desc:"\u8868\u60c5",title:"\u63d2\u5165\u8868\u60c5",yell:"\u53eb\u558a",wink:"\u7728\u773c",undecided:"\u72b9\u8c6b","tongue_out":"\u5410\u820c\u5934",surprised:"\u60ca\u8bb6",smile:"\u5fae\u7b11",sealed:"\u4fdd\u5bc6","money_mouth":"\u53d1\u8d22",laughing:"\u5927\u7b11",kiss:"\u543b",innocent:"\u5929\u771f",frown:"\u76b1\u7709","foot_in_mouth":"\u8822\u8bdd",embarassed:"\u5c34\u5c2c"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/example/dialog.htm b/webcit/tiny_mce/plugins/example/dialog.htm
new file mode 100644 (file)
index 0000000..50b2b34
--- /dev/null
@@ -0,0 +1,22 @@
+<!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>{#example_dlg.title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/dialog.js"></script>\r
+</head>\r
+<body>\r
+\r
+<form onsubmit="ExampleDialog.insert();return false;" action="#">\r
+       <p>Here is a example dialog.</p>\r
+       <p>Selected text: <input id="someval" name="someval" type="text" class="text" /></p>\r
+       <p>Custom arg: <input id="somearg" name="somearg" type="text" class="text" /></p>\r
+\r
+       <div class="mceActionPanel">\r
+               <input type="button" id="insert" name="insert" value="{#insert}" onclick="ExampleDialog.insert();" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/example/editor_plugin.js b/webcit/tiny_mce/plugins/example/editor_plugin.js
new file mode 100644 (file)
index 0000000..ec1f81e
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.PluginManager.requireLangPack("example");tinymce.create("tinymce.plugins.ExamplePlugin",{init:function(a,b){a.addCommand("mceExample",function(){a.windowManager.open({file:b+"/dialog.htm",width:320+parseInt(a.getLang("example.delta_width",0)),height:120+parseInt(a.getLang("example.delta_height",0)),inline:1},{plugin_url:b,some_custom_arg:"custom arg"})});a.addButton("example",{title:"example.desc",cmd:"mceExample",image:b+"/img/example.gif"});a.onNodeChange.add(function(d,c,e){c.setActive("example",e.nodeName=="IMG")})},createControl:function(b,a){return null},getInfo:function(){return{longname:"Example plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example",version:"1.0"}}});tinymce.PluginManager.add("example",tinymce.plugins.ExamplePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/example/editor_plugin_src.js b/webcit/tiny_mce/plugins/example/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..9a0e7da
--- /dev/null
@@ -0,0 +1,84 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       // Load plugin specific language pack\r
+       tinymce.PluginManager.requireLangPack('example');\r
+\r
+       tinymce.create('tinymce.plugins.ExamplePlugin', {\r
+               /**\r
+                * Initializes the plugin, this will be executed after the plugin has been created.\r
+                * This call is done before the editor instance has finished it's initialization so use the onInit event\r
+                * of the editor instance to intercept that event.\r
+                *\r
+                * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.\r
+                * @param {string} url Absolute URL to where the plugin is located.\r
+                */\r
+               init : function(ed, url) {\r
+                       // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');\r
+                       ed.addCommand('mceExample', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/dialog.htm',\r
+                                       width : 320 + parseInt(ed.getLang('example.delta_width', 0)),\r
+                                       height : 120 + parseInt(ed.getLang('example.delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url, // Plugin absolute URL\r
+                                       some_custom_arg : 'custom arg' // Custom argument\r
+                               });\r
+                       });\r
+\r
+                       // Register example button\r
+                       ed.addButton('example', {\r
+                               title : 'example.desc',\r
+                               cmd : 'mceExample',\r
+                               image : url + '/img/example.gif'\r
+                       });\r
+\r
+                       // Add a node change handler, selects the button in the UI when a image is selected\r
+                       ed.onNodeChange.add(function(ed, cm, n) {\r
+                               cm.setActive('example', n.nodeName == 'IMG');\r
+                       });\r
+               },\r
+\r
+               /**\r
+                * Creates control instances based in the incomming name. This method is normally not\r
+                * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons\r
+                * but you sometimes need to create more complex controls like listboxes, split buttons etc then this\r
+                * method can be used to create those.\r
+                *\r
+                * @param {String} n Name of the control to create.\r
+                * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control.\r
+                * @return {tinymce.ui.Control} New control instance or null if no control was created.\r
+                */\r
+               createControl : function(n, cm) {\r
+                       return null;\r
+               },\r
+\r
+               /**\r
+                * Returns information about the plugin as a name/value array.\r
+                * The current keys are longname, author, authorurl, infourl and version.\r
+                *\r
+                * @return {Object} Name/value array containing information about the plugin.\r
+                */\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Example plugin',\r
+                               author : 'Some author',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example',\r
+                               version : "1.0"\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/example/img/example.gif b/webcit/tiny_mce/plugins/example/img/example.gif
new file mode 100644 (file)
index 0000000..1ab5da4
Binary files /dev/null and b/webcit/tiny_mce/plugins/example/img/example.gif differ
diff --git a/webcit/tiny_mce/plugins/example/js/dialog.js b/webcit/tiny_mce/plugins/example/js/dialog.js
new file mode 100644 (file)
index 0000000..fa83411
--- /dev/null
@@ -0,0 +1,19 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var ExampleDialog = {\r
+       init : function() {\r
+               var f = document.forms[0];\r
+\r
+               // Get the selected contents as text and place it in the input\r
+               f.someval.value = tinyMCEPopup.editor.selection.getContent({format : 'text'});\r
+               f.somearg.value = tinyMCEPopup.getWindowArg('some_custom_arg');\r
+       },\r
+\r
+       insert : function() {\r
+               // Insert the contents from the input into the document\r
+               tinyMCEPopup.editor.execCommand('mceInsertContent', false, document.forms[0].someval.value);\r
+               tinyMCEPopup.close();\r
+       }\r
+};\r
+\r
+tinyMCEPopup.onInit.add(ExampleDialog.init, ExampleDialog);\r
diff --git a/webcit/tiny_mce/plugins/example/langs/en.js b/webcit/tiny_mce/plugins/example/langs/en.js
new file mode 100644 (file)
index 0000000..e0784f8
--- /dev/null
@@ -0,0 +1,3 @@
+tinyMCE.addI18n('en.example',{\r
+       desc : 'This is just a template button'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/example/langs/en_dlg.js b/webcit/tiny_mce/plugins/example/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..ebcf948
--- /dev/null
@@ -0,0 +1,3 @@
+tinyMCE.addI18n('en.example_dlg',{\r
+       title : 'This is just a example title'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/example_dependency/editor_plugin.js b/webcit/tiny_mce/plugins/example_dependency/editor_plugin.js
new file mode 100644 (file)
index 0000000..0a4551d
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.ExampleDependencyPlugin",{init:function(a,b){},getInfo:function(){return{longname:"Example Dependency plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency",version:"1.0"}}});tinymce.PluginManager.add("example_dependency",tinymce.plugins.ExampleDependencyPlugin,["example"])})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/example_dependency/editor_plugin_src.js b/webcit/tiny_mce/plugins/example_dependency/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..e1c55e4
--- /dev/null
@@ -0,0 +1,50 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+
+       tinymce.create('tinymce.plugins.ExampleDependencyPlugin', {
+               /**
+                * Initializes the plugin, this will be executed after the plugin has been created.
+                * This call is done before the editor instance has finished it's initialization so use the onInit event
+                * of the editor instance to intercept that event.
+                *
+                * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
+                * @param {string} url Absolute URL to where the plugin is located.
+                */
+               init : function(ed, url) {
+               },
+
+
+               /**
+                * Returns information about the plugin as a name/value array.
+                * The current keys are longname, author, authorurl, infourl and version.
+                *
+                * @return {Object} Name/value array containing information about the plugin.
+                */
+               getInfo : function() {
+                       return {
+                               longname : 'Example Dependency plugin',
+                               author : 'Some author',
+                               authorurl : 'http://tinymce.moxiecode.com',
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency',
+                               version : "1.0"
+                       };
+               }
+       });
+
+       /**
+        * Register the plugin, specifying the list of the plugins that this plugin depends on.  They are specified in a list, with the list loaded in order.
+        * plugins in this list will be initialised when this plugin is initialized. (before the init method is called).
+        * plugins in a depends list should typically be specified using the short name).  If neccesary this can be done
+        * with an object which has the url to the plugin and the shortname.
+        */
+       tinymce.PluginManager.add('example_dependency', tinymce.plugins.ExampleDependencyPlugin, ['example']);
+})();
diff --git a/webcit/tiny_mce/plugins/fullpage/css/fullpage.css b/webcit/tiny_mce/plugins/fullpage/css/fullpage.css
new file mode 100644 (file)
index 0000000..2675cec
--- /dev/null
@@ -0,0 +1,143 @@
+/* Hide the advanced tab */\r
+#advanced_tab {\r
+       display: none;\r
+}\r
+\r
+#metatitle, #metakeywords, #metadescription, #metaauthor, #metacopyright {\r
+       width: 280px;\r
+}\r
+\r
+#doctype, #docencoding {\r
+       width: 200px;\r
+}\r
+\r
+#langcode {\r
+       width: 30px;\r
+}\r
+\r
+#bgimage {\r
+       width: 220px;   \r
+}\r
+\r
+#fontface {\r
+       width: 240px;\r
+}\r
+\r
+#leftmargin, #rightmargin, #topmargin, #bottommargin {\r
+       width: 50px;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 400px;\r
+}\r
+\r
+#stylesheet, #style {\r
+       width: 240px;\r
+}\r
+\r
+#doctypes {\r
+       width: 200px;\r
+}\r
+\r
+/* Head list classes */\r
+\r
+.headlistwrapper {\r
+       width: 100%;\r
+}\r
+\r
+.selected {\r
+       border: 1px solid #0A246A;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.toolbar {\r
+       width: 100%;\r
+}\r
+\r
+#headlist {\r
+       width: 100%;\r
+       margin-top: 3px;\r
+       font-size: 11px;\r
+}\r
+\r
+#info, #title_element, #meta_element, #script_element, #style_element, #base_element, #link_element, #comment_element, #unknown_element {\r
+       display: none;\r
+}\r
+\r
+#addmenu {\r
+       position: absolute;\r
+       border: 1px solid gray;\r
+       display: none;\r
+       z-index: 100;\r
+       background-color: white;\r
+}\r
+\r
+#addmenu a {\r
+       display: block;\r
+       width: 100%;\r
+       line-height: 20px;\r
+       text-decoration: none;\r
+       background-color: white;\r
+}\r
+\r
+#addmenu a:hover {\r
+       background-color: #B6BDD2;\r
+       color: black;\r
+}\r
+\r
+#addmenu span {\r
+       padding-left: 10px;\r
+       padding-right: 10px;\r
+}\r
+\r
+#updateElementPanel {\r
+       display: none;\r
+}\r
+\r
+#script_element .panel_wrapper div.current {\r
+       height: 108px;\r
+}\r
+\r
+#style_element .panel_wrapper div.current {\r
+       height: 108px;\r
+}\r
+\r
+#link_element  .panel_wrapper div.current {\r
+       height: 140px;\r
+}\r
+\r
+#element_script_value {\r
+       width: 100%;\r
+       height: 100px;\r
+}\r
+\r
+#element_comment_value {\r
+       width: 100%;\r
+       height: 120px;\r
+}\r
+\r
+#element_style_value {\r
+       width: 100%;\r
+       height: 100px;\r
+}\r
+\r
+#element_title, #element_script_src, #element_meta_name, #element_meta_content, #element_base_href, #element_link_href, #element_link_title {\r
+       width: 250px;\r
+}\r
+\r
+.updateElementButton {\r
+       margin-top: 3px;\r
+}\r
+\r
+/* MSIE specific styles */\r
+\r
+* html .addbutton, * html .removebutton, * html .moveupbutton, * html .movedownbutton {\r
+       width: 22px;\r
+       height: 22px;\r
+}\r
+\r
+textarea {\r
+       height: 55px;\r
+}\r
+\r
+.panel_wrapper div.current {height:420px;}
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/editor_plugin.js b/webcit/tiny_mce/plugins/fullpage/editor_plugin.js
new file mode 100644 (file)
index 0000000..dcf7602
--- /dev/null
@@ -0,0 +1 @@
+(function(){var b=tinymce.each,a=tinymce.html.Node;tinymce.create("tinymce.plugins.FullPagePlugin",{init:function(c,d){var e=this;e.editor=c;c.addCommand("mceFullPageProperties",function(){c.windowManager.open({file:d+"/fullpage.htm",width:430+parseInt(c.getLang("fullpage.delta_width",0)),height:495+parseInt(c.getLang("fullpage.delta_height",0)),inline:1},{plugin_url:d,data:e._htmlToData()})});c.addButton("fullpage",{title:"fullpage.desc",cmd:"mceFullPageProperties"});c.onBeforeSetContent.add(e._setContent,e);c.onGetContent.add(e._getContent,e)},getInfo:function(){return{longname:"Fullpage",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_htmlToData:function(){var f=this._parseHeader(),h={},c,i,g,e=this.editor;function d(l,j){var k=l.attr(j);return k||""}h.fontface=e.getParam("fullpage_default_fontface","");h.fontsize=e.getParam("fullpage_default_fontsize","");i=f.firstChild;if(i.type==7){h.xml_pi=true;g=/encoding="([^"]+)"/.exec(i.value);if(g){h.docencoding=g[1]}}i=f.getAll("#doctype")[0];if(i){h.doctype="<!DOCTYPE"+i.value+">"}i=f.getAll("title")[0];if(i&&i.firstChild){h.metatitle=i.firstChild.value}b(f.getAll("meta"),function(m){var k=m.attr("name"),j=m.attr("http-equiv"),l;if(k){h["meta"+k.toLowerCase()]=m.attr("content")}else{if(j=="Content-Type"){l=/charset\s*=\s*(.*)\s*/gi.exec(m.attr("content"));if(l){h.docencoding=l[1]}}}});i=f.getAll("html")[0];if(i){h.langcode=d(i,"lang")||d(i,"xml:lang")}i=f.getAll("link")[0];if(i&&i.attr("rel")=="stylesheet"){h.stylesheet=i.attr("href")}i=f.getAll("body")[0];if(i){h.langdir=d(i,"dir");h.style=d(i,"style");h.visited_color=d(i,"vlink");h.link_color=d(i,"link");h.active_color=d(i,"alink")}return h},_dataToHtml:function(g){var f,d,h,j,k,e=this.editor.dom;function c(n,l,m){n.attr(l,m?m:undefined)}function i(l){if(d.firstChild){d.insert(l,d.firstChild)}else{d.append(l)}}f=this._parseHeader();d=f.getAll("head")[0];if(!d){j=f.getAll("html")[0];d=new a("head",1);if(j.firstChild){j.insert(d,j.firstChild,true)}else{j.append(d)}}j=f.firstChild;if(g.xml_pi){k='version="1.0"';if(g.docencoding){k+=' encoding="'+g.docencoding+'"'}if(j.type!=7){j=new a("xml",7);f.insert(j,f.firstChild,true)}j.value=k}else{if(j&&j.type==7){j.remove()}}j=f.getAll("#doctype")[0];if(g.doctype){if(!j){j=new a("#doctype",10);if(g.xml_pi){f.insert(j,f.firstChild)}else{i(j)}}j.value=g.doctype.substring(9,g.doctype.length-1)}else{if(j){j.remove()}}j=f.getAll("title")[0];if(g.metatitle){if(!j){j=new a("title",1);j.append(new a("#text",3)).value=g.metatitle;i(j)}}if(g.docencoding){j=null;b(f.getAll("meta"),function(l){if(l.attr("http-equiv")=="Content-Type"){j=l}});if(!j){j=new a("meta",1);j.attr("http-equiv","Content-Type");j.shortEnded=true;i(j)}j.attr("content","text/html; charset="+g.docencoding)}b("keywords,description,author,copyright,robots".split(","),function(m){var l=f.getAll("meta"),n,p,o=g["meta"+m];for(n=0;n<l.length;n++){p=l[n];if(p.attr("name")==m){if(o){p.attr("content",o)}else{p.remove()}return}}if(o){j=new a("meta",1);j.attr("name",m);j.attr("content",o);j.shortEnded=true;i(j)}});j=f.getAll("link")[0];if(j&&j.attr("rel")=="stylesheet"){if(g.stylesheet){j.attr("href",g.stylesheet)}else{j.remove()}}else{if(g.stylesheet){j=new a("link",1);j.attr({rel:"stylesheet",text:"text/css",href:g.stylesheet});j.shortEnded=true;i(j)}}j=f.getAll("body")[0];if(j){c(j,"dir",g.langdir);c(j,"style",g.style);c(j,"vlink",g.visited_color);c(j,"link",g.link_color);c(j,"alink",g.active_color);e.setAttribs(this.editor.getBody(),{style:g.style,dir:g.dir,vLink:g.visited_color,link:g.link_color,aLink:g.active_color})}j=f.getAll("html")[0];if(j){c(j,"lang",g.langcode);c(j,"xml:lang",g.langcode)}h=new tinymce.html.Serializer({validate:false,indent:true,apply_source_formatting:true,indent_before:"head,html,body,meta,title,script,link,style",indent_after:"head,html,body,meta,title,script,link,style"}).serialize(f);this.head=h.substring(0,h.indexOf("</body>"))},_parseHeader:function(){return new tinymce.html.DomParser({validate:false,root_name:"#document"}).parse(this.head)},_setContent:function(g,d){var m=this,i,c,h=d.content,f,l="",e=m.editor.dom,j;function k(n){return n.replace(/<\/?[A-Z]+/g,function(o){return o.toLowerCase()})}if(d.format=="raw"&&m.head){return}if(d.source_view&&g.getParam("fullpage_hide_in_source_view")){return}h=h.replace(/<(\/?)BODY/gi,"<$1body");i=h.indexOf("<body");if(i!=-1){i=h.indexOf(">",i);m.head=k(h.substring(0,i+1));c=h.indexOf("</body",i);if(c==-1){c=h.length}d.content=h.substring(i+1,c);m.foot=k(h.substring(c))}else{m.head=this._getDefaultHeader();m.foot="\n</body>\n</html>"}f=m._parseHeader();b(f.getAll("style"),function(n){if(n.firstChild){l+=n.firstChild.value}});j=f.getAll("body")[0];if(j){e.setAttribs(m.editor.getBody(),{style:j.attr("style")||"",dir:j.attr("dir")||"",vLink:j.attr("vlink")||"",link:j.attr("link")||"",aLink:j.attr("alink")||""})}e.remove("fullpage_styles");if(l){e.add(m.editor.getDoc().getElementsByTagName("head")[0],"style",{id:"fullpage_styles"},l);j=e.get("fullpage_styles");if(j.styleSheet){j.styleSheet.cssText=l}}},_getDefaultHeader:function(){var f="",c=this.editor,e,d="";if(c.getParam("fullpage_default_xml_pi")){f+='<?xml version="1.0" encoding="'+c.getParam("fullpage_default_encoding","ISO-8859-1")+'" ?>\n'}f+=c.getParam("fullpage_default_doctype",'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');f+="\n<html>\n<head>\n";if(e=c.getParam("fullpage_default_title")){f+="<title>"+e+"</title>\n"}if(e=c.getParam("fullpage_default_encoding")){f+='<meta http-equiv="Content-Type" content="text/html; charset='+e+'" />\n'}if(e=c.getParam("fullpage_default_font_family")){d+="font-family: "+e+";"}if(e=c.getParam("fullpage_default_font_size")){d+="font-size: "+e+";"}if(e=c.getParam("fullpage_default_text_color")){d+="color: "+e+";"}f+="</head>\n<body"+(d?' style="'+d+'"':"")+">\n";return f},_getContent:function(d,e){var c=this;if(!e.source_view||!d.getParam("fullpage_hide_in_source_view")){e.content=tinymce.trim(c.head)+"\n"+tinymce.trim(e.content)+"\n"+tinymce.trim(c.foot)}}});tinymce.PluginManager.add("fullpage",tinymce.plugins.FullPagePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/editor_plugin_src.js b/webcit/tiny_mce/plugins/fullpage/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..23de7c5
--- /dev/null
@@ -0,0 +1,405 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var each = tinymce.each, Node = tinymce.html.Node;\r
+\r
+       tinymce.create('tinymce.plugins.FullPagePlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceFullPageProperties', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/fullpage.htm',\r
+                                       width : 430 + parseInt(ed.getLang('fullpage.delta_width', 0)),\r
+                                       height : 495 + parseInt(ed.getLang('fullpage.delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url,\r
+                                       data : t._htmlToData()\r
+                               });\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'});\r
+\r
+                       ed.onBeforeSetContent.add(t._setContent, t);\r
+                       ed.onGetContent.add(t._getContent, t);\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Fullpage',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               // Private plugin internal methods\r
+\r
+               _htmlToData : function() {\r
+                       var headerFragment = this._parseHeader(), data = {}, nodes, elm, matches, editor = this.editor;\r
+\r
+                       function getAttr(elm, name) {\r
+                               var value = elm.attr(name);\r
+\r
+                               return value || '';\r
+                       };\r
+\r
+                       // Default some values\r
+                       data.fontface = editor.getParam("fullpage_default_fontface", "");\r
+                       data.fontsize = editor.getParam("fullpage_default_fontsize", "");\r
+\r
+                       // Parse XML PI\r
+                       elm = headerFragment.firstChild;\r
+                       if (elm.type == 7) {\r
+                               data.xml_pi = true;\r
+                               matches = /encoding="([^"]+)"/.exec(elm.value);\r
+                               if (matches)\r
+                                       data.docencoding = matches[1];\r
+                       }\r
+\r
+                       // Parse doctype\r
+                       elm = headerFragment.getAll('#doctype')[0];\r
+                       if (elm)\r
+                               data.doctype = '<!DOCTYPE' + elm.value + ">"; \r
+\r
+                       // Parse title element\r
+                       elm = headerFragment.getAll('title')[0];\r
+                       if (elm && elm.firstChild) {\r
+                               data.metatitle = elm.firstChild.value;\r
+                       }\r
+\r
+                       // Parse meta elements\r
+                       each(headerFragment.getAll('meta'), function(meta) {\r
+                               var name = meta.attr('name'), httpEquiv = meta.attr('http-equiv'), matches;\r
+\r
+                               if (name)\r
+                                       data['meta' + name.toLowerCase()] = meta.attr('content');\r
+                               else if (httpEquiv == "Content-Type") {\r
+                                       matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content'));\r
+\r
+                                       if (matches)\r
+                                               data.docencoding = matches[1];\r
+                               }\r
+                       });\r
+\r
+                       // Parse html attribs\r
+                       elm = headerFragment.getAll('html')[0];\r
+                       if (elm)\r
+                               data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang');\r
+       \r
+                       // Parse stylesheet\r
+                       elm = headerFragment.getAll('link')[0];\r
+                       if (elm && elm.attr('rel') == 'stylesheet')\r
+                               data.stylesheet = elm.attr('href');\r
+\r
+                       // Parse body parts\r
+                       elm = headerFragment.getAll('body')[0];\r
+                       if (elm) {\r
+                               data.langdir = getAttr(elm, 'dir');\r
+                               data.style = getAttr(elm, 'style');\r
+                               data.visited_color = getAttr(elm, 'vlink');\r
+                               data.link_color = getAttr(elm, 'link');\r
+                               data.active_color = getAttr(elm, 'alink');\r
+                       }\r
+\r
+                       return data;\r
+               },\r
+\r
+               _dataToHtml : function(data) {\r
+                       var headerFragment, headElement, html, elm, value, dom = this.editor.dom;\r
+\r
+                       function setAttr(elm, name, value) {\r
+                               elm.attr(name, value ? value : undefined);\r
+                       };\r
+\r
+                       function addHeadNode(node) {\r
+                               if (headElement.firstChild)\r
+                                       headElement.insert(node, headElement.firstChild);\r
+                               else\r
+                                       headElement.append(node);\r
+                       };\r
+\r
+                       headerFragment = this._parseHeader();\r
+                       headElement = headerFragment.getAll('head')[0];\r
+                       if (!headElement) {\r
+                               elm = headerFragment.getAll('html')[0];\r
+                               headElement = new Node('head', 1);\r
+\r
+                               if (elm.firstChild)\r
+                                       elm.insert(headElement, elm.firstChild, true);\r
+                               else\r
+                                       elm.append(headElement);\r
+                       }\r
+\r
+                       // Add/update/remove XML-PI\r
+                       elm = headerFragment.firstChild;\r
+                       if (data.xml_pi) {\r
+                               value = 'version="1.0"';\r
+\r
+                               if (data.docencoding)\r
+                                       value += ' encoding="' + data.docencoding + '"';\r
+\r
+                               if (elm.type != 7) {\r
+                                       elm = new Node('xml', 7);\r
+                                       headerFragment.insert(elm, headerFragment.firstChild, true);\r
+                               }\r
+\r
+                               elm.value = value;\r
+                       } else if (elm && elm.type == 7)\r
+                               elm.remove();\r
+\r
+                       // Add/update/remove doctype\r
+                       elm = headerFragment.getAll('#doctype')[0];\r
+                       if (data.doctype) {\r
+                               if (!elm) {\r
+                                       elm = new Node('#doctype', 10);\r
+\r
+                                       if (data.xml_pi)\r
+                                               headerFragment.insert(elm, headerFragment.firstChild);\r
+                                       else\r
+                                               addHeadNode(elm);\r
+                               }\r
+\r
+                               elm.value = data.doctype.substring(9, data.doctype.length - 1);\r
+                       } else if (elm)\r
+                               elm.remove();\r
+\r
+                       // Add/update/remove title\r
+                       elm = headerFragment.getAll('title')[0];\r
+                       if (data.metatitle) {\r
+                               if (!elm) {\r
+                                       elm = new Node('title', 1);\r
+                                       elm.append(new Node('#text', 3)).value = data.metatitle;\r
+                                       addHeadNode(elm);\r
+                               }\r
+                       }\r
+\r
+                       // Add meta encoding\r
+                       if (data.docencoding) {\r
+                               elm = null;\r
+                               each(headerFragment.getAll('meta'), function(meta) {\r
+                                       if (meta.attr('http-equiv') == 'Content-Type')\r
+                                               elm = meta;\r
+                               });\r
+\r
+                               if (!elm) {\r
+                                       elm = new Node('meta', 1);\r
+                                       elm.attr('http-equiv', 'Content-Type');\r
+                                       elm.shortEnded = true;\r
+                                       addHeadNode(elm);\r
+                               }\r
+\r
+                               elm.attr('content', 'text/html; charset=' + data.docencoding);\r
+                       }\r
+\r
+                       // Add/update/remove meta\r
+                       each('keywords,description,author,copyright,robots'.split(','), function(name) {\r
+                               var nodes = headerFragment.getAll('meta'), i, meta, value = data['meta' + name];\r
+\r
+                               for (i = 0; i < nodes.length; i++) {\r
+                                       meta = nodes[i];\r
+\r
+                                       if (meta.attr('name') == name) {\r
+                                               if (value)\r
+                                                       meta.attr('content', value);\r
+                                               else\r
+                                                       meta.remove();\r
+\r
+                                               return;\r
+                                       }\r
+                               }\r
+\r
+                               if (value) {\r
+                                       elm = new Node('meta', 1);\r
+                                       elm.attr('name', name);\r
+                                       elm.attr('content', value);\r
+                                       elm.shortEnded = true;\r
+\r
+                                       addHeadNode(elm);\r
+                               }\r
+                       });\r
+\r
+                       // Add/update/delete link\r
+                       elm = headerFragment.getAll('link')[0];\r
+                       if (elm && elm.attr('rel') == 'stylesheet') {\r
+                               if (data.stylesheet)\r
+                                       elm.attr('href', data.stylesheet);\r
+                               else\r
+                                       elm.remove();\r
+                       } else if (data.stylesheet) {\r
+                               elm = new Node('link', 1);\r
+                               elm.attr({\r
+                                       rel : 'stylesheet',\r
+                                       text : 'text/css',\r
+                                       href : data.stylesheet\r
+                               });\r
+                               elm.shortEnded = true;\r
+\r
+                               addHeadNode(elm);\r
+                       }\r
+\r
+                       // Update body attributes\r
+                       elm = headerFragment.getAll('body')[0];\r
+                       if (elm) {\r
+                               setAttr(elm, 'dir', data.langdir);\r
+                               setAttr(elm, 'style', data.style);\r
+                               setAttr(elm, 'vlink', data.visited_color);\r
+                               setAttr(elm, 'link', data.link_color);\r
+                               setAttr(elm, 'alink', data.active_color);\r
+\r
+                               // Update iframe body as well\r
+                               dom.setAttribs(this.editor.getBody(), {\r
+                                       style : data.style,\r
+                                       dir : data.dir,\r
+                                       vLink : data.visited_color,\r
+                                       link : data.link_color,\r
+                                       aLink : data.active_color\r
+                               });\r
+                       }\r
+\r
+                       // Set html attributes\r
+                       elm = headerFragment.getAll('html')[0];\r
+                       if (elm) {\r
+                               setAttr(elm, 'lang', data.langcode);\r
+                               setAttr(elm, 'xml:lang', data.langcode);\r
+                       }\r
+\r
+                       // Serialize header fragment and crop away body part\r
+                       html = new tinymce.html.Serializer({\r
+                               validate: false,\r
+                               indent: true,\r
+                               apply_source_formatting : true,\r
+                               indent_before: 'head,html,body,meta,title,script,link,style',\r
+                               indent_after: 'head,html,body,meta,title,script,link,style'\r
+                       }).serialize(headerFragment);\r
+\r
+                       this.head = html.substring(0, html.indexOf('</body>'));\r
+               },\r
+\r
+               _parseHeader : function() {\r
+                       // Parse the contents with a DOM parser\r
+                       return new tinymce.html.DomParser({\r
+                               validate: false,\r
+                               root_name: '#document'\r
+                       }).parse(this.head);\r
+               },\r
+\r
+               _setContent : function(ed, o) {\r
+                       var self = this, startPos, endPos, content = o.content, headerFragment, styles = '', dom = self.editor.dom, elm;\r
+\r
+                       function low(s) {\r
+                               return s.replace(/<\/?[A-Z]+/g, function(a) {\r
+                                       return a.toLowerCase();\r
+                               })\r
+                       };\r
+\r
+                       // Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate\r
+                       if (o.format == 'raw' && self.head)\r
+                               return;\r
+\r
+                       if (o.source_view && ed.getParam('fullpage_hide_in_source_view'))\r
+                               return;\r
+\r
+                       // Parse out head, body and footer\r
+                       content = content.replace(/<(\/?)BODY/gi, '<$1body');\r
+                       startPos = content.indexOf('<body');\r
+\r
+                       if (startPos != -1) {\r
+                               startPos = content.indexOf('>', startPos);\r
+                               self.head = low(content.substring(0, startPos + 1));\r
+\r
+                               endPos = content.indexOf('</body', startPos);\r
+                               if (endPos == -1)\r
+                                       endPos = content.length;\r
+\r
+                               o.content = content.substring(startPos + 1, endPos);\r
+                               self.foot = low(content.substring(endPos));\r
+                       } else {\r
+                               self.head = this._getDefaultHeader();\r
+                               self.foot = '\n</body>\n</html>';\r
+                       }\r
+\r
+                       // Parse header and update iframe\r
+                       headerFragment = self._parseHeader();\r
+                       each(headerFragment.getAll('style'), function(node) {\r
+                               if (node.firstChild)\r
+                                       styles += node.firstChild.value;\r
+                       });\r
+\r
+                       elm = headerFragment.getAll('body')[0];\r
+                       if (elm) {\r
+                               dom.setAttribs(self.editor.getBody(), {\r
+                                       style : elm.attr('style') || '',\r
+                                       dir : elm.attr('dir') || '',\r
+                                       vLink : elm.attr('vlink') || '',\r
+                                       link : elm.attr('link') || '',\r
+                                       aLink : elm.attr('alink') || ''\r
+                               });\r
+                       }\r
+\r
+                       dom.remove('fullpage_styles');\r
+\r
+                       if (styles) {\r
+                               dom.add(self.editor.getDoc().getElementsByTagName('head')[0], 'style', {id : 'fullpage_styles'}, styles);\r
+\r
+                               // Needed for IE 6/7\r
+                               elm = dom.get('fullpage_styles');\r
+                               if (elm.styleSheet)\r
+                                       elm.styleSheet.cssText = styles;\r
+                       }\r
+               },\r
+\r
+               _getDefaultHeader : function() {\r
+                       var header = '', editor = this.editor, value, styles = '';\r
+\r
+                       if (editor.getParam('fullpage_default_xml_pi'))\r
+                               header += '<?xml version="1.0" encoding="' + editor.getParam('fullpage_default_encoding', 'ISO-8859-1') + '" ?>\n';\r
+\r
+                       header += editor.getParam('fullpage_default_doctype', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');\r
+                       header += '\n<html>\n<head>\n';\r
+\r
+                       if (value = editor.getParam('fullpage_default_title'))\r
+                               header += '<title>' + value + '</title>\n';\r
+\r
+                       if (value = editor.getParam('fullpage_default_encoding'))\r
+                               header += '<meta http-equiv="Content-Type" content="text/html; charset=' + value + '" />\n';\r
+\r
+                       if (value = editor.getParam('fullpage_default_font_family'))\r
+                               styles += 'font-family: ' + value + ';';\r
+\r
+                       if (value = editor.getParam('fullpage_default_font_size'))\r
+                               styles += 'font-size: ' + value + ';';\r
+\r
+                       if (value = editor.getParam('fullpage_default_text_color'))\r
+                               styles += 'color: ' + value + ';';\r
+\r
+                       header += '</head>\n<body' + (styles ? ' style="' + styles + '"' : '') + '>\n';\r
+\r
+                       return header;\r
+               },\r
+\r
+               _getContent : function(ed, o) {\r
+                       var self = this;\r
+\r
+                       if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view'))\r
+                               o.content = tinymce.trim(self.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(self.foot);\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin);\r
+})();\r
diff --git a/webcit/tiny_mce/plugins/fullpage/fullpage.htm b/webcit/tiny_mce/plugins/fullpage/fullpage.htm
new file mode 100644 (file)
index 0000000..14ab865
--- /dev/null
@@ -0,0 +1,259 @@
+<!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>{#fullpage_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="js/fullpage.js"></script>\r
+       <link href="css/fullpage.css" rel="stylesheet" type="text/css" />\r
+</head>\r
+<body id="fullpage" style="display: none">\r
+<form onsubmit="FullPageDialog.update();return false;" name="fullpage" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="meta_tab" class="current"><span><a href="javascript:mcTabs.displayTab('meta_tab','meta_panel');" onmousedown="return false;">{#fullpage_dlg.meta_tab}</a></span></li>\r
+                               <li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#fullpage_dlg.appearance_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="meta_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{#fullpage_dlg.meta_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="metatitle">{#fullpage_dlg.meta_title}</label>&nbsp;</td>\r
+                                                       <td><input type="text" id="metatitle" name="metatitle" value="" class="mceFocus" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="metakeywords">{#fullpage_dlg.meta_keywords}</label>&nbsp;</td>\r
+                                                       <td><textarea id="metakeywords" name="metakeywords" rows="4"></textarea></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="metadescription">{#fullpage_dlg.meta_description}</label>&nbsp;</td>\r
+                                                       <td><textarea id="metadescription" name="metadescription" rows="4"></textarea></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="metaauthor">{#fullpage_dlg.author}</label>&nbsp;</td>\r
+                                                       <td><input type="text" id="metaauthor" name="metaauthor" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="metacopyright">{#fullpage_dlg.copyright}</label>&nbsp;</td>\r
+                                                       <td><input type="text" id="metacopyright" name="metacopyright" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="metarobots">{#fullpage_dlg.meta_robots}</label>&nbsp;</td>\r
+                                                       <td>\r
+                                                               <select id="metarobots" name="metarobots">\r
+                                                                                       <option value="">{#not_set}</option> \r
+                                                                                       <option value="index,follow">{#fullpage_dlg.meta_index_follow}</option>\r
+                                                                                       <option value="index,nofollow">{#fullpage_dlg.meta_index_nofollow}</option>\r
+                                                                                       <option value="noindex,follow">{#fullpage_dlg.meta_noindex_follow}</option>\r
+                                                                                       <option value="noindex,nofollow">{#fullpage_dlg.meta_noindex_nofollow}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{#fullpage_dlg.langprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="docencoding">{#fullpage_dlg.encoding}</label></td> \r
+                                                       <td>\r
+                                                               <select id="docencoding" name="docencoding"> \r
+                                                                               <option value="">{#not_set}</option>\r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="doctype">{#fullpage_dlg.doctypes}</label>&nbsp;</td>\r
+                                                       <td>\r
+                                                               <select id="doctype" name="doctype">\r
+                                                                               <option value="">{#not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="langcode">{#fullpage_dlg.langcode}</label>&nbsp;</td>\r
+                                                       <td><input type="text" id="langcode" name="langcode" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="langdir">{#fullpage_dlg.langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="langdir" name="langdir"> \r
+                                                                               <option value="">{#not_set}</option> \r
+                                                                               <option value="ltr">{#fullpage_dlg.ltr}</option> \r
+                                                                               <option value="rtl">{#fullpage_dlg.rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="nowrap"><label for="xml_pi">{#fullpage_dlg.xml_pi}</label>&nbsp;</td>\r
+                                                       <td><input type="checkbox" id="xml_pi" name="xml_pi" class="checkbox" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="appearance_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{#fullpage_dlg.appearance_textprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="fontface">{#fullpage_dlg.fontface}</label></td> \r
+                                                       <td>\r
+                                                               <select id="fontface" name="fontface" onchange="FullPageDialog.changedStyleProp();">\r
+                                                                               <option value="">{#not_set}</option>\r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="fontsize">{#fullpage_dlg.fontsize}</label></td> \r
+                                                       <td>\r
+                                                               <select id="fontsize" name="fontsize" onchange="FullPageDialog.changedStyleProp();">\r
+                                                                               <option value="">{#not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="textcolor">{#fullpage_dlg.textcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="textcolor" name="textcolor" type="text" value="" size="9" onchange="updateColor('textcolor_pick','textcolor');FullPageDialog.changedStyleProp();" /></td>\r
+                                                                               <td id="textcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{#fullpage_dlg.appearance_bgprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgimage">{#fullpage_dlg.bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgimage" name="bgimage" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>\r
+                                                                               <td id="bgimage_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{#fullpage_dlg.bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');FullPageDialog.changedStyleProp();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{#fullpage_dlg.appearance_marginprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="leftmargin">{#fullpage_dlg.left_margin}</label></td> \r
+                                                       <td><input id="leftmargin" name="leftmargin" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>\r
+                                                       <td class="column1"><label for="rightmargin">{#fullpage_dlg.right_margin}</label></td> \r
+                                                       <td><input id="rightmargin" name="rightmargin" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="topmargin">{#fullpage_dlg.top_margin}</label></td> \r
+                                                       <td><input id="topmargin" name="topmargin" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>\r
+                                                       <td class="column1"><label for="bottommargin">{#fullpage_dlg.bottom_margin}</label></td> \r
+                                                       <td><input id="bottommargin" name="bottommargin" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{#fullpage_dlg.appearance_linkprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="link_color">{#fullpage_dlg.link_color}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="link_color" name="link_color" type="text" value="" size="9" onchange="updateColor('link_color_pick','link_color');FullPageDialog.changedStyleProp();" /></td>\r
+                                                                               <td id="link_color_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td class="column1"><label for="visited_color">{#fullpage_dlg.visited_color}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="visited_color" name="visited_color" type="text" value="" size="9" onchange="updateColor('visited_color_pick','visited_color');FullPageDialog.changedStyleProp();" /></td>\r
+                                                                               <td id="visited_color_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="active_color">{#fullpage_dlg.active_color}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="active_color" name="active_color" type="text" value="" size="9" onchange="updateColor('active_color_pick','active_color');FullPageDialog.changedStyleProp();" /></td>\r
+                                                                               <td id="active_color_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td>&nbsp;</td>\r
+                                                       <td>&nbsp;</td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{#fullpage_dlg.appearance_style}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="stylesheet">{#fullpage_dlg.stylesheet}</label></td> \r
+                                                       <td><table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="stylesheet" name="stylesheet" type="text" value="" /></td>\r
+                                                                               <td id="stylesheet_browsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="style">{#fullpage_dlg.style}</label></td> \r
+                                                       <td><input id="style" name="style" type="text" value="" onchange="FullPageDialog.changedStyle();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <input type="submit" id="insert" name="update" value="{#update}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/fullpage/js/fullpage.js b/webcit/tiny_mce/plugins/fullpage/js/fullpage.js
new file mode 100644 (file)
index 0000000..3f672ad
--- /dev/null
@@ -0,0 +1,232 @@
+/**\r
+ * fullpage.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinyMCEPopup.requireLangPack();\r
+\r
+       var defaultDocTypes = \r
+               'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' +\r
+               'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' +\r
+               'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' +\r
+               'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">,' +\r
+               'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' +\r
+               'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' +\r
+               'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';\r
+\r
+       var defaultEncodings = \r
+               'Western european (iso-8859-1)=iso-8859-1,' +\r
+               'Central European (iso-8859-2)=iso-8859-2,' +\r
+               'Unicode (UTF-8)=utf-8,' +\r
+               'Chinese traditional (Big5)=big5,' +\r
+               'Cyrillic (iso-8859-5)=iso-8859-5,' +\r
+               'Japanese (iso-2022-jp)=iso-2022-jp,' +\r
+               'Greek (iso-8859-7)=iso-8859-7,' +\r
+               'Korean (iso-2022-kr)=iso-2022-kr,' +\r
+               'ASCII (us-ascii)=us-ascii';\r
+\r
+       var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';\r
+       var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px';\r
+\r
+       function setVal(id, value) {\r
+               var elm = document.getElementById(id);\r
+\r
+               if (elm) {\r
+                       value = value || '';\r
+\r
+                       if (elm.nodeName == "SELECT")\r
+                               selectByValue(document.forms[0], id, value);\r
+                       else if (elm.type == "checkbox")\r
+                               elm.checked = !!value;\r
+                       else\r
+                               elm.value = value;\r
+               }\r
+       };\r
+\r
+       function getVal(id) {\r
+               var elm = document.getElementById(id);\r
+\r
+               if (elm.nodeName == "SELECT")\r
+                       return elm.options[elm.selectedIndex].value;\r
+\r
+               if (elm.type == "checkbox")\r
+                       return elm.checked;\r
+\r
+               return elm.value;\r
+       };\r
+\r
+       window.FullPageDialog = {\r
+               changedStyle : function() {\r
+                       var val, styles = tinyMCEPopup.editor.dom.parseStyle(getVal('style'));\r
+\r
+                       setVal('fontface', styles['font-face']);\r
+                       setVal('fontsize', styles['font-size']);\r
+                       setVal('textcolor', styles['color']);\r
+\r
+                       if (val = styles['background-image'])\r
+                               setVal('bgimage', val.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"));\r
+                       else\r
+                               setVal('bgimage', '');\r
+\r
+                       setVal('bgcolor', styles['background-color']);\r
+\r
+                       // Reset margin form elements\r
+                       setVal('topmargin', '');\r
+                       setVal('rightmargin', '');\r
+                       setVal('bottommargin', '');\r
+                       setVal('leftmargin', '');\r
+\r
+                       // Expand margin\r
+                       if (val = styles['margin']) {\r
+                               val = val.split(' ');\r
+                               styles['margin-top'] = val[0] || '';\r
+                               styles['margin-right'] = val[1] || val[0] || '';\r
+                               styles['margin-bottom'] = val[2] || val[0] || '';\r
+                               styles['margin-left'] = val[3] || val[0] || '';\r
+                       }\r
+\r
+                       if (val = styles['margin-top'])\r
+                               setVal('topmargin', val.replace(/px/, ''));\r
+\r
+                       if (val = styles['margin-right'])\r
+                               setVal('rightmargin', val.replace(/px/, ''));\r
+\r
+                       if (val = styles['margin-bottom'])\r
+                               setVal('bottommargin', val.replace(/px/, ''));\r
+\r
+                       if (val = styles['margin-left'])\r
+                               setVal('leftmargin', val.replace(/px/, ''));\r
+\r
+                       updateColor('bgcolor_pick', 'bgcolor');\r
+                       updateColor('textcolor_pick', 'textcolor');\r
+               },\r
+\r
+               changedStyleProp : function() {\r
+                       var val, dom = tinyMCEPopup.editor.dom, styles = dom.parseStyle(getVal('style'));\r
+       \r
+                       styles['font-face'] = getVal('fontface');\r
+                       styles['font-size'] = getVal('fontsize');\r
+                       styles['color'] = getVal('textcolor');\r
+                       styles['background-color'] = getVal('bgcolor');\r
+\r
+                       if (val = getVal('bgimage'))\r
+                               styles['background-image'] = "url('" + val + "')";\r
+                       else\r
+                               styles['background-image'] = '';\r
+\r
+                       delete styles['margin'];\r
+\r
+                       if (val = getVal('topmargin'))\r
+                               styles['margin-top'] = val + "px";\r
+                       else\r
+                               styles['margin-top'] = '';\r
+\r
+                       if (val = getVal('rightmargin'))\r
+                               styles['margin-right'] = val + "px";\r
+                       else\r
+                               styles['margin-right'] = '';\r
+\r
+                       if (val = getVal('bottommargin'))\r
+                               styles['margin-bottom'] = val + "px";\r
+                       else\r
+                               styles['margin-bottom'] = '';\r
+\r
+                       if (val = getVal('leftmargin'))\r
+                               styles['margin-left'] = val + "px";\r
+                       else\r
+                               styles['margin-left'] = '';\r
+\r
+                       // Serialize, parse and reserialize this will compress redundant styles\r
+                       setVal('style', dom.serializeStyle(dom.parseStyle(dom.serializeStyle(styles))));\r
+                       this.changedStyle();\r
+               },\r
+               \r
+               update : function() {\r
+                       var data = {};\r
+\r
+                       tinymce.each(tinyMCEPopup.dom.select('select,input,textarea'), function(node) {\r
+                               data[node.id] = getVal(node.id);\r
+                       });\r
+\r
+                       tinyMCEPopup.editor.plugins.fullpage._dataToHtml(data);\r
+                       tinyMCEPopup.close();\r
+               }\r
+       };\r
+       \r
+       function init() {\r
+               var form = document.forms[0], i, item, list, editor = tinyMCEPopup.editor;\r
+\r
+               // Setup doctype select box\r
+               list = editor.getParam("fullpage_doctypes", defaultDocTypes).split(',');\r
+               for (i = 0; i < list.length; i++) {\r
+                       item = list[i].split('=');\r
+\r
+                       if (item.length > 1)\r
+                               addSelectValue(form, 'doctype', item[0], item[1]);\r
+               }\r
+\r
+               // Setup fonts select box\r
+               list = editor.getParam("fullpage_fonts", defaultFontNames).split(';');\r
+               for (i = 0; i < list.length; i++) {\r
+                       item = list[i].split('=');\r
+\r
+                       if (item.length > 1)\r
+                               addSelectValue(form, 'fontface', item[0], item[1]);\r
+               }\r
+\r
+               // Setup fontsize select box\r
+               list = editor.getParam("fullpage_fontsizes", defaultFontSizes).split(',');\r
+               for (i = 0; i < list.length; i++)\r
+                       addSelectValue(form, 'fontsize', list[i], list[i]);\r
+\r
+               // Setup encodings select box\r
+               list = editor.getParam("fullpage_encodings", defaultEncodings).split(',');\r
+               for (i = 0; i < list.length; i++) {\r
+                       item = list[i].split('=');\r
+\r
+                       if (item.length > 1)\r
+                               addSelectValue(form, 'docencoding', item[0], item[1]);\r
+               }\r
+\r
+               // Setup color pickers\r
+               document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+               document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color');\r
+               document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color');\r
+               document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color');\r
+               document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor');\r
+               document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage');\r
+               document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage');\r
+\r
+               // Resize some elements\r
+               if (isVisible('stylesheetbrowser'))\r
+                       document.getElementById('stylesheet').style.width = '220px';\r
+\r
+               if (isVisible('link_href_browser'))\r
+                       document.getElementById('element_link_href').style.width = '230px';\r
+\r
+               if (isVisible('bgimage_browser'))\r
+                       document.getElementById('bgimage').style.width = '210px';\r
+\r
+               // Update form\r
+               tinymce.each(tinyMCEPopup.getWindowArg('data'), function(value, key) {\r
+                       setVal(key, value);\r
+               });\r
+\r
+               FullPageDialog.changedStyle();\r
+\r
+               // Update colors\r
+               updateColor('textcolor_pick', 'textcolor');\r
+               updateColor('bgcolor_pick', 'bgcolor');\r
+               updateColor('visited_color_pick', 'visited_color');\r
+               updateColor('active_color_pick', 'active_color');\r
+               updateColor('link_color_pick', 'link_color');\r
+       };\r
+\r
+       tinyMCEPopup.onInit.add(init);\r
+})();\r
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/bg_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..2076714
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.fullpage_dlg',{title:"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430","meta_tab":"\u041e\u0431\u0449\u0438","appearance_tab":"\u0412\u044a\u043d\u0448\u0435\u043d \u0432\u0438\u0434","advanced_tab":"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438","meta_props":"Meta \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f",langprops:"\u0415\u0437\u0438\u043a \u0438 \u043a\u043e\u0434\u0438\u0440\u0430\u043d\u0435","meta_title":"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435","meta_keywords":"\u041a\u043b\u044e\u0447\u043e\u0432\u0438 \u0434\u0443\u043c\u0438","meta_description":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","meta_robots":"\u0420\u043e\u0431\u043e\u0442\u0438",doctypes:"\u0422\u0438\u043f",langcode:"\u041a\u043e\u0434 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",langdir:"\u041f\u043e\u0441\u043e\u043a\u0430 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",ltr:"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e",rtl:"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e","xml_pi":"XML \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438",encoding:"\u041a\u043e\u0434\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0442\u0435","appearance_bgprops":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u0444\u043e\u043d\u0430","appearance_marginprops":"Body margins","appearance_linkprops":"\u0426\u0432\u0435\u0442\u043e\u0432\u0435 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438\u0442\u0435","appearance_textprops":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430",bgcolor:"\u0426\u0432\u044f\u0442 \u043d\u0430 \u0434\u043e\u043d\u0430",bgimage:"\u0424\u043e\u043d\u043e\u0432\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430","left_margin":"\u041b\u044f\u0432 margin","right_margin":"\u0414\u0435\u0430\u0441\u0435\u043d margin","top_margin":"\u0413\u043e\u0440\u0435\u043d margin","bottom_margin":"\u0414\u043e\u043b\u0435\u043d margin","text_color":"\u0426\u0432\u044f\u0442 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430","font_size":"\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u0448\u0440\u0438\u0444\u0442\u0430","font_face":"\u0428\u0440\u0438\u0444\u0442","link_color":"\u0426\u0432\u044f\u0442 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430\u0442\u0430","hover_color":"\u0426\u0432\u044f\u0442 \u043f\u0440\u0438 hover","visited_color":"\u0426\u0432\u044f\u0442 \u0437\u0430 \u043f\u043e\u0441\u0435\u0442\u0435\u043d\u0438 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438","active_color":"\u0410\u043a\u0442\u0438\u0432\u0435\u043d \u0446\u0432\u044f\u0442",textcolor:"\u0426\u0432\u044f\u0442",fontsize:"\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u0448\u0440\u0438\u0444\u0442\u0430",fontface:"\u0428\u0440\u0438\u0444\u0442","meta_index_follow":"\u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0430\u0439 \u0438 \u0441\u043b\u0435\u0434\u0432\u0430\u0439 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438\u0442\u0435","meta_index_nofollow":"\u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0430\u0439 \u0438 \u043d\u0435 \u0441\u043b\u0435\u0434\u0432\u0430\u0439 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438\u0442\u0435","meta_noindex_follow":"\u041d\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0430\u0439 \u043d\u043e \u0441\u043b\u0435\u0434\u0432\u0430\u0439 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438\u0442\u0435","meta_noindex_nofollow":"\u041d\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0430\u0439 \u0438 \u043d\u0435 \u0441\u043b\u0435\u0434\u0432\u0430\u0439 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438\u0442\u0435","appearance_style":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 Stylesheet \u0438 \u0441\u0442\u0438\u043b\u0430",stylesheet:"Stylesheet",style:"\u0421\u0442\u0438\u043b",author:"\u0410\u0432\u0442\u043e\u0440",copyright:"Copyright",add:"\u0414\u043e\u0431\u0430\u0432\u0438 \u043d\u043e\u0432 \u0435\u043b\u0435\u043c\u0435\u043d\u0442",remove:"\u041f\u0440\u0435\u043c\u0430\u0445\u043d\u0438 \u0438\u0437\u0431\u0440\u0430\u043d\u0438\u044f\u0442 \u0435\u043b\u0435\u043c\u0435\u043d\u0442",moveup:"\u041f\u0440\u0438\u0434\u0432\u0438\u0436\u0438 \u0438\u0437\u0431\u0440\u0430\u043d\u0438\u044f\u0442 \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0433\u043e\u0440\u0435",movedown:"\u041f\u0440\u0438\u0434\u0432\u0438\u0436\u0438 \u0438\u0437\u0431\u0440\u0430\u043d\u0438\u044f\u0442 \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0434\u043e\u043b\u0443","head_elements":"Head elements",info:"Information","add_title":"Title element","add_meta":"Meta element","add_script":"Script element","add_style":"Style element","add_link":"Link element","add_base":"Base element","add_comment":"Comment node","title_element":"Title element","script_element":"Script element","style_element":"Style element","base_element":"Base element","link_element":"Link element","meta_element":"Meta element","comment_element":"Comment",src:"Src",language:"Language",href:"Href",target:"Target",type:"Type",charset:"Charset",defer:"Defer",media:"Media",properties:"Properties",name:"Name",value:"Value",content:"Content",rel:"Rel",rev:"Rev",hreflang:"Href lang","general_props":"\u041e\u0431\u0449\u0438","advanced_props":"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/cs_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..7b9d580
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.fullpage_dlg',{title:"Vlastnosti dokumentu","meta_tab":"Obecn\u00e9","appearance_tab":"Vzhled","advanced_tab":"Roz\u0161\u00ed\u0159en\u00e9","meta_props":"Meta informace",langprops:"Jazyk a k\u00f3dov\u00e1n\u00ed","meta_title":"Titulek","meta_keywords":"Kl\u00ed\u010dov\u00e1 slova","meta_description":"Popis","meta_robots":"Roboti",doctypes:"Typ dokumentu",langcode:"K\u00f3d jazyka",langdir:"Sm\u011br textu",ltr:"Zleva doprava",rtl:"Zprava doleva","xml_pi":"XML deklarace",encoding:"K\u00f3dov\u00e1n\u00ed","appearance_bgprops":"Vlastnosti pozad\u00ed","appearance_marginprops":"Okraje t\u011bla dokumentu","appearance_linkprops":"Vlastnosti odkaz\u016f","appearance_textprops":"Vlastnosti textu",bgcolor:"Barva pozad\u00ed",bgimage:"Obr\u00e1zek pozad\u00ed","left_margin":"Lev\u00fd okraj","right_margin":"Prav\u00fd okraj","top_margin":"Horn\u00ed okraj","bottom_margin":"Spodn\u00ed okraj","text_color":"Barva textu","font_size":"Velikost p\u00edsma","font_face":"Typ p\u00edsma","link_color":"Barva odkazu","hover_color":"Barva zvolen\u00e9ho odkazu","visited_color":"Barva nav\u0161t\u00edven\u00e9ho odkazu","active_color":"Barva aktivn\u00edho odkazu",textcolor:"Barva",fontsize:"Velikost p\u00edsma",fontface:"Typ p\u00edsma","meta_index_follow":"Indexovat a sledovat odkazy","meta_index_nofollow":"Indexovat a nesledovat odkazy","meta_noindex_follow":"Neindexovat, ale sledovat odkazy","meta_noindex_nofollow":"Neindexovat a nesledovat odkazy","appearance_style":"Vlastnosti styl\u016f",stylesheet:"Stylopis",style:"Styl",author:"Autor",copyright:"Autorsk\u00e1 pr\u00e1va",add:"P\u0159idat nov\u00fd element",remove:"Odebrat ozna\u010den\u00fd element",moveup:"P\u0159esu\u0148 ozna\u010den\u00fd element v\u00fd\u0161",movedown:"P\u0159esu\u0148 ozna\u010den\u00fd element n\u00ed\u017e","head_elements":"Hlavi\u010dky",info:"Informace","add_title":"Vlo\u017eit titulek","add_meta":"Vlo\u017eit meta informace","add_script":"Vlo\u017eit skript","add_style":"Vlo\u017eit styl","add_link":"Vlo\u017eit nezobrazovan\u00fd odkaz","add_base":"Vlo\u017eit z\u00e1kladn\u00ed um\u00edst\u011bn\u00ed","add_comment":"Vlo\u017eit koment\u00e1\u0159","title_element":"Titulek","script_element":"Skript","style_element":"Styl","base_element":"Z\u00e1kladn\u00ed um\u00edst\u011bn\u00ed","link_element":"Nezobrazovan\u00fd odkaz","meta_element":"Meta informace","comment_element":"Koment\u00e1\u0159",src:"Zdroj",language:"Jazyk",href:"Soubor/URL",target:"C\u00edl",type:"Typ",charset:"Znakov\u00e1 sada",defer:"Odlo\u017eit (defer)",media:"M\u00e9dia",properties:"Vlastnosti",name:"N\u00e1zev",value:"Hodnota",content:"Obsah",rel:"Vztah str\u00e1nky k c\u00edli",rev:"Vztah c\u00edle ke str\u00e1nce",hreflang:"Jazyk odkazu","general_props":"Obecn\u00e9 parametry","advanced_props":"Roz\u0161\u00ed\u0159en\u00e9 parametry"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/da_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..79fd658
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.fullpage_dlg',{title:"Dokumentegenskaber","meta_tab":"Generelt","appearance_tab":"Udseende","advanced_tab":"Advanceret","meta_props":"Meta-information",langprops:"Sprog og kodning","meta_title":"Titel","meta_keywords":"N\u00f8gleord","meta_description":"Beskrivelse","meta_robots":"Robots",doctypes:"Doctype",langcode:"Sprogkode",langdir:"Sprogretning",ltr:"Venstre mod h\u00f8jre",rtl:"H\u00f8jre md venstre","xml_pi":"XML declaration",encoding:"Tegns\u00e6t","appearance_bgprops":"Baggrundsegenskaber","appearance_marginprops":"Body margins","appearance_linkprops":"Link farver","appearance_textprops":"Tekstegenskaber",bgcolor:"Baggrundsfarve",bgimage:"Baggrundsbillede","left_margin":"Venstre margin","right_margin":"H\u00f8jre margin","top_margin":"Topmargin","bottom_margin":"Bundmargin","text_color":"Tekstfarve","font_size":"Skriftst\u00f8rrelse","font_face":"Skrifttype","link_color":"Linkfarve","hover_color":"Farve ved aktivering","visited_color":"Farve efter museklik","active_color":"Farve ved museklik",textcolor:"Farve",fontsize:"Skriftst\u00f8rrelse",fontface:"Skrifttype","meta_index_follow":"Indeks og f\u00f8lg links","meta_index_nofollow":"Indeks og f\u00f8lg ikke links","meta_noindex_follow":"Ingen indeks, men f\u00f8lg links","meta_noindex_nofollow":"Ingen indeks og f\u00f8lg ikke links","appearance_style":"Stylesheet og style-egenskaber",stylesheet:"Stylesheet",style:"Style",author:"Forfatter",copyright:"Copyright",add:"Tilf\u00f8j nyt element",remove:"Slet valgte element",moveup:"Flyt valgte element op",movedown:"Flyt valgte element ned","head_elements":"Hovedelement",info:"Information","add_title":"Titelelement","add_meta":"Meta-element","add_script":"Script-element","add_style":"Style-element","add_link":"Link-element","add_base":"Base-element","add_comment":"Kommentar-node","title_element":"Titelelement","script_element":"Script-element","style_element":"Style-element","base_element":"Base-element","link_element":"Link-element","meta_element":"Meta-element","comment_element":"Kommentar",src:"Src",language:"Sprog",href:"Href",target:"Destination",type:"Type",charset:"Tegns\u00e6t",defer:"Defer",media:"Media",properties:"Egenskaber",name:"Navn",value:"V\u00e6rdi",content:"Indhold",rel:"Rel",rev:"Rev",hreflang:"Href lang","general_props":"Generelt","advanced_props":"Advanceret"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/de_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..ecdff9e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.fullpage_dlg',{title:"Dokument-Eigenschaften","meta_tab":"Allgemein","appearance_tab":"Aussehen","advanced_tab":"Erweitert","meta_props":"Meta-Information",langprops:"Sprache und Codierung","meta_title":"Titel","meta_keywords":"Keywords","meta_description":"Beschreibung","meta_robots":"Robots",doctypes:"DocType",langcode:"Sprachcode",langdir:"Sprachrichtung",ltr:"Links nach Rechts",rtl:"Rechts nach Links","xml_pi":"XML Deklaration",encoding:"Zeichencodierung","appearance_bgprops":"Hintergrund-Eigenschaften","appearance_marginprops":"Abst\u00e4nde des Body","appearance_linkprops":"Linkfarben","appearance_textprops":"Text-Eigenschaften",bgcolor:"Hintergrundfarbe",bgimage:"Hintergrundbild","left_margin":"Linker Abstand","right_margin":"Rechter Abstand","top_margin":"Oberer Abstand","bottom_margin":"Unterer Abstand","text_color":"Textfarbe","font_size":"Schriftgr\u00f6\u00dfe","font_face":"Schriftart","link_color":"Linkfarbe","hover_color":"Hover-Farbe","visited_color":"Visited-Farbe","active_color":"Active-Farbe",textcolor:"Farbe",fontsize:"Schriftgr\u00f6\u00dfe",fontface:"Schriftart","meta_index_follow":"Indizieren und den Links folgen","meta_index_nofollow":"Indizieren, aber den Links nicht folgen","meta_noindex_follow":"Nicht indizieren, aber den Links folgen","meta_noindex_nofollow":"Nicht indizieren und auch nicht den Links folgen","appearance_style":"CSS-Stylesheet und Stileigenschaften",stylesheet:"CSS-Stylesheet",style:"CSS-Stil",author:"Autor",copyright:"Copyright",add:"Neues Element hinzuf\u00fcgen",remove:"Ausgew\u00e4hltes Element entfernen",moveup:"Ausgew\u00e4hltes Element nach oben bewegen",movedown:"Ausgew\u00e4hltes Element nach unten bewegen","head_elements":"\u00dcberschriftenelemente",info:"Information","add_title":"Titel-Element","add_meta":"Meta-Element","add_script":"Script-Element","add_style":"Style-Element","add_link":"Link-Element","add_base":"Base-Element","add_comment":"HTML-Kommentar","title_element":"Titel-Element","script_element":"Script-Element","style_element":"Style-Element","base_element":"Base-Element","link_element":"Link-Element","meta_element":"Meta_Element","comment_element":"Kommentar",src:"Src",language:"Sprache",href:"Href",target:"Ziel",type:"Typ",charset:"Zeichensatz",defer:"Defer",media:"Media",properties:"Eigenschaften",name:"Name",value:"Wert",content:"Inhalt",rel:"Rel",rev:"Rev",hreflang:"Href lang","general_props":"Allgemein","advanced_props":"Erweitert"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/el_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..457946d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.fullpage_dlg',{title:"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03b5\u03b3\u03b3\u03c1\u03ac\u03c6\u03bf\u03c5","meta_tab":"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac","appearance_tab":"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7","advanced_tab":"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2","meta_props":"\u039c\u03b5\u03c4\u03b1-\u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2",langprops:"\u0393\u03bb\u03ce\u03c3\u03c3\u03b1 \u03ba\u03b1\u03b9 \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7","meta_title":"\u03a4\u03af\u03c4\u03bb\u03bf\u03c2","meta_keywords":"\u039b\u03ad\u03be\u03b5\u03b9\u03c2 \u03ba\u03bb\u03b5\u03b9\u03b4\u03b9\u03ac","meta_description":"\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae","meta_robots":"\u03a1\u03bf\u03bc\u03c0\u03cc\u03c4",doctypes:"Doctype",langcode:"\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",langdir:"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",ltr:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac",rtl:"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","xml_pi":"\u0394\u03ae\u03bb\u03c9\u03c3\u03b7 XML",encoding:"\u039a\u03c9\u03b4\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03c9\u03bd","appearance_bgprops":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5","appearance_marginprops":"\u03a0\u03b5\u03c1\u03b9\u03b8\u03ce\u03c1\u03b9\u03b1 \u03c3\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2","appearance_linkprops":"\u03a7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03c9\u03bd","appearance_textprops":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5",bgcolor:"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5",bgimage:"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5","left_margin":"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03cc \u03c0\u03b5\u03c1\u03b9\u03b8\u03ce\u03c1\u03b9\u03bf","right_margin":"\u0394\u03b5\u03be\u03b9\u03cc \u03c0\u03b5\u03c1\u03b9\u03b8\u03ce\u03c1\u03b9\u03bf","top_margin":"\u03a0\u03ac\u03bd\u03c9 \u03c0\u03b5\u03c1\u03b9\u03b8\u03ce\u03c1\u03b9\u03bf","bottom_margin":"\u039a\u03ac\u03c4\u03c9 \u03c0\u03b5\u03c1\u03b9\u03b8\u03ce\u03c1\u03b9\u03bf","text_color":"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5","font_size":"\u039c\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ac\u03c4\u03c9\u03bd","font_face":"\u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac","link_color":"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5","hover_color":"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5 (Hover)","visited_color":"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5 (Visited)","active_color":"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5 (Active)",textcolor:"\u03a7\u03c1\u03ce\u03bc\u03b1",fontsize:"\u039c\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ac\u03c4\u03c9\u03bd",fontface:"\u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac","meta_index_follow":"\u039a\u03b1\u03c4\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b7\u03b8\u03bf\u03cd\u03bd \u03bf\u03b9 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03b9","meta_index_nofollow":"\u039a\u03b1\u03c4\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03bc\u03b7\u03bd \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b7\u03b8\u03bf\u03cd\u03bd \u03bf\u03b9 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03b9","meta_noindex_follow":"\u03a7\u03c9\u03c1\u03af\u03c2 \u03ba\u03b1\u03c4\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b7\u03b8\u03bf\u03cd\u03bd \u03bf\u03b9 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03b9","meta_noindex_nofollow":"\u03a7\u03c9\u03c1\u03af\u03c2 \u03ba\u03b1\u03c4\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03bc\u03b7\u03bd \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b7\u03b8\u03bf\u03cd\u03bd \u03bf\u03b9 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03b9","appearance_style":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03c3\u03c4\u03c5\u03bb \u03ba\u03b1\u03b9 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03c3\u03c4\u03c5\u03bb",stylesheet:"\u0391\u03c1\u03c7\u03b5\u03af\u03bf \u03c3\u03c4\u03c5\u03bb",style:"\u03a3\u03c4\u03c5\u03bb",author:"\u03a3\u03c5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ad\u03b1\u03c2",copyright:"\u0394\u03b9\u03ba\u03b1\u03af\u03c9\u03bc\u03b1 \u03ba\u03b1\u03c4\u03b1\u03c3\u03ba\u03b5\u03c5\u03b1\u03c3\u03c4\u03ae",add:"\u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5",remove:"\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5",moveup:"\u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 \u03c0\u03ac\u03bd\u03c9",movedown:"\u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 \u03ba\u03ac\u03c4\u03c9","head_elements":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03ba\u03b5\u03c6\u03b1\u03bb\u03ae\u03c2",info:"\u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2","add_title":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03c4\u03af\u03c4\u03bb\u03bf\u03c5","add_meta":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03bc\u03b5\u03c4\u03b1-\u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1\u03c2","add_script":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf Script","add_style":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03c3\u03c4\u03c5\u03bb","add_link":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5","add_base":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03b2\u03ac\u03c3\u03b7\u03c2","add_comment":"\u039a\u03cc\u03bc\u03b2\u03bf\u03c2 \u03c3\u03c7\u03bf\u03bb\u03af\u03bf\u03c5","title_element":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03c4\u03af\u03c4\u03bb\u03bf\u03c5","script_element":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf Script","style_element":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03c3\u03c4\u03c5\u03bb","base_element":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03b2\u03ac\u03c3\u03b7\u03c2","link_element":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5","meta_element":"\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03bc\u03b5\u03c4\u03b1-\u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1\u03c2","comment_element":"\u03a3\u03c7\u03cc\u03bb\u03b9\u03bf",src:"\u03a0\u03b7\u03b3\u03ae",language:"\u0393\u03bb\u03ce\u03c3\u03c3\u03b1",href:"Href",target:"\u03a3\u03c4\u03cc\u03c7\u03bf\u03c2",type:"\u03a4\u03cd\u03c0\u03bf\u03c2",charset:"\u03a3\u03b5\u03c4 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03c9\u03bd",defer:"Defer",media:"Media",properties:"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2",name:"\u038c\u03bd\u03bf\u03bc\u03b1",value:"\u03a4\u03b9\u03bc\u03ae",content:"\u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf",rel:"Rel",rev:"Rev",hreflang:"\u0393\u03bb\u03ce\u03c3\u03c3\u03b1 Href","general_props":"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac","advanced_props":"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/en_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..516edc7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.fullpage_dlg',{title:"Document Properties","meta_tab":"General","appearance_tab":"Appearance","advanced_tab":"Advanced","meta_props":"Meta Information",langprops:"Language and Encoding","meta_title":"Title","meta_keywords":"Keywords","meta_description":"Description","meta_robots":"Robots",doctypes:"Doctype",langcode:"Language Code",langdir:"Language Direction",ltr:"Left to Right",rtl:"Right to Left","xml_pi":"XML Declaration",encoding:"Character Encoding","appearance_bgprops":"Background Properties","appearance_marginprops":"Body Margins","appearance_linkprops":"Link Colors","appearance_textprops":"Text Properties",bgcolor:"Background Color",bgimage:"Background Image","left_margin":"Left Margin","right_margin":"Right Margin","top_margin":"Top Margin","bottom_margin":"Bottom Margin","text_color":"Text Color","font_size":"Font Size","font_face":"Font Face","link_color":"Link Color","hover_color":"Hover Color","visited_color":"Visited Color","active_color":"Active Color",textcolor:"Color",fontsize:"Font Size",fontface:"Font Family","meta_index_follow":"Index and Follow the Links","meta_index_nofollow":"Index and Don\'t Follow the Links","meta_noindex_follow":"Do Not Index but Follow the Links","meta_noindex_nofollow":"Do Not Index and Don\'t Follow the Links","appearance_style":"Stylesheet and Style Properties",stylesheet:"Stylesheet",style:"Style",author:"Author",copyright:"Copyright",add:"Add New Element",remove:"Remove Selected Element",moveup:"Move Selected Element Up",movedown:"Move Selected Element Down","head_elements":"Head Elements",info:"Information","add_title":"Title Element","add_meta":"Meta Element","add_script":"Script Element","add_style":"Style Element","add_link":"Link Element","add_base":"Base Element","add_comment":"Comment Node","title_element":"Title Element","script_element":"Script Element","style_element":"Style Element","base_element":"Base Element","link_element":"Link Element","meta_element":"Meta Element","comment_element":"Comment",src:"Source",language:"Language",href:"HREF",target:"Target",type:"Type",charset:"Charset",defer:"Defer",media:"Media",properties:"Properties",name:"Name",value:"Value",content:"Content",rel:"Rel",rev:"Rev",hreflang:"HREF Lang","general_props":"General","advanced_props":"Advanced"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/es_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..94e52a7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.fullpage_dlg',{title:"Propiedades del documento","meta_tab":"General","appearance_tab":"Apariencia","advanced_tab":"Avanzado","meta_props":"Informaci\u00f3n Meta",langprops:"Lenguaje y codificaci\u00f3n","meta_title":"T\u00edtulo","meta_keywords":"Palabras clave","meta_description":"Descripci\u00f3n","meta_robots":"Robots",doctypes:"Tipo de doc.",langcode:"C\u00f3digo del lenguaje",langdir:"Direcci\u00f3n del lenguaje",ltr:"Izquierda a derecha",rtl:"Derecha a izquierda","xml_pi":"Declaraci\u00f3n XML",encoding:"Codificaci\u00f3n de caracteres","appearance_bgprops":"Propiedades del fondo","appearance_marginprops":"M\u00e1rgenes","appearance_linkprops":"Colores del v\u00ednculo","appearance_textprops":"Propiedades de texto",bgcolor:"Color de fondo",bgimage:"Imagen de fondo","left_margin":"Margen izquierdo","right_margin":"Margen derecho","top_margin":"Margen superior","bottom_margin":"Margen inferior","text_color":"Color del texto","font_size":"Tama\u00f1o de fuente","font_face":"Fuente","link_color":"Color de v\u00ednculo","hover_color":"Color rat\u00f3n encima","visited_color":"Color visitado","active_color":"Color activo",textcolor:"Color",fontsize:"Tama\u00f1o de fuente",fontface:"Fuente","meta_index_follow":"Indexar y seguir los v\u00ednculos","meta_index_nofollow":"Indexar y no seguir los v\u00ednculos","meta_noindex_follow":"No indexar pero seguir v\u00ednculos","meta_noindex_nofollow":"No indexar y no seguir v\u00ednculos","appearance_style":"Propiedades de hoja de estilos y estilo",stylesheet:"Hoja de estilo",style:"Estilo",author:"Autor",copyright:"Copyright",add:"Agregar nuevo elemento",remove:"Eliminar elemento seleccionado",moveup:"Mover elemento seleccionado hacia arriba",movedown:"Mover elemento seleccionado hacia abajo","head_elements":"Elemento Head",info:"Informaci\u00f3n","add_title":"Elemento Title","add_meta":"Elemento Meta","add_script":"Elemento Script","add_style":"Elemento Style","add_link":"Elemento Link","add_base":"Elemento Base","add_comment":"Nodo Comment","title_element":"Elemento Title","script_element":"Elemento Script","style_element":"Elemento Style","base_element":"Elemento Base","link_element":"Elemento Link","meta_element":"Elemento Meta","comment_element":"Comentario",src:"Src",language:"Lenguaje",href:"Href",target:"Target",type:"Tipo",charset:"Charset",defer:"Defer",media:"Medio",properties:"Propiedades",name:"Nombre",value:"Valor",content:"Contenido",rel:"Rel",rev:"Rev",hreflang:"Href lang","general_props":"General","advanced_props":"Avanzado"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/et_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..f55f776
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.fullpage_dlg',{title:"Dokumendi omadused","meta_tab":"\u00dcldine","appearance_tab":"V\u00e4limus","advanced_tab":"P\u00f5hjalikum","meta_props":"\u201eMeta\u201c informatioon",langprops:"Keel ja kodeering","meta_title":"Pealkiri","meta_keywords":"M\u00e4rks\u00f5nad","meta_description":"Kirjeldus","meta_robots":"Robotid",doctypes:"Dokumendi t\u00fc\u00fcp",langcode:"Keele kood",langdir:"Keele suund",ltr:"Vasakult paremale",rtl:"Paremalt vasakule","xml_pi":"XML avaldus",encoding:"Karakteri kodeering","appearance_bgprops":"Tausta seadistus","appearance_marginprops":"Sisu piir","appearance_linkprops":"Lingi v\u00e4rv","appearance_textprops":"Teksti seaded",bgcolor:"Tausta v\u00e4rv",bgimage:"Tausta pilt","left_margin":"Vasak piir","right_margin":"Parem piir","top_margin":"\u00dclemine piir","bottom_margin":"Alumine piir","text_color":"Teksti v\u00e4rv","font_size":"Fondi suurus","font_face":"Fondi n\u00e4gu","link_color":"Lingi v\u00e4rv","hover_color":"\u00dcle-v\u00e4rv","visited_color":"K\u00fclastatud-v\u00e4rv","active_color":"Aktiivne-v\u00e4rv",textcolor:"V\u00f6rv",fontsize:"Fondi suurus",fontface:"Font","meta_index_follow":"M\u00e4rgi ja j\u00e4rgi linki","meta_index_nofollow":"M\u00e4rgi ja \u00e4ra j\u00e4rgi linki","meta_noindex_follow":"\u00c4ra m\u00e4rgi linki, aga j\u00e4rgi linki","meta_noindex_nofollow":"\u00c4ra m\u00e4rgi linki ja \u00e4ra j\u00e4rgi linki","appearance_style":"Stiilileht ja stiili seaded",stylesheet:"Stiilileht",style:"Stiil",author:"Autor",copyright:"Autorikaitse",add:"Lisa uus element",remove:"Eemalda valitud element",moveup:"Liiguta valitud element \u00fclesse",movedown:"Liiguta valitud element alla","head_elements":"P\u00f5hielemendid",info:"Informatioon","add_title":"Pealkirja element","add_meta":"\u201eMeta\u201c element","add_script":"Skript\u2019i element","add_style":"Stiili element","add_link":"Lingi element","add_base":"Baaselement","add_comment":"Kommentaar","title_element":"Pealkirja element","script_element":"Skript\u2019i element","style_element":"Stiili element","base_element":"Baaselement","link_element":"Lingi element","meta_element":"\u201eMeta\u201c element","comment_element":"kommentaar",src:"Src",language:"Keel",href:"Href",target:"Sihtm\u00e4rk",type:"T\u00fc\u00fcp",charset:"Charset",defer:"Edasi l\u00fckkamine",media:"Meedia",properties:"Seaded",name:"Nimi",value:"V\u00e4\u00e4rtus",content:"Sisu",rel:"Rel",rev:"Rev",hreflang:"Href lang","general_props":"\u00dcldine","advanced_props":"T\u00e4psustatud"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/fi_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..3f1fb39
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.fullpage_dlg',{title:"Tiedoston asetukset","meta_tab":"Yleinen","appearance_tab":"Ulkoasu","advanced_tab":"Edistynyt","meta_props":"Metatiedot",langprops:"Kieli ja koodaus","meta_title":"Otsikko","meta_keywords":"Avainsanat","meta_description":"Kuvaus","meta_robots":"Robotit",doctypes:"Dokumenttityypit",langcode:"Kielen koodi",langdir:"Kielen suunta",ltr:"Vasemmalta oikealle",rtl:"Oikealta vasemmalle","xml_pi":"XML-ilmoitus",encoding:"Tekstin koodaus","appearance_bgprops":"Taustan asetukset","appearance_marginprops":"Body-marginaalit","appearance_linkprops":"Linkkien v\u00e4rit","appearance_textprops":"Tekstin asetukset",bgcolor:"Taustan v\u00e4ri",bgimage:"Taustakuva","left_margin":"Vasen marginaali","right_margin":"Oikea marginaali","top_margin":"Yl\u00e4marginaali","bottom_margin":"Alamarginaali","text_color":"Tekstin v\u00e4ri","font_size":"Fonttikoko","font_face":"Fontti","link_color":"Linkin v\u00e4ri","hover_color":"Hover-v\u00e4ri","visited_color":"Vierailtu v\u00e4ri","active_color":"Aktiivinen v\u00e4ri",textcolor:"V\u00e4ri",fontsize:"Fonttikoko",fontface:"Fontti","meta_index_follow":"Indeksoi ja seuraa linkkej\u00e4","meta_index_nofollow":"Indeksoi, mutta \u00e4l\u00e4 seuraa linkkej\u00e4","meta_noindex_follow":"\u00c4l\u00e4 indeksoi, mutta seuraa linkkej\u00e4.","meta_noindex_nofollow":"\u00c4l\u00e4 indeksoi, \u00e4l\u00e4k\u00e4 seuraa linkkej\u00e4","appearance_style":"Tyylitiedosto ja tyylin asetukset",stylesheet:"Tyylitiedosto",style:"Tyyli",author:"Kirjoittaja",copyright:"Copyright",add:"Lis\u00e4\u00e4 uusi elementti",remove:"Poista valittu elementti",moveup:"Siirr\u00e4 valittua elementti\u00e4 yl\u00f6s",movedown:"Siirr\u00e4 valittua elementti\u00e4 alas","head_elements":"P\u00e4\u00e4elementti",info:"Informaatio","add_title":"Otsikkoelementti","add_meta":"Meta-elementti","add_script":"Script-elementti","add_style":"Tyylielementti","add_link":"Linkkielementti","add_base":"Base-elementti","add_comment":"Yleinen elementti","title_element":"Otsikkoelementti","script_element":"Script-elementti","style_element":"Tyylielementti","base_element":"Base-elementti","link_element":"Linkkielementti","meta_element":"Meta-elementti","comment_element":"Kommentti",src:"L\u00e4hde",language:"Kieli",href:"Href",target:"Kohde",type:"Tyyppi",charset:"Kirjasintyyppi",defer:"Mukautuminen",media:"Media",properties:"Asetukset",name:"Nimi",value:"Arvo",content:"Sis\u00e4lt\u00f6",rel:"Rel",rev:"Rev",hreflang:"Href-kieli","general_props":"Yleinen","advanced_props":"Edistynyt"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/fr_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..c2ddc65
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.fullpage_dlg',{title:"Propri\u00e9t\u00e9s du document","meta_tab":"G\u00e9n\u00e9ral","appearance_tab":"Apparence","advanced_tab":"Avanc\u00e9","meta_props":"Metadonn\u00e9es",langprops:"Langue et encodage","meta_title":"Titre","meta_keywords":"Mots-cl\u00e9s","meta_description":"Description","meta_robots":"Robots",doctypes:"Doctype",langcode:"Code de la langue",langdir:"Sens de lecture",ltr:"De gauche \u00e0 droite",rtl:"De droite \u00e0 gauche","xml_pi":"D\u00e9claration XML",encoding:"Encodage des caract\u00e8res","appearance_bgprops":"Propri\u00e9t\u00e9s du fond","appearance_marginprops":"Marge du corps de la page","appearance_linkprops":"Couleurs des liens","appearance_textprops":"Propri\u00e9t\u00e9s du texte",bgcolor:"Couleur de fond",bgimage:"Image de fond","left_margin":"Marge de gauche","right_margin":"Marge de droite","top_margin":"Marge du haut","bottom_margin":"Marge du bas","text_color":"Couleur du texte","font_size":"Taille de la police","font_face":"Nom de la police","link_color":"Couleur des liens","hover_color":"Couleur au survol","visited_color":"Couleur des liens visit\u00e9s","active_color":"Couleur du lien actif",textcolor:"Couleur",fontsize:"Taille de police",fontface:"Nom de la police","meta_index_follow":"Indexer et suivre les liens","meta_index_nofollow":"Indexer et ne pas suivre les liens","meta_noindex_follow":"Ne pas indexer et suivre les liens","meta_noindex_nofollow":"Ne pas indexer et ne pas suivre les liens","appearance_style":"Propri\u00e9t\u00e9s de la feuille de style et du style",stylesheet:"Feuille de style",style:"Style",author:"Auteur",copyright:"Copyright",add:"Ajouter un nouvel \u00e9l\u00e9ment",remove:"Retirer l\'\u00e9l\u00e9ment s\u00e9lectionn\u00e9",moveup:"D\u00e9placer l\'\u00e9l\u00e9ment s\u00e9lectionn\u00e9 vers le haut",movedown:"D\u00e9placer l\'\u00e9l\u00e9ment s\u00e9lectionn\u00e9 vers le bas","head_elements":"\u00c9l\u00e9ments d\'en-t\u00eate",info:"Information","add_title":"\u00c9l\u00e9ment de titre","add_meta":"\u00c9l\u00e9ment Meta","add_script":"\u00c9l\u00e9ment de script","add_style":"\u00c9l\u00e9ment de style","add_link":"\u00c9l\u00e9ment de lien","add_base":"\u00c9l\u00e9ment de base","add_comment":"Commentaire","title_element":"\u00c9l\u00e9ment de titre","script_element":"\u00c9l\u00e9ment de script","style_element":"\u00c9l\u00e9ment de style","base_element":"\u00c9l\u00e9ment de base","link_element":"\u00c9l\u00e9ment de lien","meta_element":"\u00c9l\u00e9ment Meta","comment_element":"Commentaire",src:"Source",language:"Langue",href:"Href",target:"Cible",type:"Type",charset:"Charset",defer:"D\u00e9f\u00e9rer",media:"M\u00e9dia",properties:"Propri\u00e9t\u00e9s",name:"Nom",value:"Valeur",content:"Contenu",rel:"Rel",rev:"Rev",hreflang:"langue Href","general_props":"G\u00e9n\u00e9ral","advanced_props":"Avanc\u00e9"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/hu_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..b206705
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.fullpage_dlg',{title:"Dokumentum tulajdons\u00e1gai","meta_tab":"\u00c1ltal\u00e1nos","appearance_tab":"Megjelen\u00e9s","advanced_tab":"Halad\u00f3","meta_props":"Meta inform\u00e1ci\u00f3",langprops:"Nyelv \u00e9s k\u00f3dol\u00e1s","meta_title":"C\u00edm","meta_keywords":"Kulcsszavak","meta_description":"Le\u00edr\u00e1s","meta_robots":"Robotok",doctypes:"Doctype",langcode:"Nyelvk\u00f3d",langdir:"\u00cdr\u00e1s ir\u00e1nya",ltr:"Balr\u00f3l jobra",rtl:"Jobbr\u00f3l balra","xml_pi":"XML deklar\u00e1ci\u00f3",encoding:"Karakterk\u00f3dol\u00e1s","appearance_bgprops":"H\u00e1tt\u00e9r tulajdons\u00e1gai","appearance_marginprops":"Test keret","appearance_linkprops":"Link sz\u00ednek","appearance_textprops":"Sz\u00f6veg tulajdons\u00e1gai",bgcolor:"H\u00e1tt\u00e9rsz\u00edn",bgimage:"H\u00e1tt\u00e9rk\u00e9p","left_margin":"Bal marg\u00f3","right_margin":"Jobb marg\u00f3","top_margin":"Fels\u0151 marg\u00f3","bottom_margin":"Als\u00f3 marg\u00f3","text_color":"Sz\u00f6vegsz\u00edn","font_size":"Bet\u0171m\u00e9ret","font_face":"Bet\u0171t\u00edpus","link_color":"Link sz\u00edn","hover_color":"F\u00f6l\u00e9vitt sz\u00edn","visited_color":"L\u00e1togatva sz\u00edn","active_color":"Akt\u00edv sz\u00edn",textcolor:"Sz\u00edn",fontsize:"Bet\u0171m\u00e9ret",fontface:"Bet\u0171t\u00edpus","meta_index_follow":"Indexel \u00e9s k\u00f6veti a linkeket","meta_index_nofollow":"Indexel, de nem k\u00f6veti a linkeket","meta_noindex_follow":"Nem indexel, de k\u00f6veti a linkeket","meta_noindex_nofollow":"Nem indexel \u00e9s nem k\u00f6veti a linkeket","appearance_style":"Stylesheet \u00e9s style tulajdons\u00e1gok",stylesheet:"Stylesheet",style:"Style",author:"Szerz\u0151",copyright:"Copyright",add:"\u00daj elem hozz\u00e1ad\u00e1sa",remove:"Kijel\u00f6lt elem t\u00f6rl\u00e9se",moveup:"Kijel\u00f6lt elem felfel\u00e9 mozgat\u00e1sa",movedown:"Kijel\u00f6lt elem lefel\u00e9 mozgat\u00e1sa","head_elements":"Fej elemek",info:"Inform\u00e1ci\u00f3","add_title":"C\u00edm elem","add_meta":"Meta elem","add_script":"Script elem","add_style":"Style elem","add_link":"Link elem","add_base":"Base elem","add_comment":"Comment elem","title_element":"Title elem","script_element":"Script elem","style_element":"Style elem","base_element":"Base elem","link_element":"Link elem","meta_element":"Meta elem","comment_element":"Megjegyz\u00e9s",src:"Src",language:"Language",href:"Href",target:"Target",type:"Type",charset:"Charset",defer:"Defer",media:"Media",properties:"Properties",name:"Name",value:"Value",content:"Content",rel:"Rel",rev:"Rev",hreflang:"Href lang","general_props":"\u00c1ltal\u00e1nos","advanced_props":"Halad\u00f3"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/it_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..d5445e8
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.fullpage_dlg',{title:"Propriet\u00e0 Documento","meta_tab":"Generale","appearance_tab":"Aspetto","advanced_tab":"Avanzate","meta_props":"Informazioni Metatag",langprops:"Lingua e codifica","meta_title":"Titolo","meta_keywords":"Parole chiave","meta_description":"Descrizione","meta_robots":"Robots",doctypes:"Doctype",langcode:"Codice lingua",langdir:"Direzione testo",ltr:"Sinistra verso destra",rtl:"Destra verso sinistra","xml_pi":"Dichiarazione XML",encoding:"Codifica carattere","appearance_bgprops":"Propriet\u00e0 sfondo","appearance_marginprops":"Margini body","appearance_linkprops":"Colori collegamenti","appearance_textprops":"Propriet\u00e0 testo",bgcolor:"Colore sfondo",bgimage:"Immagine sfondo","left_margin":"Margine sinistro","right_margin":"Margine destro","top_margin":"Margine superiore","bottom_margin":"Margine inferiore","text_color":"Colore testo","font_size":"Dimensione carattere","font_face":"Tipo carattere","link_color":"Colore collegamento","hover_color":"Colore \\\'Hover\\\'","visited_color":"Colore \\\'Visited\\\'","active_color":"Colore \\\'Active\\\'",textcolor:"Colore",fontsize:"Dimensione carattere",fontface:"Famiglia carattere","meta_index_follow":"Indicizzare e seguire collegamenti","meta_index_nofollow":"Indicizzare e non segure collegamenti","meta_noindex_follow":"Non indicizzare ma seguire collegamenti","meta_noindex_nofollow":"Non indicizzare e non seguire collegamenti","appearance_style":"Propriet\u00e0 stili e fogli di stile",stylesheet:"Fogli di stile",style:"Stile",author:"Autore",copyright:"Copyright",add:"Aggiungi nuovo elemento",remove:"Rimuovi elemento selezionato",moveup:"Sposta elemento selezionato in alto",movedown:"Sposta elemento selezionato in basso","head_elements":"Elementi Head",info:"Informazioni","add_title":"Elemento Titolo","add_meta":"Elemento Meta","add_script":"Elemento Script","add_style":"Elemento Style","add_link":"Elemento Link","add_base":"Elemento Base","add_comment":"Nodo Commento","title_element":"Elemento Titolo","script_element":"Elemento Script","style_element":"Elemento Style","base_element":"Elemento Base","link_element":"Elemento Link","meta_element":"Elemento Meta","comment_element":"Commento",src:"Sorgente",language:"Linguaggio",href:"Href",target:"Target",type:"Tipo",charset:"Set caratteri",defer:"Defer",media:"Media",properties:"Propriet\u00e0",name:"Nome",value:"Valore",content:"Contenuto",rel:"Rel",rev:"Rev",hreflang:"Href lang","general_props":"Generale","advanced_props":"Avanzate"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullpage/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/fullpage/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..de0a74a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.fullpage_dlg',{title:"\u6587\u4ef6\u5c5e\u6027","meta_tab":"\u666e\u901a","appearance_tab":"\u5916\u89c2","advanced_tab":"\u9ad8\u7ea7","meta_props":"Meta\u4fe1\u606f",langprops:"\u8bed\u8a00\u548c\u7f16\u7801","meta_title":"\u6807\u9898","meta_keywords":"Meta \u5173\u952e\u5b57","meta_description":"Meta \u63cf\u8ff0","meta_robots":"\u641c\u7d22\u673a\u5668\u4eba",doctypes:"\u6587\u6863\u7c7b\u578b",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u6587\u5b57\u65b9\u5411",ltr:"\u4ece\u5de6\u5230\u53f3",rtl:"\u4ece\u53f3\u5230\u5de6","xml_pi":"XML\u7533\u660e",encoding:"\u5b57\u7b26\u7f16\u7801","appearance_bgprops":"\u80cc\u666f\u5c5e\u6027","appearance_marginprops":"\u9875\u8fb9\u8ddd","appearance_linkprops":"\u8d85\u94fe\u63a5\u989c\u8272","appearance_textprops":"\u6587\u672c\u5c5e\u6027",bgcolor:"\u80cc\u666f\u989c\u8272",bgimage:"\u80cc\u666f\u56fe\u7247","left_margin":"\u5de6\u8fb9\u8ddd","right_margin":"\u53f3\u8fb9\u8ddd","top_margin":"\u4e0a\u8fb9\u8ddd","bottom_margin":"\u4e0b\u8fb9\u8ddd","text_color":"\u6587\u672c\u989c\u8272","font_size":"\u5b57\u4f53\u5927\u5c0f","font_face":"\u5b57\u4f53","link_color":"\u8d85\u94fe\u63a5\u989c\u8272","hover_color":"Hover\u989c\u8272","visited_color":"Visited\u989c\u8272","active_color":"Active\u989c\u8272",textcolor:"\u989c\u8272",fontsize:"\u5b57\u4f53\u5927\u5c0f",fontface:"\u5b57\u4f53","meta_index_follow":"\u7d22\u5f15\u5e76\u8fde\u7ed3","meta_index_nofollow":"\u7d22\u5f15\u4f46\u4e0d\u8fde\u7ed3","meta_noindex_follow":"\u4e0d\u7d22\u5f15\u4f46\u8fde\u7ed3","meta_noindex_nofollow":"\u4e0d\u7d22\u5f15\u4e5f\u4e0d\u8fde\u7ed3","appearance_style":"\u6837\u5f0f\u8868\u4e0e\u6837\u5f0f\u5c5e\u6027",stylesheet:"\u6837\u5f0f\u8868",style:"\u6837\u5f0f",author:"\u4f5c\u8005",copyright:"\u7248\u6743\u58f0\u660e",add:"\u6dfb\u52a0\u5143\u7d20",remove:"\u5220\u9664\u9009\u62e9\u5143\u7d20",moveup:"\u4e0a\u79fb\u9009\u62e9\u5143\u7d20",movedown:"\u4e0b\u79fb\u9009\u62e9\u5143\u7d20","head_elements":"Head\u5143\u7d20",info:"\u4fe1\u606f","add_title":"Title\u5143\u7d20","add_meta":"Meta\u5143\u7d20","add_script":"Script\u5143\u7d20","add_style":"Style\u5143\u7d20","add_link":"Link\u5143\u7d20","add_base":"Base\u5143\u7d20","add_comment":"\u6ce8\u91ca","title_element":"Title\u5143\u7d20","script_element":"Script\u5143\u7d20","style_element":"Style\u5143\u7d20","base_element":"Base\u5143\u7d20","link_element":"Link\u5143\u7d20","meta_element":"Meta\u5143\u7d20","comment_element":"\u6ce8\u91ca",src:"\u5730\u5740",language:"\u8bed\u8a00",href:"Href",target:"\u76ee\u6807",type:"\u7c7b\u578b",charset:"\u5b57\u7b26\u96c6",defer:"Defer",media:"\u5a92\u4f53",properties:"\u5c5e\u6027",name:"\u540d\u79f0",value:"\u503c",content:"\u5185\u5bb9",rel:"Rel",rev:"Rev",hreflang:"Href\u8bed\u8a00","general_props":"\u5e38\u89c4","advanced_props":"\u9ad8\u7ea7"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullscreen/editor_plugin.js b/webcit/tiny_mce/plugins/fullscreen/editor_plugin.js
new file mode 100644 (file)
index 0000000..a6456f8
--- /dev/null
@@ -0,0 +1 @@
+(function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.FullScreenPlugin",{init:function(d,e){var f=this,g={},c,b;f.editor=d;d.addCommand("mceFullScreen",function(){var i,j=a.doc.documentElement;if(d.getParam("fullscreen_is_enabled")){if(d.getParam("fullscreen_new_window")){closeFullscreen()}else{a.win.setTimeout(function(){tinymce.dom.Event.remove(a.win,"resize",f.resizeFunc);tinyMCE.get(d.getParam("fullscreen_editor_id")).setContent(d.getContent());tinyMCE.remove(d);a.remove("mce_fullscreen_container");j.style.overflow=d.getParam("fullscreen_html_overflow");a.setStyle(a.doc.body,"overflow",d.getParam("fullscreen_overflow"));a.win.scrollTo(d.getParam("fullscreen_scrollx"),d.getParam("fullscreen_scrolly"));tinyMCE.settings=tinyMCE.oldSettings},10)}return}if(d.getParam("fullscreen_new_window")){i=a.win.open(e+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{i.resizeTo(screen.availWidth,screen.availHeight)}catch(h){}}else{tinyMCE.oldSettings=tinyMCE.settings;g.fullscreen_overflow=a.getStyle(a.doc.body,"overflow",1)||"auto";g.fullscreen_html_overflow=a.getStyle(j,"overflow",1);c=a.getViewPort();g.fullscreen_scrollx=c.x;g.fullscreen_scrolly=c.y;if(tinymce.isOpera&&g.fullscreen_overflow=="visible"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&g.fullscreen_overflow=="scroll"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&(g.fullscreen_html_overflow=="visible"||g.fullscreen_html_overflow=="scroll")){g.fullscreen_html_overflow="auto"}if(g.fullscreen_overflow=="0px"){g.fullscreen_overflow=""}a.setStyle(a.doc.body,"overflow","hidden");j.style.overflow="hidden";c=a.getViewPort();a.win.scrollTo(0,0);if(tinymce.isIE){c.h-=1}if(tinymce.isIE6){b="absolute;top:"+c.y}else{b="fixed;top:0"}n=a.add(a.doc.body,"div",{id:"mce_fullscreen_container",style:"position:"+b+";left:0;width:"+c.w+"px;height:"+c.h+"px;z-index:200000;"});a.add(n,"div",{id:"mce_fullscreen"});tinymce.each(d.settings,function(k,l){g[l]=k});g.id="mce_fullscreen";g.width=n.clientWidth;g.height=n.clientHeight-15;g.fullscreen_is_enabled=true;g.fullscreen_editor_id=d.id;g.theme_advanced_resizing=false;g.save_onsavecallback=function(){d.setContent(tinyMCE.get(g.id).getContent());d.execCommand("mceSave")};tinymce.each(d.getParam("fullscreen_settings"),function(m,l){g[l]=m});if(g.theme_advanced_toolbar_location==="external"){g.theme_advanced_toolbar_location="top"}f.fullscreenEditor=new tinymce.Editor("mce_fullscreen",g);f.fullscreenEditor.onInit.add(function(){f.fullscreenEditor.setContent(d.getContent());f.fullscreenEditor.focus()});f.fullscreenEditor.render();f.fullscreenElement=new tinymce.dom.Element("mce_fullscreen_container");f.fullscreenElement.update();f.resizeFunc=tinymce.dom.Event.add(a.win,"resize",function(){var o=tinymce.DOM.getViewPort(),l=f.fullscreenEditor,k,m;k=l.dom.getSize(l.getContainer().firstChild);m=l.dom.getSize(l.getContainer().getElementsByTagName("iframe")[0]);l.theme.resizeTo(o.w-k.w+m.w,o.h-k.h+m.h)})}});d.addButton("fullscreen",{title:"fullscreen.desc",cmd:"mceFullScreen"});d.onNodeChange.add(function(i,h){h.setActive("fullscreen",i.getParam("fullscreen_is_enabled"))})},getInfo:function(){return{longname:"Fullscreen",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("fullscreen",tinymce.plugins.FullScreenPlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullscreen/editor_plugin_src.js b/webcit/tiny_mce/plugins/fullscreen/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..afa4f9b
--- /dev/null
@@ -0,0 +1,159 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM;\r
+\r
+       tinymce.create('tinymce.plugins.FullScreenPlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this, s = {}, vp, posCss;\r
+\r
+                       t.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceFullScreen', function() {\r
+                               var win, de = DOM.doc.documentElement;\r
+\r
+                               if (ed.getParam('fullscreen_is_enabled')) {\r
+                                       if (ed.getParam('fullscreen_new_window'))\r
+                                               closeFullscreen(); // Call to close in new window\r
+                                       else {\r
+                                               DOM.win.setTimeout(function() {\r
+                                                       tinymce.dom.Event.remove(DOM.win, 'resize', t.resizeFunc);\r
+                                                       tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent());\r
+                                                       tinyMCE.remove(ed);\r
+                                                       DOM.remove('mce_fullscreen_container');\r
+                                                       de.style.overflow = ed.getParam('fullscreen_html_overflow');\r
+                                                       DOM.setStyle(DOM.doc.body, 'overflow', ed.getParam('fullscreen_overflow'));\r
+                                                       DOM.win.scrollTo(ed.getParam('fullscreen_scrollx'), ed.getParam('fullscreen_scrolly'));\r
+                                                       tinyMCE.settings = tinyMCE.oldSettings; // Restore old settings\r
+                                               }, 10);\r
+                                       }\r
+\r
+                                       return;\r
+                               }\r
+\r
+                               if (ed.getParam('fullscreen_new_window')) {\r
+                                       win = DOM.win.open(url + "/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight);\r
+                                       try {\r
+                                               win.resizeTo(screen.availWidth, screen.availHeight);\r
+                                       } catch (e) {\r
+                                               // Ignore\r
+                                       }\r
+                               } else {\r
+                                       tinyMCE.oldSettings = tinyMCE.settings; // Store old settings\r
+                                       s.fullscreen_overflow = DOM.getStyle(DOM.doc.body, 'overflow', 1) || 'auto';\r
+                                       s.fullscreen_html_overflow = DOM.getStyle(de, 'overflow', 1);\r
+                                       vp = DOM.getViewPort();\r
+                                       s.fullscreen_scrollx = vp.x;\r
+                                       s.fullscreen_scrolly = vp.y;\r
+\r
+                                       // Fixes an Opera bug where the scrollbars doesn't reappear\r
+                                       if (tinymce.isOpera && s.fullscreen_overflow == 'visible')\r
+                                               s.fullscreen_overflow = 'auto';\r
+\r
+                                       // Fixes an IE bug where horizontal scrollbars would appear\r
+                                       if (tinymce.isIE && s.fullscreen_overflow == 'scroll')\r
+                                               s.fullscreen_overflow = 'auto';\r
+\r
+                                       // Fixes an IE bug where the scrollbars doesn't reappear\r
+                                       if (tinymce.isIE && (s.fullscreen_html_overflow == 'visible' || s.fullscreen_html_overflow == 'scroll'))\r
+                                               s.fullscreen_html_overflow = 'auto'; \r
+\r
+                                       if (s.fullscreen_overflow == '0px')\r
+                                               s.fullscreen_overflow = '';\r
+\r
+                                       DOM.setStyle(DOM.doc.body, 'overflow', 'hidden');\r
+                                       de.style.overflow = 'hidden'; //Fix for IE6/7\r
+                                       vp = DOM.getViewPort();\r
+                                       DOM.win.scrollTo(0, 0);\r
+\r
+                                       if (tinymce.isIE)\r
+                                               vp.h -= 1;\r
+\r
+                                       // Use fixed position if it exists\r
+                                       if (tinymce.isIE6)\r
+                                               posCss = 'absolute;top:' + vp.y;\r
+                                       else\r
+                                               posCss = 'fixed;top:0';\r
+\r
+                                       n = DOM.add(DOM.doc.body, 'div', {\r
+                                               id : 'mce_fullscreen_container', \r
+                                               style : 'position:' + posCss + ';left:0;width:' + vp.w + 'px;height:' + vp.h + 'px;z-index:200000;'});\r
+                                       DOM.add(n, 'div', {id : 'mce_fullscreen'});\r
+\r
+                                       tinymce.each(ed.settings, function(v, n) {\r
+                                               s[n] = v;\r
+                                       });\r
+\r
+                                       s.id = 'mce_fullscreen';\r
+                                       s.width = n.clientWidth;\r
+                                       s.height = n.clientHeight - 15;\r
+                                       s.fullscreen_is_enabled = true;\r
+                                       s.fullscreen_editor_id = ed.id;\r
+                                       s.theme_advanced_resizing = false;\r
+                                       s.save_onsavecallback = function() {\r
+                                               ed.setContent(tinyMCE.get(s.id).getContent());\r
+                                               ed.execCommand('mceSave');\r
+                                       };\r
+\r
+                                       tinymce.each(ed.getParam('fullscreen_settings'), function(v, k) {\r
+                                               s[k] = v;\r
+                                       });\r
+\r
+                                       if (s.theme_advanced_toolbar_location === 'external')\r
+                                               s.theme_advanced_toolbar_location = 'top';\r
+\r
+                                       t.fullscreenEditor = new tinymce.Editor('mce_fullscreen', s);\r
+                                       t.fullscreenEditor.onInit.add(function() {\r
+                                               t.fullscreenEditor.setContent(ed.getContent());\r
+                                               t.fullscreenEditor.focus();\r
+                                       });\r
+\r
+                                       t.fullscreenEditor.render();\r
+\r
+                                       t.fullscreenElement = new tinymce.dom.Element('mce_fullscreen_container');\r
+                                       t.fullscreenElement.update();\r
+                                       //document.body.overflow = 'hidden';\r
+\r
+                                       t.resizeFunc = tinymce.dom.Event.add(DOM.win, 'resize', function() {\r
+                                               var vp = tinymce.DOM.getViewPort(), fed = t.fullscreenEditor, outerSize, innerSize;\r
+\r
+                                               // Get outer/inner size to get a delta size that can be used to calc the new iframe size\r
+                                               outerSize = fed.dom.getSize(fed.getContainer().firstChild);\r
+                                               innerSize = fed.dom.getSize(fed.getContainer().getElementsByTagName('iframe')[0]);\r
+\r
+                                               fed.theme.resizeTo(vp.w - outerSize.w + innerSize.w, vp.h - outerSize.h + innerSize.h);\r
+                                       });\r
+                               }\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('fullscreen', {title : 'fullscreen.desc', cmd : 'mceFullScreen'});\r
+\r
+                       ed.onNodeChange.add(function(ed, cm) {\r
+                               cm.setActive('fullscreen', ed.getParam('fullscreen_is_enabled'));\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Fullscreen',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('fullscreen', tinymce.plugins.FullScreenPlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullscreen/fullscreen.htm b/webcit/tiny_mce/plugins/fullscreen/fullscreen.htm
new file mode 100644 (file)
index 0000000..ffe528e
--- /dev/null
@@ -0,0 +1,110 @@
+<!DOCTYPE html>\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title></title>\r
+       <meta http-equiv="X-UA-Compatible" content="IE=edge" />\r
+       <script type="text/javascript" src="../../tiny_mce.js"></script>\r
+       <script type="text/javascript">\r
+               function patchCallback(settings, key) {\r
+                       if (settings[key])\r
+                               settings[key] = "window.opener." + settings[key];\r
+               }\r
+\r
+               var settings = {}, paSe = window.opener.tinyMCE.activeEditor.settings, oeID = window.opener.tinyMCE.activeEditor.id;\r
+\r
+               // Clone array\r
+               for (var n in paSe)\r
+                       settings[n] = paSe[n];\r
+\r
+               // Override options for fullscreen\r
+               for (var n in paSe.fullscreen_settings)\r
+                       settings[n] = paSe.fullscreen_settings[n];\r
+\r
+               // Patch callbacks, make them point to window.opener\r
+               patchCallback(settings, 'urlconverter_callback');\r
+               patchCallback(settings, 'insertlink_callback');\r
+               patchCallback(settings, 'insertimage_callback');\r
+               patchCallback(settings, 'setupcontent_callback');\r
+               patchCallback(settings, 'save_callback');\r
+               patchCallback(settings, 'onchange_callback');\r
+               patchCallback(settings, 'init_instance_callback');\r
+               patchCallback(settings, 'file_browser_callback');\r
+               patchCallback(settings, 'cleanup_callback');\r
+               patchCallback(settings, 'execcommand_callback');\r
+               patchCallback(settings, 'oninit');\r
+\r
+               // Set options\r
+               delete settings.id;\r
+               settings['mode'] = 'exact';\r
+               settings['elements'] = 'fullscreenarea';\r
+               settings['add_unload_trigger'] = false;\r
+               settings['ask'] = false;\r
+               settings['document_base_url'] = window.opener.tinyMCE.activeEditor.documentBaseURI.getURI();\r
+               settings['fullscreen_is_enabled'] = true;\r
+               settings['fullscreen_editor_id'] = oeID;\r
+               settings['theme_advanced_resizing'] = false;\r
+               settings['strict_loading_mode'] = true;\r
+\r
+               settings.save_onsavecallback = function() {\r
+                       window.opener.tinyMCE.get(oeID).setContent(tinyMCE.get('fullscreenarea').getContent({format : 'raw'}), {format : 'raw'});\r
+                       window.opener.tinyMCE.get(oeID).execCommand('mceSave');\r
+                       window.close();\r
+               };\r
+\r
+               function unloadHandler(e) {\r
+                       moveContent();\r
+               }\r
+\r
+               function moveContent() {\r
+                       window.opener.tinyMCE.get(oeID).setContent(tinyMCE.activeEditor.getContent());\r
+               }\r
+\r
+               function closeFullscreen() {\r
+                       moveContent();\r
+                       window.close();\r
+               }\r
+\r
+               function doParentSubmit() {\r
+                       moveContent();\r
+\r
+                       if (window.opener.tinyMCE.selectedInstance.formElement.form)\r
+                               window.opener.tinyMCE.selectedInstance.formElement.form.submit();\r
+\r
+                       window.close();\r
+\r
+                       return false;\r
+               }\r
+\r
+               function render() {\r
+                       var e = document.getElementById('fullscreenarea'), vp, ed, ow, oh, dom = tinymce.DOM;\r
+\r
+                       e.value = window.opener.tinyMCE.get(oeID).getContent();\r
+\r
+                       vp = dom.getViewPort();\r
+                       settings.width = vp.w;\r
+                       settings.height = vp.h - 15;\r
+\r
+                       tinymce.dom.Event.add(window, 'resize', function() {\r
+                               var vp = dom.getViewPort();\r
+\r
+                               tinyMCE.activeEditor.theme.resizeTo(vp.w, vp.h);\r
+                       });\r
+\r
+                       tinyMCE.init(settings);\r
+               }\r
+\r
+               // Add onunload\r
+               tinymce.dom.Event.add(window, "beforeunload", unloadHandler);\r
+       </script>\r
+</head>\r
+<body style="margin:0;overflow:hidden;width:100%;height:100%" scrolling="no" scroll="no">\r
+<form onsubmit="doParentSubmit();">\r
+<textarea id="fullscreenarea" style="width:100%; height:100%"></textarea>\r
+</form>\r
+\r
+<script type="text/javascript">\r
+       render();\r
+</script>\r
+\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/iespell/editor_plugin.js b/webcit/tiny_mce/plugins/iespell/editor_plugin.js
new file mode 100644 (file)
index 0000000..e9cba10
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.IESpell",{init:function(a,b){var c=this,d;if(!tinymce.isIE){return}c.editor=a;a.addCommand("mceIESpell",function(){try{d=new ActiveXObject("ieSpell.ieSpellExtension");d.CheckDocumentNode(a.getDoc().documentElement)}catch(f){if(f.number==-2146827859){a.windowManager.confirm(a.getLang("iespell.download"),function(e){if(e){window.open("http://www.iespell.com/download.php","ieSpellDownload","")}})}else{a.windowManager.alert("Error Loading ieSpell: Exception "+f.number)}}});a.addButton("iespell",{title:"iespell.iespell_desc",cmd:"mceIESpell"})},getInfo:function(){return{longname:"IESpell (IE Only)",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("iespell",tinymce.plugins.IESpell)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/iespell/editor_plugin_src.js b/webcit/tiny_mce/plugins/iespell/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..1b2bb98
--- /dev/null
@@ -0,0 +1,54 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.IESpell', {\r
+               init : function(ed, url) {\r
+                       var t = this, sp;\r
+\r
+                       if (!tinymce.isIE)\r
+                               return;\r
+\r
+                       t.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceIESpell', function() {\r
+                               try {\r
+                                       sp = new ActiveXObject("ieSpell.ieSpellExtension");\r
+                                       sp.CheckDocumentNode(ed.getDoc().documentElement);\r
+                               } catch (e) {\r
+                                       if (e.number == -2146827859) {\r
+                                               ed.windowManager.confirm(ed.getLang("iespell.download"), function(s) {\r
+                                                       if (s)\r
+                                                               window.open('http://www.iespell.com/download.php', 'ieSpellDownload', '');\r
+                                               });\r
+                                       } else\r
+                                               ed.windowManager.alert("Error Loading ieSpell: Exception " + e.number);\r
+                               }\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('iespell', {title : 'iespell.iespell_desc', cmd : 'mceIESpell'});\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'IESpell (IE Only)',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('iespell', tinymce.plugins.IESpell);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/inlinepopups/editor_plugin.js b/webcit/tiny_mce/plugins/inlinepopups/editor_plugin.js
new file mode 100644 (file)
index 0000000..8bb96f9
--- /dev/null
@@ -0,0 +1 @@
+(function(){var d=tinymce.DOM,b=tinymce.dom.Element,a=tinymce.dom.Event,e=tinymce.each,c=tinymce.is;tinymce.create("tinymce.plugins.InlinePopups",{init:function(f,g){f.onBeforeRenderUI.add(function(){f.windowManager=new tinymce.InlineWindowManager(f);d.loadCSS(g+"/skins/"+(f.settings.inlinepopups_skin||"clearlooks2")+"/window.css")})},getInfo:function(){return{longname:"InlinePopups",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.create("tinymce.InlineWindowManager:tinymce.WindowManager",{InlineWindowManager:function(f){var g=this;g.parent(f);g.zIndex=300000;g.count=0;g.windows={}},open:function(s,j){var z=this,i,k="",r=z.editor,g=0,v=0,h,m,o,q,l,x,y,n;s=s||{};j=j||{};if(!s.inline){return z.parent(s,j)}n=z._frontWindow();if(n&&d.get(n.id+"_ifr")){n.focussedElement=d.get(n.id+"_ifr").contentWindow.document.activeElement}if(!s.type){z.bookmark=r.selection.getBookmark(1)}i=d.uniqueId();h=d.getViewPort();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240)+(tinymce.isIE?8:0);s.min_width=parseInt(s.min_width||150);s.min_height=parseInt(s.min_height||100);s.max_width=parseInt(s.max_width||2000);s.max_height=parseInt(s.max_height||2000);s.left=s.left||Math.round(Math.max(h.x,h.x+(h.w/2)-(s.width/2)));s.top=s.top||Math.round(Math.max(h.y,h.y+(h.h/2)-(s.height/2)));s.movable=s.resizable=true;j.mce_width=s.width;j.mce_height=s.height;j.mce_inline=true;j.mce_window_id=i;j.mce_auto_focus=s.auto_focus;z.features=s;z.params=j;z.onOpen.dispatch(z,s,j);if(s.type){k+=" mceModal";if(s.type){k+=" mce"+s.type.substring(0,1).toUpperCase()+s.type.substring(1)}s.resizable=false}if(s.statusbar){k+=" mceStatusbar"}if(s.resizable){k+=" mceResizable"}if(s.minimizable){k+=" mceMinimizable"}if(s.maximizable){k+=" mceMaximizable"}if(s.movable){k+=" mceMovable"}z._addAll(d.doc.body,["div",{id:i,role:"dialog","aria-labelledby":s.type?i+"_content":i+"_title","class":(r.settings.inlinepopups_skin||"clearlooks2")+(tinymce.isIE&&window.getSelection?" ie9":""),style:"width:100px;height:100px"},["div",{id:i+"_wrapper","class":"mceWrapper"+k},["div",{id:i+"_top","class":"mceTop"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_title"},s.title||""]],["div",{id:i+"_middle","class":"mceMiddle"},["div",{id:i+"_left","class":"mceLeft",tabindex:"0"}],["span",{id:i+"_content"}],["div",{id:i+"_right","class":"mceRight",tabindex:"0"}]],["div",{id:i+"_bottom","class":"mceBottom"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_status"},"Content"]],["a",{"class":"mceMove",tabindex:"-1",href:"javascript:;"}],["a",{"class":"mceMin",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMax",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMed",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceClose",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{id:i+"_resize_n","class":"mceResize mceResizeN",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_s","class":"mceResize mceResizeS",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_w","class":"mceResize mceResizeW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_e","class":"mceResize mceResizeE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_nw","class":"mceResize mceResizeNW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_ne","class":"mceResize mceResizeNE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_sw","class":"mceResize mceResizeSW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_se","class":"mceResize mceResizeSE",tabindex:"-1",href:"javascript:;"}]]]);d.setStyles(i,{top:-10000,left:-10000});if(tinymce.isGecko){d.setStyle(i,"overflow","auto")}if(!s.type){g+=d.get(i+"_left").clientWidth;g+=d.get(i+"_right").clientWidth;v+=d.get(i+"_top").clientHeight;v+=d.get(i+"_bottom").clientHeight}d.setStyles(i,{top:s.top,left:s.left,width:s.width+g,height:s.height+v});y=s.url||s.file;if(y){if(tinymce.relaxedDomain){y+=(y.indexOf("?")==-1?"?":"&")+"mce_rdomain="+tinymce.relaxedDomain}y=tinymce._addVer(y)}if(!s.type){d.add(i+"_content","iframe",{id:i+"_ifr",src:'javascript:""',frameBorder:0,style:"border:0;width:10px;height:10px"});d.setStyles(i+"_ifr",{width:s.width,height:s.height});d.setAttrib(i+"_ifr","src",y)}else{d.add(i+"_wrapper","a",{id:i+"_ok","class":"mceButton mceOk",href:"javascript:;",onmousedown:"return false;"},"Ok");if(s.type=="confirm"){d.add(i+"_wrapper","a",{"class":"mceButton mceCancel",href:"javascript:;",onmousedown:"return false;"},"Cancel")}d.add(i+"_middle","div",{"class":"mceIcon"});d.setHTML(i+"_content",s.content.replace("\n","<br />"));a.add(i,"keyup",function(f){var p=27;if(f.keyCode===p){s.button_func(false);return a.cancel(f)}});a.add(i,"keydown",function(f){var t,p=9;if(f.keyCode===p){t=d.select("a.mceCancel",i+"_wrapper")[0];if(t&&t!==f.target){t.focus()}else{d.get(i+"_ok").focus()}return a.cancel(f)}})}o=a.add(i,"mousedown",function(t){var u=t.target,f,p;f=z.windows[i];z.focus(i);if(u.nodeName=="A"||u.nodeName=="a"){if(u.className=="mceClose"){z.close(null,i);return a.cancel(t)}else{if(u.className=="mceMax"){f.oldPos=f.element.getXY();f.oldSize=f.element.getSize();p=d.getViewPort();p.w-=2;p.h-=2;f.element.moveTo(p.x,p.y);f.element.resizeTo(p.w,p.h);d.setStyles(i+"_ifr",{width:p.w-f.deltaWidth,height:p.h-f.deltaHeight});d.addClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMed"){f.element.moveTo(f.oldPos.x,f.oldPos.y);f.element.resizeTo(f.oldSize.w,f.oldSize.h);f.iframeElement.resizeTo(f.oldSize.w-f.deltaWidth,f.oldSize.h-f.deltaHeight);d.removeClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMove"){return z._startDrag(i,t,u.className)}else{if(d.hasClass(u,"mceResize")){return z._startDrag(i,t,u.className.substring(13))}}}}}}});q=a.add(i,"click",function(f){var p=f.target;z.focus(i);if(p.nodeName=="A"||p.nodeName=="a"){switch(p.className){case"mceClose":z.close(null,i);return a.cancel(f);case"mceButton mceOk":case"mceButton mceCancel":s.button_func(p.className=="mceButton mceOk");return a.cancel(f)}}});a.add([i+"_left",i+"_right"],"focus",function(p){var t=d.get(i+"_ifr");if(t){var f=t.contentWindow.document.body;var u=d.select(":input:enabled,*[tabindex=0]",f);if(p.target.id===(i+"_left")){u[u.length-1].focus()}else{u[0].focus()}}else{d.get(i+"_ok").focus()}});x=z.windows[i]={id:i,mousedown_func:o,click_func:q,element:new b(i,{blocker:1,container:r.getContainer()}),iframeElement:new b(i+"_ifr"),features:s,deltaWidth:g,deltaHeight:v};x.iframeElement.on("focus",function(){z.focus(i)});if(z.count==0&&z.editor.getParam("dialog_type","modal")=="modal"){d.add(d.doc.body,"div",{id:"mceModalBlocker","class":(z.editor.settings.inlinepopups_skin||"clearlooks2")+"_modalBlocker",style:{zIndex:z.zIndex-1}});d.show("mceModalBlocker");d.setAttrib(d.doc.body,"aria-hidden","true")}else{d.setStyle("mceModalBlocker","z-index",z.zIndex-1)}if(tinymce.isIE6||/Firefox\/2\./.test(navigator.userAgent)||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceModalBlocker",{position:"absolute",left:h.x,top:h.y,width:h.w-2,height:h.h-2})}d.setAttrib(i,"aria-hidden","false");z.focus(i);z._fixIELayout(i,1);if(d.get(i+"_ok")){d.get(i+"_ok").focus()}z.count++;return x},focus:function(h){var g=this,f;if(f=g.windows[h]){f.zIndex=this.zIndex++;f.element.setStyle("zIndex",f.zIndex);f.element.update();h=h+"_wrapper";d.removeClass(g.lastId,"mceFocus");d.addClass(h,"mceFocus");g.lastId=h;if(f.focussedElement){f.focussedElement.focus()}else{if(d.get(h+"_ok")){d.get(f.id+"_ok").focus()}else{if(d.get(f.id+"_ifr")){d.get(f.id+"_ifr").focus()}}}}},_addAll:function(k,h){var g,l,f=this,j=tinymce.DOM;if(c(h,"string")){k.appendChild(j.doc.createTextNode(h))}else{if(h.length){k=k.appendChild(j.create(h[0],h[1]));for(g=2;g<h.length;g++){f._addAll(k,h[g])}}}},_startDrag:function(v,G,E){var o=this,u,z,C=d.doc,f,l=o.windows[v],h=l.element,y=h.getXY(),x,q,F,g,A,s,r,j,i,m,k,n,B;g={x:0,y:0};A=d.getViewPort();A.w-=2;A.h-=2;j=G.screenX;i=G.screenY;m=k=n=B=0;u=a.add(C,"mouseup",function(p){a.remove(C,"mouseup",u);a.remove(C,"mousemove",z);if(f){f.remove()}h.moveBy(m,k);h.resizeBy(n,B);q=h.getSize();d.setStyles(v+"_ifr",{width:q.w-l.deltaWidth,height:q.h-l.deltaHeight});o._fixIELayout(v,1);return a.cancel(p)});if(E!="Move"){D()}function D(){if(f){return}o._fixIELayout(v,0);d.add(C.body,"div",{id:"mceEventBlocker","class":"mceEventBlocker "+(o.editor.settings.inlinepopups_skin||"clearlooks2"),style:{zIndex:o.zIndex+1}});if(tinymce.isIE6||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceEventBlocker",{position:"absolute",left:A.x,top:A.y,width:A.w-2,height:A.h-2})}f=new b("mceEventBlocker");f.update();x=h.getXY();q=h.getSize();s=g.x+x.x-A.x;r=g.y+x.y-A.y;d.add(f.get(),"div",{id:"mcePlaceHolder","class":"mcePlaceHolder",style:{left:s,top:r,width:q.w,height:q.h}});F=new b("mcePlaceHolder")}z=a.add(C,"mousemove",function(w){var p,H,t;D();p=w.screenX-j;H=w.screenY-i;switch(E){case"ResizeW":m=p;n=0-p;break;case"ResizeE":n=p;break;case"ResizeN":case"ResizeNW":case"ResizeNE":if(E=="ResizeNW"){m=p;n=0-p}else{if(E=="ResizeNE"){n=p}}k=H;B=0-H;break;case"ResizeS":case"ResizeSW":case"ResizeSE":if(E=="ResizeSW"){m=p;n=0-p}else{if(E=="ResizeSE"){n=p}}B=H;break;case"mceMove":m=p;k=H;break}if(n<(t=l.features.min_width-q.w)){if(m!==0){m+=n-t}n=t}if(B<(t=l.features.min_height-q.h)){if(k!==0){k+=B-t}B=t}n=Math.min(n,l.features.max_width-q.w);B=Math.min(B,l.features.max_height-q.h);m=Math.max(m,A.x-(s+A.x));k=Math.max(k,A.y-(r+A.y));m=Math.min(m,(A.w+A.x)-(s+q.w+A.x));k=Math.min(k,(A.h+A.y)-(r+q.h+A.y));if(m+k!==0){if(s+m<0){m=0}if(r+k<0){k=0}F.moveTo(s+m,r+k)}if(n+B!==0){F.resizeTo(q.w+n,q.h+B)}return a.cancel(w)});return a.cancel(G)},resizeBy:function(g,h,i){var f=this.windows[i];if(f){f.element.resizeBy(g,h);f.iframeElement.resizeBy(g,h)}},close:function(i,k){var g=this,f,j=d.doc,h,k;k=g._findId(k||i);if(!g.windows[k]){g.parent(i);return}g.count--;if(g.count==0){d.remove("mceModalBlocker");d.setAttrib(d.doc.body,"aria-hidden","false");g.editor.focus()}if(f=g.windows[k]){g.onClose.dispatch(g);a.remove(j,"mousedown",f.mousedownFunc);a.remove(j,"click",f.clickFunc);a.clear(k);a.clear(k+"_ifr");d.setAttrib(k+"_ifr","src",'javascript:""');f.element.remove();delete g.windows[k];h=g._frontWindow();if(h){g.focus(h.id)}}},_frontWindow:function(){var g,f=0;e(this.windows,function(h){if(h.zIndex>f){g=h;f=h.zIndex}});return g},setTitle:function(f,g){var h;f=this._findId(f);if(h=d.get(f+"_title")){h.innerHTML=d.encode(g)}},alert:function(g,f,j){var i=this,h;h=i.open({title:i,type:"alert",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},confirm:function(g,f,j){var i=this,h;h=i.open({title:i,type:"confirm",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},_findId:function(f){var g=this;if(typeof(f)=="string"){return f}e(g.windows,function(h){var i=d.get(h.id+"_ifr");if(i&&f==i.contentWindow){f=h.id;return false}});return f},_fixIELayout:function(i,h){var f,g;if(!tinymce.isIE6){return}e(["n","s","w","e","nw","ne","sw","se"],function(j){var k=d.get(i+"_resize_"+j);d.setStyles(k,{width:h?k.clientWidth:"",height:h?k.clientHeight:"",cursor:d.getStyle(k,"cursor",1)});d.setStyle(i+"_bottom","bottom","-1px");k=0});if(f=this.windows[i]){f.element.hide();f.element.show();e(d.select("div,a",i),function(k,j){if(k.currentStyle.backgroundImage!="none"){g=new Image();g.src=k.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,"$1")}});d.get(i).style.filter=""}}});tinymce.PluginManager.add("inlinepopups",tinymce.plugins.InlinePopups)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/inlinepopups/editor_plugin_src.js b/webcit/tiny_mce/plugins/inlinepopups/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..67123ca
--- /dev/null
@@ -0,0 +1,699 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is;\r
+\r
+       tinymce.create('tinymce.plugins.InlinePopups', {\r
+               init : function(ed, url) {\r
+                       // Replace window manager\r
+                       ed.onBeforeRenderUI.add(function() {\r
+                               ed.windowManager = new tinymce.InlineWindowManager(ed);\r
+                               DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css");\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'InlinePopups',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', {\r
+               InlineWindowManager : function(ed) {\r
+                       var t = this;\r
+\r
+                       t.parent(ed);\r
+                       t.zIndex = 300000;\r
+                       t.count = 0;\r
+                       t.windows = {};\r
+               },\r
+\r
+               open : function(f, p) {\r
+                       var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w, u, parentWindow;\r
+\r
+                       f = f || {};\r
+                       p = p || {};\r
+\r
+                       // Run native windows\r
+                       if (!f.inline)\r
+                               return t.parent(f, p);\r
+\r
+                       parentWindow = t._frontWindow();\r
+                       if (parentWindow && DOM.get(parentWindow.id + '_ifr')) {\r
+                               parentWindow.focussedElement = DOM.get(parentWindow.id + '_ifr').contentWindow.document.activeElement;\r
+                       }\r
+                       \r
+                       // Only store selection if the type is a normal window\r
+                       if (!f.type)\r
+                               t.bookmark = ed.selection.getBookmark(1);\r
+\r
+                       id = DOM.uniqueId();\r
+                       vp = DOM.getViewPort();\r
+                       f.width = parseInt(f.width || 320);\r
+                       f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0);\r
+                       f.min_width = parseInt(f.min_width || 150);\r
+                       f.min_height = parseInt(f.min_height || 100);\r
+                       f.max_width = parseInt(f.max_width || 2000);\r
+                       f.max_height = parseInt(f.max_height || 2000);\r
+                       f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0)));\r
+                       f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0)));\r
+                       f.movable = f.resizable = true;\r
+                       p.mce_width = f.width;\r
+                       p.mce_height = f.height;\r
+                       p.mce_inline = true;\r
+                       p.mce_window_id = id;\r
+                       p.mce_auto_focus = f.auto_focus;\r
+\r
+                       // Transpose\r
+//                     po = DOM.getPos(ed.getContainer());\r
+//                     f.left -= po.x;\r
+//                     f.top -= po.y;\r
+\r
+                       t.features = f;\r
+                       t.params = p;\r
+                       t.onOpen.dispatch(t, f, p);\r
+\r
+                       if (f.type) {\r
+                               opt += ' mceModal';\r
+\r
+                               if (f.type)\r
+                                       opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1);\r
+\r
+                               f.resizable = false;\r
+                       }\r
+\r
+                       if (f.statusbar)\r
+                               opt += ' mceStatusbar';\r
+\r
+                       if (f.resizable)\r
+                               opt += ' mceResizable';\r
+\r
+                       if (f.minimizable)\r
+                               opt += ' mceMinimizable';\r
+\r
+                       if (f.maximizable)\r
+                               opt += ' mceMaximizable';\r
+\r
+                       if (f.movable)\r
+                               opt += ' mceMovable';\r
+\r
+                       // Create DOM objects\r
+                       t._addAll(DOM.doc.body, \r
+                               ['div', {id : id, role : 'dialog', 'aria-labelledby': f.type ? id + '_content' : id + '_title', 'class' : (ed.settings.inlinepopups_skin || 'clearlooks2') + (tinymce.isIE && window.getSelection ? ' ie9' : ''), style : 'width:100px;height:100px'}, \r
+                                       ['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt},\r
+                                               ['div', {id : id + '_top', 'class' : 'mceTop'}, \r
+                                                       ['div', {'class' : 'mceLeft'}],\r
+                                                       ['div', {'class' : 'mceCenter'}],\r
+                                                       ['div', {'class' : 'mceRight'}],\r
+                                                       ['span', {id : id + '_title'}, f.title || '']\r
+                                               ],\r
+\r
+                                               ['div', {id : id + '_middle', 'class' : 'mceMiddle'}, \r
+                                                       ['div', {id : id + '_left', 'class' : 'mceLeft', tabindex : '0'}],\r
+                                                       ['span', {id : id + '_content'}],\r
+                                                       ['div', {id : id + '_right', 'class' : 'mceRight', tabindex : '0'}]\r
+                                               ],\r
+\r
+                                               ['div', {id : id + '_bottom', 'class' : 'mceBottom'},\r
+                                                       ['div', {'class' : 'mceLeft'}],\r
+                                                       ['div', {'class' : 'mceCenter'}],\r
+                                                       ['div', {'class' : 'mceRight'}],\r
+                                                       ['span', {id : id + '_status'}, 'Content']\r
+                                               ],\r
+\r
+                                               ['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}],\r
+                                               ['a', {'class' : 'mceMin', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],\r
+                                               ['a', {'class' : 'mceMax', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],\r
+                                               ['a', {'class' : 'mceMed', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],\r
+                                               ['a', {'class' : 'mceClose', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],\r
+                                               ['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}],\r
+                                               ['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}],\r
+                                               ['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}],\r
+                                               ['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}],\r
+                                               ['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}],\r
+                                               ['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}],\r
+                                               ['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}],\r
+                                               ['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}]\r
+                                       ]\r
+                               ]\r
+                       );\r
+\r
+                       DOM.setStyles(id, {top : -10000, left : -10000});\r
+\r
+                       // Fix gecko rendering bug, where the editors iframe messed with window contents\r
+                       if (tinymce.isGecko)\r
+                               DOM.setStyle(id, 'overflow', 'auto');\r
+\r
+                       // Measure borders\r
+                       if (!f.type) {\r
+                               dw += DOM.get(id + '_left').clientWidth;\r
+                               dw += DOM.get(id + '_right').clientWidth;\r
+                               dh += DOM.get(id + '_top').clientHeight;\r
+                               dh += DOM.get(id + '_bottom').clientHeight;\r
+                       }\r
+\r
+                       // Resize window\r
+                       DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh});\r
+\r
+                       u = f.url || f.file;\r
+                       if (u) {\r
+                               if (tinymce.relaxedDomain)\r
+                                       u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain;\r
+\r
+                               u = tinymce._addVer(u);\r
+                       }\r
+\r
+                       if (!f.type) {\r
+                               DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'});\r
+                               DOM.setStyles(id + '_ifr', {width : f.width, height : f.height});\r
+                               DOM.setAttrib(id + '_ifr', 'src', u);\r
+                       } else {\r
+                               DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok');\r
+\r
+                               if (f.type == 'confirm')\r
+                                       DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel');\r
+\r
+                               DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'});\r
+                               DOM.setHTML(id + '_content', f.content.replace('\n', '<br />'));\r
+                               \r
+                               Event.add(id, 'keyup', function(evt) {\r
+                                       var VK_ESCAPE = 27;\r
+                                       if (evt.keyCode === VK_ESCAPE) {\r
+                                               f.button_func(false);\r
+                                               return Event.cancel(evt);\r
+                                       }\r
+                               });\r
+\r
+                               Event.add(id, 'keydown', function(evt) {\r
+                                       var cancelButton, VK_TAB = 9;\r
+                                       if (evt.keyCode === VK_TAB) {\r
+                                               cancelButton = DOM.select('a.mceCancel', id + '_wrapper')[0];\r
+                                               if (cancelButton && cancelButton !== evt.target) {\r
+                                                       cancelButton.focus();\r
+                                               } else {\r
+                                                       DOM.get(id + '_ok').focus();\r
+                                               }\r
+                                               return Event.cancel(evt);\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       // Register events\r
+                       mdf = Event.add(id, 'mousedown', function(e) {\r
+                               var n = e.target, w, vp;\r
+\r
+                               w = t.windows[id];\r
+                               t.focus(id);\r
+\r
+                               if (n.nodeName == 'A' || n.nodeName == 'a') {\r
+                                       if (n.className == 'mceClose') {\r
+                                               t.close(null, id);\r
+                                               return Event.cancel(e);\r
+                                       } else if (n.className == 'mceMax') {\r
+                                               w.oldPos = w.element.getXY();\r
+                                               w.oldSize = w.element.getSize();\r
+\r
+                                               vp = DOM.getViewPort();\r
+\r
+                                               // Reduce viewport size to avoid scrollbars\r
+                                               vp.w -= 2;\r
+                                               vp.h -= 2;\r
+\r
+                                               w.element.moveTo(vp.x, vp.y);\r
+                                               w.element.resizeTo(vp.w, vp.h);\r
+                                               DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight});\r
+                                               DOM.addClass(id + '_wrapper', 'mceMaximized');\r
+                                       } else if (n.className == 'mceMed') {\r
+                                               // Reset to old size\r
+                                               w.element.moveTo(w.oldPos.x, w.oldPos.y);\r
+                                               w.element.resizeTo(w.oldSize.w, w.oldSize.h);\r
+                                               w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight);\r
+\r
+                                               DOM.removeClass(id + '_wrapper', 'mceMaximized');\r
+                                       } else if (n.className == 'mceMove')\r
+                                               return t._startDrag(id, e, n.className);\r
+                                       else if (DOM.hasClass(n, 'mceResize'))\r
+                                               return t._startDrag(id, e, n.className.substring(13));\r
+                               }\r
+                       });\r
+\r
+                       clf = Event.add(id, 'click', function(e) {\r
+                               var n = e.target;\r
+\r
+                               t.focus(id);\r
+\r
+                               if (n.nodeName == 'A' || n.nodeName == 'a') {\r
+                                       switch (n.className) {\r
+                                               case 'mceClose':\r
+                                                       t.close(null, id);\r
+                                                       return Event.cancel(e);\r
+\r
+                                               case 'mceButton mceOk':\r
+                                               case 'mceButton mceCancel':\r
+                                                       f.button_func(n.className == 'mceButton mceOk');\r
+                                                       return Event.cancel(e);\r
+                                       }\r
+                               }\r
+                       });\r
+                       \r
+                       // Make sure the tab order loops within the dialog.\r
+                       Event.add([id + '_left', id + '_right'], 'focus', function(evt) {\r
+                               var iframe = DOM.get(id + '_ifr');\r
+                               if (iframe) {\r
+                                       var body = iframe.contentWindow.document.body;\r
+                                       var focusable = DOM.select(':input:enabled,*[tabindex=0]', body);\r
+                                       if (evt.target.id === (id + '_left')) {\r
+                                               focusable[focusable.length - 1].focus();\r
+                                       } else {\r
+                                               focusable[0].focus();\r
+                                       }\r
+                               } else {\r
+                                       DOM.get(id + '_ok').focus();\r
+                               }\r
+                       });\r
+                       \r
+                       // Add window\r
+                       w = t.windows[id] = {\r
+                               id : id,\r
+                               mousedown_func : mdf,\r
+                               click_func : clf,\r
+                               element : new Element(id, {blocker : 1, container : ed.getContainer()}),\r
+                               iframeElement : new Element(id + '_ifr'),\r
+                               features : f,\r
+                               deltaWidth : dw,\r
+                               deltaHeight : dh\r
+                       };\r
+\r
+                       w.iframeElement.on('focus', function() {\r
+                               t.focus(id);\r
+                       });\r
+\r
+                       // Setup blocker\r
+                       if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') {\r
+                               DOM.add(DOM.doc.body, 'div', {\r
+                                       id : 'mceModalBlocker',\r
+                                       'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker',\r
+                                       style : {zIndex : t.zIndex - 1}\r
+                               });\r
+\r
+                               DOM.show('mceModalBlocker'); // Reduces flicker in IE\r
+                               DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'true');\r
+                       } else\r
+                               DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1);\r
+\r
+                       if (tinymce.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (tinymce.isIE && !DOM.boxModel))\r
+                               DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2});\r
+\r
+                       DOM.setAttrib(id, 'aria-hidden', 'false');\r
+                       t.focus(id);\r
+                       t._fixIELayout(id, 1);\r
+\r
+                       // Focus ok button\r
+                       if (DOM.get(id + '_ok'))\r
+                               DOM.get(id + '_ok').focus();\r
+                       t.count++;\r
+\r
+                       return w;\r
+               },\r
+\r
+               focus : function(id) {\r
+                       var t = this, w;\r
+\r
+                       if (w = t.windows[id]) {\r
+                               w.zIndex = this.zIndex++;\r
+                               w.element.setStyle('zIndex', w.zIndex);\r
+                               w.element.update();\r
+\r
+                               id = id + '_wrapper';\r
+                               DOM.removeClass(t.lastId, 'mceFocus');\r
+                               DOM.addClass(id, 'mceFocus');\r
+                               t.lastId = id;\r
+                               \r
+                               if (w.focussedElement) {\r
+                                       w.focussedElement.focus();\r
+                               } else if (DOM.get(id + '_ok')) {\r
+                                       DOM.get(w.id + '_ok').focus();\r
+                               } else if (DOM.get(w.id + '_ifr')) {\r
+                                       DOM.get(w.id + '_ifr').focus();\r
+                               }\r
+                       }\r
+               },\r
+\r
+               _addAll : function(te, ne) {\r
+                       var i, n, t = this, dom = tinymce.DOM;\r
+\r
+                       if (is(ne, 'string'))\r
+                               te.appendChild(dom.doc.createTextNode(ne));\r
+                       else if (ne.length) {\r
+                               te = te.appendChild(dom.create(ne[0], ne[1]));\r
+\r
+                               for (i=2; i<ne.length; i++)\r
+                                       t._addAll(te, ne[i]);\r
+                       }\r
+               },\r
+\r
+               _startDrag : function(id, se, ac) {\r
+                       var t = this, mu, mm, d = DOM.doc, eb, w = t.windows[id], we = w.element, sp = we.getXY(), p, sz, ph, cp, vp, sx, sy, sex, sey, dx, dy, dw, dh;\r
+\r
+                       // Get positons and sizes\r
+//                     cp = DOM.getPos(t.editor.getContainer());\r
+                       cp = {x : 0, y : 0};\r
+                       vp = DOM.getViewPort();\r
+\r
+                       // Reduce viewport size to avoid scrollbars while dragging\r
+                       vp.w -= 2;\r
+                       vp.h -= 2;\r
+\r
+                       sex = se.screenX;\r
+                       sey = se.screenY;\r
+                       dx = dy = dw = dh = 0;\r
+\r
+                       // Handle mouse up\r
+                       mu = Event.add(d, 'mouseup', function(e) {\r
+                               Event.remove(d, 'mouseup', mu);\r
+                               Event.remove(d, 'mousemove', mm);\r
+\r
+                               if (eb)\r
+                                       eb.remove();\r
+\r
+                               we.moveBy(dx, dy);\r
+                               we.resizeBy(dw, dh);\r
+                               sz = we.getSize();\r
+                               DOM.setStyles(id + '_ifr', {width : sz.w - w.deltaWidth, height : sz.h - w.deltaHeight});\r
+                               t._fixIELayout(id, 1);\r
+\r
+                               return Event.cancel(e);\r
+                       });\r
+\r
+                       if (ac != 'Move')\r
+                               startMove();\r
+\r
+                       function startMove() {\r
+                               if (eb)\r
+                                       return;\r
+\r
+                               t._fixIELayout(id, 0);\r
+\r
+                               // Setup event blocker\r
+                               DOM.add(d.body, 'div', {\r
+                                       id : 'mceEventBlocker',\r
+                                       'class' : 'mceEventBlocker ' + (t.editor.settings.inlinepopups_skin || 'clearlooks2'),\r
+                                       style : {zIndex : t.zIndex + 1}\r
+                               });\r
+\r
+                               if (tinymce.isIE6 || (tinymce.isIE && !DOM.boxModel))\r
+                                       DOM.setStyles('mceEventBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2});\r
+\r
+                               eb = new Element('mceEventBlocker');\r
+                               eb.update();\r
+\r
+                               // Setup placeholder\r
+                               p = we.getXY();\r
+                               sz = we.getSize();\r
+                               sx = cp.x + p.x - vp.x;\r
+                               sy = cp.y + p.y - vp.y;\r
+                               DOM.add(eb.get(), 'div', {id : 'mcePlaceHolder', 'class' : 'mcePlaceHolder', style : {left : sx, top : sy, width : sz.w, height : sz.h}});\r
+                               ph = new Element('mcePlaceHolder');\r
+                       };\r
+\r
+                       // Handle mouse move/drag\r
+                       mm = Event.add(d, 'mousemove', function(e) {\r
+                               var x, y, v;\r
+\r
+                               startMove();\r
+\r
+                               x = e.screenX - sex;\r
+                               y = e.screenY - sey;\r
+\r
+                               switch (ac) {\r
+                                       case 'ResizeW':\r
+                                               dx = x;\r
+                                               dw = 0 - x;\r
+                                               break;\r
+\r
+                                       case 'ResizeE':\r
+                                               dw = x;\r
+                                               break;\r
+\r
+                                       case 'ResizeN':\r
+                                       case 'ResizeNW':\r
+                                       case 'ResizeNE':\r
+                                               if (ac == "ResizeNW") {\r
+                                                       dx = x;\r
+                                                       dw = 0 - x;\r
+                                               } else if (ac == "ResizeNE")\r
+                                                       dw = x;\r
+\r
+                                               dy = y;\r
+                                               dh = 0 - y;\r
+                                               break;\r
+\r
+                                       case 'ResizeS':\r
+                                       case 'ResizeSW':\r
+                                       case 'ResizeSE':\r
+                                               if (ac == "ResizeSW") {\r
+                                                       dx = x;\r
+                                                       dw = 0 - x;\r
+                                               } else if (ac == "ResizeSE")\r
+                                                       dw = x;\r
+\r
+                                               dh = y;\r
+                                               break;\r
+\r
+                                       case 'mceMove':\r
+                                               dx = x;\r
+                                               dy = y;\r
+                                               break;\r
+                               }\r
+\r
+                               // Boundary check\r
+                               if (dw < (v = w.features.min_width - sz.w)) {\r
+                                       if (dx !== 0)\r
+                                               dx += dw - v;\r
+\r
+                                       dw = v;\r
+                               }\r
+       \r
+                               if (dh < (v = w.features.min_height - sz.h)) {\r
+                                       if (dy !== 0)\r
+                                               dy += dh - v;\r
+\r
+                                       dh = v;\r
+                               }\r
+\r
+                               dw = Math.min(dw, w.features.max_width - sz.w);\r
+                               dh = Math.min(dh, w.features.max_height - sz.h);\r
+                               dx = Math.max(dx, vp.x - (sx + vp.x));\r
+                               dy = Math.max(dy, vp.y - (sy + vp.y));\r
+                               dx = Math.min(dx, (vp.w + vp.x) - (sx + sz.w + vp.x));\r
+                               dy = Math.min(dy, (vp.h + vp.y) - (sy + sz.h + vp.y));\r
+\r
+                               // Move if needed\r
+                               if (dx + dy !== 0) {\r
+                                       if (sx + dx < 0)\r
+                                               dx = 0;\r
+       \r
+                                       if (sy + dy < 0)\r
+                                               dy = 0;\r
+\r
+                                       ph.moveTo(sx + dx, sy + dy);\r
+                               }\r
+\r
+                               // Resize if needed\r
+                               if (dw + dh !== 0)\r
+                                       ph.resizeTo(sz.w + dw, sz.h + dh);\r
+\r
+                               return Event.cancel(e);\r
+                       });\r
+\r
+                       return Event.cancel(se);\r
+               },\r
+\r
+               resizeBy : function(dw, dh, id) {\r
+                       var w = this.windows[id];\r
+\r
+                       if (w) {\r
+                               w.element.resizeBy(dw, dh);\r
+                               w.iframeElement.resizeBy(dw, dh);\r
+                       }\r
+               },\r
+\r
+               close : function(win, id) {\r
+                       var t = this, w, d = DOM.doc, fw, id;\r
+\r
+                       id = t._findId(id || win);\r
+\r
+                       // Probably not inline\r
+                       if (!t.windows[id]) {\r
+                               t.parent(win);\r
+                               return;\r
+                       }\r
+\r
+                       t.count--;\r
+\r
+                       if (t.count == 0) {\r
+                               DOM.remove('mceModalBlocker');\r
+                               DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'false');\r
+                               t.editor.focus();\r
+                       }\r
+\r
+                       if (w = t.windows[id]) {\r
+                               t.onClose.dispatch(t);\r
+                               Event.remove(d, 'mousedown', w.mousedownFunc);\r
+                               Event.remove(d, 'click', w.clickFunc);\r
+                               Event.clear(id);\r
+                               Event.clear(id + '_ifr');\r
+\r
+                               DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak\r
+                               w.element.remove();\r
+                               delete t.windows[id];\r
+\r
+                               fw = t._frontWindow();\r
+\r
+                               if (fw)\r
+                                       t.focus(fw.id);\r
+                       }\r
+               },\r
+               \r
+               // Find front most window\r
+               _frontWindow : function() {\r
+                       var fw, ix = 0;\r
+                       // Find front most window and focus that\r
+                       each (this.windows, function(w) {\r
+                               if (w.zIndex > ix) {\r
+                                       fw = w;\r
+                                       ix = w.zIndex;\r
+                               }\r
+                       });\r
+                       return fw;\r
+               },\r
+\r
+               setTitle : function(w, ti) {\r
+                       var e;\r
+\r
+                       w = this._findId(w);\r
+\r
+                       if (e = DOM.get(w + '_title'))\r
+                               e.innerHTML = DOM.encode(ti);\r
+               },\r
+\r
+               alert : function(txt, cb, s) {\r
+                       var t = this, w;\r
+\r
+                       w = t.open({\r
+                               title : t,\r
+                               type : 'alert',\r
+                               button_func : function(s) {\r
+                                       if (cb)\r
+                                               cb.call(s || t, s);\r
+\r
+                                       t.close(null, w.id);\r
+                               },\r
+                               content : DOM.encode(t.editor.getLang(txt, txt)),\r
+                               inline : 1,\r
+                               width : 400,\r
+                               height : 130\r
+                       });\r
+               },\r
+\r
+               confirm : function(txt, cb, s) {\r
+                       var t = this, w;\r
+\r
+                       w = t.open({\r
+                               title : t,\r
+                               type : 'confirm',\r
+                               button_func : function(s) {\r
+                                       if (cb)\r
+                                               cb.call(s || t, s);\r
+\r
+                                       t.close(null, w.id);\r
+                               },\r
+                               content : DOM.encode(t.editor.getLang(txt, txt)),\r
+                               inline : 1,\r
+                               width : 400,\r
+                               height : 130\r
+                       });\r
+               },\r
+\r
+               // Internal functions\r
+\r
+               _findId : function(w) {\r
+                       var t = this;\r
+\r
+                       if (typeof(w) == 'string')\r
+                               return w;\r
+\r
+                       each(t.windows, function(wo) {\r
+                               var ifr = DOM.get(wo.id + '_ifr');\r
+\r
+                               if (ifr && w == ifr.contentWindow) {\r
+                                       w = wo.id;\r
+                                       return false;\r
+                               }\r
+                       });\r
+\r
+                       return w;\r
+               },\r
+\r
+               _fixIELayout : function(id, s) {\r
+                       var w, img;\r
+\r
+                       if (!tinymce.isIE6)\r
+                               return;\r
+\r
+                       // Fixes the bug where hover flickers and does odd things in IE6\r
+                       each(['n','s','w','e','nw','ne','sw','se'], function(v) {\r
+                               var e = DOM.get(id + '_resize_' + v);\r
+\r
+                               DOM.setStyles(e, {\r
+                                       width : s ? e.clientWidth : '',\r
+                                       height : s ? e.clientHeight : '',\r
+                                       cursor : DOM.getStyle(e, 'cursor', 1)\r
+                               });\r
+\r
+                               DOM.setStyle(id + "_bottom", 'bottom', '-1px');\r
+\r
+                               e = 0;\r
+                       });\r
+\r
+                       // Fixes graphics glitch\r
+                       if (w = this.windows[id]) {\r
+                               // Fixes rendering bug after resize\r
+                               w.element.hide();\r
+                               w.element.show();\r
+\r
+                               // Forced a repaint of the window\r
+                               //DOM.get(id).style.filter = '';\r
+\r
+                               // IE has a bug where images used in CSS won't get loaded\r
+                               // sometimes when the cache in the browser is disabled\r
+                               // This fix tries to solve it by loading the images using the image object\r
+                               each(DOM.select('div,a', id), function(e, i) {\r
+                                       if (e.currentStyle.backgroundImage != 'none') {\r
+                                               img = new Image();\r
+                                               img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1');\r
+                                       }\r
+                               });\r
+\r
+                               DOM.get(id).style.filter = '';\r
+                       }\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups);\r
+})();\r
+\r
diff --git a/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif
new file mode 100644 (file)
index 0000000..2191398
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif
new file mode 100644 (file)
index 0000000..f957e49
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif
new file mode 100644 (file)
index 0000000..6baf64a
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif
new file mode 100644 (file)
index 0000000..20acbbf
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif
new file mode 100644 (file)
index 0000000..d5de1cc
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif
new file mode 100644 (file)
index 0000000..c2a2ad4
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif
new file mode 100644 (file)
index 0000000..0b4cc36
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css b/webcit/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css
new file mode 100644 (file)
index 0000000..a50d4fc
--- /dev/null
@@ -0,0 +1,90 @@
+/* Clearlooks 2 */
+
+/* Reset */
+.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block}
+
+/* General */
+.clearlooks2 {position:absolute; direction:ltr}
+.clearlooks2 .mceWrapper {position:static}
+.mceEventBlocker {position:fixed; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%}
+.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50)}
+.clearlooks2_modalBlocker {position:fixed; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60); display:none}
+
+/* Top */
+.clearlooks2 .mceTop, .clearlooks2 .mceTop div {top:0; width:100%; height:23px}
+.clearlooks2 .mceTop .mceLeft {width:6px; background:url(img/corners.gif)}
+.clearlooks2 .mceTop .mceCenter {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)}
+.clearlooks2 .mceTop .mceRight {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0}
+.clearlooks2 .mceTop span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold}
+.clearlooks2 .mceFocus .mceTop .mceLeft {background:url(img/corners.gif) -6px 0}
+.clearlooks2 .mceFocus .mceTop .mceCenter {background:url(img/horizontal.gif) 0 -23px}
+.clearlooks2 .mceFocus .mceTop .mceRight {background:url(img/corners.gif) -18px 0}
+.clearlooks2 .mceFocus .mceTop span {color:#FFF}
+
+/* Middle */
+.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0}
+.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)}
+.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:url(img/vertical.gif) -5px 0}
+.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF}
+.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:url(img/vertical.gif)}
+
+/* Bottom */
+.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px}
+.clearlooks2 .mceBottom {left:0; bottom:0; width:100%}
+.clearlooks2 .mceBottom div {top:0}
+.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:url(img/corners.gif) -34px -6px}
+.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px}
+.clearlooks2 .mceBottom .mceRight {right:0; width:5px; background: url(img/corners.gif) -34px 0}
+.clearlooks2 .mceBottom span {display:none}
+.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px}
+.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0}
+.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px}
+.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0}
+.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px}
+
+/* Actions */
+.clearlooks2 a {width:29px; height:16px; top:3px;}
+.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0}
+.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0}
+.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0}
+.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0}
+.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px}
+.clearlooks2 .mceMovable .mceMove {display:block}
+.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px}
+.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px}
+.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px}
+.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px}
+.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
+.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
+.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px}
+.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px}
+.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px}
+
+/* Resize */
+.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px}
+.clearlooks2 .mceResizable .mceResize {display:block}
+.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none}
+.clearlooks2 .mceMinimizable .mceMin {display:block}
+.clearlooks2 .mceMaximizable .mceMax {display:block}
+.clearlooks2 .mceMaximized .mceMed {display:block}
+.clearlooks2 .mceMaximized .mceMax {display:none}
+.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize}
+.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize}
+.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize}
+.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;}
+.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize}
+.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize}
+.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize}
+.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize}
+
+/* Alert/Confirm */
+.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0}
+.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px}
+.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal}
+.clearlooks2 a:hover {font-weight:bold;}
+.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#D6D7D5}
+.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px}
+.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)}
+.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px}
+.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto}
+.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)}
diff --git a/webcit/tiny_mce/plugins/inlinepopups/template.htm b/webcit/tiny_mce/plugins/inlinepopups/template.htm
new file mode 100644 (file)
index 0000000..f9ec642
--- /dev/null
@@ -0,0 +1,387 @@
+<!-- <!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>Template for dialogs</title>\r
+<link rel="stylesheet" type="text/css" href="skins/clearlooks2/window.css" />\r
+</head>\r
+<body>\r
+\r
+<div class="mceEditor">\r
+       <div class="clearlooks2" style="width:400px; height:100px; left:10px;">\r
+               <div class="mceWrapper">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Blured</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>Content</span>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar text.</span>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceMin" href="#"></a>\r
+                       <a class="mceMax" href="#"></a>\r
+                       <a class="mceMed" href="#"></a>\r
+                       <a class="mceClose" href="#"></a>\r
+                       <a class="mceResize mceResizeN" href="#"></a>\r
+                       <a class="mceResize mceResizeS" href="#"></a>\r
+                       <a class="mceResize mceResizeW" href="#"></a>\r
+                       <a class="mceResize mceResizeE" href="#"></a>\r
+                       <a class="mceResize mceResizeNW" href="#"></a>\r
+                       <a class="mceResize mceResizeNE" href="#"></a>\r
+                       <a class="mceResize mceResizeSW" href="#"></a>\r
+                       <a class="mceResize mceResizeSE" href="#"></a>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="clearlooks2" style="width:400px; height:100px; left:420px;">\r
+               <div class="mceWrapper mceMovable mceFocus">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Focused</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>Content</span>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar text.</span>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceMin" href="#"></a>\r
+                       <a class="mceMax" href="#"></a>\r
+                       <a class="mceMed" href="#"></a>\r
+                       <a class="mceClose" href="#"></a>\r
+                       <a class="mceResize mceResizeN" href="#"></a>\r
+                       <a class="mceResize mceResizeS" href="#"></a>\r
+                       <a class="mceResize mceResizeW" href="#"></a>\r
+                       <a class="mceResize mceResizeE" href="#"></a>\r
+                       <a class="mceResize mceResizeNW" href="#"></a>\r
+                       <a class="mceResize mceResizeNE" href="#"></a>\r
+                       <a class="mceResize mceResizeSW" href="#"></a>\r
+                       <a class="mceResize mceResizeSE" href="#"></a>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="clearlooks2" style="width:400px; height:100px; left:10px; top:120px;">\r
+               <div class="mceWrapper mceMovable mceFocus mceStatusbar">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>Content</span>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar text.</span>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceMin" href="#"></a>\r
+                       <a class="mceMax" href="#"></a>\r
+                       <a class="mceMed" href="#"></a>\r
+                       <a class="mceClose" href="#"></a>\r
+                       <a class="mceResize mceResizeN" href="#"></a>\r
+                       <a class="mceResize mceResizeS" href="#"></a>\r
+                       <a class="mceResize mceResizeW" href="#"></a>\r
+                       <a class="mceResize mceResizeE" href="#"></a>\r
+                       <a class="mceResize mceResizeNW" href="#"></a>\r
+                       <a class="mceResize mceResizeNE" href="#"></a>\r
+                       <a class="mceResize mceResizeSW" href="#"></a>\r
+                       <a class="mceResize mceResizeSE" href="#"></a>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="clearlooks2" style="width:400px; height:100px; left:420px; top:120px;">\r
+               <div class="mceWrapper mceMovable mceFocus mceStatusbar mceResizable">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar, Resizable</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>Content</span>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar text.</span>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceMin" href="#"></a>\r
+                       <a class="mceMax" href="#"></a>\r
+                       <a class="mceMed" href="#"></a>\r
+                       <a class="mceClose" href="#"></a>\r
+                       <a class="mceResize mceResizeN" href="#"></a>\r
+                       <a class="mceResize mceResizeS" href="#"></a>\r
+                       <a class="mceResize mceResizeW" href="#"></a>\r
+                       <a class="mceResize mceResizeE" href="#"></a>\r
+                       <a class="mceResize mceResizeNW" href="#"></a>\r
+                       <a class="mceResize mceResizeNE" href="#"></a>\r
+                       <a class="mceResize mceResizeSW" href="#"></a>\r
+                       <a class="mceResize mceResizeSE" href="#"></a>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="clearlooks2" style="width:400px; height:100px; left:10px; top:230px;">\r
+               <div class="mceWrapper mceMovable mceFocus mceResizable mceMaximizable">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Resizable, Maximizable</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>Content</span>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar text.</span>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceMin" href="#"></a>\r
+                       <a class="mceMax" href="#"></a>\r
+                       <a class="mceMed" href="#"></a>\r
+                       <a class="mceClose" href="#"></a>\r
+                       <a class="mceResize mceResizeN" href="#"></a>\r
+                       <a class="mceResize mceResizeS" href="#"></a>\r
+                       <a class="mceResize mceResizeW" href="#"></a>\r
+                       <a class="mceResize mceResizeE" href="#"></a>\r
+                       <a class="mceResize mceResizeNW" href="#"></a>\r
+                       <a class="mceResize mceResizeNE" href="#"></a>\r
+                       <a class="mceResize mceResizeSW" href="#"></a>\r
+                       <a class="mceResize mceResizeSE" href="#"></a>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="clearlooks2" style="width:400px; height:100px; left:420px; top:230px;">\r
+               <div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximizable">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Blurred, Maximizable, Statusbar, Resizable</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>Content</span>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar text.</span>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceMin" href="#"></a>\r
+                       <a class="mceMax" href="#"></a>\r
+                       <a class="mceMed" href="#"></a>\r
+                       <a class="mceClose" href="#"></a>\r
+                       <a class="mceResize mceResizeN" href="#"></a>\r
+                       <a class="mceResize mceResizeS" href="#"></a>\r
+                       <a class="mceResize mceResizeW" href="#"></a>\r
+                       <a class="mceResize mceResizeE" href="#"></a>\r
+                       <a class="mceResize mceResizeNW" href="#"></a>\r
+                       <a class="mceResize mceResizeNE" href="#"></a>\r
+                       <a class="mceResize mceResizeSW" href="#"></a>\r
+                       <a class="mceResize mceResizeSE" href="#"></a>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="clearlooks2" style="width:400px; height:100px; left:10px; top:340px;">\r
+               <div class="mceWrapper mceMovable mceFocus mceResizable mceMaximized mceMinimizable mceMaximizable">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Maximized, Maximizable, Minimizable</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>Content</span>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar text.</span>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceMin" href="#"></a>\r
+                       <a class="mceMax" href="#"></a>\r
+                       <a class="mceMed" href="#"></a>\r
+                       <a class="mceClose" href="#"></a>\r
+                       <a class="mceResize mceResizeN" href="#"></a>\r
+                       <a class="mceResize mceResizeS" href="#"></a>\r
+                       <a class="mceResize mceResizeW" href="#"></a>\r
+                       <a class="mceResize mceResizeE" href="#"></a>\r
+                       <a class="mceResize mceResizeNW" href="#"></a>\r
+                       <a class="mceResize mceResizeNE" href="#"></a>\r
+                       <a class="mceResize mceResizeSW" href="#"></a>\r
+                       <a class="mceResize mceResizeSE" href="#"></a>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="clearlooks2" style="width:400px; height:100px; left:420px; top:340px;">\r
+               <div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximized mceMinimizable mceMaximizable">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Blured</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>Content</span>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Statusbar text.</span>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceMin" href="#"></a>\r
+                       <a class="mceMax" href="#"></a>\r
+                       <a class="mceMed" href="#"></a>\r
+                       <a class="mceClose" href="#"></a>\r
+                       <a class="mceResize mceResizeN" href="#"></a>\r
+                       <a class="mceResize mceResizeS" href="#"></a>\r
+                       <a class="mceResize mceResizeW" href="#"></a>\r
+                       <a class="mceResize mceResizeE" href="#"></a>\r
+                       <a class="mceResize mceResizeNW" href="#"></a>\r
+                       <a class="mceResize mceResizeNE" href="#"></a>\r
+                       <a class="mceResize mceResizeSW" href="#"></a>\r
+                       <a class="mceResize mceResizeSE" href="#"></a>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="clearlooks2" style="width:400px; height:130px; left:10px; top:450px;">\r
+               <div class="mceWrapper mceMovable mceFocus mceModal mceAlert">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Alert</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                               </span>\r
+                               <div class="mceRight"></div>\r
+                               <div class="mceIcon"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceButton mceOk" href="#">Ok</a>\r
+                       <a class="mceClose" href="#"></a>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="clearlooks2" style="width:400px; height:130px; left:420px; top:450px;">\r
+               <div class="mceWrapper mceMovable mceFocus mceModal mceConfirm">\r
+                       <div class="mceTop">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                               <span>Confirm</span>\r
+                       </div>\r
+\r
+                       <div class="mceMiddle">\r
+                               <div class="mceLeft"></div>\r
+                               <span>\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       This is a very long error message. This is a very long error message.\r
+                                       </span>\r
+                               <div class="mceRight"></div>\r
+                               <div class="mceIcon"></div>\r
+                       </div>\r
+\r
+                       <div class="mceBottom">\r
+                               <div class="mceLeft"></div>\r
+                               <div class="mceCenter"></div>\r
+                               <div class="mceRight"></div>\r
+                       </div>\r
+\r
+                       <a class="mceMove" href="#"></a>\r
+                       <a class="mceButton mceOk" href="#">Ok</a>\r
+                       <a class="mceButton mceCancel" href="#">Cancel</a>\r
+                       <a class="mceClose" href="#"></a>\r
+               </div>\r
+       </div>\r
+</div>\r
+\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/editor_plugin.js b/webcit/tiny_mce/plugins/insertdatetime/editor_plugin.js
new file mode 100644 (file)
index 0000000..938ce6b
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.InsertDateTime",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertDate",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_dateFormat",a.getLang("insertdatetime.date_fmt")));a.execCommand("mceInsertContent",false,d)});a.addCommand("mceInsertTime",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_timeFormat",a.getLang("insertdatetime.time_fmt")));a.execCommand("mceInsertContent",false,d)});a.addButton("insertdate",{title:"insertdatetime.insertdate_desc",cmd:"mceInsertDate"});a.addButton("inserttime",{title:"insertdatetime.inserttime_desc",cmd:"mceInsertTime"})},getInfo:function(){return{longname:"Insert date/time",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getDateTime:function(e,a){var c=this.editor;function b(g,d){g=""+g;if(g.length<d){for(var f=0;f<(d-g.length);f++){g="0"+g}}return g}a=a.replace("%D","%m/%d/%y");a=a.replace("%r","%I:%M:%S %p");a=a.replace("%Y",""+e.getFullYear());a=a.replace("%y",""+e.getYear());a=a.replace("%m",b(e.getMonth()+1,2));a=a.replace("%d",b(e.getDate(),2));a=a.replace("%H",""+b(e.getHours(),2));a=a.replace("%M",""+b(e.getMinutes(),2));a=a.replace("%S",""+b(e.getSeconds(),2));a=a.replace("%I",""+((e.getHours()+11)%12+1));a=a.replace("%p",""+(e.getHours()<12?"AM":"PM"));a=a.replace("%B",""+c.getLang("insertdatetime.months_long").split(",")[e.getMonth()]);a=a.replace("%b",""+c.getLang("insertdatetime.months_short").split(",")[e.getMonth()]);a=a.replace("%A",""+c.getLang("insertdatetime.day_long").split(",")[e.getDay()]);a=a.replace("%a",""+c.getLang("insertdatetime.day_short").split(",")[e.getDay()]);a=a.replace("%%","%");return a}});tinymce.PluginManager.add("insertdatetime",tinymce.plugins.InsertDateTime)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/insertdatetime/editor_plugin_src.js b/webcit/tiny_mce/plugins/insertdatetime/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..181c791
--- /dev/null
@@ -0,0 +1,83 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.InsertDateTime', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+\r
+                       ed.addCommand('mceInsertDate', function() {\r
+                               var str = t._getDateTime(new Date(), ed.getParam("plugin_insertdate_dateFormat", ed.getLang('insertdatetime.date_fmt')));\r
+\r
+                               ed.execCommand('mceInsertContent', false, str);\r
+                       });\r
+\r
+                       ed.addCommand('mceInsertTime', function() {\r
+                               var str = t._getDateTime(new Date(), ed.getParam("plugin_insertdate_timeFormat", ed.getLang('insertdatetime.time_fmt')));\r
+\r
+                               ed.execCommand('mceInsertContent', false, str);\r
+                       });\r
+\r
+                       ed.addButton('insertdate', {title : 'insertdatetime.insertdate_desc', cmd : 'mceInsertDate'});\r
+                       ed.addButton('inserttime', {title : 'insertdatetime.inserttime_desc', cmd : 'mceInsertTime'});\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Insert date/time',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               // Private methods\r
+\r
+               _getDateTime : function(d, fmt) {\r
+                       var ed = this.editor;\r
+\r
+                       function addZeros(value, len) {\r
+                               value = "" + value;\r
+\r
+                               if (value.length < len) {\r
+                                       for (var i=0; i<(len-value.length); i++)\r
+                                               value = "0" + value;\r
+                               }\r
+\r
+                               return value;\r
+                       };\r
+\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("%B", "" + ed.getLang("insertdatetime.months_long").split(',')[d.getMonth()]);\r
+                       fmt = fmt.replace("%b", "" + ed.getLang("insertdatetime.months_short").split(',')[d.getMonth()]);\r
+                       fmt = fmt.replace("%A", "" + ed.getLang("insertdatetime.day_long").split(',')[d.getDay()]);\r
+                       fmt = fmt.replace("%a", "" + ed.getLang("insertdatetime.day_short").split(',')[d.getDay()]);\r
+                       fmt = fmt.replace("%%", "%");\r
+\r
+                       return fmt;\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('insertdatetime', tinymce.plugins.InsertDateTime);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/layer/editor_plugin.js b/webcit/tiny_mce/plugins/layer/editor_plugin.js
new file mode 100644 (file)
index 0000000..d610f7e
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Layer",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertLayer",c._insertLayer,c);a.addCommand("mceMoveForward",function(){c._move(1)});a.addCommand("mceMoveBackward",function(){c._move(-1)});a.addCommand("mceMakeAbsolute",function(){c._toggleAbsolute()});a.addButton("moveforward",{title:"layer.forward_desc",cmd:"mceMoveForward"});a.addButton("movebackward",{title:"layer.backward_desc",cmd:"mceMoveBackward"});a.addButton("absolute",{title:"layer.absolute_desc",cmd:"mceMakeAbsolute"});a.addButton("insertlayer",{title:"layer.insertlayer_desc",cmd:"mceInsertLayer"});a.onInit.add(function(){if(tinymce.isIE){a.getDoc().execCommand("2D-Position",false,true)}});a.onNodeChange.add(c._nodeChange,c);a.onVisualAid.add(c._visualAid,c)},getInfo:function(){return{longname:"Layer",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,e){var c,d;c=this._getParentLayer(e);d=b.dom.getParent(e,"DIV,P,IMG");if(!d){a.setDisabled("absolute",1);a.setDisabled("moveforward",1);a.setDisabled("movebackward",1)}else{a.setDisabled("absolute",0);a.setDisabled("moveforward",!c);a.setDisabled("movebackward",!c);a.setActive("absolute",c&&c.style.position.toLowerCase()=="absolute")}},_visualAid:function(a,c,b){var d=a.dom;tinymce.each(d.select("div,p",c),function(f){if(/^(absolute|relative|static)$/i.test(f.style.position)){if(b){d.addClass(f,"mceItemVisualAid")}else{d.removeClass(f,"mceItemVisualAid")}}})},_move:function(h){var b=this.editor,f,g=[],e=this._getParentLayer(b.selection.getNode()),c=-1,j=-1,a;a=[];tinymce.walk(b.getBody(),function(d){if(d.nodeType==1&&/^(absolute|relative|static)$/i.test(d.style.position)){a.push(d)}},"childNodes");for(f=0;f<a.length;f++){g[f]=a[f].style.zIndex?parseInt(a[f].style.zIndex):0;if(c<0&&a[f]==e){c=f}}if(h<0){for(f=0;f<g.length;f++){if(g[f]<g[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{if(g[c]>0){a[c].style.zIndex=g[c]-1}}}else{for(f=0;f<g.length;f++){if(g[f]>g[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{a[c].style.zIndex=g[c]+1}}b.execCommand("mceRepaint")},_getParentLayer:function(a){return this.editor.dom.getParent(a,function(b){return b.nodeType==1&&/^(absolute|relative|static)$/i.test(b.style.position)})},_insertLayer:function(){var a=this.editor,b=a.dom.getPos(a.dom.getParent(a.selection.getNode(),"*"));a.dom.add(a.getBody(),"div",{style:{position:"absolute",left:b.x,top:(b.y>20?b.y:20),width:100,height:100},"class":"mceItemVisualAid"},a.selection.getContent()||a.getLang("layer.content"))},_toggleAbsolute:function(){var a=this.editor,b=this._getParentLayer(a.selection.getNode());if(!b){b=a.dom.getParent(a.selection.getNode(),"DIV,P,IMG")}if(b){if(b.style.position.toLowerCase()=="absolute"){a.dom.setStyles(b,{position:"",left:"",top:"",width:"",height:""});a.dom.removeClass(b,"mceItemVisualAid")}else{if(b.style.left==""){b.style.left=20+"px"}if(b.style.top==""){b.style.top=20+"px"}if(b.style.width==""){b.style.width=b.width?(b.width+"px"):"100px"}if(b.style.height==""){b.style.height=b.height?(b.height+"px"):"100px"}b.style.position="absolute";a.dom.setAttrib(b,"data-mce-style","");a.addVisual(a.getBody())}a.execCommand("mceRepaint");a.nodeChanged()}}});tinymce.PluginManager.add("layer",tinymce.plugins.Layer)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/layer/editor_plugin_src.js b/webcit/tiny_mce/plugins/layer/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..a8ac5a7
--- /dev/null
@@ -0,0 +1,214 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.Layer', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceInsertLayer', t._insertLayer, t);\r
+\r
+                       ed.addCommand('mceMoveForward', function() {\r
+                               t._move(1);\r
+                       });\r
+\r
+                       ed.addCommand('mceMoveBackward', function() {\r
+                               t._move(-1);\r
+                       });\r
+\r
+                       ed.addCommand('mceMakeAbsolute', function() {\r
+                               t._toggleAbsolute();\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('moveforward', {title : 'layer.forward_desc', cmd : 'mceMoveForward'});\r
+                       ed.addButton('movebackward', {title : 'layer.backward_desc', cmd : 'mceMoveBackward'});\r
+                       ed.addButton('absolute', {title : 'layer.absolute_desc', cmd : 'mceMakeAbsolute'});\r
+                       ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'});\r
+\r
+                       ed.onInit.add(function() {\r
+                               if (tinymce.isIE)\r
+                                       ed.getDoc().execCommand('2D-Position', false, true);\r
+                       });\r
+\r
+                       ed.onNodeChange.add(t._nodeChange, t);\r
+                       ed.onVisualAid.add(t._visualAid, t);\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Layer',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               // Private methods\r
+\r
+               _nodeChange : function(ed, cm, n) {\r
+                       var le, p;\r
+\r
+                       le = this._getParentLayer(n);\r
+                       p = ed.dom.getParent(n, 'DIV,P,IMG');\r
+\r
+                       if (!p) {\r
+                               cm.setDisabled('absolute', 1);\r
+                               cm.setDisabled('moveforward', 1);\r
+                               cm.setDisabled('movebackward', 1);\r
+                       } else {\r
+                               cm.setDisabled('absolute', 0);\r
+                               cm.setDisabled('moveforward', !le);\r
+                               cm.setDisabled('movebackward', !le);\r
+                               cm.setActive('absolute', le && le.style.position.toLowerCase() == "absolute");\r
+                       }\r
+               },\r
+\r
+               // Private methods\r
+\r
+               _visualAid : function(ed, e, s) {\r
+                       var dom = ed.dom;\r
+\r
+                       tinymce.each(dom.select('div,p', e), function(e) {\r
+                               if (/^(absolute|relative|static)$/i.test(e.style.position)) {\r
+                                       if (s)\r
+                                               dom.addClass(e, 'mceItemVisualAid');\r
+                                       else\r
+                                               dom.removeClass(e, 'mceItemVisualAid'); \r
+                               }\r
+                       });\r
+               },\r
+\r
+               _move : function(d) {\r
+                       var ed = this.editor, i, z = [], le = this._getParentLayer(ed.selection.getNode()), ci = -1, fi = -1, nl;\r
+\r
+                       nl = [];\r
+                       tinymce.walk(ed.getBody(), function(n) {\r
+                               if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position))\r
+                                       nl.push(n); \r
+                       }, 'childNodes');\r
+\r
+                       // Find z-indexes\r
+                       for (i=0; i<nl.length; i++) {\r
+                               z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex) : 0;\r
+\r
+                               if (ci < 0 && nl[i] == le)\r
+                                       ci = i;\r
+                       }\r
+\r
+                       if (d < 0) {\r
+                               // Move back\r
+\r
+                               // Try find a lower one\r
+                               for (i=0; i<z.length; i++) {\r
+                                       if (z[i] < z[ci]) {\r
+                                               fi = i;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               if (fi > -1) {\r
+                                       nl[ci].style.zIndex = z[fi];\r
+                                       nl[fi].style.zIndex = z[ci];\r
+                               } else {\r
+                                       if (z[ci] > 0)\r
+                                               nl[ci].style.zIndex = z[ci] - 1;\r
+                               }\r
+                       } else {\r
+                               // Move forward\r
+\r
+                               // Try find a higher one\r
+                               for (i=0; i<z.length; i++) {\r
+                                       if (z[i] > z[ci]) {\r
+                                               fi = i;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               if (fi > -1) {\r
+                                       nl[ci].style.zIndex = z[fi];\r
+                                       nl[fi].style.zIndex = z[ci];\r
+                               } else\r
+                                       nl[ci].style.zIndex = z[ci] + 1;\r
+                       }\r
+\r
+                       ed.execCommand('mceRepaint');\r
+               },\r
+\r
+               _getParentLayer : function(n) {\r
+                       return this.editor.dom.getParent(n, function(n) {\r
+                               return n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position);\r
+                       });\r
+               },\r
+\r
+               _insertLayer : function() {\r
+                       var ed = this.editor, p = ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(), '*'));\r
+\r
+                       ed.dom.add(ed.getBody(), 'div', {\r
+                               style : {\r
+                                       position : 'absolute',\r
+                                       left : p.x,\r
+                                       top : (p.y > 20 ? p.y : 20),\r
+                                       width : 100,\r
+                                       height : 100\r
+                               },\r
+                               'class' : 'mceItemVisualAid'\r
+                       }, ed.selection.getContent() || ed.getLang('layer.content'));\r
+               },\r
+\r
+               _toggleAbsolute : function() {\r
+                       var ed = this.editor, le = this._getParentLayer(ed.selection.getNode());\r
+\r
+                       if (!le)\r
+                               le = ed.dom.getParent(ed.selection.getNode(), 'DIV,P,IMG');\r
+\r
+                       if (le) {\r
+                               if (le.style.position.toLowerCase() == "absolute") {\r
+                                       ed.dom.setStyles(le, {\r
+                                               position : '',\r
+                                               left : '',\r
+                                               top : '',\r
+                                               width : '',\r
+                                               height : ''\r
+                                       });\r
+\r
+                                       ed.dom.removeClass(le, 'mceItemVisualAid');\r
+                               } else {\r
+                                       if (le.style.left == "")\r
+                                               le.style.left = 20 + 'px';\r
+\r
+                                       if (le.style.top == "")\r
+                                               le.style.top = 20 + 'px';\r
+\r
+                                       if (le.style.width == "")\r
+                                               le.style.width = le.width ? (le.width + 'px') : '100px';\r
+\r
+                                       if (le.style.height == "")\r
+                                               le.style.height = le.height ? (le.height + 'px') : '100px';\r
+\r
+                                       le.style.position = "absolute";\r
+\r
+                                       ed.dom.setAttrib(le, 'data-mce-style', '');\r
+                                       ed.addVisual(ed.getBody());\r
+                               }\r
+\r
+                               ed.execCommand('mceRepaint');\r
+                               ed.nodeChanged();\r
+                       }\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('layer', tinymce.plugins.Layer);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/legacyoutput/editor_plugin.js b/webcit/tiny_mce/plugins/legacyoutput/editor_plugin.js
new file mode 100644 (file)
index 0000000..b3a4ce3
--- /dev/null
@@ -0,0 +1 @@
+(function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.schema;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:true}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:true}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",styles:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});a.each("b,i,u,strike".split(","),function(f){d.addValidElements(f+"[*]")});if(!d.getElementRule("font")){d.addValidElements("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.getElementRule(f),g;if(h){if(!h.attributes.align){h.attributes.align={};h.attributesOrder.push("align")}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce);
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/legacyoutput/editor_plugin_src.js b/webcit/tiny_mce/plugins/legacyoutput/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..e627ec7
--- /dev/null
@@ -0,0 +1,139 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ *\r
+ * This plugin will force TinyMCE to produce deprecated legacy output such as font elements, u elements, align\r
+ * attributes and so forth. There are a few cases where these old items might be needed for example in email applications or with Flash\r
+ *\r
+ * However you should NOT use this plugin if you are building some system that produces web contents such as a CMS. All these elements are\r
+ * not apart of the newer specifications for HTML and XHTML.\r
+ */\r
+\r
+(function(tinymce) {\r
+       // Override inline_styles setting to force TinyMCE to produce deprecated contents\r
+       tinymce.onAddEditor.addToTop(function(tinymce, editor) {\r
+               editor.settings.inline_styles = false;\r
+       });\r
+\r
+       // Create the legacy ouput plugin\r
+       tinymce.create('tinymce.plugins.LegacyOutput', {\r
+               init : function(editor) {\r
+                       editor.onInit.add(function() {\r
+                               var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img',\r
+                                       fontSizes = tinymce.explode(editor.settings.font_size_style_values),\r
+                                       schema = editor.schema;\r
+\r
+                               // Override some internal formats to produce legacy elements and attributes\r
+                               editor.formatter.register({\r
+                                       // Change alignment formats to use the deprecated align attribute\r
+                                       alignleft : {selector : alignElements, attributes : {align : 'left'}},\r
+                                       aligncenter : {selector : alignElements, attributes : {align : 'center'}},\r
+                                       alignright : {selector : alignElements, attributes : {align : 'right'}},\r
+                                       alignfull : {selector : alignElements, attributes : {align : 'justify'}},\r
+\r
+                                       // Change the basic formatting elements to use deprecated element types
+                                       bold : [\r
+                                               {inline : 'b', remove : 'all'},\r
+                                               {inline : 'strong', remove : 'all'},\r
+                                               {inline : 'span', styles : {fontWeight : 'bold'}}\r
+                                       ],\r
+                                       italic : [\r
+                                               {inline : 'i', remove : 'all'},\r
+                                               {inline : 'em', remove : 'all'},\r
+                                               {inline : 'span', styles : {fontStyle : 'italic'}}\r
+                                       ],\r
+                                       underline : [\r
+                                               {inline : 'u', remove : 'all'},\r
+                                               {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}\r
+                                       ],\r
+                                       strikethrough : [\r
+                                               {inline : 'strike', remove : 'all'},\r
+                                               {inline : 'span', styles : {textDecoration: 'line-through'}, exact : true}\r
+                                       ],
+\r
+                                       // Change font size and font family to use the deprecated font element\r
+                                       fontname : {inline : 'font', attributes : {face : '%value'}},\r
+                                       fontsize : {\r
+                                               inline : 'font',\r
+                                               attributes : {\r
+                                                       size : function(vars) {\r
+                                                               return tinymce.inArray(fontSizes, vars.value) + 1;\r
+                                                       }\r
+                                               }\r
+                                       },\r
+\r
+                                       // Setup font elements for colors as well\r
+                                       forecolor : {inline : 'font', styles : {color : '%value'}},\r
+                                       hilitecolor : {inline : 'font', styles : {backgroundColor : '%value'}}\r
+                               });\r
+\r
+                               // Check that deprecated elements are allowed if not add them\r
+                               tinymce.each('b,i,u,strike'.split(','), function(name) {\r
+                                       schema.addValidElements(name + '[*]');\r
+                               });\r
+\r
+                               // Add font element if it's missing\r
+                               if (!schema.getElementRule("font"))\r
+                                       schema.addValidElements("font[face|size|color|style]");\r
+\r
+                               // Add the missing and depreacted align attribute for the serialization engine\r
+                               tinymce.each(alignElements.split(','), function(name) {\r
+                                       var rule = schema.getElementRule(name), found;\r
+\r
+                                       if (rule) {\r
+                                               if (!rule.attributes.align) {\r
+                                                       rule.attributes.align = {};\r
+                                                       rule.attributesOrder.push('align');\r
+                                               }\r
+                                       }\r
+                               });\r
+\r
+                               // Listen for the onNodeChange event so that we can do special logic for the font size and font name drop boxes\r
+                               editor.onNodeChange.add(function(editor, control_manager) {\r
+                                       var control, fontElm, fontName, fontSize;\r
+\r
+                                       // Find font element get it's name and size\r
+                                       fontElm = editor.dom.getParent(editor.selection.getNode(), 'font');\r
+                                       if (fontElm) {\r
+                                               fontName = fontElm.face;\r
+                                               fontSize = fontElm.size;\r
+                                       }\r
+\r
+                                       // Select/unselect the font name in droplist\r
+                                       if (control = control_manager.get('fontselect')) {\r
+                                               control.select(function(value) {\r
+                                                       return value == fontName;\r
+                                               });\r
+                                       }\r
+\r
+                                       // Select/unselect the font size in droplist\r
+                                       if (control = control_manager.get('fontsizeselect')) {\r
+                                               control.select(function(value) {\r
+                                                       var index = tinymce.inArray(fontSizes, value.fontSize);\r
+\r
+                                                       return index + 1 == fontSize;\r
+                                               });\r
+                                       }\r
+                               });\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'LegacyOutput',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('legacyoutput', tinymce.plugins.LegacyOutput);\r
+})(tinymce);\r
diff --git a/webcit/tiny_mce/plugins/lists/editor_plugin.js b/webcit/tiny_mce/plugins/lists/editor_plugin.js
new file mode 100644 (file)
index 0000000..67308f0
--- /dev/null
@@ -0,0 +1 @@
+(function(){var e=tinymce.each,r=tinymce.dom.Event,g;function p(t,s){while(t&&(t.nodeType===8||(t.nodeType===3&&/^[ \t\n\r]*$/.test(t.nodeValue)))){t=s(t)}return t}function b(s){return p(s,function(t){return t.previousSibling})}function i(s){return p(s,function(t){return t.nextSibling})}function d(s,u,t){return s.dom.getParent(u,function(v){return tinymce.inArray(t,v)!==-1})}function n(s){return s&&(s.tagName==="OL"||s.tagName==="UL")}function c(u,v){var t,w,s;t=b(u.lastChild);while(n(t)){w=t;t=b(w.previousSibling)}if(w){s=v.create("li",{style:"list-style-type: none;"});v.split(u,w);v.insertAfter(s,w);s.appendChild(w);s.appendChild(w);u=s.previousSibling}return u}function m(t,s,u){t=a(t,s,u);return o(t,s,u)}function a(u,s,v){var t=b(u.previousSibling);if(t){return h(t,u,s?t:false,v)}else{return u}}function o(u,t,v){var s=i(u.nextSibling);if(s){return h(u,s,t?s:false,v)}else{return u}}function h(u,s,t,v){if(l(u,s,!!t,v)){return f(u,s,t)}else{if(u&&u.tagName==="LI"&&n(s)){u.appendChild(s)}}return s}function l(u,t,s,v){if(!u||!t){return false}else{if(u.tagName==="LI"&&t.tagName==="LI"){return t.style.listStyleType==="none"||j(t)}else{if(n(u)){return(u.tagName===t.tagName&&(s||u.style.listStyleType===t.style.listStyleType))||q(t)}else{if(v&&u.tagName==="P"&&t.tagName==="P"){return true}else{return false}}}}}function q(t){var s=i(t.firstChild),u=b(t.lastChild);return s&&u&&n(t)&&s===u&&(n(s)||s.style.listStyleType==="none"||j(s))}function j(u){var t=i(u.firstChild),s=b(u.lastChild);return t&&s&&t===s&&n(t)}function f(w,v,s){var u=b(w.lastChild),t=i(v.firstChild);if(w.tagName==="P"){w.appendChild(w.ownerDocument.createElement("br"))}while(v.firstChild){w.appendChild(v.firstChild)}if(s){w.style.listStyleType=s.style.listStyleType}v.parentNode.removeChild(v);h(u,t,false);return w}function k(t,u){var s;if(!u.is(t,"li,ol,ul")){s=u.getParent(t,"li");if(s){t=s}}return t}tinymce.create("tinymce.plugins.Lists",{init:function(A,y){var w=0;var t=1;var H=2;var J=3;var z=J;function C(M){return M.keyCode===9&&(A.queryCommandState("InsertUnorderedList")||A.queryCommandState("InsertOrderedList"))}function x(){var M=B();var O=M.parentNode.parentNode;var N=M.parentNode.lastChild===M;return N&&!u(O)&&K(M)}function u(M){if(n(M)){return M.parentNode&&M.parentNode.tagName==="LI"}else{return M.tagName==="LI"}}function D(){return A.selection.isCollapsed()&&K(B())}function B(){var M=A.selection.getStart();return((M.tagName=="BR"||M.tagName=="")&&M.parentNode.tagName=="LI")?M.parentNode:M}function K(M){var N=M.childNodes.length;if(M.tagName==="LI"){return N==0?true:N==1&&(M.firstChild.tagName==""||F(M)||G(M))}return false}function F(M){return tinymce.isWebKit&&M.firstChild.nodeName=="BR"}function G(M){var N=tinymce.grep(M.parentNode.childNodes,function(Q){return Q.nodeName=="LI"});var O=M==N[N.length-1];var P=M.firstChild;return tinymce.isIE9&&O&&(P.nodeValue==String.fromCharCode(160)||P.nodeValue==String.fromCharCode(32))}function L(M){return M.keyCode===13}function I(M){if(C(M)){return w}else{if(L(M)&&x()){return H}else{if(L(M)&&D()){return t}else{return J}}}}function s(M,N){if(z==w||z==t){return r.cancel(N)}}function v(P,R){var U;if(!tinymce.isGecko){return}var N=P.selection.getStart();if(R.keyCode!=8||N.tagName!=="IMG"){return}function O(Y){var Z=Y.firstChild;var X=null;do{if(!Z){break}if(Z.tagName==="LI"){X=Z}}while(Z=Z.nextSibling);return X}function W(Y,X){while(Y.childNodes.length>0){X.appendChild(Y.childNodes[0])}}U=N.parentNode.previousSibling;if(!U){return}var S;if(U.tagName==="UL"||U.tagName==="OL"){S=U}else{if(U.previousSibling&&(U.previousSibling.tagName==="UL"||U.previousSibling.tagName==="OL")){S=U.previousSibling}else{return}}var V=O(S);var M=P.dom.createRng();M.setStart(V,1);M.setEnd(V,1);P.selection.setRng(M);P.selection.collapse(true);var Q=P.selection.getBookmark();var T=N.parentNode.cloneNode(true);if(T.tagName==="P"||T.tagName==="DIV"){W(T,V)}else{V.appendChild(T)}N.parentNode.parentNode.removeChild(N.parentNode);P.selection.moveToBookmark(Q)}function E(M){var N=A.dom.getParent(M,"ol,ul");if(N!=null){var O=N.lastChild;O.appendChild(A.getDoc().createElement(""));A.selection.setCursorLocation(O,0)}}this.ed=A;A.addCommand("Indent",this.indent,this);A.addCommand("Outdent",this.outdent,this);A.addCommand("InsertUnorderedList",function(){this.applyList("UL","OL")},this);A.addCommand("InsertOrderedList",function(){this.applyList("OL","UL")},this);A.onInit.add(function(){A.editorCommands.addCommands({outdent:function(){var N=A.selection,O=A.dom;function M(P){P=O.getParent(P,O.isBlock);return P&&(parseInt(A.dom.getStyle(P,"margin-left")||0,10)+parseInt(A.dom.getStyle(P,"padding-left")||0,10))>0}return M(N.getStart())||M(N.getEnd())||A.queryCommandState("InsertOrderedList")||A.queryCommandState("InsertUnorderedList")}},"state")});A.onKeyUp.add(function(N,O){if(z==w){N.execCommand(O.shiftKey?"Outdent":"Indent",true,null);z=J;return r.cancel(O)}else{if(z==t){var M=B();var Q=N.settings.list_outdent_on_enter===true||O.shiftKey;N.execCommand(Q?"Outdent":"Indent",true,null);if(tinymce.isIE){E(M)}return r.cancel(O)}else{if(z==H){if(tinymce.isIE8){var P=N.getDoc().createTextNode("\uFEFF");N.selection.getNode().appendChild(P)}else{if(tinymce.isIE9){N.execCommand("Outdent");return r.cancel(O)}}}}}});A.onKeyDown.add(function(M,N){z=I(N)});A.onKeyDown.add(s);A.onKeyDown.add(v);A.onKeyPress.add(s)},applyList:function(y,v){var C=this,z=C.ed,I=z.dom,s=[],H=false,u=false,w=false,B,G=z.selection.getSelectedBlocks();function E(t){if(t&&t.tagName==="BR"){I.remove(t)}}function F(M){var N=I.create(y),t;function L(O){if(O.style.marginLeft||O.style.paddingLeft){C.adjustPaddingFunction(false)(O)}}if(M.tagName==="LI"){}else{if(M.tagName==="P"||M.tagName==="DIV"||M.tagName==="BODY"){K(M,function(P,O,Q){J(P,O,M.tagName==="BODY"?null:P.parentNode);t=P.parentNode;L(t);E(O)});if(M.tagName==="P"||G.length>1){I.split(t.parentNode.parentNode,t.parentNode)}m(t.parentNode,true);return}else{t=I.create("li");I.insertAfter(t,M);t.appendChild(M);L(M);M=t}}I.insertAfter(N,M);N.appendChild(M);m(N,true);s.push(M)}function J(Q,L,O){var t,P=Q,N,M;while(!I.isBlock(Q.parentNode)&&Q.parentNode!==I.getRoot()){Q=I.split(Q.parentNode,Q.previousSibling);Q=Q.nextSibling;P=Q}if(O){t=O.cloneNode(true);Q.parentNode.insertBefore(t,Q);while(t.firstChild){I.remove(t.firstChild)}t=I.rename(t,"li")}else{t=I.create("li");Q.parentNode.insertBefore(t,Q)}while(P&&P!=L){N=P.nextSibling;t.appendChild(P);P=N}if(t.childNodes.length===0){t.innerHTML='<br _mce_bogus="1" />'}F(t)}function K(Q,T){var N,R,O=3,L=1,t="br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl";function P(X,U){var V=I.createRng(),W;g.keep=true;z.selection.moveToBookmark(g);g.keep=false;W=z.selection.getRng(true);if(!U){U=X.parentNode.lastChild}V.setStartBefore(X);V.setEndAfter(U);return !(V.compareBoundaryPoints(O,W)>0||V.compareBoundaryPoints(L,W)<=0)}function S(U){if(U.nextSibling){return U.nextSibling}if(!I.isBlock(U.parentNode)&&U.parentNode!==I.getRoot()){return S(U.parentNode)}}N=Q.firstChild;var M=false;e(I.select(t,Q),function(V){var U;if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(P(N,V)){I.addClass(V,"_mce_tagged_br");N=S(V)}});M=(N&&P(N,undefined));N=Q.firstChild;e(I.select(t,Q),function(V){var U=S(V);if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(I.hasClass(V,"_mce_tagged_br")){T(N,V,R);R=null}else{R=V}N=U});if(M){T(N,undefined,R)}}function D(t){K(t,function(M,L,N){J(M,L);E(L);E(N)})}function A(t){if(tinymce.inArray(s,t)!==-1){return}if(t.parentNode.tagName===v){I.split(t.parentNode,t);F(t);o(t.parentNode,false)}s.push(t)}function x(M){var O,N,L,t;if(tinymce.inArray(s,M)!==-1){return}M=c(M,I);while(I.is(M.parentNode,"ol,ul,li")){I.split(M.parentNode,M)}s.push(M);M=I.rename(M,"p");L=m(M,false,z.settings.force_br_newlines);if(L===M){O=M.firstChild;while(O){if(I.isBlock(O)){O=I.split(O.parentNode,O);t=true;N=O.nextSibling&&O.nextSibling.firstChild}else{N=O.nextSibling;if(t&&O.tagName==="BR"){I.remove(O)}t=false}O=N}}}e(G,function(t){t=k(t,I);if(t.tagName===v||(t.tagName==="LI"&&t.parentNode.tagName===v)){u=true}else{if(t.tagName===y||(t.tagName==="LI"&&t.parentNode.tagName===y)){H=true}else{w=true}}});if(w||u||G.length===0){B={LI:A,H1:F,H2:F,H3:F,H4:F,H5:F,H6:F,P:F,BODY:F,DIV:G.length>1?F:D,defaultAction:D}}else{B={defaultAction:x}}this.process(B)},indent:function(){var u=this.ed,w=u.dom,x=[];function s(z){var y=w.create("li",{style:"list-style-type: none;"});w.insertAfter(y,z);return y}function t(B){var y=s(B),D=w.getParent(B,"ol,ul"),C=D.tagName,E=w.getStyle(D,"list-style-type"),A={},z;if(E!==""){A.style="list-style-type: "+E+";"}z=w.create(C,A);y.appendChild(z);return z}function v(z){if(!d(u,z,x)){z=c(z,w);var y=t(z);y.appendChild(z);m(y.parentNode,false);m(y,false);x.push(z)}}this.process({LI:v,defaultAction:this.adjustPaddingFunction(true)})},outdent:function(){var v=this,u=v.ed,w=u.dom,s=[];function x(t){var z,y,A;if(!d(u,t,s)){if(w.getStyle(t,"margin-left")!==""||w.getStyle(t,"padding-left")!==""){return v.adjustPaddingFunction(false)(t)}A=w.getStyle(t,"text-align",true);if(A==="center"||A==="right"){w.setStyle(t,"text-align","left");return}t=c(t,w);z=t.parentNode;y=t.parentNode.parentNode;if(y.tagName==="P"){w.split(y,t.parentNode)}else{w.split(z,t);if(y.tagName==="LI"){w.split(y,t)}else{if(!w.is(y,"ol,ul")){w.rename(t,"p")}}}s.push(t)}}this.process({LI:x,defaultAction:this.adjustPaddingFunction(false)});e(s,m)},process:function(y){var D=this,w=D.ed.selection,z=D.ed.dom,C,u;function x(s){z.removeClass(s,"_mce_act_on");if(!s||s.nodeType!==1){return}s=k(s,z);var t=y[s.tagName];if(!t){t=y.defaultAction}t(s)}function v(s){D.splitSafeEach(s.childNodes,x)}function B(s,t){return t>=0&&s.hasChildNodes()&&t<s.childNodes.length&&s.childNodes[t].tagName==="BR"}C=w.getSelectedBlocks();if(C.length===0){C=[z.getRoot()]}u=w.getRng(true);if(!u.collapsed){if(B(u.endContainer,u.endOffset-1)){u.setEnd(u.endContainer,u.endOffset-1);w.setRng(u)}if(B(u.startContainer,u.startOffset)){u.setStart(u.startContainer,u.startOffset+1);w.setRng(u)}}if(tinymce.isIE8){var E=D.ed.selection.getNode();if(E.tagName==="LI"&&!(E.parentNode.lastChild===E)){var A=D.ed.getDoc().createTextNode("\uFEFF");E.appendChild(A)}}g=w.getBookmark();y.OL=y.UL=v;D.splitSafeEach(C,x);w.moveToBookmark(g);g=null;D.ed.execCommand("mceRepaint")},splitSafeEach:function(t,s){if(tinymce.isGecko&&(/Firefox\/[12]\.[0-9]/.test(navigator.userAgent)||/Firefox\/3\.[0-4]/.test(navigator.userAgent))){this.classBasedEach(t,s)}else{e(t,s)}},classBasedEach:function(v,u){var w=this.ed.dom,s,t;e(v,function(x){w.addClass(x,"_mce_act_on")});s=w.select("._mce_act_on");while(s.length>0){t=s.shift();w.removeClass(t,"_mce_act_on");u(t);s=w.select("._mce_act_on")}},adjustPaddingFunction:function(u){var s,v,t=this.ed;s=t.settings.indentation;v=/[a-z%]+/i.exec(s);s=parseInt(s,10);return function(w){var y,x;y=parseInt(t.dom.getStyle(w,"margin-left")||0,10)+parseInt(t.dom.getStyle(w,"padding-left")||0,10);if(u){x=y+s}else{x=y-s}t.dom.setStyle(w,"padding-left","");t.dom.setStyle(w,"margin-left",x>0?x+v:"")}},getInfo:function(){return{longname:"Lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("lists",tinymce.plugins.Lists)}());
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/lists/editor_plugin_src.js b/webcit/tiny_mce/plugins/lists/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..1db29f7
--- /dev/null
@@ -0,0 +1,781 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2011, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+       var each = tinymce.each, Event = tinymce.dom.Event, bookmark;
+
+       // Skips text nodes that only contain whitespace since they aren't semantically important.
+       function skipWhitespaceNodes(e, next) {
+               while (e && (e.nodeType === 8 || (e.nodeType === 3 && /^[ \t\n\r]*$/.test(e.nodeValue)))) {
+                       e = next(e);
+               }
+               return e;
+       }
+
+       function skipWhitespaceNodesBackwards(e) {
+               return skipWhitespaceNodes(e, function(e) {
+                       return e.previousSibling;
+               });
+       }
+
+       function skipWhitespaceNodesForwards(e) {
+               return skipWhitespaceNodes(e, function(e) {
+                       return e.nextSibling;
+               });
+       }
+
+       function hasParentInList(ed, e, list) {
+               return ed.dom.getParent(e, function(p) {
+                       return tinymce.inArray(list, p) !== -1;
+               });
+       }
+
+       function isList(e) {
+               return e && (e.tagName === 'OL' || e.tagName === 'UL');
+       }
+
+       function splitNestedLists(element, dom) {
+               var tmp, nested, wrapItem;
+               tmp = skipWhitespaceNodesBackwards(element.lastChild);
+               while (isList(tmp)) {
+                       nested = tmp;
+                       tmp = skipWhitespaceNodesBackwards(nested.previousSibling);
+               }
+               if (nested) {
+                       wrapItem = dom.create('li', { style: 'list-style-type: none;'});
+                       dom.split(element, nested);
+                       dom.insertAfter(wrapItem, nested);
+                       wrapItem.appendChild(nested);
+                       wrapItem.appendChild(nested);
+                       element = wrapItem.previousSibling;
+               }
+               return element;
+       }
+
+       function attemptMergeWithAdjacent(e, allowDifferentListStyles, mergeParagraphs) {
+               e = attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs);
+               return attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs);
+       }
+
+       function attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs) {
+               var prev = skipWhitespaceNodesBackwards(e.previousSibling);
+               if (prev) {
+                       return attemptMerge(prev, e, allowDifferentListStyles ? prev : false, mergeParagraphs);
+               } else {
+                       return e;
+               }
+       }
+
+       function attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs) {
+               var next = skipWhitespaceNodesForwards(e.nextSibling);
+               if (next) {
+                       return attemptMerge(e, next, allowDifferentListStyles ? next : false, mergeParagraphs);
+               } else {
+                       return e;
+               }
+       }
+
+       function attemptMerge(e1, e2, differentStylesMasterElement, mergeParagraphs) {
+               if (canMerge(e1, e2, !!differentStylesMasterElement, mergeParagraphs)) {
+                       return merge(e1, e2, differentStylesMasterElement);
+               } else if (e1 && e1.tagName === 'LI' && isList(e2)) {
+                       // Fix invalidly nested lists.
+                       e1.appendChild(e2);
+               }
+               return e2;
+       }
+
+       function canMerge(e1, e2, allowDifferentListStyles, mergeParagraphs) {
+               if (!e1 || !e2) {
+                       return false;
+               } else if (e1.tagName === 'LI' && e2.tagName === 'LI') {
+                       return e2.style.listStyleType === 'none' || containsOnlyAList(e2);
+               } else if (isList(e1)) {
+                       return (e1.tagName === e2.tagName && (allowDifferentListStyles || e1.style.listStyleType === e2.style.listStyleType)) || isListForIndent(e2);
+               } else if (mergeParagraphs && e1.tagName === 'P' && e2.tagName === 'P') {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       function isListForIndent(e) {
+               var firstLI = skipWhitespaceNodesForwards(e.firstChild), lastLI = skipWhitespaceNodesBackwards(e.lastChild);
+               return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI));
+       }
+
+       function containsOnlyAList(e) {
+               var firstChild = skipWhitespaceNodesForwards(e.firstChild), lastChild = skipWhitespaceNodesBackwards(e.lastChild);
+               return firstChild && lastChild && firstChild === lastChild && isList(firstChild);
+       }
+
+       function merge(e1, e2, masterElement) {
+               var lastOriginal = skipWhitespaceNodesBackwards(e1.lastChild), firstNew = skipWhitespaceNodesForwards(e2.firstChild);
+               if (e1.tagName === 'P') {
+                       e1.appendChild(e1.ownerDocument.createElement('br'));
+               }
+               while (e2.firstChild) {
+                       e1.appendChild(e2.firstChild);
+               }
+               if (masterElement) {
+                       e1.style.listStyleType = masterElement.style.listStyleType;
+               }
+               e2.parentNode.removeChild(e2);
+               attemptMerge(lastOriginal, firstNew, false);
+               return e1;
+       }
+
+       function findItemToOperateOn(e, dom) {
+               var item;
+               if (!dom.is(e, 'li,ol,ul')) {
+                       item = dom.getParent(e, 'li');
+                       if (item) {
+                               e = item;
+                       }
+               }
+               return e;
+       }
+
+       tinymce.create('tinymce.plugins.Lists', {
+               init: function(ed, url) {
+                       var LIST_TABBING = 0;
+                       var LIST_EMPTY_ITEM = 1;
+                       var LIST_ESCAPE = 2;
+                       var LIST_UNKNOWN = 3;
+                       var state = LIST_UNKNOWN;
+
+                       function isTabInList(e) {
+                               return e.keyCode === 9 && (ed.queryCommandState('InsertUnorderedList') || ed.queryCommandState('InsertOrderedList'));
+                       }
+
+                       function isOnLastListItem() {
+                               var li = getLi();
+                               var grandParent = li.parentNode.parentNode;
+                               var isLastItem = li.parentNode.lastChild === li;
+                               return isLastItem && !isNestedList(grandParent) && isEmptyListItem(li);
+                       }
+
+                       function isNestedList(grandParent) {
+                               if (isList(grandParent)) {
+                                       return grandParent.parentNode && grandParent.parentNode.tagName === 'LI';
+                               } else {
+                                       return  grandParent.tagName === 'LI';
+                               }
+                       }
+
+                       function isInEmptyListItem() {
+                               return ed.selection.isCollapsed() && isEmptyListItem(getLi());
+                       }
+
+                       function getLi() {
+                               var n = ed.selection.getStart();
+                               // Get start will return BR if the LI only contains a BR or an empty element as we use these to fix caret position
+                               return ((n.tagName == 'BR' || n.tagName == '') && n.parentNode.tagName == 'LI') ? n.parentNode : n;
+                       }
+
+                       function isEmptyListItem(li) {
+                               var numChildren = li.childNodes.length;
+                               if (li.tagName === 'LI') {
+                                       return numChildren == 0 ? true : numChildren == 1 && (li.firstChild.tagName == '' || isEmptyWebKitLi(li) || isEmptyIE9Li(li));
+                               }
+                               return false;
+                       }
+
+                       function isEmptyWebKitLi(li) {
+                               // Check for empty LI or a LI with just a child that is a BR since Gecko and WebKit uses BR elements to place the caret
+                               return tinymce.isWebKit && li.firstChild.nodeName == 'BR';
+                       }
+
+                       function isEmptyIE9Li(li) {
+                               // only consider this to be last item if there is no list item content or that content is nbsp or space since IE9 creates these
+                               var lis = tinymce.grep(li.parentNode.childNodes, function(n) {return n.nodeName == 'LI'});
+                               var isLastLi = li == lis[lis.length - 1];
+                               var child = li.firstChild;
+                               return tinymce.isIE9 && isLastLi && (child.nodeValue == String.fromCharCode(160) || child.nodeValue == String.fromCharCode(32));
+                       }
+
+                       function isEnter(e) {
+                               return e.keyCode === 13;
+                       }
+
+                       function getListKeyState(e) {
+                               if (isTabInList(e)) {
+                                       return LIST_TABBING;
+                               } else if (isEnter(e) && isOnLastListItem()) {
+                                       return LIST_ESCAPE;
+                               } else if (isEnter(e) && isInEmptyListItem()) {
+                                       return LIST_EMPTY_ITEM;
+                               } else {
+                                       return LIST_UNKNOWN;
+                               }
+                       }
+
+                       function cancelEnterAndTab(_, e) {
+                               if (state == LIST_TABBING || state == LIST_EMPTY_ITEM) {
+                                       return Event.cancel(e);
+                               }
+                       }
+
+                       function imageJoiningListItem(ed, e) {
+                               var prevSibling;
+
+                               if (!tinymce.isGecko)
+                                       return;
+
+                               var n = ed.selection.getStart();
+                               if (e.keyCode != 8 || n.tagName !== 'IMG')
+                                       return;
+
+                               function lastLI(node) {
+                                       var child = node.firstChild;
+                                       var li = null;
+                                       do {
+                                               if (!child)
+                                                       break;
+
+                                               if (child.tagName === 'LI')
+                                                       li = child;
+                                       } while (child = child.nextSibling);
+
+                                       return li;
+                               }
+
+                               function addChildren(parentNode, destination) {
+                                       while (parentNode.childNodes.length > 0)
+                                               destination.appendChild(parentNode.childNodes[0]);
+                               }
+
+                               // Check if there is a previous sibling
+                               prevSibling = n.parentNode.previousSibling;
+                               if (!prevSibling)
+                                       return;
+
+                               var ul;
+                               if (prevSibling.tagName === 'UL' || prevSibling.tagName === 'OL')
+                                       ul = prevSibling;
+                               else if (prevSibling.previousSibling && (prevSibling.previousSibling.tagName === 'UL' || prevSibling.previousSibling.tagName === 'OL'))
+                                       ul = prevSibling.previousSibling;
+                               else
+                                       return;
+
+                               var li = lastLI(ul);
+
+                               // move the caret to the end of the list item
+                               var rng = ed.dom.createRng();
+                               rng.setStart(li, 1);
+                               rng.setEnd(li, 1);
+                               ed.selection.setRng(rng);
+                               ed.selection.collapse(true);
+
+                               // save a bookmark at the end of the list item
+                               var bookmark = ed.selection.getBookmark();
+
+                               // copy the image an its text to the list item
+                               var clone = n.parentNode.cloneNode(true);
+                               if (clone.tagName === 'P' || clone.tagName === 'DIV')
+                                       addChildren(clone, li);
+                               else
+                                       li.appendChild(clone);
+
+                               // remove the old copy of the image
+                               n.parentNode.parentNode.removeChild(n.parentNode);
+
+                               // move the caret where we saved the bookmark
+                               ed.selection.moveToBookmark(bookmark);
+                       }
+
+                       // fix the cursor position to ensure it is correct in IE
+                       function setCursorPositionToOriginalLi(li) {
+                               var list = ed.dom.getParent(li, 'ol,ul');
+                               if (list != null) {
+                                       var lastLi = list.lastChild;
+                                       lastLi.appendChild(ed.getDoc().createElement(''));
+                                       ed.selection.setCursorLocation(lastLi, 0);
+                               }
+                       }
+
+                       this.ed = ed;
+                       ed.addCommand('Indent', this.indent, this);
+                       ed.addCommand('Outdent', this.outdent, this);
+                       ed.addCommand('InsertUnorderedList', function() {
+                               this.applyList('UL', 'OL');
+                       }, this);
+                       ed.addCommand('InsertOrderedList', function() {
+                               this.applyList('OL', 'UL');
+                       }, this);
+
+                       ed.onInit.add(function() {
+                               ed.editorCommands.addCommands({
+                                       'outdent': function() {
+                                               var sel = ed.selection, dom = ed.dom;
+
+                                               function hasStyleIndent(n) {
+                                                       n = dom.getParent(n, dom.isBlock);
+                                                       return n && (parseInt(ed.dom.getStyle(n, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(n, 'padding-left') || 0, 10)) > 0;
+                                               }
+
+                                               return hasStyleIndent(sel.getStart()) || hasStyleIndent(sel.getEnd()) || ed.queryCommandState('InsertOrderedList') || ed.queryCommandState('InsertUnorderedList');
+                                       }
+                               }, 'state');
+                       });
+
+                       ed.onKeyUp.add(function(ed, e) {
+                               if (state == LIST_TABBING) {
+                                       ed.execCommand(e.shiftKey ? 'Outdent' : 'Indent', true, null);
+                                       state = LIST_UNKNOWN;
+                                       return Event.cancel(e);
+                               } else if (state == LIST_EMPTY_ITEM) {
+                                       var li = getLi();
+                                       var shouldOutdent =  ed.settings.list_outdent_on_enter === true || e.shiftKey;
+                                       ed.execCommand(shouldOutdent ? 'Outdent' : 'Indent', true, null);
+                                       if (tinymce.isIE) {
+                                               setCursorPositionToOriginalLi(li);
+                                       }
+                                       return Event.cancel(e);
+                               } else if (state == LIST_ESCAPE) {
+                                       if (tinymce.isIE8) {
+                                               // append a zero sized nbsp so that caret is positioned correctly in IE8 after escaping and applying formatting.
+                                               // if there is no text then applying formatting for e.g a H1 to the P tag immediately following list after
+                                               // escaping from it will cause the caret to be positioned on the last li instead of staying the in P tag.
+                                               var n = ed.getDoc().createTextNode('\uFEFF');
+                                               ed.selection.getNode().appendChild(n);
+                                       } else if (tinymce.isIE9) {
+                                               // IE9 does not escape the list so we use outdent to do this and cancel the default behaviour
+                                               ed.execCommand('Outdent');
+                                               return Event.cancel(e);
+                                       }
+                               }
+                       });
+                       ed.onKeyDown.add(function(_, e) { state = getListKeyState(e); });
+                       ed.onKeyDown.add(cancelEnterAndTab);
+                       ed.onKeyDown.add(imageJoiningListItem);
+                       ed.onKeyPress.add(cancelEnterAndTab);
+               },
+
+               applyList: function(targetListType, oppositeListType) {
+                       var t = this, ed = t.ed, dom = ed.dom, applied = [], hasSameType = false, hasOppositeType = false, hasNonList = false, actions,
+                                       selectedBlocks = ed.selection.getSelectedBlocks();
+
+                       function cleanupBr(e) {
+                               if (e && e.tagName === 'BR') {
+                                       dom.remove(e);
+                               }
+                       }
+
+                       function makeList(element) {
+                               var list = dom.create(targetListType), li;
+
+                               function adjustIndentForNewList(element) {
+                                       // If there's a margin-left, outdent one level to account for the extra list margin.
+                                       if (element.style.marginLeft || element.style.paddingLeft) {
+                                               t.adjustPaddingFunction(false)(element);
+                                       }
+                               }
+
+                               if (element.tagName === 'LI') {
+                                       // No change required.
+                               } else if (element.tagName === 'P' || element.tagName === 'DIV' || element.tagName === 'BODY') {
+                                       processBrs(element, function(startSection, br, previousBR) {
+                                               doWrapList(startSection, br, element.tagName === 'BODY' ? null : startSection.parentNode);
+                                               li = startSection.parentNode;
+                                               adjustIndentForNewList(li);
+                                               cleanupBr(br);
+                                       });
+                                       if (element.tagName === 'P' || selectedBlocks.length > 1) {
+                                               dom.split(li.parentNode.parentNode, li.parentNode);
+                                       }
+                                       attemptMergeWithAdjacent(li.parentNode, true);
+                                       return;
+                               } else {
+                                       // Put the list around the element.
+                                       li = dom.create('li');
+                                       dom.insertAfter(li, element);
+                                       li.appendChild(element);
+                                       adjustIndentForNewList(element);
+                                       element = li;
+                               }
+                               dom.insertAfter(list, element);
+                               list.appendChild(element);
+                               attemptMergeWithAdjacent(list, true);
+                               applied.push(element);
+                       }
+
+                       function doWrapList(start, end, template) {
+                               var li, n = start, tmp, i;
+                               while (!dom.isBlock(start.parentNode) && start.parentNode !== dom.getRoot()) {
+                                       start = dom.split(start.parentNode, start.previousSibling);
+                                       start = start.nextSibling;
+                                       n = start;
+                               }
+                               if (template) {
+                                       li = template.cloneNode(true);
+                                       start.parentNode.insertBefore(li, start);
+                                       while (li.firstChild) dom.remove(li.firstChild);
+                                       li = dom.rename(li, 'li');
+                               } else {
+                                       li = dom.create('li');
+                                       start.parentNode.insertBefore(li, start);
+                               }
+                               while (n && n != end) {
+                                       tmp = n.nextSibling;
+                                       li.appendChild(n);
+                                       n = tmp;
+                               }
+                               if (li.childNodes.length === 0) {
+                                       li.innerHTML = '<br _mce_bogus="1" />';
+                               }
+                               makeList(li);
+                       }
+
+                       function processBrs(element, callback) {
+                               var startSection, previousBR, END_TO_START = 3, START_TO_END = 1,
+                                               breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl';
+
+                               function isAnyPartSelected(start, end) {
+                                       var r = dom.createRng(), sel;
+                                       bookmark.keep = true;
+                                       ed.selection.moveToBookmark(bookmark);
+                                       bookmark.keep = false;
+                                       sel = ed.selection.getRng(true);
+                                       if (!end) {
+                                               end = start.parentNode.lastChild;
+                                       }
+                                       r.setStartBefore(start);
+                                       r.setEndAfter(end);
+                                       return !(r.compareBoundaryPoints(END_TO_START, sel) > 0 || r.compareBoundaryPoints(START_TO_END, sel) <= 0);
+                               }
+
+                               function nextLeaf(br) {
+                                       if (br.nextSibling)
+                                               return br.nextSibling;
+                                       if (!dom.isBlock(br.parentNode) && br.parentNode !== dom.getRoot())
+                                               return nextLeaf(br.parentNode);
+                               }
+
+                               // Split on BRs within the range and process those.
+                               startSection = element.firstChild;
+                               // First mark the BRs that have any part of the previous section selected.
+                               var trailingContentSelected = false;
+                               each(dom.select(breakElements, element), function(br) {
+                                       var b;
+                                       if (br.hasAttribute && br.hasAttribute('_mce_bogus')) {
+                                               return true; // Skip the bogus Brs that are put in to appease Firefox and Safari.
+                                       }
+                                       if (isAnyPartSelected(startSection, br)) {
+                                               dom.addClass(br, '_mce_tagged_br');
+                                               startSection = nextLeaf(br);
+                                       }
+                               });
+                               trailingContentSelected = (startSection && isAnyPartSelected(startSection, undefined));
+                               startSection = element.firstChild;
+                               each(dom.select(breakElements, element), function(br) {
+                                       // Got a section from start to br.
+                                       var tmp = nextLeaf(br);
+                                       if (br.hasAttribute && br.hasAttribute('_mce_bogus')) {
+                                               return true; // Skip the bogus Brs that are put in to appease Firefox and Safari.
+                                       }
+                                       if (dom.hasClass(br, '_mce_tagged_br')) {
+                                               callback(startSection, br, previousBR);
+                                               previousBR = null;
+                                       } else {
+                                               previousBR = br;
+                                       }
+                                       startSection = tmp;
+                               });
+                               if (trailingContentSelected) {
+                                       callback(startSection, undefined, previousBR);
+                               }
+                       }
+
+                       function wrapList(element) {
+                               processBrs(element, function(startSection, br, previousBR) {
+                                       // Need to indent this part
+                                       doWrapList(startSection, br);
+                                       cleanupBr(br);
+                                       cleanupBr(previousBR);
+                               });
+                       }
+
+                       function changeList(element) {
+                               if (tinymce.inArray(applied, element) !== -1) {
+                                       return;
+                               }
+                               if (element.parentNode.tagName === oppositeListType) {
+                                       dom.split(element.parentNode, element);
+                                       makeList(element);
+                                       attemptMergeWithNext(element.parentNode, false);
+                               }
+                               applied.push(element);
+                       }
+
+                       function convertListItemToParagraph(element) {
+                               var child, nextChild, mergedElement, splitLast;
+                               if (tinymce.inArray(applied, element) !== -1) {
+                                       return;
+                               }
+                               element = splitNestedLists(element, dom);
+                               while (dom.is(element.parentNode, 'ol,ul,li')) {
+                                       dom.split(element.parentNode, element);
+                               }
+                               // Push the original element we have from the selection, not the renamed one.
+                               applied.push(element);
+                               element = dom.rename(element, 'p');
+                               mergedElement = attemptMergeWithAdjacent(element, false, ed.settings.force_br_newlines);
+                               if (mergedElement === element) {
+                                       // Now split out any block elements that can't be contained within a P.
+                                       // Manually iterate to ensure we handle modifications correctly (doesn't work with tinymce.each)
+                                       child = element.firstChild;
+                                       while (child) {
+                                               if (dom.isBlock(child)) {
+                                                       child = dom.split(child.parentNode, child);
+                                                       splitLast = true;
+                                                       nextChild = child.nextSibling && child.nextSibling.firstChild;
+                                               } else {
+                                                       nextChild = child.nextSibling;
+                                                       if (splitLast && child.tagName === 'BR') {
+                                                               dom.remove(child);
+                                                       }
+                                                       splitLast = false;
+                                               }
+                                               child = nextChild;
+                                       }
+                               }
+                       }
+
+                       each(selectedBlocks, function(e) {
+                               e = findItemToOperateOn(e, dom);
+                               if (e.tagName === oppositeListType || (e.tagName === 'LI' && e.parentNode.tagName === oppositeListType)) {
+                                       hasOppositeType = true;
+                               } else if (e.tagName === targetListType || (e.tagName === 'LI' && e.parentNode.tagName === targetListType)) {
+                                       hasSameType = true;
+                               } else {
+                                       hasNonList = true;
+                               }
+                       });
+
+                       if (hasNonList || hasOppositeType || selectedBlocks.length === 0) {
+                               actions = {
+                                       'LI': changeList,
+                                       'H1': makeList,
+                                       'H2': makeList,
+                                       'H3': makeList,
+                                       'H4': makeList,
+                                       'H5': makeList,
+                                       'H6': makeList,
+                                       'P': makeList,
+                                       'BODY': makeList,
+                                       'DIV': selectedBlocks.length > 1 ? makeList : wrapList,
+                                       defaultAction: wrapList
+                               };
+                       } else {
+                               actions = {
+                                       defaultAction: convertListItemToParagraph
+                               };
+                       }
+                       this.process(actions);
+               },
+
+               indent: function() {
+                       var ed = this.ed, dom = ed.dom, indented = [];
+
+                       function createWrapItem(element) {
+                               var wrapItem = dom.create('li', { style: 'list-style-type: none;'});
+                               dom.insertAfter(wrapItem, element);
+                               return wrapItem;
+                       }
+
+                       function createWrapList(element) {
+                               var wrapItem = createWrapItem(element),
+                                               list = dom.getParent(element, 'ol,ul'),
+                                               listType = list.tagName,
+                                               listStyle = dom.getStyle(list, 'list-style-type'),
+                                               attrs = {},
+                                               wrapList;
+                               if (listStyle !== '') {
+                                       attrs.style = 'list-style-type: ' + listStyle + ';';
+                               }
+                               wrapList = dom.create(listType, attrs);
+                               wrapItem.appendChild(wrapList);
+                               return wrapList;
+                       }
+
+                       function indentLI(element) {
+                               if (!hasParentInList(ed, element, indented)) {
+                                       element = splitNestedLists(element, dom);
+                                       var wrapList = createWrapList(element);
+                                       wrapList.appendChild(element);
+                                       attemptMergeWithAdjacent(wrapList.parentNode, false);
+                                       attemptMergeWithAdjacent(wrapList, false);
+                                       indented.push(element);
+                               }
+                       }
+
+                       this.process({
+                               'LI': indentLI,
+                               defaultAction: this.adjustPaddingFunction(true)
+                       });
+
+               },
+
+               outdent: function() {
+                       var t = this, ed = t.ed, dom = ed.dom, outdented = [];
+
+                       function outdentLI(element) {
+                               var listElement, targetParent, align;
+                               if (!hasParentInList(ed, element, outdented)) {
+                                       if (dom.getStyle(element, 'margin-left') !== '' || dom.getStyle(element, 'padding-left') !== '') {
+                                               return t.adjustPaddingFunction(false)(element);
+                                       }
+                                       align = dom.getStyle(element, 'text-align', true);
+                                       if (align === 'center' || align === 'right') {
+                                               dom.setStyle(element, 'text-align', 'left');
+                                               return;
+                                       }
+                                       element = splitNestedLists(element, dom);
+                                       listElement = element.parentNode;
+                                       targetParent = element.parentNode.parentNode;
+                                       if (targetParent.tagName === 'P') {
+                                               dom.split(targetParent, element.parentNode);
+                                       } else {
+                                               dom.split(listElement, element);
+                                               if (targetParent.tagName === 'LI') {
+                                                       // Nested list, need to split the LI and go back out to the OL/UL element.
+                                                       dom.split(targetParent, element);
+                                               } else if (!dom.is(targetParent, 'ol,ul')) {
+                                                       dom.rename(element, 'p');
+                                               }
+                                       }
+                                       outdented.push(element);
+                               }
+                       }
+
+                       this.process({
+                               'LI': outdentLI,
+                               defaultAction: this.adjustPaddingFunction(false)
+                       });
+
+                       each(outdented, attemptMergeWithAdjacent);
+               },
+
+               process: function(actions) {
+                       var t = this, sel = t.ed.selection, dom = t.ed.dom, selectedBlocks, r;
+
+                       function processElement(element) {
+                               dom.removeClass(element, '_mce_act_on');
+                               if (!element || element.nodeType !== 1) {
+                                       return;
+                               }
+                               element = findItemToOperateOn(element, dom);
+                               var action = actions[element.tagName];
+                               if (!action) {
+                                       action = actions.defaultAction;
+                               }
+                               action(element);
+                       }
+
+                       function recurse(element) {
+                               t.splitSafeEach(element.childNodes, processElement);
+                       }
+
+                       function brAtEdgeOfSelection(container, offset) {
+                               return offset >= 0 && container.hasChildNodes() && offset < container.childNodes.length &&
+                                               container.childNodes[offset].tagName === 'BR';
+                       }
+
+                       selectedBlocks = sel.getSelectedBlocks();
+                       if (selectedBlocks.length === 0) {
+                               selectedBlocks = [ dom.getRoot() ];
+                       }
+
+                       r = sel.getRng(true);
+                       if (!r.collapsed) {
+                               if (brAtEdgeOfSelection(r.endContainer, r.endOffset - 1)) {
+                                       r.setEnd(r.endContainer, r.endOffset - 1);
+                                       sel.setRng(r);
+                               }
+                               if (brAtEdgeOfSelection(r.startContainer, r.startOffset)) {
+                                       r.setStart(r.startContainer, r.startOffset + 1);
+                                       sel.setRng(r);
+                               }
+                       }
+
+
+                       if (tinymce.isIE8) {
+                               // append a zero sized nbsp so that caret is restored correctly using bookmark
+                               var s = t.ed.selection.getNode();
+                               if (s.tagName === 'LI' && !(s.parentNode.lastChild === s)) {
+                                       var i = t.ed.getDoc().createTextNode('\uFEFF');
+                                       s.appendChild(i);
+                               }
+                       }
+
+                       bookmark = sel.getBookmark();
+                       actions.OL = actions.UL = recurse;
+                       t.splitSafeEach(selectedBlocks, processElement);
+                       sel.moveToBookmark(bookmark);
+                       bookmark = null;
+                       // Avoids table or image handles being left behind in Firefox.
+                       t.ed.execCommand('mceRepaint');
+               },
+
+               splitSafeEach: function(elements, f) {
+                       if (tinymce.isGecko && (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) ||
+                                       /Firefox\/3\.[0-4]/.test(navigator.userAgent))) {
+                               this.classBasedEach(elements, f);
+                       } else {
+                               each(elements, f);
+                       }
+               },
+
+               classBasedEach: function(elements, f) {
+                       var dom = this.ed.dom, nodes, element;
+                       // Mark nodes
+                       each(elements, function(element) {
+                               dom.addClass(element, '_mce_act_on');
+                       });
+                       nodes = dom.select('._mce_act_on');
+                       while (nodes.length > 0) {
+                               element = nodes.shift();
+                               dom.removeClass(element, '_mce_act_on');
+                               f(element);
+                               nodes = dom.select('._mce_act_on');
+                       }
+               },
+
+               adjustPaddingFunction: function(isIndent) {
+                       var indentAmount, indentUnits, ed = this.ed;
+                       indentAmount = ed.settings.indentation;
+                       indentUnits = /[a-z%]+/i.exec(indentAmount);
+                       indentAmount = parseInt(indentAmount, 10);
+                       return function(element) {
+                               var currentIndent, newIndentAmount;
+                               currentIndent = parseInt(ed.dom.getStyle(element, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(element, 'padding-left') || 0, 10);
+                               if (isIndent) {
+                                       newIndentAmount = currentIndent + indentAmount;
+                               } else {
+                                       newIndentAmount = currentIndent - indentAmount;
+                               }
+                               ed.dom.setStyle(element, 'padding-left', '');
+                               ed.dom.setStyle(element, 'margin-left', newIndentAmount > 0 ? newIndentAmount + indentUnits : '');
+                       };
+               },
+
+               getInfo: function() {
+                       return {
+                               longname : 'Lists',
+                               author : 'Moxiecode Systems AB',
+                               authorurl : 'http://tinymce.moxiecode.com',
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists',
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion
+                       };
+               }
+       });
+       tinymce.PluginManager.add("lists", tinymce.plugins.Lists);
+}());
diff --git a/webcit/tiny_mce/plugins/media/css/media.css b/webcit/tiny_mce/plugins/media/css/media.css
new file mode 100644 (file)
index 0000000..0c45c7f
--- /dev/null
@@ -0,0 +1,17 @@
+#id, #name, #hspace, #vspace, #class_name, #align { width: 100px }\r
+#hspace, #vspace { width: 50px }\r
+#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px }\r
+#flash_base, #flash_flashvars, #html5_altsource1, #html5_altsource2, #html5_poster { width: 240px }\r
+#width, #height { width: 40px }\r
+#src, #media_type { width: 250px }\r
+#class { width: 120px }\r
+#prev { margin: 0; border: 1px solid black; width: 380px; height: 260px; overflow: auto }\r
+.panel_wrapper div.current { height: 420px; overflow: auto }\r
+#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none }\r
+.mceAddSelectValue { background-color: #DDDDDD }\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 { width: 70px }\r
+#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px }\r
+#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px }\r
+#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px }\r
+#qt_qtsrc { width: 200px }\r
+iframe {border: 1px solid gray}\r
diff --git a/webcit/tiny_mce/plugins/media/editor_plugin.js b/webcit/tiny_mce/plugins/media/editor_plugin.js
new file mode 100644 (file)
index 0000000..f89959e
--- /dev/null
@@ -0,0 +1 @@
+(function(){var d=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),h=tinymce.makeMap(d.join(",")),b=tinymce.html.Node,f,a,g=tinymce.util.JSON,e;f=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"],["Audio"]];function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(i){return i&&i.nodeName==="IMG"&&n.dom.hasClass(i,"mceItemMedia")}r.editor=n;r.url=j;a="";for(m=0;m<f.length;m++){k=f[m][0];q={name:k,clsids:tinymce.explode(f[m][1]||""),mimes:tinymce.explode(f[m][2]||""),codebase:f[m][3]};for(p=0;p<q.clsids.length;p++){l["clsid:"+q.clsids[p]]=q}for(p=0;p<q.mimes.length;p++){l[q.mimes[p]]=q}l["mceItem"+k]=q;l[k.toLowerCase()]=q;a+=(a?"|":"")+k}tinymce.each(n.getParam("media_types","video=mp4,m4v,ogv,webm;silverlight=xap;flash=swf,flv;shockwave=dcr;quicktime=mov,qt,mpg,mpeg;shockwave=dcr;windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;realmedia=rm,ra,ram;java=jar;audio=mp3,ogg").split(";"),function(v){var s,u,t;v=v.split(/=/);u=tinymce.explode(v[1].toLowerCase());for(s=0;s<u.length;s++){t=l[v[0].toLowerCase()];if(t){l[u[s]]=t}}});a=new RegExp("write("+a+")\\(([^)]+)\\)");r.lookup=l;n.onPreInit.add(function(){n.schema.addValidElements("object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]");n.parser.addNodeFilter("object,embed,video,audio,script,iframe",function(s){var t=s.length;while(t--){r.objectToImg(s[t])}});n.serializer.addNodeFilter("img",function(s,u,t){var v=s.length,w;while(v--){w=s[v];if((w.attr("class")||"").indexOf("mceItemMedia")!==-1){r.imgToObject(w,t)}}})});n.onInit.add(function(){if(n.theme&&n.theme.onResolveName){n.theme.onResolveName.add(function(i,s){if(s.name==="img"&&n.dom.hasClass(s.node,"mceItemMedia")){s.name="media"}})}if(n&&n.plugins.contextmenu){n.plugins.contextmenu.onContextMenu.add(function(s,t,i){if(i.nodeName==="IMG"&&i.className.indexOf("mceItemMedia")!==-1){t.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});n.addCommand("mceMedia",function(){var s,i;i=n.selection.getNode();if(o(i)){s=n.dom.getAttrib(i,"data-mce-json");if(s){s=g.parse(s);tinymce.each(d,function(t){var u=n.dom.getAttrib(i,t);if(u){s[t]=u}});s.type=r.getType(i.className).name.toLowerCase()}}if(!s){s={type:"flash",video:{sources:[]},params:{}}}n.windowManager.open({file:j+"/media.htm",width:430+parseInt(n.getLang("media.delta_width",0)),height:500+parseInt(n.getLang("media.delta_height",0)),inline:1},{plugin_url:j,data:s})});n.addButton("media",{title:"media.desc",cmd:"mceMedia"});n.onNodeChange.add(function(s,i,t){i.setActive("media",o(t))})},convertUrl:function(k,n){var j=this,m=j.editor,l=m.settings,o=l.url_converter,i=l.url_converter_scope||j;if(!k){return k}if(n){return m.documentBaseURI.toAbsolute(k)}return o.call(i,k,"src","object")},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}},dataToImg:function(m,k){var r=this,o=r.editor,p=o.documentBaseURI,j,q,n,l;m.params.src=r.convertUrl(m.params.src,k);q=m.video.attrs;if(q){q.src=r.convertUrl(q.src,k)}if(q){q.poster=r.convertUrl(q.poster,k)}j=c(m.video.sources);if(j){for(l=0;l<j.length;l++){j[l].src=r.convertUrl(j[l].src,k)}}n=r.editor.dom.create("img",{id:m.id,style:m.style,align:m.align,src:r.editor.theme.url+"/img/trans.gif","class":"mceItemMedia mceItem"+r.getType(m.type).name,"data-mce-json":g.serialize(m,"'")});n.width=m.width||(m.type=="audio"?"300":"320");n.height=m.height||(m.type=="audio"?"32":"240");return n},dataToHtml:function(i,j){return this.editor.serializer.serialize(this.dataToImg(i,j),{forced_root_block:"",force_absolute:j})},htmlToData:function(k){var j,i,l;l={type:"flash",video:{sources:[]},params:{}};j=this.editor.parser.parse(k);i=j.getAll("img")[0];if(i){l=g.parse(i.attr("data-mce-json"));l.type=this.getType(i.attr("class")).name.toLowerCase();tinymce.each(d,function(m){var n=i.attr(m);if(n){l[m]=n}})}return l},getType:function(m){var k,j,l;j=tinymce.explode(m," ");for(k=0;k<j.length;k++){l=this.lookup[j[k]];if(l){return l}}},imgToObject:function(x,n){var t=this,o=t.editor,A,F,j,s,G,w,E,u,k,C,r,p,y,B,m,v,l,z,D;function q(i,H){var L,K,M,J,I;I=o.getParam("flash_video_player_url",t.convertUrl(t.url+"/moxieplayer.swf"));if(I){L=o.documentBaseURI;E.params.src=I;if(o.getParam("flash_video_player_absvideourl",true)){i=L.toAbsolute(i||"",true);H=L.toAbsolute(H||"",true)}M="";K=o.getParam("flash_video_player_flashvars",{url:"$url",poster:"$poster"});tinymce.each(K,function(O,N){O=O.replace(/\$url/,i||"");O=O.replace(/\$poster/,H||"");if(O.length>0){M+=(M?"&":"")+N+"="+escape(O)}});if(M.length){E.params.flashvars=M}J=o.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(J,function(O,N){E.params[N]=""+O})}}E=x.attr("data-mce-json");if(!E){return}E=g.parse(E);p=this.getType(x.attr("class"));z=x.attr("data-mce-style");if(!z){z=x.attr("style");if(z){z=o.dom.serializeStyle(o.dom.parseStyle(z,"img"))}}if(p.name==="Iframe"){v=new b("iframe",1);tinymce.each(d,function(i){var H=x.attr(i);if(i=="class"&&H){H=H.replace(/mceItem.+ ?/g,"")}if(H&&H.length>0){v.attr(i,H)}});for(G in E.params){v.attr(G,E.params[G])}v.attr({style:z,src:E.params.src});x.replace(v);return}if(this.editor.settings.media_use_script){v=new b("script",1).attr("type","text/javascript");w=new b("#text",3);w.value="write"+p.name+"("+g.serialize(tinymce.extend(E.params,{width:x.attr("width"),height:x.attr("height")}))+");";v.append(w);x.replace(v);return}if(p.name==="Video"&&E.video.sources[0]){A=new b("video",1).attr(tinymce.extend({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z},E.video.attrs));if(E.video.attrs){l=E.video.attrs.poster}k=E.video.sources=c(E.video.sources);for(y=0;y<k.length;y++){if(/\.mp4$/.test(k[y].src)){m=k[y].src}}if(!k[0].type){A.attr("src",k[0].src);k.splice(0,1)}for(y=0;y<k.length;y++){u=new b("source",1).attr(k[y]);u.shortEnded=true;A.append(u)}if(m){q(m,l);p=t.getType("flash")}else{E.params.src=""}}if(p.name==="Audio"&&E.video.sources[0]){D=new b("audio",1).attr(tinymce.extend({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z},E.video.attrs));if(E.video.attrs){l=E.video.attrs.poster}k=E.video.sources=c(E.video.sources);if(!k[0].type){D.attr("src",k[0].src);k.splice(0,1)}for(y=0;y<k.length;y++){u=new b("source",1).attr(k[y]);u.shortEnded=true;D.append(u)}E.params.src=""}if(E.params.src){if(/\.flv$/i.test(E.params.src)){q(E.params.src,"")}if(n&&n.force_absolute){E.params.src=o.documentBaseURI.toAbsolute(E.params.src)}F=new b("object",1).attr({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z});tinymce.each(d,function(i){if(E[i]&&i!="type"){F.attr(i,E[i])}});for(G in E.params){r=new b("param",1);r.shortEnded=true;w=E.params[G];if(G==="src"&&p.name==="WindowsMedia"){G="url"}r.attr({name:G,value:w});F.append(r)}if(this.editor.getParam("media_strict",true)){F.attr({data:E.params.src,type:p.mimes[0]})}else{F.attr({classid:"clsid:"+p.clsids[0],codebase:p.codebase});j=new b("embed",1);j.shortEnded=true;j.attr({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z,type:p.mimes[0]});for(G in E.params){j.attr(G,E.params[G])}tinymce.each(d,function(i){if(E[i]&&i!="type"){j.attr(i,E[i])}});F.append(j)}if(E.object_html){w=new b("#text",3);w.raw=true;w.value=E.object_html;F.append(w)}if(A){A.append(F)}}if(A){if(E.video_html){w=new b("#text",3);w.raw=true;w.value=E.video_html;A.append(w)}}if(D){if(E.video_html){w=new b("#text",3);w.raw=true;w.value=E.video_html;D.append(w)}}if(A||D||F){x.replace(A||D||F)}else{x.remove()}},objectToImg:function(y){var F,j,A,p,G,H,u,w,t,B,z,q,o,D,x,k,E,n,C=this.lookup,l,v,s=this.editor.settings.url_converter,m=this.editor.settings.url_converter_scope;function r(i){return new tinymce.html.Serializer({inner:true,validate:false}).serialize(i)}if(!y.parent){return}if(y.name==="script"){if(y.firstChild){l=a.exec(y.firstChild.value)}if(!l){return}n=l[1];E={video:{},params:g.parse(l[2])};w=E.params.width;t=E.params.height}E=E||{video:{},params:{}};G=new b("img",1);G.attr({src:this.editor.theme.url+"/img/trans.gif"});H=y.name;if(H==="video"||H=="audio"){A=y;F=y.getAll("object")[0];j=y.getAll("embed")[0];w=A.attr("width");t=A.attr("height");u=A.attr("id");E.video={attrs:{},sources:[]};v=E.video.attrs;for(H in A.attributes.map){v[H]=A.attributes.map[H]}x=y.attr("src");if(x){E.video.sources.push({src:s.call(m,x,"src",y.name)})}k=A.getAll("source");for(z=0;z<k.length;z++){x=k[z].remove();E.video.sources.push({src:s.call(m,x.attr("src"),"src","source"),type:x.attr("type"),media:x.attr("media")})}if(v.poster){v.poster=s.call(m,v.poster,"poster",y.name)}}if(y.name==="object"){F=y;j=y.getAll("embed")[0]}if(y.name==="embed"){j=y}if(y.name==="iframe"){p=y;n="Iframe"}if(F){w=w||F.attr("width");t=t||F.attr("height");B=B||F.attr("style");u=u||F.attr("id");D=F.getAll("param");for(z=0;z<D.length;z++){o=D[z];H=o.remove().attr("name");if(!h[H]){E.params[H]=o.attr("value")}}E.params.src=E.params.src||F.attr("data")}if(j){w=w||j.attr("width");t=t||j.attr("height");B=B||j.attr("style");u=u||j.attr("id");for(H in j.attributes.map){if(!h[H]&&!E.params[H]){E.params[H]=j.attributes.map[H]}}}if(p){w=p.attr("width");t=p.attr("height");B=B||p.attr("style");u=p.attr("id");tinymce.each(d,function(i){G.attr(i,p.attr(i))});for(H in p.attributes.map){if(!h[H]&&!E.params[H]){E.params[H]=p.attributes.map[H]}}}if(E.params.movie){E.params.src=E.params.src||E.params.movie;delete E.params.movie}if(E.params.src){E.params.src=s.call(m,E.params.src,"src","object")}if(A){if(y.name==="video"){n=C.video.name}else{if(y.name==="audio"){n=C.audio.name}}}if(F&&!n){n=(C[(F.attr("clsid")||"").toLowerCase()]||C[(F.attr("type")||"").toLowerCase()]||{}).name}if(j&&!n){n=(C[(j.attr("type")||"").toLowerCase()]||{}).name}y.replace(G);if(j){j.remove()}if(F){q=r(F.remove());if(q){E.object_html=q}}if(A){q=r(A.remove());if(q){E.video_html=q}}G.attr({id:u,"class":"mceItemMedia mceItem"+(n||"Flash"),style:B,width:w||(y.name=="audio"?"300":"320"),height:t||(y.name=="audio"?"32":"240"),"data-mce-json":g.serialize(E,"'")})}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/editor_plugin_src.js b/webcit/tiny_mce/plugins/media/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..219d713
--- /dev/null
@@ -0,0 +1,822 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var rootAttributes = tinymce.explode('id,name,width,height,style,align,class,hspace,vspace,bgcolor,type'), excludedAttrs = tinymce.makeMap(rootAttributes.join(',')), Node = tinymce.html.Node,\r
+               mediaTypes, scriptRegExp, JSON = tinymce.util.JSON, mimeTypes;\r
+\r
+       // Media types supported by this plugin\r
+       mediaTypes = [\r
+               // Type, clsid:s, mime types, codebase\r
+               ["Flash", "d27cdb6e-ae6d-11cf-96b8-444553540000", "application/x-shockwave-flash", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],\r
+               ["ShockWave", "166b1bca-3f9c-11cf-8075-444553540000", "application/x-director", "http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],\r
+               ["WindowsMedia", "6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a", "application/x-mplayer2", "http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],\r
+               ["QuickTime", "02bf25d5-8c17-4b23-bc80-d3488abddc6b", "video/quicktime", "http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],\r
+               ["RealMedia", "cfcdaa03-8be4-11cf-b84b-0020afbbccfa", "audio/x-pn-realaudio-plugin", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],\r
+               ["Java", "8ad9c840-044e-11d1-b3e9-00805f499d93", "application/x-java-applet", "http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],\r
+               ["Silverlight", "dfeaf541-f3e1-4c24-acac-99c30715084a", "application/x-silverlight-2"],\r
+               ["Iframe"],\r
+               ["Video"],\r
+               ["Audio"]\r
+       ];\r
+\r
+       function toArray(obj) {\r
+               var undef, out, i;\r
+\r
+               if (obj && !obj.splice) {\r
+                       out = [];\r
+\r
+                       for (i = 0; true; i++) {\r
+                               if (obj[i])\r
+                                       out[i] = obj[i];\r
+                               else\r
+                                       break;\r
+                       }\r
+\r
+                       return out;\r
+               }\r
+\r
+               return obj;\r
+       };\r
+\r
+       tinymce.create('tinymce.plugins.MediaPlugin', {\r
+               init : function(ed, url) {\r
+                       var self = this, lookup = {}, i, y, item, name;\r
+\r
+                       function isMediaImg(node) {\r
+                               return node && node.nodeName === 'IMG' && ed.dom.hasClass(node, 'mceItemMedia');\r
+                       };\r
+\r
+                       self.editor = ed;\r
+                       self.url = url;\r
+\r
+                       // Parse media types into a lookup table\r
+                       scriptRegExp = '';\r
+                       for (i = 0; i < mediaTypes.length; i++) {\r
+                               name = mediaTypes[i][0];\r
+\r
+                               item = {\r
+                                       name : name,\r
+                                       clsids : tinymce.explode(mediaTypes[i][1] || ''),\r
+                                       mimes : tinymce.explode(mediaTypes[i][2] || ''),\r
+                                       codebase : mediaTypes[i][3]\r
+                               };\r
+\r
+                               for (y = 0; y < item.clsids.length; y++)\r
+                                       lookup['clsid:' + item.clsids[y]] = item;\r
+\r
+                               for (y = 0; y < item.mimes.length; y++)\r
+                                       lookup[item.mimes[y]] = item;\r
+\r
+                               lookup['mceItem' + name] = item;\r
+                               lookup[name.toLowerCase()] = item;\r
+\r
+                               scriptRegExp += (scriptRegExp ? '|' : '') + name;\r
+                       }\r
+\r
+                       // Handle the media_types setting\r
+                       tinymce.each(ed.getParam("media_types",\r
+                               "video=mp4,m4v,ogv,webm;" +\r
+                               "silverlight=xap;" +\r
+                               "flash=swf,flv;" +\r
+                               "shockwave=dcr;" +\r
+                               "quicktime=mov,qt,mpg,mpeg;" +\r
+                               "shockwave=dcr;" +\r
+                               "windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;" +\r
+                               "realmedia=rm,ra,ram;" +\r
+                               "java=jar;" +\r
+                               "audio=mp3,ogg"\r
+                       ).split(';'), function(item) {\r
+                               var i, extensions, type;\r
+\r
+                               item = item.split(/=/);\r
+                               extensions = tinymce.explode(item[1].toLowerCase());\r
+                               for (i = 0; i < extensions.length; i++) {\r
+                                       type = lookup[item[0].toLowerCase()];\r
+\r
+                                       if (type)\r
+                                               lookup[extensions[i]] = type;\r
+                               }\r
+                       });\r
+\r
+                       scriptRegExp = new RegExp('write(' + scriptRegExp + ')\\(([^)]+)\\)');\r
+                       self.lookup = lookup;\r
+\r
+                       ed.onPreInit.add(function() {\r
+                               // Allow video elements\r
+                               ed.schema.addValidElements('object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]');\r
+\r
+                               // Convert video elements to image placeholder\r
+                               ed.parser.addNodeFilter('object,embed,video,audio,script,iframe', function(nodes) {\r
+                                       var i = nodes.length;\r
+\r
+                                       while (i--)\r
+                                               self.objectToImg(nodes[i]);\r
+                               });\r
+\r
+                               // Convert image placeholders to video elements\r
+                               ed.serializer.addNodeFilter('img', function(nodes, name, args) {\r
+                                       var i = nodes.length, node;\r
+\r
+                                       while (i--) {\r
+                                               node = nodes[i];\r
+                                               if ((node.attr('class') || '').indexOf('mceItemMedia') !== -1)\r
+                                                       self.imgToObject(node, args);\r
+                                       }\r
+                               });\r
+                       });\r
+\r
+                       ed.onInit.add(function() {\r
+                               // Display "media" instead of "img" in element path\r
+                               if (ed.theme && ed.theme.onResolveName) {\r
+                                       ed.theme.onResolveName.add(function(theme, path_object) {\r
+                                               if (path_object.name === 'img' && ed.dom.hasClass(path_object.node, 'mceItemMedia'))\r
+                                                       path_object.name = 'media';\r
+                                       });\r
+                               }\r
+\r
+                               // Add contect menu if it's loaded\r
+                               if (ed && ed.plugins.contextmenu) {\r
+                                       ed.plugins.contextmenu.onContextMenu.add(function(plugin, menu, element) {\r
+                                               if (element.nodeName === 'IMG' && element.className.indexOf('mceItemMedia') !== -1)\r
+                                                       menu.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'});\r
+                                       });\r
+                               }\r
+                       });\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceMedia', function() {\r
+                               var data, img;\r
+\r
+                               img = ed.selection.getNode();\r
+                               if (isMediaImg(img)) {\r
+                                       data = ed.dom.getAttrib(img, 'data-mce-json');\r
+                                       if (data) {\r
+                                               data = JSON.parse(data);\r
+\r
+                                               // Add some extra properties to the data object\r
+                                               tinymce.each(rootAttributes, function(name) {\r
+                                                       var value = ed.dom.getAttrib(img, name);\r
+\r
+                                                       if (value)\r
+                                                               data[name] = value;\r
+                                               });\r
+\r
+                                               data.type = self.getType(img.className).name.toLowerCase();\r
+                                       }\r
+                               }\r
+\r
+                               if (!data) {\r
+                                       data = {\r
+                                               type : 'flash',\r
+                                               video: {sources:[]},\r
+                                               params: {}\r
+                                       };\r
+                               }\r
+\r
+                               ed.windowManager.open({\r
+                                       file : url + '/media.htm',\r
+                                       width : 430 + parseInt(ed.getLang('media.delta_width', 0)),\r
+                                       height : 500 + parseInt(ed.getLang('media.delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url,\r
+                                       data : data\r
+                               });\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'});\r
+\r
+                       // Update media selection status\r
+                       ed.onNodeChange.add(function(ed, cm, node) {\r
+                               cm.setActive('media', isMediaImg(node));\r
+                       });\r
+               },\r
+\r
+               convertUrl : function(url, force_absolute) {\r
+                       var self = this, editor = self.editor, settings = editor.settings,\r
+                               urlConverter = settings.url_converter,\r
+                               urlConverterScope = settings.url_converter_scope || self;\r
+\r
+                       if (!url)\r
+                               return url;\r
+\r
+                       if (force_absolute)\r
+                               return editor.documentBaseURI.toAbsolute(url);\r
+\r
+                       return urlConverter.call(urlConverterScope, url, 'src', 'object');\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
+               /**\r
+                * Converts the JSON data object to an img node.\r
+                */\r
+               dataToImg : function(data, force_absolute) {\r
+                       var self = this, editor = self.editor, baseUri = editor.documentBaseURI, sources, attrs, img, i;\r
+\r
+                       data.params.src = self.convertUrl(data.params.src, force_absolute);\r
+\r
+                       attrs = data.video.attrs;\r
+                       if (attrs)\r
+                               attrs.src = self.convertUrl(attrs.src, force_absolute);\r
+\r
+                       if (attrs)\r
+                               attrs.poster = self.convertUrl(attrs.poster, force_absolute);\r
+\r
+                       sources = toArray(data.video.sources);\r
+                       if (sources) {\r
+                               for (i = 0; i < sources.length; i++)\r
+                                       sources[i].src = self.convertUrl(sources[i].src, force_absolute);\r
+                       }\r
+\r
+                       img = self.editor.dom.create('img', {\r
+                               id : data.id,\r
+                               style : data.style,\r
+                               align : data.align,\r
+                               src : self.editor.theme.url + '/img/trans.gif',\r
+                               'class' : 'mceItemMedia mceItem' + self.getType(data.type).name,\r
+                               'data-mce-json' : JSON.serialize(data, "'")\r
+                       });\r
+\r
+                       img.width = data.width || (data.type == 'audio' ? "300" : "320");\r
+                       img.height = data.height || (data.type == 'audio' ? "32" : "240");\r
+\r
+                       return img;\r
+               },\r
+\r
+               /**\r
+                * Converts the JSON data object to a HTML string.\r
+                */\r
+               dataToHtml : function(data, force_absolute) {\r
+                       return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {forced_root_block : '', force_absolute : force_absolute});\r
+               },\r
+\r
+               /**\r
+                * Converts the JSON data object to a HTML string.\r
+                */\r
+               htmlToData : function(html) {\r
+                       var fragment, img, data;\r
+\r
+                       data = {\r
+                               type : 'flash',\r
+                               video: {sources:[]},\r
+                               params: {}\r
+                       };\r
+\r
+                       fragment = this.editor.parser.parse(html);\r
+                       img = fragment.getAll('img')[0];\r
+\r
+                       if (img) {\r
+                               data = JSON.parse(img.attr('data-mce-json'));\r
+                               data.type = this.getType(img.attr('class')).name.toLowerCase();\r
+\r
+                               // Add some extra properties to the data object\r
+                               tinymce.each(rootAttributes, function(name) {\r
+                                       var value = img.attr(name);\r
+\r
+                                       if (value)\r
+                                               data[name] = value;\r
+                               });\r
+                       }\r
+\r
+                       return data;\r
+               },\r
+\r
+               /**\r
+                * Get type item by extension, class, clsid or mime type.\r
+                *\r
+                * @method getType\r
+                * @param {String} value Value to get type item by.\r
+                * @return {Object} Type item object or undefined.\r
+                */\r
+               getType : function(value) {\r
+                       var i, values, typeItem;\r
+\r
+                       // Find type by checking the classes\r
+                       values = tinymce.explode(value, ' ');\r
+                       for (i = 0; i < values.length; i++) {\r
+                               typeItem = this.lookup[values[i]];\r
+\r
+                               if (typeItem)\r
+                                       return typeItem;\r
+                       }\r
+               },\r
+\r
+               /**\r
+                * Converts a tinymce.html.Node image element to video/object/embed.\r
+                */\r
+               imgToObject : function(node, args) {\r
+                       var self = this, editor = self.editor, video, object, embed, iframe, name, value, data,\r
+                               source, sources, params, param, typeItem, i, item, mp4Source, replacement,\r
+                               posterSrc, style, audio;\r
+\r
+                       // Adds the flash player\r
+                       function addPlayer(video_src, poster_src) {\r
+                               var baseUri, flashVars, flashVarsOutput, params, flashPlayer;\r
+\r
+                               flashPlayer = editor.getParam('flash_video_player_url', self.convertUrl(self.url + '/moxieplayer.swf'));\r
+                               if (flashPlayer) {\r
+                                       baseUri = editor.documentBaseURI;\r
+                                       data.params.src = flashPlayer;\r
+\r
+                                       // Convert the movie url to absolute urls\r
+                                       if (editor.getParam('flash_video_player_absvideourl', true)) {\r
+                                               video_src = baseUri.toAbsolute(video_src || '', true);\r
+                                               poster_src = baseUri.toAbsolute(poster_src || '', true);\r
+                                       }\r
+\r
+                                       // Generate flash vars\r
+                                       flashVarsOutput = '';\r
+                                       flashVars = editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'});\r
+                                       tinymce.each(flashVars, function(value, name) {\r
+                                               // Replace $url and $poster variables in flashvars value\r
+                                               value = value.replace(/\$url/, video_src || '');\r
+                                               value = value.replace(/\$poster/, poster_src || '');\r
+\r
+                                               if (value.length > 0)\r
+                                                       flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value);\r
+                                       });\r
+\r
+                                       if (flashVarsOutput.length)\r
+                                               data.params.flashvars = flashVarsOutput;\r
+\r
+                                       params = editor.getParam('flash_video_player_params', {\r
+                                               allowfullscreen: true,\r
+                                               allowscriptaccess: true\r
+                                       });\r
+\r
+                                       tinymce.each(params, function(value, name) {\r
+                                               data.params[name] = "" + value;\r
+                                       });\r
+                               }\r
+                       };\r
+\r
+                       data = node.attr('data-mce-json');\r
+                       if (!data)\r
+                               return;\r
+\r
+                       data = JSON.parse(data);\r
+                       typeItem = this.getType(node.attr('class'));\r
+\r
+                       style = node.attr('data-mce-style')\r
+                       if (!style) {\r
+                               style = node.attr('style');\r
+\r
+                               if (style)\r
+                                       style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img'));\r
+                       }\r
+\r
+                       // Handle iframe\r
+                       if (typeItem.name === 'Iframe') {\r
+                               replacement = new Node('iframe', 1);\r
+\r
+                               tinymce.each(rootAttributes, function(name) {\r
+                                       var value = node.attr(name);\r
+\r
+                                       if (name == 'class' && value)\r
+                                               value = value.replace(/mceItem.+ ?/g, '');\r
+\r
+                                       if (value && value.length > 0)\r
+                                               replacement.attr(name, value);\r
+                               });\r
+\r
+                               for (name in data.params)\r
+                                       replacement.attr(name, data.params[name]);\r
+\r
+                               replacement.attr({\r
+                                       style: style,\r
+                                       src: data.params.src\r
+                               });\r
+\r
+                               node.replace(replacement);\r
+\r
+                               return;\r
+                       }\r
+\r
+                       // Handle scripts\r
+                       if (this.editor.settings.media_use_script) {\r
+                               replacement = new Node('script', 1).attr('type', 'text/javascript');\r
+\r
+                               value = new Node('#text', 3);\r
+                               value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, {\r
+                                       width: node.attr('width'),\r
+                                       height: node.attr('height')\r
+                               })) + ');';\r
+\r
+                               replacement.append(value);\r
+                               node.replace(replacement);\r
+\r
+                               return;\r
+                       }\r
+\r
+                       // Add HTML5 video element\r
+                       if (typeItem.name === 'Video' && data.video.sources[0]) {\r
+                               // Create new object element\r
+                               video = new Node('video', 1).attr(tinymce.extend({\r
+                                       id : node.attr('id'),\r
+                                       width: node.attr('width'),\r
+                                       height: node.attr('height'),\r
+                                       style : style\r
+                               }, data.video.attrs));\r
+\r
+                               // Get poster source and use that for flash fallback\r
+                               if (data.video.attrs)\r
+                                       posterSrc = data.video.attrs.poster;\r
+\r
+                               sources = data.video.sources = toArray(data.video.sources);\r
+                               for (i = 0; i < sources.length; i++) {\r
+                                       if (/\.mp4$/.test(sources[i].src))\r
+                                               mp4Source = sources[i].src;\r
+                               }\r
+\r
+                               if (!sources[0].type) {\r
+                                       video.attr('src', sources[0].src);\r
+                                       sources.splice(0, 1);\r
+                               }\r
+\r
+                               for (i = 0; i < sources.length; i++) {\r
+                                       source = new Node('source', 1).attr(sources[i]);\r
+                                       source.shortEnded = true;\r
+                                       video.append(source);\r
+                               }\r
+\r
+                               // Create flash fallback for video if we have a mp4 source\r
+                               if (mp4Source) {\r
+                                       addPlayer(mp4Source, posterSrc);\r
+                                       typeItem = self.getType('flash');\r
+                               } else\r
+                                       data.params.src = '';\r
+                       }\r
+\r
+                       // Add HTML5 audio element\r
+                       if (typeItem.name === 'Audio' && data.video.sources[0]) {\r
+                               // Create new object element\r
+                               audio = new Node('audio', 1).attr(tinymce.extend({\r
+                                       id : node.attr('id'),\r
+                                       width: node.attr('width'),\r
+                                       height: node.attr('height'),\r
+                                       style : style\r
+                               }, data.video.attrs));\r
+\r
+                               // Get poster source and use that for flash fallback\r
+                               if (data.video.attrs)\r
+                                       posterSrc = data.video.attrs.poster;\r
+\r
+                               sources = data.video.sources = toArray(data.video.sources);\r
+                               if (!sources[0].type) {\r
+                                       audio.attr('src', sources[0].src);\r
+                                       sources.splice(0, 1);\r
+                               }\r
+\r
+                               for (i = 0; i < sources.length; i++) {\r
+                                       source = new Node('source', 1).attr(sources[i]);\r
+                                       source.shortEnded = true;\r
+                                       audio.append(source);\r
+                               }\r
+\r
+                               data.params.src = '';\r
+                       }\r
+\r
+                       // Do we have a params src then we can generate object\r
+                       if (data.params.src) {\r
+                               // Is flv movie add player for it\r
+                               if (/\.flv$/i.test(data.params.src))\r
+                                       addPlayer(data.params.src, '');\r
+\r
+                               if (args && args.force_absolute)\r
+                                       data.params.src = editor.documentBaseURI.toAbsolute(data.params.src);\r
+\r
+                               // Create new object element\r
+                               object = new Node('object', 1).attr({\r
+                                       id : node.attr('id'),\r
+                                       width: node.attr('width'),\r
+                                       height: node.attr('height'),\r
+                                       style : style\r
+                               });\r
+\r
+                               tinymce.each(rootAttributes, function(name) {\r
+                                       if (data[name] && name != 'type')\r
+                                               object.attr(name, data[name]);\r
+                               });\r
+\r
+                               // Add params\r
+                               for (name in data.params) {\r
+                                       param = new Node('param', 1);\r
+                                       param.shortEnded = true;\r
+                                       value = data.params[name];\r
+\r
+                                       // Windows media needs to use url instead of src for the media URL\r
+                                       if (name === 'src' && typeItem.name === 'WindowsMedia')\r
+                                               name = 'url';\r
+\r
+                                       param.attr({name: name, value: value});\r
+                                       object.append(param);\r
+                               }\r
+\r
+                               // Setup add type and classid if strict is disabled\r
+                               if (this.editor.getParam('media_strict', true)) {\r
+                                       object.attr({\r
+                                               data: data.params.src,\r
+                                               type: typeItem.mimes[0]\r
+                                       });\r
+                               } else {\r
+                                       object.attr({\r
+                                               classid: "clsid:" + typeItem.clsids[0],\r
+                                               codebase: typeItem.codebase\r
+                                       });\r
+\r
+                                       embed = new Node('embed', 1);\r
+                                       embed.shortEnded = true;\r
+                                       embed.attr({\r
+                                               id: node.attr('id'),\r
+                                               width: node.attr('width'),\r
+                                               height: node.attr('height'),\r
+                                               style : style,\r
+                                               type: typeItem.mimes[0]\r
+                                       });\r
+\r
+                                       for (name in data.params)\r
+                                               embed.attr(name, data.params[name]);\r
+\r
+                                       tinymce.each(rootAttributes, function(name) {\r
+                                               if (data[name] && name != 'type')\r
+                                                       embed.attr(name, data[name]);\r
+                                       });\r
+\r
+                                       object.append(embed);\r
+                               }\r
+\r
+                               // Insert raw HTML\r
+                               if (data.object_html) {\r
+                                       value = new Node('#text', 3);\r
+                                       value.raw = true;\r
+                                       value.value = data.object_html;\r
+                                       object.append(value);\r
+                               }\r
+\r
+                               // Append object to video element if it exists\r
+                               if (video)\r
+                                       video.append(object);\r
+                       }\r
+\r
+                       if (video) {\r
+                               // Insert raw HTML\r
+                               if (data.video_html) {\r
+                                       value = new Node('#text', 3);\r
+                                       value.raw = true;\r
+                                       value.value = data.video_html;\r
+                                       video.append(value);\r
+                               }\r
+                       }\r
+\r
+                       if (audio) {\r
+                               // Insert raw HTML\r
+                               if (data.video_html) {\r
+                                       value = new Node('#text', 3);\r
+                                       value.raw = true;\r
+                                       value.value = data.video_html;\r
+                                       audio.append(value);\r
+                               }\r
+                       }\r
+\r
+                       if (video || audio || object)\r
+                               node.replace(video || audio || object);\r
+                       else\r
+                               node.remove();\r
+               },\r
+\r
+               /**\r
+                * Converts a tinymce.html.Node video/object/embed to an img element.\r
+                *\r
+                * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this:\r
+                * <img class="mceItemMedia mceItemFlash" width="100" height="100" data-mce-json="{..}" />\r
+                *\r
+                * The JSON structure will be like this:\r
+                * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}}\r
+                */\r
+               objectToImg : function(node) {\r
+                       var object, embed, video, iframe, img, name, id, width, height, style, i, html,\r
+                               param, params, source, sources, data, type, lookup = this.lookup,\r
+                               matches, attrs, urlConverter = this.editor.settings.url_converter,\r
+                               urlConverterScope = this.editor.settings.url_converter_scope;\r
+\r
+                       function getInnerHTML(node) {\r
+                               return new tinymce.html.Serializer({\r
+                                       inner: true,\r
+                                       validate: false\r
+                               }).serialize(node);\r
+                       };\r
+\r
+                       // If node isn't in document\r
+                       if (!node.parent)\r
+                               return;\r
+\r
+                       // Handle media scripts\r
+                       if (node.name === 'script') {\r
+                               if (node.firstChild)\r
+                                       matches = scriptRegExp.exec(node.firstChild.value);\r
+\r
+                               if (!matches)\r
+                                       return;\r
+\r
+                               type = matches[1];\r
+                               data = {video : {}, params : JSON.parse(matches[2])};\r
+                               width = data.params.width;\r
+                               height = data.params.height;\r
+                       }\r
+\r
+                       // Setup data objects\r
+                       data = data || {\r
+                               video : {},\r
+                               params : {}\r
+                       };\r
+\r
+                       // Setup new image object\r
+                       img = new Node('img', 1);\r
+                       img.attr({\r
+                               src : this.editor.theme.url + '/img/trans.gif'\r
+                       });\r
+\r
+                       // Video element\r
+                       name = node.name;\r
+                       if (name === 'video' || name == 'audio') {\r
+                               video = node;\r
+                               object = node.getAll('object')[0];\r
+                               embed = node.getAll('embed')[0];\r
+                               width = video.attr('width');\r
+                               height = video.attr('height');\r
+                               id = video.attr('id');\r
+                               data.video = {attrs : {}, sources : []};\r
+\r
+                               // Get all video attributes\r
+                               attrs = data.video.attrs;\r
+                               for (name in video.attributes.map)\r
+                                       attrs[name] = video.attributes.map[name];\r
+\r
+                               source = node.attr('src');\r
+                               if (source)\r
+                                       data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', node.name)});\r
+\r
+                               // Get all sources\r
+                               sources = video.getAll("source");\r
+                               for (i = 0; i < sources.length; i++) {\r
+                                       source = sources[i].remove();\r
+\r
+                                       data.video.sources.push({\r
+                                               src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'),\r
+                                               type: source.attr('type'),\r
+                                               media: source.attr('media')\r
+                                       });\r
+                               }\r
+\r
+                               // Convert the poster URL\r
+                               if (attrs.poster)\r
+                                       attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', node.name);\r
+                       }\r
+\r
+                       // Object element\r
+                       if (node.name === 'object') {\r
+                               object = node;\r
+                               embed = node.getAll('embed')[0];\r
+                       }\r
+\r
+                       // Embed element\r
+                       if (node.name === 'embed')\r
+                               embed = node;\r
+\r
+                       // Iframe element\r
+                       if (node.name === 'iframe') {\r
+                               iframe = node;\r
+                               type = 'Iframe';\r
+                       }\r
+\r
+                       if (object) {\r
+                               // Get width/height\r
+                               width = width || object.attr('width');\r
+                               height = height || object.attr('height');\r
+                               style = style || object.attr('style');\r
+                               id = id || object.attr('id');\r
+\r
+                               // Get all object params\r
+                               params = object.getAll("param");\r
+                               for (i = 0; i < params.length; i++) {\r
+                                       param = params[i];\r
+                                       name = param.remove().attr('name');\r
+\r
+                                       if (!excludedAttrs[name])\r
+                                               data.params[name] = param.attr('value');\r
+                               }\r
+\r
+                               data.params.src = data.params.src || object.attr('data');\r
+                       }\r
+\r
+                       if (embed) {\r
+                               // Get width/height\r
+                               width = width || embed.attr('width');\r
+                               height = height || embed.attr('height');\r
+                               style = style || embed.attr('style');\r
+                               id = id || embed.attr('id');\r
+\r
+                               // Get all embed attributes\r
+                               for (name in embed.attributes.map) {\r
+                                       if (!excludedAttrs[name] && !data.params[name])\r
+                                               data.params[name] = embed.attributes.map[name];\r
+                               }\r
+                       }\r
+\r
+                       if (iframe) {\r
+                               // Get width/height\r
+                               width = iframe.attr('width');\r
+                               height = iframe.attr('height');\r
+                               style = style || iframe.attr('style');\r
+                               id = iframe.attr('id');\r
+\r
+                               tinymce.each(rootAttributes, function(name) {\r
+                                       img.attr(name, iframe.attr(name));\r
+                               });\r
+\r
+                               // Get all iframe attributes\r
+                               for (name in iframe.attributes.map) {\r
+                                       if (!excludedAttrs[name] && !data.params[name])\r
+                                               data.params[name] = iframe.attributes.map[name];\r
+                               }\r
+                       }\r
+\r
+                       // Use src not movie\r
+                       if (data.params.movie) {\r
+                               data.params.src = data.params.src || data.params.movie;\r
+                               delete data.params.movie;\r
+                       }\r
+\r
+                       // Convert the URL to relative/absolute depending on configuration\r
+                       if (data.params.src)\r
+                               data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object');\r
+\r
+                       if (video) {\r
+                               if (node.name === 'video')\r
+                                       type = lookup.video.name;\r
+                               else if (node.name === 'audio')\r
+                                       type = lookup.audio.name;\r
+                       }\r
+\r
+                       if (object && !type)\r
+                               type = (lookup[(object.attr('clsid') || '').toLowerCase()] || lookup[(object.attr('type') || '').toLowerCase()] || {}).name;\r
+\r
+                       if (embed && !type)\r
+                               type = (lookup[(embed.attr('type') || '').toLowerCase()] || {}).name;\r
+\r
+                       // Replace the video/object/embed element with a placeholder image containing the data\r
+                       node.replace(img);\r
+\r
+                       // Remove embed\r
+                       if (embed)\r
+                               embed.remove();\r
+\r
+                       // Serialize the inner HTML of the object element\r
+                       if (object) {\r
+                               html = getInnerHTML(object.remove());\r
+\r
+                               if (html)\r
+                                       data.object_html = html;\r
+                       }\r
+\r
+                       // Serialize the inner HTML of the video element\r
+                       if (video) {\r
+                               html = getInnerHTML(video.remove());\r
+\r
+                               if (html)\r
+                                       data.video_html = html;\r
+                       }\r
+\r
+                       // Set width/height of placeholder\r
+                       img.attr({\r
+                               id : id,\r
+                               'class' : 'mceItemMedia mceItem' + (type || 'Flash'),\r
+                               style : style,\r
+                               width : width || (node.name == 'audio' ? "300" : "320"),\r
+                               height : height || (node.name == 'audio' ? "32" : "240"),\r
+                               "data-mce-json" : JSON.serialize(data, "'")\r
+                       });\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/js/embed.js b/webcit/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/webcit/tiny_mce/plugins/media/js/media.js b/webcit/tiny_mce/plugins/media/js/media.js
new file mode 100644 (file)
index 0000000..055a68d
--- /dev/null
@@ -0,0 +1,389 @@
+(function() {\r
+       var 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 get(id) {\r
+               return document.getElementById(id);\r
+       }\r
+\r
+       function getVal(id) {\r
+               var elm = get(id);\r
+\r
+               if (elm.nodeName == "SELECT")\r
+                       return elm.options[elm.selectedIndex].value;\r
+\r
+               if (elm.type == "checkbox")\r
+                       return elm.checked;\r
+\r
+               return elm.value;\r
+       }\r
+\r
+       function setVal(id, value, name) {\r
+               if (typeof(value) != 'undefined') {\r
+                       var elm = get(id);\r
+\r
+                       if (elm.nodeName == "SELECT")\r
+                               selectByValue(document.forms[0], id, value);\r
+                       else if (elm.type == "checkbox") {\r
+                               if (typeof(value) == 'string') {\r
+                                       value = value.toLowerCase();\r
+                                       value = (!name && value === 'true') || (name && value === name.toLowerCase());\r
+                               }\r
+                               elm.checked = !!value;\r
+                       } else\r
+                               elm.value = value;\r
+               }\r
+       }\r
+\r
+       window.Media = {\r
+               init : function() {\r
+                       var html, editor;\r
+\r
+                       this.editor = editor = tinyMCEPopup.editor;\r
+\r
+                       // Setup file browsers and color pickers\r
+                       get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');\r
+                       get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media');\r
+                       get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+                       get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource1','video_altsource1','media','media');\r
+                       get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource2','video_altsource2','media','media');\r
+                       get('audio_altsource1_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource1','audio_altsource1','media','media');\r
+                       get('audio_altsource2_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource2','audio_altsource2','media','media');\r
+                       get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image');\r
+\r
+                       html = this.getMediaListHTML('medialist', 'src', 'media', 'media');\r
+                       if (html == "")\r
+                               get("linklistrow").style.display = 'none';\r
+                       else\r
+                               get("linklistcontainer").innerHTML = html;\r
+\r
+                       if (isVisible('filebrowser'))\r
+                               get('src').style.width = '230px';\r
+\r
+                       if (isVisible('video_filebrowser_altsource1'))\r
+                               get('video_altsource1').style.width = '220px';\r
+\r
+                       if (isVisible('video_filebrowser_altsource2'))\r
+                               get('video_altsource2').style.width = '220px';\r
+\r
+                       if (isVisible('audio_filebrowser_altsource1'))\r
+                               get('audio_altsource1').style.width = '220px';\r
+\r
+                       if (isVisible('audio_filebrowser_altsource2'))\r
+                               get('audio_altsource2').style.width = '220px';\r
+\r
+                       if (isVisible('filebrowser_poster'))\r
+                               get('video_poster').style.width = '220px';\r
+\r
+                       this.data = tinyMCEPopup.getWindowArg('data');\r
+                       this.dataToForm();\r
+                       this.preview();\r
+               },\r
+\r
+               insert : function() {\r
+                       var editor = tinyMCEPopup.editor;\r
+\r
+                       this.formToData();\r
+                       editor.execCommand('mceRepaint');\r
+                       tinyMCEPopup.restoreSelection();\r
+                       editor.selection.setNode(editor.plugins.media.dataToImg(this.data));\r
+                       tinyMCEPopup.close();\r
+               },\r
+\r
+               preview : function() {\r
+                       get('prev').innerHTML = this.editor.plugins.media.dataToHtml(this.data, true);\r
+               },\r
+\r
+               moveStates : function(to_form, field) {\r
+                       var data = this.data, editor = this.editor, data = this.data,\r
+                               mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src;\r
+\r
+                       defaultStates = {\r
+                               // QuickTime\r
+                               quicktime_autoplay : true,\r
+                               quicktime_controller : true,\r
+\r
+                               // Flash\r
+                               flash_play : true,\r
+                               flash_loop : true,\r
+                               flash_menu : true,\r
+\r
+                               // WindowsMedia\r
+                               windowsmedia_autostart : true,\r
+                               windowsmedia_enablecontextmenu : true,\r
+                               windowsmedia_invokeurls : true,\r
+\r
+                               // RealMedia\r
+                               realmedia_autogotourl : true,\r
+                               realmedia_imagestatus : true\r
+                       };\r
+\r
+                       function parseQueryParams(str) {\r
+                               var out = {};\r
+\r
+                               if (str) {\r
+                                       tinymce.each(str.split('&'), function(item) {\r
+                                               var parts = item.split('=');\r
+\r
+                                               out[unescape(parts[0])] = unescape(parts[1]);\r
+                                       });\r
+                               }\r
+\r
+                               return out;\r
+                       };\r
+\r
+                       function setOptions(type, names) {\r
+                               var i, name, formItemName, value, list;\r
+\r
+                               if (type == data.type || type == 'global') {\r
+                                       names = tinymce.explode(names);\r
+                                       for (i = 0; i < names.length; i++) {\r
+                                               name = names[i];\r
+                                               formItemName = type == 'global' ? name : type + '_' + name;\r
+\r
+                                               if (type == 'global')\r
+                                                       list = data;\r
+                                               else if (type == 'video' || type == 'audio') {\r
+                                                       list = data.video.attrs;\r
+\r
+                                                       if (!list && !to_form)\r
+                                                               data.video.attrs = list = {};\r
+                                               } else\r
+                                                       list = data.params;\r
+\r
+                                               if (list) {\r
+                                                       if (to_form) {\r
+                                                               setVal(formItemName, list[name], type == 'video' || type == 'audio' ? name : '');\r
+                                                       } else {\r
+                                                               delete list[name];\r
+\r
+                                                               value = getVal(formItemName);\r
+                                                               if ((type == 'video' || type == 'audio') && value === true)\r
+                                                                       value = name;\r
+\r
+                                                               if (defaultStates[formItemName]) {\r
+                                                                       if (value !== defaultStates[formItemName]) {\r
+                                                                               value = "" + value;\r
+                                                                               list[name] = value;\r
+                                                                       }\r
+                                                               } else if (value) {\r
+                                                                       value = "" + value;\r
+                                                                       list[name] = value;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       if (!to_form) {\r
+                               data.type = get('media_type').options[get('media_type').selectedIndex].value;\r
+                               data.width = getVal('width');\r
+                               data.height = getVal('height');\r
+\r
+                               // Switch type based on extension\r
+                               src = getVal('src');\r
+                               if (field == 'src') {\r
+                                       ext = src.replace(/^.*\.([^.]+)$/, '$1');\r
+                                       if (typeInfo = mediaPlugin.getType(ext))\r
+                                               data.type = typeInfo.name.toLowerCase();\r
+\r
+                                       setVal('media_type', data.type);\r
+                               }\r
+\r
+                               if (data.type == "video" || data.type == "audio") {\r
+                                       if (!data.video.sources)\r
+                                               data.video.sources = [];\r
+\r
+                                       data.video.sources[0] = {src: getVal('src')};\r
+                               }\r
+                       }\r
+\r
+                       // Hide all fieldsets and show the one active\r
+                       get('video_options').style.display = 'none';\r
+                       get('audio_options').style.display = 'none';\r
+                       get('flash_options').style.display = 'none';\r
+                       get('quicktime_options').style.display = 'none';\r
+                       get('shockwave_options').style.display = 'none';\r
+                       get('windowsmedia_options').style.display = 'none';\r
+                       get('realmedia_options').style.display = 'none';\r
+\r
+                       if (get(data.type + '_options'))\r
+                               get(data.type + '_options').style.display = 'block';\r
+\r
+                       setVal('media_type', data.type);\r
+\r
+                       setOptions('flash', 'play,loop,menu,swliveconnect,quality,scale,salign,wmode,base,flashvars');\r
+                       setOptions('quicktime', 'loop,autoplay,cache,controller,correction,enablejavascript,kioskmode,autohref,playeveryframe,targetcache,scale,starttime,endtime,target,qtsrcchokespeed,volume,qtsrc');\r
+                       setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign');\r
+                       setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume');\r
+                       setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks');\r
+                       setOptions('video', 'poster,autoplay,loop,muted,preload,controls');\r
+                       setOptions('audio', 'autoplay,loop,preload,controls');\r
+                       setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height');\r
+\r
+                       if (to_form) {\r
+                               if (data.type == 'video') {\r
+                                       if (data.video.sources[0])\r
+                                               setVal('src', data.video.sources[0].src);\r
+\r
+                                       src = data.video.sources[1];\r
+                                       if (src)\r
+                                               setVal('video_altsource1', src.src);\r
+\r
+                                       src = data.video.sources[2];\r
+                                       if (src)\r
+                                               setVal('video_altsource2', src.src);\r
+                } else if (data.type == 'audio') {\r
+                    if (data.video.sources[0])\r
+                        setVal('src', data.video.sources[0].src);\r
+                    \r
+                    src = data.video.sources[1];\r
+                    if (src)\r
+                        setVal('audio_altsource1', src.src);\r
+                    \r
+                    src = data.video.sources[2];\r
+                    if (src)\r
+                        setVal('audio_altsource2', src.src);\r
+                               } else {\r
+                                       // Check flash vars\r
+                                       if (data.type == 'flash') {\r
+                                               tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) {\r
+                                                       if (value == '$url')\r
+                                                               data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src;\r
+                                               });\r
+                                       }\r
+\r
+                                       setVal('src', data.params.src);\r
+                               }\r
+                       } else {\r
+                               src = getVal("src");\r
+       \r
+                               // YouTube\r
+                               if (src.match(/youtube.com(.+)v=([^&]+)/)) {\r
+                                       data.width = 425;\r
+                                       data.height = 350;\r
+                                       data.params.frameborder = '0';\r
+                                       data.type = 'iframe';\r
+                                       src = 'http://www.youtube.com/embed/' + src.match(/v=([^&]+)/)[1];\r
+                                       setVal('src', src);\r
+                                       setVal('media_type', data.type);\r
+                               }\r
+\r
+                               // Google video\r
+                               if (src.match(/video.google.com(.+)docid=([^&]+)/)) {\r
+                                       data.width = 425;\r
+                                       data.height = 326;\r
+                                       data.type = 'flash';\r
+                                       src = 'http://video.google.com/googleplayer.swf?docId=' + src.match(/docid=([^&]+)/)[1] + '&hl=en';\r
+                                       setVal('src', src);\r
+                                       setVal('media_type', data.type);\r
+                               }\r
+\r
+                               if (data.type == 'video') {\r
+                                       if (!data.video.sources)\r
+                                               data.video.sources = [];\r
+\r
+                                       data.video.sources[0] = {src : src};\r
+\r
+                                       src = getVal("video_altsource1");\r
+                                       if (src)\r
+                                               data.video.sources[1] = {src : src};\r
+\r
+                                       src = getVal("video_altsource2");\r
+                                       if (src)\r
+                                               data.video.sources[2] = {src : src};\r
+                } else if (data.type == 'audio') {\r
+                    if (!data.video.sources)\r
+                        data.video.sources = [];\r
+                    \r
+                    data.video.sources[0] = {src : src};\r
+                    \r
+                    src = getVal("audio_altsource1");\r
+                    if (src)\r
+                        data.video.sources[1] = {src : src};\r
+                    \r
+                    src = getVal("audio_altsource2");\r
+                    if (src)\r
+                        data.video.sources[2] = {src : src};\r
+                               } else\r
+                                       data.params.src = src;\r
+\r
+                               // Set default size\r
+                setVal('width', data.width || (data.type == 'audio' ? 300 : 320));\r
+                setVal('height', data.height || (data.type == 'audio' ? 32 : 240));\r
+                       }\r
+               },\r
+\r
+               dataToForm : function() {\r
+                       this.moveStates(true);\r
+               },\r
+\r
+               formToData : function(field) {\r
+                       if (field == "width" || field == "height")\r
+                               this.changeSize(field);\r
+\r
+                       if (field == 'source') {\r
+                               this.moveStates(false, field);\r
+                               setVal('source', this.editor.plugins.media.dataToHtml(this.data));\r
+                               this.panel = 'source';\r
+                       } else {\r
+                               if (this.panel == 'source') {\r
+                                       this.data = this.editor.plugins.media.htmlToData(getVal('source'));\r
+                                       this.dataToForm();\r
+                                       this.panel = '';\r
+                               }\r
+\r
+                               this.moveStates(false, field);\r
+                               this.preview();\r
+                       }\r
+               },\r
+\r
+               beforeResize : function() {\r
+            this.width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);\r
+            this.height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);\r
+               },\r
+\r
+               changeSize : function(type) {\r
+                       var width, height, scale, size;\r
+\r
+                       if (get('constrain').checked) {\r
+                width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);\r
+                height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);\r
+\r
+                               if (type == 'width') {\r
+                                       this.height = Math.round((width / this.width) * height);\r
+                                       setVal('height', this.height);\r
+                               } else {\r
+                                       this.width = Math.round((height / this.height) * width);\r
+                                       setVal('width', this.width);\r
+                               }\r
+                       }\r
+               },\r
+\r
+               getMediaListHTML : function() {\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;Media.formToData(\'src\');">';\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
+\r
+       tinyMCEPopup.requireLangPack();\r
+       tinyMCEPopup.onInit.add(function() {\r
+               Media.init();\r
+       });\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/bg_dlg.js b/webcit/tiny_mce/plugins/media/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..533afa4
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.media_dlg',{list:"\u0421\u043f\u0438\u0441\u044a\u043a",file:"\u0424\u0430\u0439\u043b/URL",advanced:"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438",general:"\u041e\u0431\u0449\u0438",title:"\u0412\u043c\u044a\u043a\u043d\u0438/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043c\u0435\u0434\u0438\u044f","align_top_left":"\u0413\u043e\u0440\u0435 \u043b\u044f\u0432\u043e","align_center":"\u0426\u0435\u043d\u0442\u044a\u0440","align_left":"\u041b\u044f\u0432\u043e","align_bottom":"\u0414\u043e\u043b\u0443","align_right":"\u0414\u044f\u0441\u043d\u043e","align_top":"\u0413\u043e\u0440\u0435","qt_stream_warn":"\u041f\u043e\u0442\u043e\u0447\u043d\u0438\u0442\u0435 rtsp \u0440\u0435\u0441\u0443\u0440\u0441\u0438 \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u044f\u0442 \u0432 QT Src \u043f\u043e\u043b\u0435\u0442\u043e \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0437\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438.\n\u0422\u0440\u044f\u0431\u0432\u0430 \u0441\u044a\u0449\u043e \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0435 \u043f\u043e\u0442\u043e\u0447\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0432 Src \u043f\u043e\u043b\u0435\u0442\u043e..",qtsrc:"QT Src",progress:"\u041f\u0440\u043e\u0433\u0440\u0435\u0441",sound:"\u0417\u0432\u0443\u043a",swstretchvalign:"\u0420\u0430\u0437\u043f\u044a\u0432\u0430\u043d\u0435 V-Align",swstretchhalign:"\u0420\u0430\u0437\u043f\u044a\u0432\u0430\u043d\u0435 H-Align",swstretchstyle:"\u0421\u0442\u0438\u043b \u043d\u0430 \u0440\u0430\u0437\u043f\u044a\u0432\u0430\u043d\u0435",scriptcallbacks:"Script callbacks","align_top_right":"\u0413\u043e\u0440\u0435 \u0434\u044f\u0441\u043d\u043e",uimode:"UI \u0440\u0435\u0436\u0438\u043c",rate:"\u0411\u044a\u0440\u0437\u0438\u043d\u0430",playcount:"\u0411\u0440\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f",defaultframe:"\u041d\u0430\u0447\u0430\u043b\u0435\u043d \u043a\u0430\u0434\u044a\u0440",currentposition:"\u0422\u0435\u043a\u0443\u0449\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f",currentmarker:"\u0422\u0435\u043a\u0443\u0449 \u043c\u0430\u0440\u043a\u0435\u0440",captioningid:"\u041d\u0430\u0434\u043f\u0438\u0441\u0432\u0430\u043d\u0435 id",baseurl:"\u0411\u0430\u0437\u043e\u0432\u043e URL",balance:"\u0411\u0430\u043b\u0430\u043d\u0441",windowlessvideo:"\u0412\u0438\u0434\u0435\u043e \u0431\u0435\u0437 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446",stretchtofit:"\u0420\u0430\u0437\u043f\u044a\u043d\u0438",mute:"\u0417\u0430\u0433\u043b\u0443\u0448\u0438",invokeurls:"Invoke URLs",fullscreen:"\u0426\u044f\u043b \u0435\u043a\u0440\u0430\u043d",enabled:"\u0412\u043a\u043b\u044e\u0447\u0435\u043d",autostart:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435",volume:"\u0421\u0438\u043b\u0430 \u043d\u0430 \u0437\u0432\u0443\u043a\u0430",target:"\u0426\u0435\u043b",qtsrcchokespeed:"\u041f\u0440\u0435\u0434\u0435\u043b\u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442",href:"Href",endtime:"\u0412\u0440\u0435\u043c\u0435 \u0437\u0430 \u043a\u0440\u0430\u0439",starttime:"\u0412\u0440\u0435\u043c\u0435 \u0437\u0430 \u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435",enablejavascript:"\u0412\u043a\u043b\u044e\u0447\u0438 JavaScript",correction:"\u0411\u0435\u0437 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0438",targetcache:"\u0426\u0435\u043b\u0435\u0432\u0438 \u043a\u0435\u0448",playeveryframe:"\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u0439 \u0432\u0441\u0435\u043a\u0438 \u043a\u0430\u0434\u044a\u0440",kioskmode:"Kiosk \u0440\u0435\u0436\u0438\u043c",controller:"\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440",menu:"\u041f\u043e\u043a\u0430\u0436\u0438 \u043c\u0435\u043d\u044e",loop:"\u041f\u043e\u0432\u0442\u0430\u0440\u044f\u0439",play:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043f\u0443\u0441\u043a\u0430\u043d\u0435",hspace:"H-Space",vspace:"V-Space","class_name":"\u041a\u043b\u0430\u0441",name:"\u0418\u043c\u0435",id:"Id",type:"\u0422\u0438\u043f",size:"\u0420\u0430\u0437\u043c\u0435\u0440\u0438",preview:"\u041f\u0440\u0435\u0433\u043b\u0435\u0434","constrain_proportions":"\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438\u0442\u0435",controls:"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",numloop:"\u0411\u0440\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f",console:"\u041a\u043e\u043d\u0437\u043e\u043b\u0430",cache:"\u041a\u0435\u0448",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"\u041e\u0441\u043d\u043e\u0432\u0430",bgcolor:"\u0424\u043e\u043d",wmode:"WMode",salign:"SAlign",align:"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",scale:"\u041f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u0438",quality:"\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e",shuffle:"\u0420\u0430\u0437\u0431\u044a\u0440\u043a\u0430\u0439",prefetch:"\u0421\u0432\u0430\u043b\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u043d\u043e",nojava:"\u0411\u0435\u0437 JAVA",maintainaspect:"\u041f\u043e\u0434\u0434\u044a\u0440\u0436\u0430\u0439 \u0441\u044a\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u0442\u043e",imagestatus:"\u0421\u0442\u0430\u0442\u0443\u0441 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",center:"\u0426\u0435\u043d\u0442\u044a\u0440",autogotourl:"\u041e\u0442\u0438\u0434\u0438 \u043d\u0430 URL","shockwave_options":"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Shockwave","rmp_options":"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Real media player","wmp_options":"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Windows media player","qt_options":"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Quicktime","flash_options":"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Flash",hidden:"\u0421\u043a\u0440\u0438\u0442","align_bottom_left":"\u0414\u043e\u043b\u0443 \u043b\u044f\u0432\u043e","align_bottom_right":"\u0414\u043e\u043b\u0443 \u0434\u044f\u0441\u043d\u043e","html5_video_options":"HTML5 \u0412\u0438\u0434\u0435\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",altsource1:"\u0410\u043b\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0435\u043d \u0438\u0437\u0442\u043e\u0447\u043d\u0438\u043a 1",altsource2:"\u0410\u043b\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0435\u043d \u0438\u0437\u0442\u043e\u0447\u043d\u0438\u043a 2",preload:"\u041f\u0440\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u043d\u043e \u0437\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435",poster:"\u041f\u043b\u0430\u043a\u0430\u0442",source:"\u0418\u0437\u0442\u043e\u0447\u043d\u0438\u043a","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/cs_dlg.js b/webcit/tiny_mce/plugins/media/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..d3d4630
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.media_dlg',{list:"Seznam",file:"Soubor/URL",advanced:"Roz\u0161\u00ed\u0159en\u00e9",general:"Obecn\u00e9",title:"Vlo\u017eit/upravit vkl\u00e1dan\u00e1 m\u00e9dia","align_top_left":"Nahoru vlevo","align_center":"Na st\u0159ed","align_left":"Vlevo","align_bottom":"Dol\u016f","align_right":"Vpravo","align_top":"Nahoru","qt_stream_warn":"Streamovan\u00e9 rtsp zdroje mohou b\u00fdt p\u0159id\u00e1ny do pole \'Soubor/URL streamu pro QT\' na z\u00e1lo\u017ece \'Roz\u0161\u00ed\u0159en\u00e9\'.\nYM\u016f\u017eete tak\u00e9 p\u0159idat nestreamovanou verzi do pole \'Soubor/URL\'.",qtsrc:"Soubor/URL streamu pro QT",progress:"Pr\u016fb\u011bh",sound:"Zvuk",swstretchvalign:"Zarovn\u00e1n\u00ed vert. rozta\u017een\u00ed",swstretchhalign:"Zarovn\u00e1n\u00ed horiz. rozta\u017een\u00ed",swstretchstyle:"Styl rozta\u017een\u00ed",scriptcallbacks:"Skripty zp\u011btn\u00fdch vol\u00e1n\u00ed","align_top_right":"Nahoru vpravo",uimode:"Re\u017eim ovl\u00e1dac\u00edho panelu",rate:"Relativn\u00ed rychlost",playcount:"Po\u010det p\u0159ehr\u00e1n\u00ed",defaultframe:"V\u00fdchoz\u00ed sn\u00edmek",currentposition:"Aktu\u00e1ln\u00ed pozice",currentmarker:"Aktu\u00e1ln\u00ed z\u00e1lo\u017eka",captioningid:"ID popisku m\u00e9dia",baseurl:"Z\u00e1kladn\u00ed URL",balance:"Vyv\u00e1\u017een\u00ed",windowlessvideo:"Video bez okna",stretchtofit:"Rozt\u00e1hnout do okna",mute:"Ztlumit",invokeurls:"Po\u017eadovat URL",fullscreen:"Cel\u00e1 obrazovka",enabled:"Povolit ovl\u00e1dac\u00ed panel",autostart:"Automatick\u00e9 spu\u0161t\u011bn\u00ed",volume:"Hlasitost",target:"C\u00edl",qtsrcchokespeed:"Sn\u00ed\u017een\u00ed rychlosti",href:"Odkaz",endtime:"\u010cas ukon\u010den\u00ed",starttime:"Po\u010d\u00e1te\u010dn\u00ed \u010das",enablejavascript:"Povolit Javascript",correction:"Bez korekc\u00ed",targetcache:"C\u00edlov\u00e1 mezipam\u011b\u0165",playeveryframe:"P\u0159ehr\u00e1t ka\u017ed\u00fd sn\u00edmek",kioskmode:"Zak\u00e1zat ukl\u00e1d\u00e1n\u00ed",controller:"Ovl\u00e1dac\u00ed panel",menu:"Zobrazit nab\u00eddku",loop:"Opakov\u00e1n\u00ed",play:"Automatick\u00e9 p\u0159ehr\u00e1v\u00e1n\u00ed",hspace:"Horizont\u00e1ln\u00ed odsazen\u00ed",vspace:"Vertik\u00e1ln\u00ed odsazen\u00ed","class_name":"T\u0159\u00edda",name:"N\u00e1zev",id:"ID",type:"Typ",size:"Rozm\u011bry",preview:"N\u00e1hled","constrain_proportions":"Zachovat proporce",controls:"Ovl\u00e1dac\u00ed panel",numloop:"Po\u010det opakov\u00e1n\u00ed",console:"Konzola",cache:"Mezipam\u011b\u0165",autohref:"Automatick\u00e9 na\u010dten\u00ed",liveconnect:"Spustit Javu (SWLiveConnect)",flashvars:"Parametry (Flashvars)",base:"Z\u00e1kladn\u00ed slo\u017eka",bgcolor:"Pozad\u00ed",wmode:"Re\u017eim okna",salign:"Zarovn\u00e1n\u00ed okna",align:"Zarovn\u00e1n\u00ed",scale:"Pom\u011br",quality:"Kvalita",shuffle:"N\u00e1hodn\u011b",prefetch:"P\u0159edna\u010dten\u00ed",nojava:"Nespout\u011bt Javu",maintainaspect:"Zachovat pom\u011br stran",imagestatus:"Stav obrazu",center:"Na st\u0159ed",autogotourl:"Automatick\u00fd p\u0159echod na URL","shockwave_options":"Mo\u017enosti Shockwave","rmp_options":"Mo\u017enosti p\u0159ehr\u00e1va\u010de Real media","wmp_options":"Mo\u017enosti p\u0159ehr\u00e1va\u010de Windows media","qt_options":"Mo\u017enosti Quicktime","flash_options":"Mo\u017enosti Flashe",hidden:"Skr\u00fdt","align_bottom_left":"Dol\u016f vlevo","align_bottom_right":"Dol\u016f vpravo","html5_video_options":"Mo\u017enosti HTML5 video",altsource1:"Alternativn\u00ed zdroj 1",altsource2:"Alternativn\u00ed zdroj 2",preload:"P\u0159edna\u010d\u00edst",poster:"Obr\u00e1zek (zobraz\u00ed se p\u0159i nedostupnosti videa)",source:"Zdroj","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/da_dlg.js b/webcit/tiny_mce/plugins/media/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..f04fa1a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.media_dlg',{list:"Liste",file:"Fil/URL",advanced:"Avanceret",general:"Generelt",title:"Inds\u00e6t/rediger indlejret mediefil","align_top_left":"\u00d8verste venstre hj\u00f8rne","align_center":"Centreret","align_left":"Venstre","align_bottom":"Bund","align_right":"H\u00f8jret","align_top":"Top","qt_stream_warn":"Streamede rtsp resourcer skal tilf\u00f8jes til QT Src feltet under tabben avanceret.\nDu skal ogs\u00e5 tilf\u00f8je en ikke streamet version til Src feltet..",qtsrc:"QT Src",progress:"Fremskridt",sound:"Lyd",swstretchvalign:"Str\u00e6k V-justering",swstretchhalign:"Str\u00e6k H-justering",swstretchstyle:"Str\u00e6k stil",scriptcallbacks:"Script callbacks","align_top_right":"\u00d8verste h\u00f8jre hj\u00f8rne",uimode:"UI-tilstand",rate:"Vurder",playcount:"Afspil indhold",defaultframe:"Standard ramme",currentposition:"Aktuel position",currentmarker:"Aktuel mark\u00f8r",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Vinduesl\u00f8s video",stretchtofit:"Str\u00e6k for at tilpasse",mute:"Lydl\u00f8s",invokeurls:"Aktiver URL\'er",fullscreen:"Fulssk\u00e6rm",enabled:"Valgt",autostart:"Afspil automatisk",volume:"Lydstyrke",target:"M\u00e5l",qtsrcchokespeed:"Choke-hastighed",href:"Href",endtime:"Sluttidspunkt",starttime:"Starttidspunkt",enablejavascript:"Tillad JavaScript",correction:"Ingen korrektion",targetcache:"M\u00e5l-cache",playeveryframe:"Afsplil alle rammer",kioskmode:"Kiosk-tilstand",controller:"Controller",menu:"Vis menu",loop:"Gentag",play:"Start",hspace:"H-afstand",vspace:"V-afstand","class_name":"Klasse",name:"Navn",id:"Id",type:"Type",size:"Dimensioner",preview:"Vis udskrift","constrain_proportions":"Bevar proportioner",controls:"Kontroller",numloop:"Antal loops",console:"Konsol",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Baggrund",wmode:"WMode",salign:"SAlign",align:"Juster",scale:"Skaler",quality:"Kvalitet",shuffle:"Bland",prefetch:"Forh\u00e5ndshent",nojava:"Ingen java",maintainaspect:"Bevar aspekt",imagestatus:"Billedstatus",center:"Center",autogotourl:"Auto g\u00e5 til URL","shockwave_options":"Shockwave options","rmp_options":"Real media player egenskaber","wmp_options":"Windows media player egenskaber","qt_options":"Quicktime egenskaber","flash_options":"Flash egenskaber",hidden:"Skjul","align_bottom_left":"Nederste venstre hj\u00f8rne","align_bottom_right":"\u00d8verste h\u00f8jre hj\u00f8rne","html5_video_options":"HTML5 Video Indstillinger",altsource1:"Alternativ kilde 1",altsource2:"Alternativ kilde 2",preload:"Forudindl\u00e6s",poster:"Poster",source:"Kilde","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/de_dlg.js b/webcit/tiny_mce/plugins/media/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..71ff5c0
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.media_dlg',{list:"Liste",file:"Datei/URL",advanced:"Erweitert",general:"Allgemein",title:"Multimedia-Inhalte einf\u00fcgen/bearbeiten","align_top_left":"Oben Links","align_center":"Zentriert","align_left":"Links","align_bottom":"Unten","align_right":"Rechts","align_top":"Oben","qt_stream_warn":"In den Erweiterten Einstellungen sollten im Feld \'QT Src\' gestreamte RTSP Resourcen hinzugef\u00fcgt werden.\nZus\u00e4tzlich sollten Sie dort auch eine nicht-gestreamte Resource angeben.",qtsrc:"Angabe zu QT Src",progress:"Fortschritt",sound:"Ton",swstretchvalign:"Stretch V-Ausrichtung",swstretchhalign:"Stretch H-Ausrichtung",swstretchstyle:"Stretch-Art",scriptcallbacks:"Script callbacks","align_top_right":"Oben Rechts",uimode:"UI Modus",rate:"Rate",playcount:"Z\u00e4hler",defaultframe:"Frame-Voreinstellung",currentposition:"Aktuelle Position",currentmarker:"Aktueller Marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Fensterloses Video",stretchtofit:"Anzeigefl\u00e4che an verf\u00fcgbaren Platz anpassen",mute:"Stumm",invokeurls:"Invoke URLs",fullscreen:"Vollbild",enabled:"Aktiviert",autostart:"Autostart",volume:"Lautst\u00e4rke",target:"Ziel",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"Endzeitpunkt",starttime:"Startzeitpunkt",enablejavascript:"JavaScript aktivieren",correction:"Ohne Korrektur",targetcache:"Ziel zwischenspeichern",playeveryframe:"Jeden Frame abspielen",kioskmode:"Kioskmodus",controller:"Controller",menu:"Men\u00fc anzeigen",loop:"Wiederholung",play:"Automatisches Abspielen",hspace:"Horizontaler Abstand",vspace:"Vertikaler Abstand","class_name":"CSS-Klasse",name:"Name",id:"Id",type:"Typ",size:"Abmessungen",preview:"Vorschau","constrain_proportions":"Proportionen erhalten",controls:"Steuerung",numloop:"Anzahl Wiederholungen",console:"Konsole",cache:"Zwischenspeicher",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvariablen",base:"Base",bgcolor:"Hintergrund",wmode:"WMode",salign:"S-Ausrichtung",align:"Ausrichtung",scale:"Skalierung",quality:"Qualit\u00e4t",shuffle:"Zuf\u00e4llige Wiedergabe",prefetch:"Prefetch",nojava:"Kein Java",maintainaspect:"Bildverh\u00e4ltnis beibehalten",imagestatus:"Bildstatus",center:"Zentriert",autogotourl:"Auto goto URL","shockwave_options":"Shockwave-Optionen","rmp_options":"Optionen f\u00fcr Real Media Player","wmp_options":"Optionen f\u00fcr Windows Media Player","qt_options":"Quicktime-Optionen","flash_options":"Flash-Optionen",hidden:"Versteckt","align_bottom_left":"Unten Links","align_bottom_right":"Unten Rechts","html5_video_options":"HTML5 Video Optionen",altsource1:"Alternative Quelle 1",altsource2:"Alternative Quelle 2",preload:"Preload",poster:"Poster",source:"Quelle","html5_audio_options":"Audio Optionen","preload_none":"Nicht vorladen","preload_metadata":"Video Metadaten vorladen","preload_auto":"Benutzer Browser entscheidet automatisch"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/el_dlg.js b/webcit/tiny_mce/plugins/media/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..e87c9ca
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.media_dlg',{list:"\u039b\u03af\u03c3\u03c4\u03b1",file:"\u0391\u03c1\u03c7\u03b5\u03af\u03bf/URL",advanced:"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2",general:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac",title:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd media","align_top_left":"\u03a0\u03ac\u03bd\u03c9 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","align_center":"\u039a\u03ad\u03bd\u03c4\u03c1\u03bf","align_left":"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","align_bottom":"\u039a\u03ac\u03c4\u03c9","align_right":"\u0394\u03b5\u03be\u03b9\u03ac","align_top":"\u03a0\u03ac\u03bd\u03c9","qt_stream_warn":"\u03a0\u03b7\u03b3\u03ad\u03c2 \u03c1\u03bf\u03ce\u03bd rtsp \u03b8\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b5\u03b8\u03bf\u03cd\u03bd \u03c3\u03c4\u03bf \u03c0\u03b5\u03b4\u03af\u03bf \u03a0\u03b7\u03b3\u03ae QT \u03ba\u03ac\u03c4\u03c9 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03ba\u03b1\u03c1\u03c4\u03ad\u03bb\u03b1 \u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2.\n\u0395\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03bb\u03cc \u03b8\u03b1 \u03ae\u03c4\u03b1\u03bd \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03b5\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03b1\u03c0\u03bb\u03ae (\u03cc\u03c7\u03b9 \u03c1\u03bf\u03ae\u03c2) \u03c0\u03b7\u03b3\u03ae..",qtsrc:"\u03a0\u03b7\u03b3\u03ae \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5",progress:"\u03a0\u03c1\u03cc\u03bf\u03b4\u03bf\u03c2",sound:"\u0389\u03c7\u03bf\u03c2",swstretchvalign:"\u039a\u03b1\u03c4\u03b1\u03ba\u03cc\u03c1\u03c5\u03c6\u03b7 \u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7",swstretchhalign:"\u039f\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7",swstretchstyle:"\u03a3\u03c4\u03c5\u03bb \u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7\u03c2",scriptcallbacks:"Script callbacks","align_top_right":"\u03a0\u03ac\u03bd\u03c9 \u03b4\u03b5\u03be\u03b9\u03ac",uimode:"\u039b\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 UI",rate:"\u03a1\u03c5\u03b8\u03bc\u03cc\u03c2",playcount:"\u03a0\u03cc\u03c3\u03b5\u03c2 \u03c6\u03bf\u03c1\u03ad\u03c2 \u03b8\u03b1 \u03c0\u03b1\u03af\u03be\u03b5\u03b9",defaultframe:"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf \u03ba\u03b1\u03c1\u03ad",currentposition:"\u03a4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1 \u03b8\u03ad\u03c3\u03b7",currentmarker:"\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03c3\u03b7\u03bc\u03ac\u03b4\u03b9",captioningid:"Captioning id",baseurl:"URL \u03b2\u03ac\u03c3\u03b7\u03c2",balance:"\u0399\u03c3\u03bf\u03c1\u03c1\u03bf\u03c0\u03af\u03b1",windowlessvideo:"\u0392\u03af\u03bd\u03c4\u03b5\u03bf \u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf",stretchtofit:"\u0395\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7 \u03ce\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c7\u03c9\u03c1\u03ad\u03c3\u03b5\u03b9",mute:"\u03a3\u03af\u03b3\u03b1\u03c3\u03b7",invokeurls:"\u039a\u03bb\u03ae\u03c3\u03b7 URLs",fullscreen:"\u03a0\u03bb\u03ae\u03c1\u03b7\u03c2 \u03bf\u03b8\u03cc\u03bd\u03b7",enabled:"\u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",autostart:"\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7",volume:"\u0388\u03bd\u03c4\u03b1\u03c3\u03b7",target:"\u03a3\u03c4\u03cc\u03c7\u03bf\u03c2",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"\u03a7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03bb\u03ae\u03be\u03b7\u03c2",starttime:"\u03a7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03ad\u03bd\u03b1\u03c1\u03be\u03b7\u03c2",enablejavascript:"\u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 JavaScript",correction:"\u03a7\u03c9\u03c1\u03af\u03c2 \u03b4\u03b9\u03cc\u03c1\u03b8\u03c9\u03c3\u03b7",targetcache:"\u039c\u03bd\u03ae\u03bc\u03b7 cache \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",playeveryframe:"\u03a0\u03b1\u03af\u03be\u03b9\u03bc\u03bf \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03ba\u03b1\u03c1\u03ad",kioskmode:"\u039b\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 Kiosk",controller:"\u0395\u03bb\u03b5\u03b3\u03ba\u03c4\u03ae\u03c2",menu:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03bc\u03b5\u03bd\u03bf\u03cd",loop:"\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7",play:"\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03bf \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7",hspace:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1",vspace:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03ba\u03ac\u03b8\u03b5\u03c4\u03b7","class_name":"\u039a\u03bb\u03ac\u03c3\u03b7",name:"\u038c\u03bd\u03bf\u03bc\u03b1",id:"Id",type:"\u03a4\u03cd\u03c0\u03bf\u03c2",size:"\u0394\u03b9\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2",preview:"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7","constrain_proportions":"\u0394\u03b9\u03b1\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 \u03b1\u03bd\u03b1\u03bb\u03bf\u03b3\u03af\u03b1\u03c2 \u03c0\u03bb. - \u03cd\u03c8\u03bf\u03c5\u03c2",controls:"\u03a7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c1\u03b9\u03b1",numloop:"\u03a0\u03cc\u03c3\u03b5\u03c2 \u03c6\u03bf\u03c1\u03ad\u03c2 \u03b8\u03b1 \u03c0\u03b1\u03af\u03be\u03b5\u03b9",console:"\u039a\u03bf\u03bd\u03c3\u03cc\u03bb\u03b1",cache:"\u039c\u03bd\u03ae\u03bc\u03b7 cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"\u039c\u03b5\u03c4\u03b1\u03b2\u03bb\u03b7\u03c4\u03ad\u03c2 Flash",base:"\u0392\u03ac\u03c3\u03b7",bgcolor:"\u03a6\u03cc\u03bd\u03c4\u03bf",wmode:"WMode",salign:"SAlign",align:"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7",scale:"\u039a\u03bb\u03af\u03bc\u03b1\u03ba\u03b1",quality:"\u03a0\u03bf\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1",shuffle:"\u03a4\u03c5\u03c7\u03b1\u03af\u03b1 \u03c3\u03b5\u03b9\u03c1\u03ac",prefetch:"\u03a0\u03c1\u03bf\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7",nojava:"\u03a7\u03c9\u03c1\u03af\u03c2 java",maintainaspect:"\u0394\u03b9\u03b1\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 \u03b1\u03bd\u03b1\u03bb\u03bf\u03b3\u03af\u03b1\u03c2 \u03c0\u03bb. - \u03cd\u03c8\u03bf\u03c5\u03c2",imagestatus:"\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",center:"\u039a\u03ad\u03bd\u03c4\u03c1\u03bf",autogotourl:"\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03bc\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf URL","shockwave_options":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Shockwave","rmp_options":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Real media player","wmp_options":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Windows media player","qt_options":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Quicktime","flash_options":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Flash",hidden:"\u039a\u03c1\u03c5\u03c6\u03cc","align_bottom_left":"\u039a\u03ac\u03c4\u03c9 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","align_bottom_right":"\u039a\u03ac\u03c4\u03c9 \u03b4\u03b5\u03be\u03b9\u03ac","html5_video_options":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 HTML5 Video",altsource1:"\u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03ba\u03c4\u03b9\u03ba\u03ae \u03c0\u03b7\u03b3\u03ae 1",altsource2:"\u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03ba\u03c4\u03b9\u03ba\u03ae \u03c0\u03b7\u03b3\u03ae 2",preload:"\u03a0\u03c1\u03bf\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7",poster:"\u0391\u03c6\u03af\u03c3\u03b1",source:"\u03a0\u03b7\u03b3\u03ae","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/en_dlg.js b/webcit/tiny_mce/plugins/media/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..efbc94c
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert/Edit Embedded Media","align_top_left":"Top Left","align_center":"Center","align_left":"Left","align_bottom":"Bottom","align_right":"Right","align_top":"Top","qt_stream_warn":"Streamed RTSP resources should be added to the QT Source field under the Advanced tab.\nYou should also add a non-streamed version to the Source field.",qtsrc:"QT Source",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch Style",scriptcallbacks:"Script Callbacks","align_top_right":"Top Right",uimode:"UI Mode",rate:"Rate",playcount:"Play Count",defaultframe:"Default Frame",currentposition:"Current Position",currentmarker:"Current Marker",captioningid:"Captioning ID",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless Video",stretchtofit:"Stretch to Fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Full Screen",enabled:"Enabled",autostart:"Auto Start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke Speed",href:"HREF",endtime:"End Time",starttime:"Start Time",enablejavascript:"Enable JavaScript",correction:"No Correction",targetcache:"Target Cache",playeveryframe:"Play Every Frame",kioskmode:"Kiosk Mode",controller:"Controller",menu:"Show Menu",loop:"Loop",play:"Auto Play",hspace:"H-Space",vspace:"V-Space","class_name":"Class",name:"Name",id:"ID",type:"Type",size:"Dimensions",preview:"Preview","constrain_proportions":"Constrain Proportions",controls:"Controls",numloop:"Num Loops",console:"Console",cache:"Cache",autohref:"Auto HREF",liveconnect:"SWLiveConnect",flashvars:"Flash Vars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No Java",maintainaspect:"Maintain Aspect",imagestatus:"Image Status",center:"Center",autogotourl:"Auto Goto URL","shockwave_options":"Shockwave Options","rmp_options":"Real Media Player Options","wmp_options":"Windows Media Player Options","qt_options":"QuickTime Options","flash_options":"Flash Options",hidden:"Hidden","align_bottom_left":"Bottom Left","align_bottom_right":"Bottom Right","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/es_dlg.js b/webcit/tiny_mce/plugins/media/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..049d2b7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.media_dlg',{list:"Lista",file:"Archivo/URL",advanced:"Avanzado",general:"General",title:"Insertar/editar medio embebido","align_top_left":"Arriba Izda.","align_center":"Centrado","align_left":"Izquierda","align_bottom":"Debajo","align_right":"Derecha","align_top":"Arriba","qt_stream_warn":"Los recursos rtsp de Streaming deber\u00edan a\u00f1adirse en el campo QT Src de la pesta\u00f1a avanzada.\nAdem\u00e1s deber\u00eda a\u00f1adir una versi\u00f3n no Streaming en el campo Src.",qtsrc:"QT Src",progress:"Progreso",sound:"Sonido",swstretchvalign:"Alin. V. Estiramiento",swstretchhalign:"Alin. H. Estiramiento",swstretchstyle:"Estilo estiramiento",scriptcallbacks:"Script callbacks","align_top_right":"Arriba Dcha.",uimode:"Modo UI",rate:"Ratio",playcount:"Cuantas reproducciones",defaultframe:"Frame predet.",currentposition:"Posici\u00f3n actual",currentmarker:"Marcador actual",captioningid:"Captioning id",baseurl:"URL Base",balance:"Balance",windowlessvideo:"Video sin ventana",stretchtofit:"Estirar para ajustar",mute:"Silencio",invokeurls:"Invocar URLs",fullscreen:"Pantalla Completa",enabled:"Habilitado",autostart:"Comienzo Autom\u00e1tico",volume:"Volumen",target:"Target",qtsrcchokespeed:"Vel. de choque",href:"Href",endtime:"Fin",starttime:"Inicio",enablejavascript:"Habilitar JavaScript",correction:"Sin correci\u00f3n",targetcache:"Target cache",playeveryframe:"Reproducir todo los frames",kioskmode:"Kiosk mode",controller:"Controller",menu:"Mostrar Men\u00fa",loop:"Repetitivo",play:"Comienzo Autom\u00e1tico",hspace:"H-Space",vspace:"V-Space","class_name":"Clase",name:"Nombre",id:"Id",type:"Tipo",size:"Dimensiones",preview:"Vista Previa","constrain_proportions":"Bloquear relaci\u00f3n de aspecto",controls:"Controles",numloop:"N\u00fam. repeticiones",console:"Consola",cache:"Cach\u00e9",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Fondo",wmode:"WMode",salign:"SAlign",align:"Alineaci\u00f3n",scale:"Scale",quality:"Calidad",shuffle:"Aleatorio",prefetch:"Preb\u00fasqueda",nojava:"No java",maintainaspect:"Mantener aspecto",imagestatus:"Estado de imagen",center:"Centrado",autogotourl:"Ir a URL autom\u00e1t.","shockwave_options":"Opciones Shockwave","rmp_options":"Opciones Real media player","wmp_options":"Opciones Windows media player","qt_options":"Opciones Quicktime","flash_options":"Opciones Flash",hidden:"Hidden","align_bottom_left":"Debajo Izda.","align_bottom_right":"Debajo Dcha.","html5_video_options":"Opciones Video HTML5",altsource1:"Fuente alternativa 1",altsource2:"Fuente alternativa 2",preload:"Precarga",poster:"P\u00f3ster",source:"Fuente","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/et_dlg.js b/webcit/tiny_mce/plugins/media/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..ed9b798
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.media_dlg',{list:"Nimekiri",file:"Fail/URL",advanced:"T\u00e4psem",general:"\u00dcldine",title:"Sisesta/muuda meediat","align_top_left":"\u00dcleval vasakul","align_center":"Keskel","align_left":"Vasakul","align_bottom":"All","align_right":"Paremal","align_top":"\u00dcleval","qt_stream_warn":"Striimitav variant peaks olema lisatud.",qtsrc:"QT Src",progress:"Progress",sound:"Heli",swstretchvalign:"Venita V-joondust",swstretchhalign:"Venita H-joondust",swstretchstyle:"Venita stiili",scriptcallbacks:"Skripti tagasikutse","align_top_right":"Pleval paremal",uimode:"UI Reziim",rate:"Hinda",playcount:"M\u00e4ngukorrad",defaultframe:"Vaikimisi raam",currentposition:"Antud positioon",currentmarker:"Antud marker",captioningid:"Tiitri ID",baseurl:"Baas URL",balance:"Tasakaal",windowlessvideo:"Aknata video",stretchtofit:"Venita sobivaks",mute:"Vaigista",invokeurls:"N\u00e4ita URL\u2019e",fullscreen:"T\u00e4isekraan",enabled:"Lubatud",autostart:"Auto-start",volume:"Valjudus",target:"Sihtm\u00e4rk",qtsrcchokespeed:"Kiirus",href:"Href",endtime:"L\u00f5pu aeg",starttime:"Stardi aeg",enablejavascript:"Luba JavaScript\u2019i",correction:"Parandust ei ole",targetcache:"Sihtm\u00e4rgi vahem\u00e4lu",playeveryframe:"M\u00e4ngi igat raami",kioskmode:"Kioski reziim",controller:"Kontrollija",menu:"N\u00e4ita men\u00fc\u00fcd",loop:"Auto-kordus",play:"Auto-start",hspace:"H-vahe",vspace:"V-vahe","class_name":"Klass",name:"Nime",id:"ID",type:"T\u00fc\u00fcp",size:"M\u00f5\u00f5dud",preview:"Eelvaade","constrain_proportions":"S\u00e4ilita proportsioon",controls:"Kontrollid",numloop:"Kordused",console:"Konsool",cache:"Vahem\u00e4lu",autohref:"Auto-HREF",liveconnect:"SWLive-\u00dchendus",flashvars:"Flashiv\u00e4rk",base:"Baas",bgcolor:"Taust",wmode:"WMoodus",salign:"SJoondus",align:"Joondus",scale:"M\u00f5\u00f5tkava",quality:"Kvaliteet",shuffle:"Sega",prefetch:"Prefetch",nojava:"Ilma java\u2019ta",maintainaspect:"S\u00e4ilitamise aspekt",imagestatus:"Pildi staatus",center:"Keskel",autogotourl:"Auto-URL","shockwave_options":"Shockwave\u2019i seaded","rmp_options":"Real media player\u2019i seaded","wmp_options":"Windows media player\u2019i seaded","qt_options":"Quicktime\u2019 seaded","flash_options":"Flash\u2019i seaded",hidden:"Peidetud","align_bottom_left":"All vasakul","align_bottom_right":"All paremal","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/fi_dlg.js b/webcit/tiny_mce/plugins/media/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..0538f60
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.media_dlg',{list:"Lista",file:"Tiedosto/URL",advanced:"Edistyneet",general:"Yleiset",title:"Lis\u00e4\u00e4/muokkaa upotettua mediaa","align_top_left":"Yl\u00e4-vasemmalla","align_center":"Keskell\u00e4","align_left":"Vasemmalla","align_bottom":"Alhaalla","align_right":"Oikealla","align_top":"Ylh\u00e4\u00e4ll\u00e4","qt_stream_warn":"Streamatut rtsp-resurssit tulisi lis\u00e4t\u00e4 QT Src -kentt\u00e4\u00e4n edistynyt-v\u00e4lilehdelle.\nSinun kannattaa lis\u00e4t\u00e4 my\u00f6s ei-streamattu versio Src-kentt\u00e4\u00e4n.",qtsrc:"QT Src",progress:"Eteneminen",sound:"\u00c4\u00e4ni",swstretchvalign:"Venyt\u00e4 pystysuunnassa",swstretchhalign:"Venyt\u00e4 vaakasuunnassa",swstretchstyle:"Venytystyyli",scriptcallbacks:"Skriptin takaisinkutsut","align_top_right":"Yl\u00e4-oikealla",uimode:"UI-moodi",rate:"Rate",playcount:"Toistolaskin",defaultframe:"Oletusruutu",currentposition:"T\u00e4m\u00e4nhetkinen sijainti",currentmarker:"T\u00e4m\u00e4nhetkinen merkki",captioningid:"Otsikointi-id",baseurl:"Perus URL-osoitteet",balance:"Tasapaino",windowlessvideo:"Ikkunaton video",stretchtofit:"Venyt\u00e4 sopimaan",mute:"Hiljennys",invokeurls:"Kutsu URL-osoitteet",fullscreen:"Kokoruutu",enabled:"P\u00e4\u00e4ll\u00e4",autostart:"Automaattinen aloitus",volume:"\u00c4\u00e4nen voimakkuus",target:"Kohde",qtsrcchokespeed:"Choke-nopeus",href:"Href",endtime:"Lopetusaika",starttime:"Aloitusaika",enablejavascript:"Salli JavaScript",correction:"Ei korjausta",targetcache:"Kohteen v\u00e4limuisti",playeveryframe:"Toista jokainen ruutu",kioskmode:"Kioskitila",controller:"Ohjain",menu:"N\u00e4yt\u00e4 valikko",loop:"Silmukka",play:"Automaattinen toisto",hspace:"Vaakatason tila",vspace:"Pystytason tila","class_name":"Luokka",name:"Nimi",id:"Tunniste",type:"Tyyppi",size:"Mitat",preview:"Esikatselu","constrain_proportions":"S\u00e4ilyt\u00e4 mittasuhteet",controls:"Kontrollit",numloop:"Toistojen m\u00e4\u00e4r\u00e4",console:"Konsoli",cache:"V\u00e4limuisti",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash-muuttujat",base:"Perusta",bgcolor:"Tausta",wmode:"WMode",salign:"SAlign",align:"Tasaus",scale:"Skaala",quality:"Laatu",shuffle:"Sekoita",prefetch:"Esinouda",nojava:"Ei Javaa",maintainaspect:"S\u00e4ilyt\u00e4 kuvasuhde",imagestatus:"Kuvan tila",center:"Keskit\u00e4",autogotourl:"Mene automaattisesti URL:iin","shockwave_options":"Shockwaven asetukset","rmp_options":"Real media playerin asetukset","wmp_options":"Windows media playerin asetukset","qt_options":"Quicktimen asetukset","flash_options":"Flashin asetukset",hidden:"Piilotettu","align_bottom_left":"Ala-vasemmalla","align_bottom_right":"Ala-oikealla","html5_video_options":"HTML5 videoasetukset",altsource1:"Vaihtoehtoinen l\u00e4hde 1",altsource2:"Vaihtoehtoinen l\u00e4hde 2",preload:"Esilataa",poster:"Posteri",source:"L\u00e4hde","html5_audio_options":"\u00c4\u00e4niasetukset","preload_none":"\u00c4l\u00e4 esilataa","preload_metadata":"Esilataa videon metatiedot","preload_auto":"Anna k\u00e4ytt\u00e4j\u00e4n selaimen p\u00e4\u00e4tt\u00e4\u00e4"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/fr_dlg.js b/webcit/tiny_mce/plugins/media/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..6273c59
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.media_dlg',{list:"Liste",file:"Fichier / URL",advanced:"Avanc\u00e9",general:"G\u00e9n\u00e9ral",title:"Ins\u00e9rer / \u00e9diter un fichier m\u00e9dia","align_top_left":"En haut \u00e0 gauche","align_center":"Centr\u00e9","align_left":"Gauche","align_bottom":"Bas","align_right":"Droite","align_top":"Haut","qt_stream_warn":"Les ressources rtsp en streaming doivent \u00eatre ajout\u00e9es au champ \u00ab Source QT \u00bb dans l\'onglet avanc\u00e9.\nVous devriez aussi ajouter une version n\'\u00e9tant pas en streaming au champ \u00ab source QT \u00bb.",qtsrc:"Source QT",progress:"Progression",sound:"Son",swstretchvalign:"Stretch vertical",swstretchhalign:"Stretch horizontal",swstretchstyle:"Stretch style",scriptcallbacks:"Callback de script","align_top_right":"En haut \u00e0 droite",uimode:"Mode UI",rate:"Taux",playcount:"Compteur",defaultframe:"Image par d\u00e9faut",currentposition:"Position actuelle",currentmarker:"Marqueur actuel",captioningid:"ID sous-titrage",baseurl:"Adresse de base",balance:"Balance",windowlessvideo:"Vid\u00e9o sans fen\u00eatre",stretchtofit:"\u00c9tendre pour adapter la taille",mute:"Muet",invokeurls:"Invoquer URLs",fullscreen:"Plein \u00e9cran",enabled:"Activ\u00e9",autostart:"Lire automatiquement",volume:"Volume",target:"Cible",qtsrcchokespeed:"D\u00e9bit maximum",href:"Href",endtime:"Fin",starttime:"D\u00e9but",enablejavascript:"Activer le JavaScript",correction:"Pas de correction",targetcache:"Cache cible",playeveryframe:"Jouer toutes les images",kioskmode:"Mode kiosque",controller:"Contr\u00f4leur",menu:"Afficher le menu",loop:"Lire en boucle",play:"Lecture automatique",hspace:"Espacement horizontal",vspace:"Espacement vertical","class_name":"Classe",name:"Nom",id:"Id",type:"Type",size:"Dimensions",preview:"Pr\u00e9visualisation","constrain_proportions":"Conserver les proportions",controls:"Contr\u00f4les",numloop:"Nombre de tours",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Variables flash",base:"Base",bgcolor:"Fond",wmode:"WMode",salign:"SAlign",align:"Alignement",scale:"\u00c9chelle",quality:"Qualit\u00e9",shuffle:"Al\u00e9atoire",prefetch:"Pr\u00e9chargement",nojava:"Pas java",maintainaspect:"Maintenir l\'aspect",imagestatus:"Statut de l\'image",center:"Centrer",autogotourl:"Aller automatiquement \u00e0 l\'URL","shockwave_options":"Options Shockwave","rmp_options":"Options Real media player","wmp_options":"Windows media player options","qt_options":"Options Quicktime","flash_options":"Options Flash",hidden:"Cach\u00e9","align_bottom_left":"En bas \u00e0 gauche","align_bottom_right":"En bas \u00e0 droite","html5_video_options":"Options Vid\u00e9o HTML 5",altsource1:"Source alternative 1",altsource2:"Source alternative 2",preload:"Pr\u00e9chargement",poster:"Poster",source:"Source","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/hu_dlg.js b/webcit/tiny_mce/plugins/media/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..d303397
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.media_dlg',{list:"Lista",file:"F\u00e1jl/URL",advanced:"Halad\u00f3",general:"\u00c1ltal\u00e1nos",title:"Be\u00e1gyazott m\u00e9dia besz\u00far\u00e1sa/szerkeszt\u00e9se","align_top_left":"Bal-fent","align_center":"K\u00f6z\u00e9pen","align_left":"Balra","align_bottom":"Lent","align_right":"Jobbra","align_top":"Fent","qt_stream_warn":"Streamelt rtsp forr\u00e1sok a QT Src mez\u0151be val\u00f3k a halad\u00f3 lapon.\nHozz\u00e1 kellene adnia egy nem streamelt verzi\u00f3t a Src mez\u0151ben.",qtsrc:"QT Src",progress:"Folyamat",sound:"Hang",swstretchvalign:"Ny\u00fajt\u00e1s F-igaz\u00edt\u00e1s",swstretchhalign:"Ny\u00fajt\u00e1s V-igaz\u00edt\u00e1s",swstretchstyle:"Ny\u00fajt\u00e1s st\u00edlusa",scriptcallbacks:"Script callbacks","align_top_right":"Jobbra fent",uimode:"UI M\u00f3d",rate:"\u00c9rt\u00e9kel\u00e9s",playcount:"Lej\u00e1tsz\u00e1ssz\u00e1m",defaultframe:"Alap\u00e9rtelmezett frame",currentposition:"Aktu\u00e1lis poz\u00edci\u00f3",currentmarker:"Aktu\u00e1lis marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Ablak n\u00e9lk\u00fcli vide\u00f3",stretchtofit:"Ny\u00fajtva igaz\u00edt\u00e1s",mute:"N\u00e9ma",invokeurls:"URL-ek bevon\u00e1sa",fullscreen:"Teljes k\u00e9perny\u0151",enabled:"Enged\u00e9lyezve",autostart:"Automatikus kezd\u00e9s",volume:"Hanger\u0151",target:"C\u00e9l",qtsrcchokespeed:"Folyt\u00e1s sebess\u00e9ge",href:"Href",endtime:"Z\u00e1r\u00f3 id\u0151",starttime:"Kezd\u00e9si id\u0151",enablejavascript:"JavaScript enged\u00e9se",correction:"Nincs jav\u00edt\u00e1s",targetcache:"C\u00e9l cache",playeveryframe:"Minden kocka lej\u00e1tsz\u00e1sa",kioskmode:"Kiosk m\u00f3d",controller:"Vez\u00e9rl\u0151",menu:"Men\u00fc mutat\u00e1sa",loop:"Ism\u00e9tl\u00e9s",play:"Automatikus lej\u00e1tsz\u00e1s",hspace:"V-t\u00e1v",vspace:"F-t\u00e1v","class_name":"Oszt\u00e1ly",name:"N\u00e9v",id:"Id",type:"T\u00edpus",size:"M\u00e9retek",preview:"El\u0151n\u00e9zet","constrain_proportions":"Ar\u00e1nytart\u00e1s",controls:"Kezel\u0151k",numloop:"Ism\u00e9tl\u00e9ssz\u00e1m",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"H\u00e1tt\u00e9r",wmode:"WM\u00f3d",salign:"SElrendez\u00e9s",align:"Elrendez\u00e9s",scale:"Nagy\u00edt\u00e1s",quality:"Min\u0151s\u00e9g",shuffle:"V\u00e9letlenszer\u0171",prefetch:"El\u0151t\u00f6lt\u00e9s",nojava:"Nincs java",maintainaspect:"Ar\u00e1nytart\u00e1s",imagestatus:"K\u00e9p \u00e1llapot",center:"K\u00f6z\u00e9pre",autogotourl:"Automatikus URL-re ugr\u00e1s","shockwave_options":"Shockwave be\u00e1ll\u00edt\u00e1sai","rmp_options":"Real media player be\u00e1ll\u00edt\u00e1sai","wmp_options":"Windows media player be\u00e1ll\u00edt\u00e1sai","qt_options":"Quicktime be\u00e1ll\u00edt\u00e1sai","flash_options":"Flash be\u00e1ll\u00edt\u00e1sai",hidden:"Rejtett","align_bottom_left":"Bal-lent","align_bottom_right":"Bal-jobbra","html5_video_options":"HTML5 Video be\u00e1ll\u00edt\u00e1sok",altsource1:"Alternat\u00edv forr\u00e1s 1",altsource2:"Alternat\u00edv forr\u00e1s 2",preload:"El\u0151t\u00f6lt\u00e9s",poster:"Hozz\u00e1ad\u00f3",source:"Forr\u00e1s","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/it_dlg.js b/webcit/tiny_mce/plugins/media/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..23b5240
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.media_dlg',{list:"Lista",file:"File/URL",advanced:"Avanzate",general:"Generale",title:"Inserisci/modifica file multimediale","align_top_left":"Alto a sinistra","align_center":"Centro","align_left":"Sinistra","align_bottom":"Basso","align_right":"Destra","align_top":"Alto","qt_stream_warn":"Le risorse rstp \'streamed\' devono essere aggiunte al campo Sorgente QT nella tabella Avanzate.\nSi dovrebbe inserire anche una versione non \'streamed\' al campo Sorgente..",qtsrc:"Sorgente QT",progress:"Avanzamento",sound:"Suono",swstretchvalign:"Tratto V-Allineamento",swstretchhalign:"Tratto H-Allineamento",swstretchstyle:"Stile Tratto",scriptcallbacks:"Script richiamato","align_top_right":"Alto a destra",uimode:"Modalit\u00e0 Interfaccia Utente",rate:"Qualit\u00e0",playcount:"Conteggio esecuzione",defaultframe:"Frame predefinito",currentposition:"Posizione corrente",currentmarker:"Indicatore corrente",captioningid:"Didascalia dell\'Id",baseurl:"URL base",balance:"Bilanciamento",windowlessvideo:"Video senza finestra",stretchtofit:"Adatta dimensioni",mute:"Muto",invokeurls:"Invoca URLs",fullscreen:"Tutto schermo",enabled:"Abilitato",autostart:"Avvio automatico",volume:"Volume",target:"Target",qtsrcchokespeed:"Velocit\u00e0 cursore",href:"Href",endtime:"Ora fine",starttime:"Ora inizio",enablejavascript:"Abilita JavaScript",correction:"Nessuna correzione",targetcache:"Cache del target",playeveryframe:"Esegui ogni frame",kioskmode:"Modalit\u00e0 Kiosk",controller:"Controller",menu:"Mostra menu",loop:"Riproduzione ciclica",play:"Esecuzione automatica",hspace:"H-Spazio",vspace:"V-Spazio","class_name":"Classe",name:"Nome",id:"Id",type:"Tipo",size:"Dimensioni",preview:"Anteprima","constrain_proportions":"Mantieni proporzioni",controls:"Controlli",numloop:"Numero cicli",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Sfondo",wmode:"WMode",salign:"SAlign",align:"Allineamento",scale:"Scala",quality:"Qualit\u00e0",shuffle:"Shuffle",prefetch:"Precaricamento",nojava:"No java",maintainaspect:"Mantieni aspetto",imagestatus:"Stato immagine",center:"Centra",autogotourl:"Vai a URL automatico","shockwave_options":"Opzioni Shockwave","rmp_options":"Opzioni Real media player","wmp_options":"Opzioni Windows media player","qt_options":"Opzioni Quicktime","flash_options":"Opzioni Flash",hidden:"Nascosto","align_bottom_left":"Basso a sinistra","align_bottom_right":"Basso a destra","html5_video_options":"Opzioni Video HTML5",altsource1:"Sorgente alternativa 1",altsource2:"Sorgente alternativa 2",preload:"Precarica",poster:"Poster",source:"Sorgente","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/media/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..273a48f
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.media_dlg',{list:"\u5217\u8868",file:"\u6587\u4ef6/URL",advanced:"\u9ad8\u7ea7",general:"\u666e\u901a",title:"\u63d2\u5165/\u7f16\u8f91 \u5d4c\u5165\u5f0f\u5a92\u4f53","align_top_left":"\u5de6\u4e0a","align_center":"\u5c45\u4e2d","align_left":"\u5c45\u5de6","align_bottom":"\u5c45\u4e0b","align_right":"\u5c45\u53f3","align_top":"\u5c45\u4e0a","qt_stream_warn":"\u6d41\u5a92\u4f53RTSP\u8d44\u6e90\u5e94\u6dfb\u52a0\u5230\u9ad8\u7ea7\u9009\u9879\u7684QT\u8d44\u6e90\u4e2d\u3002n\u540c\u65f6\uff0c\u60a8\u4e5f\u53ef\u4ee5\u5728\u8fd9\u91cc\u52a0\u5165\u4e00\u4e2a\u975e\u6d41\u5a92\u4f53\u3002",qtsrc:"QT\u8d44\u6e90",progress:"\u8fdb\u5ea6",sound:"\u58f0\u97f3",swstretchvalign:"\u5782\u76f4\u62c9\u4f38",swstretchhalign:"\u6c34\u5e73\u62c9\u4f38",swstretchstyle:"\u62c9\u4f38\u65b9\u5f0f",scriptcallbacks:"\u811a\u672c\u56de\u8c03","align_top_right":"\u53f3\u4e0a",uimode:"\u5916\u89c2\u6a21\u5f0f",rate:"\u6bd4\u7387",playcount:"\u64ad\u653e\u6b21\u6570",defaultframe:"\u9ed8\u8ba4\u5e27",currentposition:"\u5f53\u524d\u4f4d\u7f6e",currentmarker:"\u5f53\u524d\u6807\u8bb0",captioningid:"\u5b57\u5e55ID",baseurl:"\u57fa\u7840\u8def\u5f84",balance:"\u5e73\u8861",windowlessvideo:"\u65e0\u8fb9\u6846",stretchtofit:"\u62c9\u4f38\u5230\u9002\u5408",mute:"\u9759\u97f3",invokeurls:"\u5f15\u7528URL",fullscreen:"\u5168\u5c4f",enabled:"\u542f\u7528",autostart:"\u81ea\u52a8\u64ad\u653e",volume:"\u97f3\u91cf",target:"\u76ee\u6807",qtsrcchokespeed:"\u9650\u5236\u901f\u5ea6",href:"\u8d85\u94fe\u63a5",endtime:"\u7ed3\u675f\u65f6\u95f4",starttime:"\u5f00\u59cb\u65f6\u95f4",enablejavascript:"\u542f\u7528JavaScript",correction:"\u65e0\u4fee\u6b63",targetcache:"\u76ee\u6807\u7f13\u5b58",playeveryframe:"\u9010\u5e27\u64ad\u653e",kioskmode:"\u5168\u5c4f\u6a21\u5f0f",controller:"\u63a7\u5236\u53f0",menu:"\u663e\u793a\u83dc\u5355",loop:"\u5faa\u73af",play:"\u81ea\u52a8\u64ad\u653e",hspace:"\u6c34\u5e73\u8ddd\u79bb",vspace:"\u5782\u76f4\u8ddd\u79bb","class_name":"\u7c7b\u522b",name:"\u540d\u79f0",id:"ID",type:"\u7c7b\u578b",size:"\u5c3a\u5bf8",preview:"\u9884\u89c8","constrain_proportions":"\u4fdd\u6301\u6bd4\u4f8b",controls:"\u64ad\u653e\u63a7\u5236",numloop:"\u5faa\u73af\u6b21\u6570",console:"\u63a7\u5236\u53f0",cache:"\u7f13\u5b58",autohref:"\u81ea\u52a8\u8df3\u8f6c",liveconnect:"JavaScript\u5f00\u542f",flashvars:"Flash\u53d8\u91cf",base:"\u57fa\u7840\u8def\u5f84",bgcolor:"\u80cc\u666f",wmode:"\u7a97\u4f53\u6a21\u5f0f",salign:"\u5a92\u4f53\u5bf9\u9f50",align:"\u6587\u672c\u5bf9\u9f50",scale:"\u7f29\u653e",quality:"\u753b\u8d28",shuffle:"\u968f\u673a",prefetch:"\u9884\u52a0\u8f7d",nojava:"\u65e0java",maintainaspect:"\u4fdd\u6301\u5916\u89c2",imagestatus:"\u56fe\u7247\u72b6\u6001",center:"\u5c45\u4e2d",autogotourl:"\u81ea\u52a8\u8f6c\u5230URL","shockwave_options":"Shockwave\u9009\u9879","rmp_options":"Real media player\u9009\u9879","wmp_options":"Windows media player\u9009\u9879","qt_options":"Quicktime\u9009\u9879","flash_options":"Flash\u9009\u9879",hidden:"\u9690\u85cf","align_bottom_left":"\u5de6\u4e0b","align_bottom_right":"\u53f3\u4e0b","html5_video_options":"HTML5\u89c6\u9891\u9009\u9879",altsource1:"\u66ff\u4ee3\u8d44\u6e901",altsource2:"\u66ff\u4ee3\u8d44\u6e902",preload:"\u9884\u52a0\u8f7d",poster:"\u6d77\u62a5",source:"\u8d44\u6e90","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/media/media.htm b/webcit/tiny_mce/plugins/media/media.htm
new file mode 100644 (file)
index 0000000..fdea37a
--- /dev/null
@@ -0,0 +1,897 @@
+<!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>{#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
+</head>\r
+<body style="display: none" role="application">\r
+<form onsubmit="Media.insert();return false;" action="#">\r
+               <div class="tabs" role="presentation">\r
+                       <ul>\r
+                               <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');Media.formToData();" onmousedown="return false;">{#media_dlg.general}</a></span></li>\r
+                               <li id="advanced_tab" aria-controls="advanced_panel"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');Media.formToData();" onmousedown="return false;">{#media_dlg.advanced}</a></span></li>\r
+                               <li id="source_tab" aria-controls="source_panel"><span><a href="javascript:mcTabs.displayTab('source_tab','source_panel');Media.formToData('source');" onmousedown="return false;">{#media_dlg.source}</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>{#media_dlg.general}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                                       <tr>\r
+                                                               <td><label for="media_type">{#media_dlg.type}</label></td>\r
+                                                               <td>\r
+                                                                       <select id="media_type" name="media_type" onchange="Media.formToData('type');">\r
+                                                                               <option value="video">HTML5 Video</option>\r
+                                                                               <option value="audio">HTML5 Audio</option>\r
+                                                                               <option value="flash">Flash</option>\r
+                                                                               <option value="quicktime">QuickTime</option>\r
+                                                                               <option value="shockwave">Shockwave</option>\r
+                                                                               <option value="windowsmedia">Windows Media</option>\r
+                                                                               <option value="realmedia">Real Media</option>\r
+                                                                               <option value="iframe">Iframe</option>\r
+                                                                       </select>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                       <td><label for="src">{#media_dlg.file}</label></td>\r
+                                                               <td>\r
+                                                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="src" name="src" type="text" value="" class="mceFocus" onchange="Media.formToData();" /></td>\r
+                                                                               <td id="filebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                                       </table>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                                       <tr id="linklistrow">\r
+                                                               <td><label for="linklist">{#media_dlg.list}</label></td>\r
+                                                               <td id="linklistcontainer"><select id="linklist"><option value=""></option></select></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><label for="width">{#media_dlg.size}</label></td>\r
+                                                               <td>\r
+                                                                       <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                               <tr>\r
+                                                                                       <td><input type="text" id="width" name="width" value="" class="size" onchange="Media.formToData('width');" onfocus="Media.beforeResize();" /> x <input type="text" id="height" name="height" value="" class="size" onfocus="Media.beforeResize();" onchange="Media.formToData('height');" /></td>\r
+                                                                                       <td>&nbsp;&nbsp;<input id="constrain" type="checkbox" name="constrain" class="checkbox" checked="checked" /></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>{#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>{#media_dlg.advanced}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                               <tr>\r
+                                                       <td><label for="id">{#media_dlg.id}</label></td>\r
+                                                       <td><input type="text" id="id" name="id" onchange="Media.formToData();" /></td>\r
+                                                       <td><label for="name">{#media_dlg.name}</label></td>\r
+                                                       <td><input type="text" id="name" name="name" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="align">{#media_dlg.align}</label></td>\r
+                                                       <td>\r
+                                                               <select id="align" name="align" onchange="Media.formToData();">\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">{#media_dlg.bgcolor}</label></td>\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');Media.formToData();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="vspace">{#media_dlg.vspace}</label></td>\r
+                                                       <td><input type="text" id="vspace" name="vspace" class="number" onchange="Media.formToData();" /></td>\r
+                                                       <td><label for="hspace">{#media_dlg.hspace}</label></td>\r
+                                                       <td><input type="text" id="hspace" name="hspace" class="number" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="video_options">\r
+                                       <legend>{#media_dlg.html5_video_options}</legend>\r
+\r
+                                       <table role="presentation">\r
+                                               <tr>\r
+                                                       <td><label for="video_altsource1">{#media_dlg.altsource1}</label></td>\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" id="video_altsource1" name="video_altsource1" onchange="Media.formToData();" style="width: 240px" /></td>\r
+                                                                               <td id="video_altsource1_filebrowser">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="video_altsource2">{#media_dlg.altsource2}</label></td>\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" id="video_altsource2" name="video_altsource2" onchange="Media.formToData();" style="width: 240px" /></td>\r
+                                                                               <td id="video_altsource2_filebrowser">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="video_poster">{#media_dlg.poster}</label></td>\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" id="video_poster" name="video_poster" onchange="Media.formToData();" style="width: 240px" /></td>\r
+                                                                               <td id="video_poster_filebrowser">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="video_preload">{#media_dlg.preload}</label></td>\r
+                                                       <td>\r
+                                                               <select id="video_preload" name="video_preload" onchange="Media.formToData();">\r
+                                                                       <option value="none">{#media_dlg.preload_none}</option> \r
+                                                                       <option value="metadata">{#media_dlg.preload_metadata}</option>\r
+                                                                       <option value="auto">{#media_dlg.preload_auto}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="video_autoplay" name="video_autoplay" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="video_autoplay">{#media_dlg.play}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="video_muted" name="video_muted" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="video_muted">{#media_dlg.mute}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td>\r
+                                                                       <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                                       <tr>\r
+                                                                                                       <td><input type="checkbox" class="checkbox" id="video_loop" name="video_loop" onchange="Media.formToData();" /></td>\r
+                                                                                                       <td><label for="video_loop">{#media_dlg.loop}</label></td>\r
+                                                                                       </tr>\r
+                                                                       </table>\r
+                                                       </td>\r
+\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="video_controls" name="video_controls" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="video_controls">{#media_dlg.controls}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="audio_options">\r
+                                       <legend>{#media_dlg.html5_audio_options}</legend>\r
+\r
+                                       <table role="presentation">\r
+                                               <tr>\r
+                                                       <td><label for="audio_altsource1">{#media_dlg.altsource1}</label></td>\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" id="audio_altsource1" name="audio_altsource1" onchange="Media.formToData();" style="width: 240px" /></td>\r
+                                                                               <td id="audio_altsource1_filebrowser">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="audio_altsource2">{#media_dlg.altsource2}</label></td>\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" id="audio_altsource2" name="audio_altsource2" onchange="Media.formToData();" style="width: 240px" /></td>\r
+                                                                               <td id="audio_altsource2_filebrowser">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="audio_preload">{#media_dlg.preload}</label></td>\r
+                                                       <td>\r
+                                                               <select id="audio_preload" name="audio_preload" onchange="Media.formToData();">\r
+                                                                       <option value="none">{#media_dlg.preload_none}</option> \r
+                                                                       <option value="metadata">{#media_dlg.preload_metadata}</option>\r
+                                                                       <option value="auto">{#media_dlg.preload_auto}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="audio_autoplay" name="audio_autoplay" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="audio_autoplay">{#media_dlg.play}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="audio_loop" name="audio_loop" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="audio_loop">{#media_dlg.loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="audio_controls" name="audio_controls" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="audio_controls">{#media_dlg.controls}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+\r
+                               <fieldset id="flash_options">\r
+                                       <legend>{#media_dlg.flash_options}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="flash_quality">{#media_dlg.quality}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_quality" name="flash_quality" onchange="Media.formToData();">\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
+                                                                       <option value="autohigh">autohigh</option>\r
+                                                                       <option value="best">best</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="flash_scale">{#media_dlg.scale}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_scale" name="flash_scale" onchange="Media.formToData();">\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">{#media_dlg.wmode}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_wmode" name="flash_wmode" onchange="Media.formToData();">\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">{#media_dlg.salign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_salign" name="flash_salign" onchange="Media.formToData();">\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
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_play" name="flash_play" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="flash_play">{#media_dlg.play}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_loop" name="flash_loop" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="flash_loop">{#media_dlg.loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_menu" name="flash_menu" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="flash_menu">{#media_dlg.menu}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_swliveconnect" name="flash_swliveconnect" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="flash_swliveconnect">{#media_dlg.liveconnect}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <table role="presentation">\r
+                                               <tr>\r
+                                                       <td><label for="flash_base">{#media_dlg.base}</label></td>\r
+                                                       <td><input type="text" id="flash_base" name="flash_base" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="flash_flashvars">{#media_dlg.flashvars}</label></td>\r
+                                                       <td><input type="text" id="flash_flashvars" name="flash_flashvars" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="quicktime_options">\r
+                                       <legend>{#media_dlg.qt_options}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_loop" name="quicktime_loop" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_loop">{#media_dlg.loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_autoplay" name="quicktime_autoplay" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_autoplay">{#media_dlg.play}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_cache" name="quicktime_cache" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_cache">{#media_dlg.cache}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_controller" name="quicktime_controller" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_controller">{#media_dlg.controller}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_correction" name="quicktime_correction" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_correction">{#media_dlg.correction}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_enablejavascript" name="quicktime_enablejavascript" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_enablejavascript">{#media_dlg.enablejavascript}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_kioskmode" name="quicktime_kioskmode" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_kioskmode">{#media_dlg.kioskmode}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_autohref" name="quicktime_autohref" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_autohref">{#media_dlg.autohref}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_playeveryframe" name="quicktime_playeveryframe" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_playeveryframe">{#media_dlg.playeveryframe}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="quicktime_targetcache" name="quicktime_targetcache" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="quicktime_targetcache">{#media_dlg.targetcache}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="quicktime_scale">{#media_dlg.scale}</label></td>\r
+                                                       <td><select id="quicktime_scale" name="quicktime_scale" class="mceEditableSelect" onchange="Media.formToData();">\r
+                                                                       <option value="">{#not_set}</option> \r
+                                                                       <option value="tofit">tofit</option>\r
+                                                                       <option value="aspect">aspect</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">&nbsp;</td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="quicktime_starttime">{#media_dlg.starttime}</label></td>\r
+                                                       <td><input type="text" id="quicktime_starttime" name="quicktime_starttime" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="quicktime_endtime">{#media_dlg.endtime}</label></td>\r
+                                                       <td><input type="text" id="quicktime_endtime" name="quicktime_endtime" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="quicktime_target">{#media_dlg.target}</label></td>\r
+                                                       <td><input type="text" id="quicktime_target" name="quicktime_target" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="quicktime_href">{#media_dlg.href}</label></td>\r
+                                                       <td><input type="text" id="quicktime_href" name="quicktime_href" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="quicktime_qtsrcchokespeed">{#media_dlg.qtsrcchokespeed}</label></td>\r
+                                                       <td><input type="text" id="quicktime_qtsrcchokespeed" name="quicktime_qtsrcchokespeed" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="quicktime_volume">{#media_dlg.volume}</label></td>\r
+                                                       <td><input type="text" id="quicktime_volume" name="quicktime_volume" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="quicktime_qtsrc">{#media_dlg.qtsrc}</label></td>\r
+                                                       <td colspan="4">\r
+                                                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" id="quicktime_qtsrc" name="quicktime_qtsrc" onchange="Media.formToData();" /></td>\r
+                                                                               <td id="qtsrcfilebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="windowsmedia_options">\r
+                                       <legend>{#media_dlg.wmp_options}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="windowsmedia_autostart" name="windowsmedia_autostart" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="windowsmedia_autostart">{#media_dlg.autostart}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="windowsmedia_enabled" name="windowsmedia_enabled" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="windowsmedia_enabled">{#media_dlg.enabled}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="windowsmedia_enablecontextmenu" name="windowsmedia_enablecontextmenu" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="windowsmedia_enablecontextmenu">{#media_dlg.menu}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="windowsmedia_fullscreen" name="windowsmedia_fullscreen" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="windowsmedia_fullscreen">{#media_dlg.fullscreen}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="windowsmedia_invokeurls" name="windowsmedia_invokeurls" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="windowsmedia_invokeurls">{#media_dlg.invokeurls}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="windowsmedia_mute" name="windowsmedia_mute" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="windowsmedia_mute">{#media_dlg.mute}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="windowsmedia_stretchtofit" name="windowsmedia_stretchtofit" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="windowsmedia_stretchtofit">{#media_dlg.stretchtofit}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="windowsmedia_windowlessvideo" name="windowsmedia_windowlessvideo" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="windowsmedia_windowlessvideo">{#media_dlg.windowlessvideo}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="windowsmedia_balance">{#media_dlg.balance}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_balance" name="windowsmedia_balance" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="windowsmedia_baseurl">{#media_dlg.baseurl}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_baseurl" name="windowsmedia_baseurl" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="windowsmedia_captioningid">{#media_dlg.captioningid}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_captioningid" name="windowsmedia_captioningid" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="windowsmedia_currentmarker">{#media_dlg.currentmarker}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_currentmarker" name="windowsmedia_currentmarker" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="windowsmedia_currentposition">{#media_dlg.currentposition}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_currentposition" name="windowsmedia_currentposition" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="windowsmedia_defaultframe">{#media_dlg.defaultframe}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_defaultframe" name="windowsmedia_defaultframe" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="windowsmedia_playcount">{#media_dlg.playcount}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_playcount" name="windowsmedia_playcount" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="windowsmedia_rate">{#media_dlg.rate}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_rate" name="windowsmedia_rate" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="windowsmedia_uimode">{#media_dlg.uimode}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_uimode" name="windowsmedia_uimode" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="windowsmedia_volume">{#media_dlg.volume}</label></td>\r
+                                                       <td><input type="text" id="windowsmedia_volume" name="windowsmedia_volume" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="realmedia_options">\r
+                                       <legend>{#media_dlg.rmp_options}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="realmedia_autostart" name="realmedia_autostart" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="realmedia_autostart">{#media_dlg.autostart}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="realmedia_loop" name="realmedia_loop" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="realmedia_loop">{#media_dlg.loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="realmedia_autogotourl" name="realmedia_autogotourl" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="realmedia_autogotourl">{#media_dlg.autogotourl}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="realmedia_center" name="realmedia_center" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="realmedia_center">{#media_dlg.center}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="realmedia_imagestatus" name="realmedia_imagestatus" checked="checked" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="realmedia_imagestatus">{#media_dlg.imagestatus}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="realmedia_maintainaspect" name="realmedia_maintainaspect" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="realmedia_maintainaspect">{#media_dlg.maintainaspect}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="realmedia_nojava" name="realmedia_nojava" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="realmedia_nojava">{#media_dlg.nojava}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="realmedia_prefetch" name="realmedia_prefetch" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="realmedia_prefetch">{#media_dlg.prefetch}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="realmedia_shuffle" name="realmedia_shuffle" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="realmedia_shuffle">{#media_dlg.shuffle}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               &nbsp;\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="realmedia_console">{#media_dlg.console}</label></td>\r
+                                                       <td><input type="text" id="realmedia_console" name="realmedia_console" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="realmedia_controls">{#media_dlg.controls}</label></td>\r
+                                                       <td><input type="text" id="realmedia_controls" name="realmedia_controls" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="realmedia_numloop">{#media_dlg.numloop}</label></td>\r
+                                                       <td><input type="text" id="realmedia_numloop" name="realmedia_numloop" onchange="Media.formToData();" /></td>\r
+\r
+                                                       <td><label for="realmedia_scriptcallbacks">{#media_dlg.scriptcallbacks}</label></td>\r
+                                                       <td><input type="text" id="realmedia_scriptcallbacks" name="realmedia_scriptcallbacks" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="shockwave_options">\r
+                                       <legend>{#media_dlg.shockwave_options}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="shockwave_swstretchstyle">{#media_dlg.swstretchstyle}</label></td>\r
+                                                       <td>\r
+                                                               <select id="shockwave_swstretchstyle" name="shockwave_swstretchstyle" onchange="Media.formToData();">\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">{#media_dlg.volume}</label></td>\r
+                                                       <td><input type="text" id="shockwave_swvolume" name="shockwave_swvolume" onchange="Media.formToData();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="shockwave_swstretchhalign">{#media_dlg.swstretchhalign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="shockwave_swstretchhalign" name="shockwave_swstretchhalign" onchange="Media.formToData();">\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">{#media_dlg.swstretchvalign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="shockwave_swstretchvalign" name="shockwave_swstretchvalign" onchange="Media.formToData();">\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
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_autostart" name="shockwave_autostart" onchange="Media.formToData();" checked="checked" /></td>\r
+                                                                               <td><label for="shockwave_autostart">{#media_dlg.autostart}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_sound" name="shockwave_sound" onchange="Media.formToData();" checked="checked" /></td>\r
+                                                                               <td><label for="shockwave_sound">{#media_dlg.sound}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_swliveconnect" name="shockwave_swliveconnect" onchange="Media.formToData();" /></td>\r
+                                                                               <td><label for="shockwave_swliveconnect">{#media_dlg.liveconnect}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_progress" name="shockwave_progress" onchange="Media.formToData();" checked="checked" /></td>\r
+                                                                               <td><label for="shockwave_progress">{#media_dlg.progress}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="source_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{#media_dlg.source}</legend>\r
+                                       <textarea id="source" style="width: 99%; height: 390px"></textarea>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/media/moxieplayer.swf b/webcit/tiny_mce/plugins/media/moxieplayer.swf
new file mode 100644 (file)
index 0000000..2a04035
Binary files /dev/null and b/webcit/tiny_mce/plugins/media/moxieplayer.swf differ
diff --git a/webcit/tiny_mce/plugins/nonbreaking/editor_plugin.js b/webcit/tiny_mce/plugins/nonbreaking/editor_plugin.js
new file mode 100644 (file)
index 0000000..687f548
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Nonbreaking",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceNonBreaking",function(){a.execCommand("mceInsertContent",false,(a.plugins.visualchars&&a.plugins.visualchars.state)?'<span data-mce-bogus="1" class="mceItemHidden mceItemNbsp">&nbsp;</span>':"&nbsp;")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(f.keyCode==9){f.preventDefault();d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking")}})}},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
diff --git a/webcit/tiny_mce/plugins/nonbreaking/editor_plugin_src.js b/webcit/tiny_mce/plugins/nonbreaking/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..d492fbe
--- /dev/null
@@ -0,0 +1,54 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       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 data-mce-bogus="1" class="mceItemHidden mceItemNbsp">&nbsp;</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 (e.keyCode == 9) {\r
+                                               e.preventDefault();\r
+       \r
+                                               ed.execCommand('mceNonBreaking');\r
+                                               ed.execCommand('mceNonBreaking');\r
+                                               ed.execCommand('mceNonBreaking');\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
+               // Private methods\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('nonbreaking', tinymce.plugins.Nonbreaking);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/noneditable/editor_plugin.js b/webcit/tiny_mce/plugins/noneditable/editor_plugin.js
new file mode 100644 (file)
index 0000000..2d60138
--- /dev/null
@@ -0,0 +1 @@
+(function(){var a=tinymce.dom.Event;tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(d,e){var f=this,c,b,g;f.editor=d;c=d.getParam("noneditable_editable_class","mceEditable");b=d.getParam("noneditable_noneditable_class","mceNonEditable");d.onNodeChange.addToTop(function(i,h,l){var k,j;k=i.dom.getParent(i.selection.getStart(),function(m){return i.dom.hasClass(m,b)});j=i.dom.getParent(i.selection.getEnd(),function(m){return i.dom.hasClass(m,b)});if(k||j){g=1;f._setDisabled(1);return false}else{if(g==1){f._setDisabled(0);g=0}}})},getInfo:function(){return{longname:"Non editable elements",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_block:function(c,d){var b=d.keyCode;if((b>32&&b<41)||(b>111&&b<124)){return}return a.cancel(d)},_setDisabled:function(d){var c=this,b=c.editor;tinymce.each(b.controlManager.controls,function(e){e.setDisabled(d)});if(d!==c.disabled){if(d){b.onKeyDown.addToTop(c._block);b.onKeyPress.addToTop(c._block);b.onKeyUp.addToTop(c._block);b.onPaste.addToTop(c._block);b.onContextMenu.addToTop(c._block)}else{b.onKeyDown.remove(c._block);b.onKeyPress.remove(c._block);b.onKeyUp.remove(c._block);b.onPaste.remove(c._block);b.onContextMenu.remove(c._block)}c.disabled=d}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/noneditable/editor_plugin_src.js b/webcit/tiny_mce/plugins/noneditable/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..916dce2
--- /dev/null
@@ -0,0 +1,95 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var Event = tinymce.dom.Event;\r
+\r
+       tinymce.create('tinymce.plugins.NonEditablePlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this, editClass, nonEditClass, state;\r
+\r
+                       t.editor = ed;\r
+                       editClass = ed.getParam("noneditable_editable_class", "mceEditable");\r
+                       nonEditClass = ed.getParam("noneditable_noneditable_class", "mceNonEditable");\r
+\r
+                       ed.onNodeChange.addToTop(function(ed, cm, n) {\r
+                               var sc, ec;\r
+\r
+                               // Block if start or end is inside a non editable element\r
+                               sc = ed.dom.getParent(ed.selection.getStart(), function(n) {\r
+                                       return ed.dom.hasClass(n, nonEditClass);\r
+                               });\r
+\r
+                               ec = ed.dom.getParent(ed.selection.getEnd(), function(n) {\r
+                                       return ed.dom.hasClass(n, nonEditClass);\r
+                               });\r
+\r
+                               // Block or unblock\r
+                               if (sc || ec) {\r
+                                       state = 1;\r
+                                       t._setDisabled(1);\r
+                                       return false;\r
+                               } else if (state == 1) {\r
+                                       t._setDisabled(0);\r
+                                       state = 0;\r
+                               }\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Non editable elements',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               _block : function(ed, e) {\r
+                       var k = e.keyCode;\r
+\r
+                       // Don't block arrow keys, pg up/down, and F1-F12\r
+                       if ((k > 32 && k < 41) || (k > 111 && k < 124))\r
+                               return;\r
+\r
+                       return Event.cancel(e);\r
+               },\r
+\r
+               _setDisabled : function(s) {\r
+                       var t = this, ed = t.editor;\r
+\r
+                       tinymce.each(ed.controlManager.controls, function(c) {\r
+                               c.setDisabled(s);\r
+                       });\r
+\r
+                       if (s !== t.disabled) {\r
+                               if (s) {\r
+                                       ed.onKeyDown.addToTop(t._block);\r
+                                       ed.onKeyPress.addToTop(t._block);\r
+                                       ed.onKeyUp.addToTop(t._block);\r
+                                       ed.onPaste.addToTop(t._block);\r
+                                       ed.onContextMenu.addToTop(t._block);\r
+                               } else {\r
+                                       ed.onKeyDown.remove(t._block);\r
+                                       ed.onKeyPress.remove(t._block);\r
+                                       ed.onKeyUp.remove(t._block);\r
+                                       ed.onPaste.remove(t._block);\r
+                                       ed.onContextMenu.remove(t._block);\r
+                               }\r
+\r
+                               t.disabled = s;\r
+                       }\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/pagebreak/editor_plugin.js b/webcit/tiny_mce/plugins/pagebreak/editor_plugin.js
new file mode 100644 (file)
index 0000000..35085e8
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.PageBreakPlugin",{init:function(b,d){var f='<img src="'+b.theme.url+'/img/trans.gif" class="mcePageBreak mceItemNoResize" />',a="mcePageBreak",c=b.getParam("pagebreak_separator","<!-- pagebreak -->"),e;e=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(g){return"\\"+g}),"g");b.addCommand("mcePageBreak",function(){b.execCommand("mceInsertContent",0,f)});b.addButton("pagebreak",{title:"pagebreak.desc",cmd:a});b.onInit.add(function(){if(b.theme.onResolveName){b.theme.onResolveName.add(function(g,h){if(h.node.nodeName=="IMG"&&b.dom.hasClass(h.node,a)){h.name="pagebreak"}})}});b.onClick.add(function(g,h){h=h.target;if(h.nodeName==="IMG"&&g.dom.hasClass(h,a)){g.selection.select(h)}});b.onNodeChange.add(function(h,g,i){g.setActive("pagebreak",i.nodeName==="IMG"&&h.dom.hasClass(i,a))});b.onBeforeSetContent.add(function(g,h){h.content=h.content.replace(e,f)});b.onPostProcess.add(function(g,h){if(h.get){h.content=h.content.replace(/<img[^>]+>/g,function(i){if(i.indexOf('class="mcePageBreak')!==-1){i=c}return i})}})},getInfo:function(){return{longname:"PageBreak",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("pagebreak",tinymce.plugins.PageBreakPlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/pagebreak/editor_plugin_src.js b/webcit/tiny_mce/plugins/pagebreak/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..a094c19
--- /dev/null
@@ -0,0 +1,74 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.PageBreakPlugin', {\r
+               init : function(ed, url) {\r
+                       var pb = '<img src="' + ed.theme.url + '/img/trans.gif" class="mcePageBreak mceItemNoResize" />', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', '<!-- pagebreak -->'), pbRE;\r
+\r
+                       pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g');\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mcePageBreak', function() {\r
+                               ed.execCommand('mceInsertContent', 0, pb);\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('pagebreak', {title : 'pagebreak.desc', cmd : cls});\r
+\r
+                       ed.onInit.add(function() {\r
+                               if (ed.theme.onResolveName) {\r
+                                       ed.theme.onResolveName.add(function(th, o) {\r
+                                               if (o.node.nodeName == 'IMG' && ed.dom.hasClass(o.node, cls))\r
+                                                       o.name = 'pagebreak';\r
+                                       });\r
+                               }\r
+                       });\r
+\r
+                       ed.onClick.add(function(ed, e) {\r
+                               e = e.target;\r
+\r
+                               if (e.nodeName === 'IMG' && ed.dom.hasClass(e, cls))\r
+                                       ed.selection.select(e);\r
+                       });\r
+\r
+                       ed.onNodeChange.add(function(ed, cm, n) {\r
+                               cm.setActive('pagebreak', n.nodeName === 'IMG' && ed.dom.hasClass(n, cls));\r
+                       });\r
+\r
+                       ed.onBeforeSetContent.add(function(ed, o) {\r
+                               o.content = o.content.replace(pbRE, pb);\r
+                       });\r
+\r
+                       ed.onPostProcess.add(function(ed, o) {\r
+                               if (o.get)\r
+                                       o.content = o.content.replace(/<img[^>]+>/g, function(im) {\r
+                                               if (im.indexOf('class="mcePageBreak') !== -1)\r
+                                                       im = sep;\r
+\r
+                                               return im;\r
+                                       });\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'PageBreak',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('pagebreak', tinymce.plugins.PageBreakPlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/editor_plugin.js b/webcit/tiny_mce/plugins/paste/editor_plugin.js
new file mode 100644 (file)
index 0000000..4de9710
--- /dev/null
@@ -0,0 +1 @@
+(function(){var c=tinymce.each,a={paste_auto_cleanup_on_paste:true,paste_enable_default_filters:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_sticky_default:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(d,e){return d.getParam(e,a[e])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(d,e){var f=this;f.editor=d;f.url=e;f.onPreProcess=new tinymce.util.Dispatcher(f);f.onPostProcess=new tinymce.util.Dispatcher(f);f.onPreProcess.add(f._preProcess);f.onPostProcess.add(f._postProcess);f.onPreProcess.add(function(i,j){d.execCallback("paste_preprocess",i,j)});f.onPostProcess.add(function(i,j){d.execCallback("paste_postprocess",i,j)});d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){return false}});d.pasteAsPlainText=b(d,"paste_text_sticky_default");function h(l,j){var k=d.dom,i;f.onPreProcess.dispatch(f,l);l.node=k.create("div",0,l.content);if(tinymce.isGecko){i=d.selection.getRng(true);if(i.startContainer==i.endContainer&&i.startContainer.nodeType==3){if(l.node.childNodes.length===1&&/^(p|h[1-6]|pre)$/i.test(l.node.firstChild.nodeName)&&l.content.indexOf("__MCE_ITEM__")===-1){k.remove(l.node.firstChild,true)}}}f.onPostProcess.dispatch(f,l);l.content=d.serializer.serialize(l.node,{getInner:1,forced_root_block:""});if((!j)&&(d.pasteAsPlainText)){f._insertPlainText(l.content);if(!b(d,"paste_text_sticky")){d.pasteAsPlainText=false;d.controlManager.setActive("pastetext",false)}}else{f._insert(l.content)}}d.addCommand("mceInsertClipboardContent",function(i,j){h(j,true)});if(!b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(j,i){var k=tinymce.util.Cookie;d.pasteAsPlainText=!d.pasteAsPlainText;d.controlManager.setActive("pastetext",d.pasteAsPlainText);if((d.pasteAsPlainText)&&(!k.get("tinymcePasteText"))){if(b(d,"paste_text_sticky")){d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}else{d.windowManager.alert(d.translate("paste.plaintext_mode"))}if(!b(d,"paste_text_notifyalways")){k.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}d.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});d.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function g(s){var l,p,j,t,k=d.selection,o=d.dom,q=d.getBody(),i,r;if(s.clipboardData||o.doc.dataTransfer){r=(s.clipboardData||o.doc.dataTransfer).getData("Text");if(d.pasteAsPlainText){s.preventDefault();h({content:o.encode(r).replace(/\r?\n/g,"<br />")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},"\uFEFF\uFEFF");if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort(d.getWin()).y}o.setStyles(l,{position:"absolute",left:tinymce.isGecko?-40:0,top:i-25,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,2);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u="<p>"+o.encode(r).replace(/\r?\n\r?\n/g,"</p><p>").replace(/\r?\n/g,"<br />")+"</p>"}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}d.onInit.add(function(){d.controlManager.setActive("pastetext",d.pasteAsPlainText);if(b(d,"paste_block_drop")){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})}});f._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g,"$1"]]);d([[/<br><br>/g,"<BR><BR>"],[/<br>/g," "],[/<BR><BR>/g,"<br>"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(k,"paste_convert_middot_lists")){d([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/&quot;/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/<h[1-6][^>]*>/gi,"<p><strong>"],[/<\/h[1-6][^>]*>/gi,"</strong></p>"]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l<d.length;l++){o=d[l];j=h.getStyle(m,o);if(j){n[o]=j;k++}}}h.setAttrib(m,"style","");if(d&&k>0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/&nbsp;/g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f<d){n=tinymce.inArray(m,f);o=i.getParents(h.parentNode,s);h=o[o.length-1-n]||h}}}c(i.select("span",t),function(v){var p=v.innerHTML.replace(/<\/?\w+[^>]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*(&nbsp;|\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(g){var d=this.editor,e=b(d,"paste_text_linebreaktype"),i=b(d,"paste_text_replacements"),f=tinymce.is;function h(j){c(j,function(k){if(k.constructor==RegExp){g=g.replace(k,"")}else{g=g.replace(k[0],k[1])}})}if((typeof(g)==="string")&&(g.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(g)){h([/[\n\r]+/g])}else{h([/\r+/g])}h([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/<br[^>]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*<t[dh][^>]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/&nbsp;/gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"]]);g=d.dom.decode(tinymce.html.Entities.encodeRaw(g));if(f(i,"array")){h(i)}else{if(f(i,"string")){h(new RegExp(i,"gi"))}}if(e=="none"){h([[/\n+/g," "]])}else{if(e=="br"){h([[/\n/g,"<br />"]])}else{h([[/\n\n/g,"</p><p>"],[/^(.*<\/p>)(<p>)$/,"<p>$1"],[/\n/g,"<br />"]])}}d.execCommand("mceInsertContent",false,g)}},_legacySupport:function(){var e=this,d=e.editor;d.addCommand("mcePasteWord",function(){d.windowManager.open({file:e.url+"/pasteword.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})});if(b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(){d.windowManager.open({file:e.url+"/pastetext.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})})}d.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/editor_plugin_src.js b/webcit/tiny_mce/plugins/paste/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..1d9d3b4
--- /dev/null
@@ -0,0 +1,861 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var each = tinymce.each,\r
+               defs = {\r
+                       paste_auto_cleanup_on_paste : true,\r
+                       paste_enable_default_filters : true,\r
+                       paste_block_drop : false,\r
+                       paste_retain_style_properties : "none",\r
+                       paste_strip_class_attributes : "mso",\r
+                       paste_remove_spans : false,\r
+                       paste_remove_styles : false,\r
+                       paste_remove_styles_if_webkit : true,\r
+                       paste_convert_middot_lists : true,\r
+                       paste_convert_headers_to_strong : false,\r
+                       paste_dialog_width : "450",\r
+                       paste_dialog_height : "400",\r
+                       paste_text_use_dialog : false,\r
+                       paste_text_sticky : false,\r
+                       paste_text_sticky_default : false,\r
+                       paste_text_notifyalways : false,\r
+                       paste_text_linebreaktype : "p",\r
+                       paste_text_replacements : [\r
+                               [/\u2026/g, "..."],\r
+                               [/[\x93\x94\u201c\u201d]/g, '"'],\r
+                               [/[\x60\x91\x92\u2018\u2019]/g, "'"]\r
+                       ]\r
+               };\r
+\r
+       function getParam(ed, name) {\r
+               return ed.getParam(name, defs[name]);\r
+       }\r
+\r
+       tinymce.create('tinymce.plugins.PastePlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+                       t.url = url;\r
+\r
+                       // Setup plugin events\r
+                       t.onPreProcess = new tinymce.util.Dispatcher(t);\r
+                       t.onPostProcess = new tinymce.util.Dispatcher(t);\r
+\r
+                       // Register default handlers\r
+                       t.onPreProcess.add(t._preProcess);\r
+                       t.onPostProcess.add(t._postProcess);\r
+\r
+                       // Register optional preprocess handler\r
+                       t.onPreProcess.add(function(pl, o) {\r
+                               ed.execCallback('paste_preprocess', pl, o);\r
+                       });\r
+\r
+                       // Register optional postprocess\r
+                       t.onPostProcess.add(function(pl, o) {\r
+                               ed.execCallback('paste_postprocess', pl, o);\r
+                       });\r
+\r
+                       ed.onKeyDown.addToTop(function(ed, e) {\r
+                               // Block ctrl+v from adding an undo level since the default logic in tinymce.Editor will add that\r
+                               if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))\r
+                                       return false; // Stop other listeners\r
+                       });\r
+\r
+                       // Initialize plain text flag\r
+                       ed.pasteAsPlainText = getParam(ed, 'paste_text_sticky_default');\r
+\r
+                       // This function executes the process handlers and inserts the contents\r
+                       // force_rich overrides plain text mode set by user, important for pasting with execCommand\r
+                       function process(o, force_rich) {\r
+                               var dom = ed.dom, rng;\r
+\r
+                               // Execute pre process handlers\r
+                               t.onPreProcess.dispatch(t, o);\r
+\r
+                               // Create DOM structure\r
+                               o.node = dom.create('div', 0, o.content);\r
+\r
+                               // If pasting inside the same element and the contents is only one block\r
+                               // remove the block and keep the text since Firefox will copy parts of pre and h1-h6 as a pre element\r
+                               if (tinymce.isGecko) {\r
+                                       rng = ed.selection.getRng(true);\r
+                                       if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) {\r
+                                               // Is only one block node and it doesn't contain word stuff\r
+                                               if (o.node.childNodes.length === 1 && /^(p|h[1-6]|pre)$/i.test(o.node.firstChild.nodeName) && o.content.indexOf('__MCE_ITEM__') === -1)\r
+                                                       dom.remove(o.node.firstChild, true);\r
+                                       }\r
+                               }\r
+\r
+                               // Execute post process handlers\r
+                               t.onPostProcess.dispatch(t, o);\r
+\r
+                               // Serialize content\r
+                               o.content = ed.serializer.serialize(o.node, {getInner : 1, forced_root_block : ''});\r
+\r
+                               // Plain text option active?\r
+                               if ((!force_rich) && (ed.pasteAsPlainText)) {\r
+                                       t._insertPlainText(o.content);\r
+\r
+                                       if (!getParam(ed, "paste_text_sticky")) {\r
+                                               ed.pasteAsPlainText = false;\r
+                                               ed.controlManager.setActive("pastetext", false);\r
+                                       }\r
+                               } else {\r
+                                       t._insert(o.content);\r
+                               }\r
+                       }\r
+\r
+                       // Add command for external usage\r
+                       ed.addCommand('mceInsertClipboardContent', function(u, o) {\r
+                               process(o, true);\r
+                       });\r
+\r
+                       if (!getParam(ed, "paste_text_use_dialog")) {\r
+                               ed.addCommand('mcePasteText', function(u, v) {\r
+                                       var cookie = tinymce.util.Cookie;\r
+\r
+                                       ed.pasteAsPlainText = !ed.pasteAsPlainText;\r
+                                       ed.controlManager.setActive('pastetext', ed.pasteAsPlainText);\r
+\r
+                                       if ((ed.pasteAsPlainText) && (!cookie.get("tinymcePasteText"))) {\r
+                                               if (getParam(ed, "paste_text_sticky")) {\r
+                                                       ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));\r
+                                               } else {\r
+                                                       ed.windowManager.alert(ed.translate('paste.plaintext_mode'));\r
+                                               }\r
+\r
+                                               if (!getParam(ed, "paste_text_notifyalways")) {\r
+                                                       cookie.set("tinymcePasteText", "1", new Date(new Date().getFullYear() + 1, 12, 31))\r
+                                               }\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       ed.addButton('pastetext', {title: 'paste.paste_text_desc', cmd: 'mcePasteText'});\r
+                       ed.addButton('selectall', {title: 'paste.selectall_desc', cmd: 'selectall'});\r
+\r
+                       // This function grabs the contents from the clipboard by adding a\r
+                       // hidden div and placing the caret inside it and after the browser paste\r
+                       // is done it grabs that contents and processes that\r
+                       function grabContent(e) {\r
+                               var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent;\r
+\r
+                               // Check if browser supports direct plaintext access\r
+                               if (e.clipboardData || dom.doc.dataTransfer) {\r
+                                       textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text');\r
+\r
+                                       if (ed.pasteAsPlainText) {\r
+                                               e.preventDefault();\r
+                                               process({content : dom.encode(textContent).replace(/\r?\n/g, '<br />')});\r
+                                               return;\r
+                                       }\r
+                               }\r
+\r
+                               if (dom.get('_mcePaste'))\r
+                                       return;\r
+\r
+                               // Create container to paste into\r
+                               n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF');\r
+\r
+                               // If contentEditable mode we need to find out the position of the closest element\r
+                               if (body != ed.getDoc().body)\r
+                                       posY = dom.getPos(ed.selection.getStart(), body).y;\r
+                               else\r
+                                       posY = body.scrollTop + dom.getViewPort(ed.getWin()).y;\r
+\r
+                               // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles\r
+                               // If also needs to be in view on IE or the paste would fail\r
+                               dom.setStyles(n, {\r
+                                       position : 'absolute',\r
+                                       left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div\r
+                                       top : posY - 25,\r
+                                       width : 1,\r
+                                       height : 1,\r
+                                       overflow : 'hidden'\r
+                               });\r
+\r
+                               if (tinymce.isIE) {\r
+                                       // Store away the old range\r
+                                       oldRng = sel.getRng();\r
+\r
+                                       // Select the container\r
+                                       rng = dom.doc.body.createTextRange();\r
+                                       rng.moveToElementText(n);\r
+                                       rng.execCommand('Paste');\r
+\r
+                                       // Remove container\r
+                                       dom.remove(n);\r
+\r
+                                       // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due\r
+                                       // to IE security settings so we pass the junk though better than nothing right\r
+                                       if (n.innerHTML === '\uFEFF\uFEFF') {\r
+                                               ed.execCommand('mcePasteWord');\r
+                                               e.preventDefault();\r
+                                               return;\r
+                                       }\r
+\r
+                                       // Restore the old range and clear the contents before pasting\r
+                                       sel.setRng(oldRng);\r
+                                       sel.setContent('');\r
+\r
+                                       // For some odd reason we need to detach the the mceInsertContent call from the paste event\r
+                                       // It's like IE has a reference to the parent element that you paste in and the selection gets messed up\r
+                                       // when it tries to restore the selection\r
+                                       setTimeout(function() {\r
+                                               // Process contents\r
+                                               process({content : n.innerHTML});\r
+                                       }, 0);\r
+\r
+                                       // Block the real paste event\r
+                                       return tinymce.dom.Event.cancel(e);\r
+                               } else {\r
+                                       function block(e) {\r
+                                               e.preventDefault();\r
+                                       };\r
+\r
+                                       // Block mousedown and click to prevent selection change\r
+                                       dom.bind(ed.getDoc(), 'mousedown', block);\r
+                                       dom.bind(ed.getDoc(), 'keydown', block);\r
+\r
+                                       or = ed.selection.getRng();\r
+\r
+                                       // Move select contents inside DIV\r
+                                       n = n.firstChild;\r
+                                       rng = ed.getDoc().createRange();\r
+                                       rng.setStart(n, 0);\r
+                                       rng.setEnd(n, 2);\r
+                                       sel.setRng(rng);\r
+\r
+                                       // Wait a while and grab the pasted contents\r
+                                       window.setTimeout(function() {\r
+                                               var h = '', nl;\r
+\r
+                                               // Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit\r
+                                               if (!dom.select('div.mcePaste > div.mcePaste').length) {\r
+                                                       nl = dom.select('div.mcePaste');\r
+\r
+                                                       // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string\r
+                                                       each(nl, function(n) {\r
+                                                               var child = n.firstChild;\r
+\r
+                                                               // WebKit inserts a DIV container with lots of odd styles\r
+                                                               if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) {\r
+                                                                       dom.remove(child, 1);\r
+                                                               }\r
+\r
+                                                               // Remove apply style spans\r
+                                                               each(dom.select('span.Apple-style-span', n), function(n) {\r
+                                                                       dom.remove(n, 1);\r
+                                                               });\r
+\r
+                                                               // Remove bogus br elements\r
+                                                               each(dom.select('br[data-mce-bogus]', n), function(n) {\r
+                                                                       dom.remove(n);\r
+                                                               });\r
+\r
+                                                               // WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV\r
+                                                               if (n.parentNode.className != 'mcePaste')\r
+                                                                       h += n.innerHTML;\r
+                                                       });\r
+                                               } else {\r
+                                                       // Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc\r
+                                                       // So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same\r
+                                                       h = '<p>' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '</p><p>').replace(/\r?\n/g, '<br />') + '</p>';\r
+                                               }\r
+\r
+                                               // Remove the nodes\r
+                                               each(dom.select('div.mcePaste'), function(n) {\r
+                                                       dom.remove(n);\r
+                                               });\r
+\r
+                                               // Restore the old selection\r
+                                               if (or)\r
+                                                       sel.setRng(or);\r
+\r
+                                               process({content : h});\r
+\r
+                                               // Unblock events ones we got the contents\r
+                                               dom.unbind(ed.getDoc(), 'mousedown', block);\r
+                                               dom.unbind(ed.getDoc(), 'keydown', block);\r
+                                       }, 0);\r
+                               }\r
+                       }\r
+\r
+                       // Check if we should use the new auto process method                   \r
+                       if (getParam(ed, "paste_auto_cleanup_on_paste")) {\r
+                               // Is it's Opera or older FF use key handler\r
+                               if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {\r
+                                       ed.onKeyDown.addToTop(function(ed, e) {\r
+                                               if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))\r
+                                                       grabContent(e);\r
+                                       });\r
+                               } else {\r
+                                       // Grab contents on paste event on Gecko and WebKit\r
+                                       ed.onPaste.addToTop(function(ed, e) {\r
+                                               return grabContent(e);\r
+                                       });\r
+                               }\r
+                       }\r
+\r
+                       ed.onInit.add(function() {\r
+                               ed.controlManager.setActive("pastetext", ed.pasteAsPlainText);\r
+\r
+                               // Block all drag/drop events\r
+                               if (getParam(ed, "paste_block_drop")) {\r
+                                       ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) {\r
+                                               e.preventDefault();\r
+                                               e.stopPropagation();\r
+\r
+                                               return false;\r
+                                       });\r
+                               }\r
+                       });\r
+\r
+                       // Add legacy support\r
+                       t._legacySupport();\r
+               },\r
+\r
+               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
+               _preProcess : function(pl, o) {\r
+                       var ed = this.editor,\r
+                               h = o.content,\r
+                               grep = tinymce.grep,\r
+                               explode = tinymce.explode,\r
+                               trim = tinymce.trim,\r
+                               len, stripClass;\r
+\r
+                       //console.log('Before preprocess:' + o.content);\r
+\r
+                       function process(items) {\r
+                               each(items, function(v) {\r
+                                       // Remove or replace\r
+                                       if (v.constructor == RegExp)\r
+                                               h = h.replace(v, '');\r
+                                       else\r
+                                               h = h.replace(v[0], v[1]);\r
+                               });\r
+                       }\r
+                       \r
+                       if (ed.settings.paste_enable_default_filters == false) {\r
+                               return;\r
+                       }\r
+\r
+                       // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser\r
+                       if (tinymce.isIE && document.documentMode >= 9) {\r
+                               // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser\r
+                               process([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g, '$1']]);\r
+\r
+                               // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break\r
+                               process([\r
+                                       [/<br><br>/g, '<BR><BR>'], // Replace multiple BR elements with uppercase BR to keep them intact\r
+                                       [/<br>/g, ' '], // Replace single br elements with space since they are word wrap BR:s\r
+                                       [/<BR><BR>/g, '<br>'] // Replace back the double brs but into a single BR\r
+                               ]);\r
+                       }\r
+\r
+                       // Detect Word content and process it more aggressive\r
+                       if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) {\r
+                               o.wordContent = true;                   // Mark the pasted contents as word specific content\r
+                               //console.log('Word contents detected.');\r
+\r
+                               // Process away some basic content\r
+                               process([\r
+                                       /^\s*(&nbsp;)+/gi,                              // &nbsp; entities at the start of contents\r
+                                       /(&nbsp;|<br[^>]*>)+\s*$/gi             // &nbsp; entities at the end of contents\r
+                               ]);\r
+\r
+                               if (getParam(ed, "paste_convert_headers_to_strong")) {\r
+                                       h = h.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>");\r
+                               }\r
+\r
+                               if (getParam(ed, "paste_convert_middot_lists")) {\r
+                                       process([\r
+                                               [/<!--\[if !supportLists\]-->/gi, '$&__MCE_ITEM__'],                                    // Convert supportLists to a list item marker\r
+                                               [/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'],             // Convert mso-list and symbol spans to item markers\r
+                                               [/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi, '$1__MCE_ITEM__']                             // Convert mso-list and symbol paragraphs to item markers (FF)\r
+                                       ]);\r
+                               }\r
+\r
+                               process([\r
+                                       // Word comments like conditional comments etc\r
+                                       /<!--[\s\S]+?-->/gi,\r
+\r
+                                       // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags\r
+                                       /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,\r
+\r
+                                       // Convert <s> into <strike> for line-though\r
+                                       [/<(\/?)s>/gi, "<$1strike>"],\r
+\r
+                                       // Replace nsbp entites to char since it's easier to handle\r
+                                       [/&nbsp;/gi, "\u00a0"]\r
+                               ]);\r
+\r
+                               // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag.\r
+                               // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot.\r
+                               do {\r
+                                       len = h.length;\r
+                                       h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1");\r
+                               } while (len != h.length);\r
+\r
+                               // Remove all spans if no styles is to be retained\r
+                               if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) {\r
+                                       h = h.replace(/<\/?span[^>]*>/gi, "");\r
+                               } else {\r
+                                       // We're keeping styles, so at least clean them up.\r
+                                       // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx\r
+\r
+                                       process([\r
+                                               // Convert <span style="mso-spacerun:yes">___</span> to string of alternating breaking/non-breaking spaces of same length\r
+                                               [/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,\r
+                                                       function(str, spaces) {\r
+                                                               return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : "";\r
+                                                       }\r
+                                               ],\r
+\r
+                                               // Examine all styles: delete junk, transform some, and keep the rest\r
+                                               [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,\r
+                                                       function(str, tag, style) {\r
+                                                               var n = [],\r
+                                                                       i = 0,\r
+                                                                       s = explode(trim(style).replace(/&quot;/gi, "'"), ";");\r
+\r
+                                                               // Examine each style definition within the tag's style attribute\r
+                                                               each(s, function(v) {\r
+                                                                       var name, value,\r
+                                                                               parts = explode(v, ":");\r
+\r
+                                                                       function ensureUnits(v) {\r
+                                                                               return v + ((v !== "0") && (/\d$/.test(v)))? "px" : "";\r
+                                                                       }\r
+\r
+                                                                       if (parts.length == 2) {\r
+                                                                               name = parts[0].toLowerCase();\r
+                                                                               value = parts[1].toLowerCase();\r
+\r
+                                                                               // Translate certain MS Office styles into their CSS equivalents\r
+                                                                               switch (name) {\r
+                                                                                       case "mso-padding-alt":\r
+                                                                                       case "mso-padding-top-alt":\r
+                                                                                       case "mso-padding-right-alt":\r
+                                                                                       case "mso-padding-bottom-alt":\r
+                                                                                       case "mso-padding-left-alt":\r
+                                                                                       case "mso-margin-alt":\r
+                                                                                       case "mso-margin-top-alt":\r
+                                                                                       case "mso-margin-right-alt":\r
+                                                                                       case "mso-margin-bottom-alt":\r
+                                                                                       case "mso-margin-left-alt":\r
+                                                                                       case "mso-table-layout-alt":\r
+                                                                                       case "mso-height":\r
+                                                                                       case "mso-width":\r
+                                                                                       case "mso-vertical-align-alt":\r
+                                                                                               n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value);\r
+                                                                                               return;\r
+\r
+                                                                                       case "horiz-align":\r
+                                                                                               n[i++] = "text-align:" + value;\r
+                                                                                               return;\r
+\r
+                                                                                       case "vert-align":\r
+                                                                                               n[i++] = "vertical-align:" + value;\r
+                                                                                               return;\r
+\r
+                                                                                       case "font-color":\r
+                                                                                       case "mso-foreground":\r
+                                                                                               n[i++] = "color:" + value;\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-background":\r
+                                                                                       case "mso-highlight":\r
+                                                                                               n[i++] = "background:" + value;\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-default-height":\r
+                                                                                               n[i++] = "min-height:" + ensureUnits(value);\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-default-width":\r
+                                                                                               n[i++] = "min-width:" + ensureUnits(value);\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-padding-between-alt":\r
+                                                                                               n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value);\r
+                                                                                               return;\r
+\r
+                                                                                       case "text-line-through":\r
+                                                                                               if ((value == "single") || (value == "double")) {\r
+                                                                                                       n[i++] = "text-decoration:line-through";\r
+                                                                                               }\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-zero-height":\r
+                                                                                               if (value == "yes") {\r
+                                                                                                       n[i++] = "display:none";\r
+                                                                                               }\r
+                                                                                               return;\r
+                                                                               }\r
+\r
+                                                                               // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name\r
+                                                                               if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(name)) {\r
+                                                                                       return;\r
+                                                                               }\r
+\r
+                                                                               // If it reached this point, it must be a valid CSS style\r
+                                                                               n[i++] = name + ":" + parts[1];         // Lower-case name, but keep value case\r
+                                                                       }\r
+                                                               });\r
+\r
+                                                               // If style attribute contained any valid styles the re-write it; otherwise delete style attribute.\r
+                                                               if (i > 0) {\r
+                                                                       return tag + ' style="' + n.join(';') + '"';\r
+                                                               } else {\r
+                                                                       return tag;\r
+                                                               }\r
+                                                       }\r
+                                               ]\r
+                                       ]);\r
+                               }\r
+                       }\r
+\r
+                       // Replace headers with <strong>\r
+                       if (getParam(ed, "paste_convert_headers_to_strong")) {\r
+                               process([\r
+                                       [/<h[1-6][^>]*>/gi, "<p><strong>"],\r
+                                       [/<\/h[1-6][^>]*>/gi, "</strong></p>"]\r
+                               ]);\r
+                       }\r
+\r
+                       process([\r
+                               // Copy paste from Java like Open Office will produce this junk on FF\r
+                               [/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, '']\r
+                       ]);\r
+\r
+                       // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso").\r
+                       // Note:-  paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation.\r
+                       stripClass = getParam(ed, "paste_strip_class_attributes");\r
+\r
+                       if (stripClass !== "none") {\r
+                               function removeClasses(match, g1) {\r
+                                               if (stripClass === "all")\r
+                                                       return '';\r
+\r
+                                               var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "),\r
+                                                       function(v) {\r
+                                                               return (/^(?!mso)/i.test(v));\r
+                                                       }\r
+                                               );\r
+\r
+                                               return cls.length ? ' class="' + cls.join(" ") + '"' : '';\r
+                               };\r
+\r
+                               h = h.replace(/ class="([^"]+)"/gi, removeClasses);\r
+                               h = h.replace(/ class=([\-\w]+)/gi, removeClasses);\r
+                       }\r
+\r
+                       // Remove spans option\r
+                       if (getParam(ed, "paste_remove_spans")) {\r
+                               h = h.replace(/<\/?span[^>]*>/gi, "");\r
+                       }\r
+\r
+                       //console.log('After preprocess:' + h);\r
+\r
+                       o.content = h;\r
+               },\r
+\r
+               /**\r
+                * Various post process items.\r
+                */\r
+               _postProcess : function(pl, o) {\r
+                       var t = this, ed = t.editor, dom = ed.dom, styleProps;\r
+\r
+                       if (ed.settings.paste_enable_default_filters == false) {\r
+                               return;\r
+                       }\r
+                       \r
+                       if (o.wordContent) {\r
+                               // Remove named anchors or TOC links\r
+                               each(dom.select('a', o.node), function(a) {\r
+                                       if (!a.href || a.href.indexOf('#_Toc') != -1)\r
+                                               dom.remove(a, 1);\r
+                               });\r
+\r
+                               if (getParam(ed, "paste_convert_middot_lists")) {\r
+                                       t._convertLists(pl, o);\r
+                               }\r
+\r
+                               // Process styles\r
+                               styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties\r
+\r
+                               // Process only if a string was specified and not equal to "all" or "*"\r
+                               if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) {\r
+                                       styleProps = tinymce.explode(styleProps.replace(/^none$/i, ""));\r
+\r
+                                       // Retains some style properties\r
+                                       each(dom.select('*', o.node), function(el) {\r
+                                               var newStyle = {}, npc = 0, i, sp, sv;\r
+\r
+                                               // Store a subset of the existing styles\r
+                                               if (styleProps) {\r
+                                                       for (i = 0; i < styleProps.length; i++) {\r
+                                                               sp = styleProps[i];\r
+                                                               sv = dom.getStyle(el, sp);\r
+\r
+                                                               if (sv) {\r
+                                                                       newStyle[sp] = sv;\r
+                                                                       npc++;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Remove all of the existing styles\r
+                                               dom.setAttrib(el, 'style', '');\r
+\r
+                                               if (styleProps && npc > 0)\r
+                                                       dom.setStyles(el, newStyle); // Add back the stored subset of styles\r
+                                               else // Remove empty span tags that do not have class attributes\r
+                                                       if (el.nodeName == 'SPAN' && !el.className)\r
+                                                               dom.remove(el, true);\r
+                                       });\r
+                               }\r
+                       }\r
+\r
+                       // Remove all style information or only specifically on WebKit to avoid the style bug on that browser\r
+                       if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) {\r
+                               each(dom.select('*[style]', o.node), function(el) {\r
+                                       el.removeAttribute('style');\r
+                                       el.removeAttribute('data-mce-style');\r
+                               });\r
+                       } else {\r
+                               if (tinymce.isWebKit) {\r
+                                       // We need to compress the styles on WebKit since if you paste <img border="0" /> it will become <img border="0" style="... lots of junk ..." />\r
+                                       // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles\r
+                                       each(dom.select('*', o.node), function(el) {\r
+                                               el.removeAttribute('data-mce-style');\r
+                                       });\r
+                               }\r
+                       }\r
+               },\r
+\r
+               /**\r
+                * Converts the most common bullet and number formats in Office into a real semantic UL/LI list.\r
+                */\r
+               _convertLists : function(pl, o) {\r
+                       var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html;\r
+\r
+                       // Convert middot lists into real semantic lists\r
+                       each(dom.select('p', o.node), function(p) {\r
+                               var sib, val = '', type, html, idx, parents;\r
+\r
+                               // Get text node value at beginning of paragraph\r
+                               for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling)\r
+                                       val += sib.nodeValue;\r
+\r
+                               val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/&nbsp;/g, '\u00a0');\r
+\r
+                               // Detect unordered lists look for bullets\r
+                               if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(val))\r
+                                       type = 'ul';\r
+\r
+                               // Detect ordered lists 1., a. or ixv.\r
+                               if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(val))\r
+                                       type = 'ol';\r
+\r
+                               // Check if node value matches the list pattern: o&nbsp;&nbsp;\r
+                               if (type) {\r
+                                       margin = parseFloat(p.style.marginLeft || 0);\r
+\r
+                                       if (margin > lastMargin)\r
+                                               levels.push(margin);\r
+\r
+                                       if (!listElm || type != lastType) {\r
+                                               listElm = dom.create(type);\r
+                                               dom.insertAfter(listElm, p);\r
+                                       } else {\r
+                                               // Nested list element\r
+                                               if (margin > lastMargin) {\r
+                                                       listElm = li.appendChild(dom.create(type));\r
+                                               } else if (margin < lastMargin) {\r
+                                                       // Find parent level based on margin value\r
+                                                       idx = tinymce.inArray(levels, margin);\r
+                                                       parents = dom.getParents(listElm.parentNode, type);\r
+                                                       listElm = parents[parents.length - 1 - idx] || listElm;\r
+                                               }\r
+                                       }\r
+\r
+                                       // Remove middot or number spans if they exists\r
+                                       each(dom.select('span', p), function(span) {\r
+                                               var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, '');\r
+\r
+                                               // Remove span with the middot or the number\r
+                                               if (type == 'ul' && /^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(html))\r
+                                                       dom.remove(span);\r
+                                               else if (/^__MCE_ITEM__[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(html))\r
+                                                       dom.remove(span);\r
+                                       });\r
+\r
+                                       html = p.innerHTML;\r
+\r
+                                       // Remove middot/list items\r
+                                       if (type == 'ul')\r
+                                               html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*(&nbsp;|\u00a0)+\s*/, '');\r
+                                       else\r
+                                               html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/, '');\r
+\r
+                                       // Create li and add paragraph data into the new li\r
+                                       li = listElm.appendChild(dom.create('li', 0, html));\r
+                                       dom.remove(p);\r
+\r
+                                       lastMargin = margin;\r
+                                       lastType = type;\r
+                               } else\r
+                                       listElm = lastMargin = 0; // End list element\r
+                       });\r
+\r
+                       // Remove any left over makers\r
+                       html = o.node.innerHTML;\r
+                       if (html.indexOf('__MCE_ITEM__') != -1)\r
+                               o.node.innerHTML = html.replace(/__MCE_ITEM__/g, '');\r
+               },\r
+\r
+               /**\r
+                * Inserts the specified contents at the caret position.\r
+                */\r
+               _insert : function(h, skip_undo) {\r
+                       var ed = this.editor, r = ed.selection.getRng();\r
+\r
+                       // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells.\r
+                       if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer)\r
+                               ed.getDoc().execCommand('Delete', false, null);\r
+\r
+                       ed.execCommand('mceInsertContent', false, h, {skip_undo : skip_undo});\r
+               },\r
+\r
+               /**\r
+                * Instead of the old plain text method which tried to re-create a paste operation, the\r
+                * new approach adds a plain text mode toggle switch that changes the behavior of paste.\r
+                * This function is passed the same input that the regular paste plugin produces.\r
+                * It performs additional scrubbing and produces (and inserts) the plain text.\r
+                * This approach leverages all of the great existing functionality in the paste\r
+                * plugin, and requires minimal changes to add the new functionality.\r
+                * Speednet - June 2009\r
+                */\r
+               _insertPlainText : function(content) {\r
+                       var ed = this.editor,\r
+                               linebr = getParam(ed, "paste_text_linebreaktype"),\r
+                               rl = getParam(ed, "paste_text_replacements"),\r
+                               is = tinymce.is;\r
+\r
+                       function process(items) {\r
+                               each(items, function(v) {\r
+                                       if (v.constructor == RegExp)\r
+                                               content = content.replace(v, "");\r
+                                       else\r
+                                               content = content.replace(v[0], v[1]);\r
+                               });\r
+                       };\r
+\r
+                       if ((typeof(content) === "string") && (content.length > 0)) {\r
+                               // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line\r
+                               if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(content)) {\r
+                                       process([\r
+                                               /[\n\r]+/g\r
+                                       ]);\r
+                               } else {\r
+                                       // Otherwise just get rid of carriage returns (only need linefeeds)\r
+                                       process([\r
+                                               /\r+/g\r
+                                       ]);\r
+                               }\r
+\r
+                               process([\r
+                                       [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"],               // Block tags get a blank line after them\r
+                                       [/<br[^>]*>|<\/tr>/gi, "\n"],                           // Single linebreak for <br /> tags and table rows\r
+                                       [/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"],           // Table cells get tabs betweem them\r
+                                       /<[a-z!\/?][^>]*>/gi,                                           // Delete all remaining tags\r
+                                       [/&nbsp;/gi, " "],                                                      // Convert non-break spaces to regular spaces (remember, *plain text*)\r
+                                       [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"],// Cool little RegExp deletes whitespace around linebreak chars.\r
+                                       [/\n{3,}/g, "\n\n"]                                                     // Max. 2 consecutive linebreaks\r
+                               ]);\r
+\r
+                               content = ed.dom.decode(tinymce.html.Entities.encodeRaw(content));\r
+\r
+                               // Perform default or custom replacements\r
+                               if (is(rl, "array")) {\r
+                                       process(rl);\r
+                               } else if (is(rl, "string")) {\r
+                                       process(new RegExp(rl, "gi"));\r
+                               }\r
+\r
+                               // Treat paragraphs as specified in the config\r
+                               if (linebr == "none") {\r
+                                       process([\r
+                                               [/\n+/g, " "]\r
+                                       ]);\r
+                               } else if (linebr == "br") {\r
+                                       process([\r
+                                               [/\n/g, "<br />"]\r
+                                       ]);\r
+                               } else {\r
+                                       process([\r
+                                               [/\n\n/g, "</p><p>"],\r
+                                               [/^(.*<\/p>)(<p>)$/, '<p>$1'],\r
+                                               [/\n/g, "<br />"]\r
+                                       ]);\r
+                               }\r
+\r
+                               ed.execCommand('mceInsertContent', false, content);\r
+                       }\r
+               },\r
+\r
+               /**\r
+                * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine.\r
+                */\r
+               _legacySupport : function() {\r
+                       var t = this, ed = t.editor;\r
+\r
+                       // Register command(s) for backwards compatibility\r
+                       ed.addCommand("mcePasteWord", function() {\r
+                               ed.windowManager.open({\r
+                                       file: t.url + "/pasteword.htm",\r
+                                       width: parseInt(getParam(ed, "paste_dialog_width")),\r
+                                       height: parseInt(getParam(ed, "paste_dialog_height")),\r
+                                       inline: 1\r
+                               });\r
+                       });\r
+\r
+                       if (getParam(ed, "paste_text_use_dialog")) {\r
+                               ed.addCommand("mcePasteText", function() {\r
+                                       ed.windowManager.open({\r
+                                               file : t.url + "/pastetext.htm",\r
+                                               width: parseInt(getParam(ed, "paste_dialog_width")),\r
+                                               height: parseInt(getParam(ed, "paste_dialog_height")),\r
+                                               inline : 1\r
+                                       });\r
+                               });\r
+                       }\r
+\r
+                       // Register button for backwards compatibility\r
+                       ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"});\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin);\r
+})();\r
diff --git a/webcit/tiny_mce/plugins/paste/js/pastetext.js b/webcit/tiny_mce/plugins/paste/js/pastetext.js
new file mode 100644 (file)
index 0000000..c524f9e
--- /dev/null
@@ -0,0 +1,36 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var PasteTextDialog = {\r
+       init : function() {\r
+               this.resize();\r
+       },\r
+\r
+       insert : function() {\r
+               var h = tinyMCEPopup.dom.encode(document.getElementById('content').value), lines;\r
+\r
+               // Convert linebreaks into paragraphs\r
+               if (document.getElementById('linebreaks').checked) {\r
+                       lines = h.split(/\r?\n/);\r
+                       if (lines.length > 1) {\r
+                               h = '';\r
+                               tinymce.each(lines, function(row) {\r
+                                       h += '<p>' + row + '</p>';\r
+                               });\r
+                       }\r
+               }\r
+\r
+               tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h});\r
+               tinyMCEPopup.close();\r
+       },\r
+\r
+       resize : function() {\r
+               var vp = tinyMCEPopup.dom.getViewPort(window), el;\r
+\r
+               el = document.getElementById('content');\r
+\r
+               el.style.width  = (vp.w - 20) + 'px';\r
+               el.style.height = (vp.h - 90) + 'px';\r
+       }\r
+};\r
+\r
+tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog);\r
diff --git a/webcit/tiny_mce/plugins/paste/js/pasteword.js b/webcit/tiny_mce/plugins/paste/js/pasteword.js
new file mode 100644 (file)
index 0000000..a52731c
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var PasteWordDialog = {\r
+       init : function() {\r
+               var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = '';\r
+\r
+               // Create iframe\r
+               el.innerHTML = '<iframe id="iframe" src="javascript:\'\';" frameBorder="0" style="border: 1px solid gray"></iframe>';\r
+               ifr = document.getElementById('iframe');\r
+               doc = ifr.contentWindow.document;\r
+\r
+               // Force absolute CSS urls\r
+               css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")];\r
+               css = css.concat(tinymce.explode(ed.settings.content_css) || []);\r
+               tinymce.each(css, function(u) {\r
+                       cssHTML += '<link href="' + ed.documentBaseURI.toAbsolute('' + u) + '" rel="stylesheet" type="text/css" />';\r
+               });\r
+\r
+               // Write content into iframe\r
+               doc.open();\r
+               doc.write('<html><head>' + cssHTML + '</head><body class="mceContentBody" spellcheck="false"></body></html>');\r
+               doc.close();\r
+\r
+               doc.designMode = 'on';\r
+               this.resize();\r
+\r
+               window.setTimeout(function() {\r
+                       ifr.contentWindow.focus();\r
+               }, 10);\r
+       },\r
+\r
+       insert : function() {\r
+               var h = document.getElementById('iframe').contentWindow.document.body.innerHTML;\r
+\r
+               tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true});\r
+               tinyMCEPopup.close();\r
+       },\r
+\r
+       resize : function() {\r
+               var vp = tinyMCEPopup.dom.getViewPort(window), el;\r
+\r
+               el = document.getElementById('iframe');\r
+\r
+               if (el) {\r
+                       el.style.width  = (vp.w - 20) + 'px';\r
+                       el.style.height = (vp.h - 90) + 'px';\r
+               }\r
+       }\r
+};\r
+\r
+tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog);\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/bg_dlg.js b/webcit/tiny_mce/plugins/paste/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..722ecdc
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.paste_dlg',{"word_title":"\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 CTRL V \u043e\u0442 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0442\u0430, \u0437\u0430 \u0434\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446\u0430.","text_linebreaks":"\u0417\u0430\u043f\u0430\u0437\u0438 \u0437\u043d\u0430\u0446\u0438\u0442\u0435 \u0437\u0430 \u043d\u043e\u0432\u0438 \u0440\u0435\u0434\u043e\u0432\u0435","text_title":"\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 CTRL V \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0442\u0430, \u0437\u0430 \u0434\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446\u0430."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/cs_dlg.js b/webcit/tiny_mce/plugins/paste/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..66936bb
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.paste_dlg',{"word_title":"Pou\u017eijte CTRL+V pro vlo\u017een\u00ed textu do okna.","text_linebreaks":"Zachovat zalamov\u00e1n\u00ed \u0159\u00e1dk\u016f","text_title":"Pou\u017eijte CTRL+V pro vlo\u017een\u00ed textu do okna."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/da_dlg.js b/webcit/tiny_mce/plugins/paste/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..7e1b961
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.paste_dlg',{"word_title":"Anvend CTRL+V p\u00e5 tastaturet for at inds\u00e6tte teksten.","text_linebreaks":"Bevar linieskift","text_title":"Anvend CTRL+V p\u00e5 tastaturet for at inds\u00e6tte teksten."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/de_dlg.js b/webcit/tiny_mce/plugins/paste/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..84b9bc6
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.paste_dlg',{"word_title":"Dr\u00fccken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00fcgen.","text_linebreaks":"Zeilenumbr\u00fcche beibehalten","text_title":"Dr\u00fccken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00fcgen."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/el_dlg.js b/webcit/tiny_mce/plugins/paste/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..563ecc7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.paste_dlg',{"word_title":"\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 CTRL+V \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b5\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf.","text_linebreaks":"\u039d\u03b1 \u03ba\u03c1\u03b1\u03c4\u03b7\u03b8\u03bf\u03cd\u03bd \u03c4\u03b1 linebreaks","text_title":"\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 CTRL+V \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b5\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/en_dlg.js b/webcit/tiny_mce/plugins/paste/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..bc74daf
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.paste_dlg',{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/es_dlg.js b/webcit/tiny_mce/plugins/paste/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..82d8dc2
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.paste_dlg',{"word_title":"Use CTRL+V en su teclado para pegar el texto en la ventana.","text_linebreaks":"Keep linebreaks","text_title":"Use CTRL+V en su teclado para pegar el texto en la ventana."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/et_dlg.js b/webcit/tiny_mce/plugins/paste/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..8949d83
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.paste_dlg',{"word_title":"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks.","text_linebreaks":"J\u00e4ta reavahetused","text_title":"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/fi_dlg.js b/webcit/tiny_mce/plugins/paste/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..530e507
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.paste_dlg',{"word_title":"Paina Ctrl+V liitt\u00e4\u00e4ksesi sis\u00e4ll\u00f6n ikkunaan.","text_linebreaks":"S\u00e4ilyt\u00e4 rivinvaihdot","text_title":"Paina Ctrl+V liitt\u00e4\u00e4ksesi sis\u00e4ll\u00f6n ikkunaan."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/fr_dlg.js b/webcit/tiny_mce/plugins/paste/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..acc5d63
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.paste_dlg',{"word_title":"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre.","text_linebreaks":"Conserver les retours \u00e0 la ligne","text_title":"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/hu_dlg.js b/webcit/tiny_mce/plugins/paste/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..7f4fb7e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.paste_dlg',{"word_title":"Haszn\u00e1lja a Ctrl+V-t a billenty\u0171zet\u00e9n a beilleszt\u00e9shez.","text_linebreaks":"Sort\u00f6r\u00e9sek megtart\u00e1sa","text_title":"Haszn\u00e1lja a Ctrl+V-t a billenty\u0171zet\u00e9n a beilleszt\u00e9shez."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/it_dlg.js b/webcit/tiny_mce/plugins/paste/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..f1b8dc7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.paste_dlg',{"word_title":"Premere CTRL+V sulla tastiera per incollare il testo nella finestra.","text_linebreaks":"Mantieni interruzioni di riga","text_title":"Premere CTRL+V sulla tastiera per incollare il testo nella finestra."});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/paste/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..4abd1a9
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.paste_dlg',{"word_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u6587\u672c\u5230\u7a97\u53e3\u4e2d\u3002","text_linebreaks":"\u4fdd\u7559\u65ad\u884c","text_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u6587\u672c\u5230\u7a97\u53e3\u4e2d\u3002"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/pastetext.htm b/webcit/tiny_mce/plugins/paste/pastetext.htm
new file mode 100644 (file)
index 0000000..b655945
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#paste.paste_text_desc}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/pastetext.js"></script>\r
+</head>\r
+<body onresize="PasteTextDialog.resize();" style="display:none; overflow:hidden;">\r
+       <form name="source" onsubmit="return PasteTextDialog.insert();" 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 id="content" name="content" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft" class="mceFocus"></textarea>\r
+\r
+               <div class="mceActionPanel">\r
+                       <input type="submit" name="insert" value="{#insert}" id="insert" />\r
+                       <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
+               </div>\r
+       </form>\r
+</body> \r
+</html>
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/pasteword.htm b/webcit/tiny_mce/plugins/paste/pasteword.htm
new file mode 100644 (file)
index 0000000..0f6bb41
--- /dev/null
@@ -0,0 +1,21 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\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
+</head>\r
+<body onresize="PasteWordDialog.resize();" style="display:none; overflow:hidden;">\r
+       <form name="source" onsubmit="return PasteWordDialog.insert();" 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
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/preview/editor_plugin.js b/webcit/tiny_mce/plugins/preview/editor_plugin.js
new file mode 100644 (file)
index 0000000..507909c
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Preview",{init:function(a,b){var d=this,c=tinymce.explode(a.settings.content_css);d.editor=a;tinymce.each(c,function(f,e){c[e]=a.documentBaseURI.toAbsolute(f)});a.addCommand("mcePreview",function(){a.windowManager.open({file:a.getParam("plugin_preview_pageurl",b+"/preview.html"),width:parseInt(a.getParam("plugin_preview_width","550")),height:parseInt(a.getParam("plugin_preview_height","600")),resizable:"yes",scrollbars:"yes",popup_css:c?c.join(","):a.baseURI.toAbsolute("themes/"+a.settings.theme+"/skins/"+a.settings.skin+"/content.css"),inline:a.getParam("plugin_preview_inline",1)},{base:a.documentBaseURI.getURI()})});a.addButton("preview",{title:"preview.preview_desc",cmd:"mcePreview"})},getInfo:function(){return{longname:"Preview",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("preview",tinymce.plugins.Preview)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/preview/editor_plugin_src.js b/webcit/tiny_mce/plugins/preview/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..80f00f0
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+       tinymce.create('tinymce.plugins.Preview', {
+               init : function(ed, url) {
+                       var t = this, css = tinymce.explode(ed.settings.content_css);
+
+                       t.editor = ed;
+
+                       // Force absolute CSS urls      
+                       tinymce.each(css, function(u, k) {
+                               css[k] = ed.documentBaseURI.toAbsolute(u);
+                       });
+
+                       ed.addCommand('mcePreview', function() {
+                               ed.windowManager.open({
+                                       file : ed.getParam("plugin_preview_pageurl", url + "/preview.html"),
+                                       width : parseInt(ed.getParam("plugin_preview_width", "550")),
+                                       height : parseInt(ed.getParam("plugin_preview_height", "600")),
+                                       resizable : "yes",
+                                       scrollbars : "yes",
+                                       popup_css : css ? css.join(',') : ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css"),
+                                       inline : ed.getParam("plugin_preview_inline", 1)
+                               }, {
+                                       base : ed.documentBaseURI.getURI()
+                               });
+                       });
+
+                       ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'});
+               },
+
+               getInfo : function() {
+                       return {
+                               longname : 'Preview',
+                               author : 'Moxiecode Systems AB',
+                               authorurl : 'http://tinymce.moxiecode.com',
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview',
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion
+                       };
+               }
+       });
+
+       // Register plugin
+       tinymce.PluginManager.add('preview', tinymce.plugins.Preview);
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/preview/example.html b/webcit/tiny_mce/plugins/preview/example.html
new file mode 100644 (file)
index 0000000..b2c3d90
--- /dev/null
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+<script language="javascript" src="../../tiny_mce_popup.js"></script>\r
+<script type="text/javascript" src="jscripts/embed.js"></script>\r
+<script type="text/javascript">\r
+tinyMCEPopup.onInit.add(function(ed) {\r
+       var dom = tinyMCEPopup.dom;\r
+\r
+       // Load editor content_css\r
+       tinymce.each(ed.settings.content_css.split(','), function(u) {\r
+               dom.loadCSS(ed.documentBaseURI.toAbsolute(u));\r
+       });\r
+\r
+       // Place contents inside div container\r
+       dom.setHTML('content', ed.getContent());\r
+});\r
+</script>\r
+<title>Example of a custom preview page</title>\r
+</head>\r
+<body>\r
+\r
+Editor contents: <br />\r
+<div id="content">\r
+<!-- Gets filled with editor contents -->\r
+</div>\r
+\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/preview/jscripts/embed.js b/webcit/tiny_mce/plugins/preview/jscripts/embed.js
new file mode 100644 (file)
index 0000000..f8dc810
--- /dev/null
@@ -0,0 +1,73 @@
+/**\r
+ * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.\r
+ */\r
+\r
+function writeFlash(p) {\r
+       writeEmbed(\r
+               'D27CDB6E-AE6D-11cf-96B8-444553540000',\r
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
+               'application/x-shockwave-flash',\r
+               p\r
+       );\r
+}\r
+\r
+function writeShockWave(p) {\r
+       writeEmbed(\r
+       '166B1BCA-3F9C-11CF-8075-444553540000',\r
+       'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',\r
+       'application/x-director',\r
+               p\r
+       );\r
+}\r
+\r
+function writeQuickTime(p) {\r
+       writeEmbed(\r
+               '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',\r
+               'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',\r
+               'video/quicktime',\r
+               p\r
+       );\r
+}\r
+\r
+function writeRealMedia(p) {\r
+       writeEmbed(\r
+               'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',\r
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
+               'audio/x-pn-realaudio-plugin',\r
+               p\r
+       );\r
+}\r
+\r
+function writeWindowsMedia(p) {\r
+       p.url = p.src;\r
+       writeEmbed(\r
+               '6BF52A52-394A-11D3-B153-00C04F79FAA6',\r
+               'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',\r
+               'application/x-mplayer2',\r
+               p\r
+       );\r
+}\r
+\r
+function writeEmbed(cls, cb, mt, p) {\r
+       var h = '', n;\r
+\r
+       h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';\r
+       h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';\r
+       h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';\r
+       h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';\r
+       h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';\r
+       h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';\r
+       h += '>';\r
+\r
+       for (n in p)\r
+               h += '<param name="' + n + '" value="' + p[n] + '">';\r
+\r
+       h += '<embed type="' + mt + '"';\r
+\r
+       for (n in p)\r
+               h += n + '="' + p[n] + '" ';\r
+\r
+       h += '></embed></object>';\r
+\r
+       document.write(h);\r
+}\r
diff --git a/webcit/tiny_mce/plugins/preview/preview.html b/webcit/tiny_mce/plugins/preview/preview.html
new file mode 100644 (file)
index 0000000..67e7b14
--- /dev/null
@@ -0,0 +1,17 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+<script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+<script type="text/javascript" src="jscripts/embed.js"></script>\r
+<script type="text/javascript"><!--\r
+document.write('<base href="' + tinyMCEPopup.getWindowArg("base") + '">');\r
+// -->\r
+</script>\r
+<title>{#preview.preview_desc}</title>\r
+</head>\r
+<body id="content">\r
+<script type="text/javascript">\r
+       document.write(tinyMCEPopup.editor.getContent());\r
+</script>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/print/editor_plugin.js b/webcit/tiny_mce/plugins/print/editor_plugin.js
new file mode 100644 (file)
index 0000000..b5b3a55
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Print",{init:function(a,b){a.addCommand("mcePrint",function(){a.getWin().print()});a.addButton("print",{title:"print.print_desc",cmd:"mcePrint"})},getInfo:function(){return{longname:"Print",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("print",tinymce.plugins.Print)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/print/editor_plugin_src.js b/webcit/tiny_mce/plugins/print/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..3933fe6
--- /dev/null
@@ -0,0 +1,34 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.Print', {\r
+               init : function(ed, url) {\r
+                       ed.addCommand('mcePrint', function() {\r
+                               ed.getWin().print();\r
+                       });\r
+\r
+                       ed.addButton('print', {title : 'print.print_desc', cmd : 'mcePrint'});\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Print',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('print', tinymce.plugins.Print);\r
+})();\r
diff --git a/webcit/tiny_mce/plugins/save/editor_plugin.js b/webcit/tiny_mce/plugins/save/editor_plugin.js
new file mode 100644 (file)
index 0000000..8e93996
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Save",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceSave",c._save,c);a.addCommand("mceCancel",c._cancel,c);a.addButton("save",{title:"save.save_desc",cmd:"mceSave"});a.addButton("cancel",{title:"save.cancel_desc",cmd:"mceCancel"});a.onNodeChange.add(c._nodeChange,c);a.addShortcut("ctrl+s",a.getLang("save.save_desc"),"mceSave")},getInfo:function(){return{longname:"Save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,c){var b=this.editor;if(b.getParam("save_enablewhendirty")){a.setDisabled("save",!b.isDirty());a.setDisabled("cancel",!b.isDirty())}},_save:function(){var c=this.editor,a,e,d,b;a=tinymce.DOM.get(c.id).form||tinymce.DOM.getParent(c.id,"form");if(c.getParam("save_enablewhendirty")&&!c.isDirty()){return}tinyMCE.triggerSave();if(e=c.getParam("save_onsavecallback")){if(c.execCallback("save_onsavecallback",c)){c.startContent=tinymce.trim(c.getContent({format:"raw"}));c.nodeChanged()}return}if(a){c.isNotDirty=true;if(a.onsubmit==null||a.onsubmit()!=false){a.submit()}c.nodeChanged()}else{c.windowManager.alert("Error: No form element found.")}},_cancel:function(){var a=this.editor,c,b=tinymce.trim(a.startContent);if(c=a.getParam("save_oncancelcallback")){a.execCallback("save_oncancelcallback",a);return}a.setContent(b);a.undoManager.clear();a.nodeChanged()}});tinymce.PluginManager.add("save",tinymce.plugins.Save)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/save/editor_plugin_src.js b/webcit/tiny_mce/plugins/save/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..f5a3de8
--- /dev/null
@@ -0,0 +1,101 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.Save', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceSave', t._save, t);\r
+                       ed.addCommand('mceCancel', t._cancel, t);\r
+\r
+                       // Register buttons\r
+                       ed.addButton('save', {title : 'save.save_desc', cmd : 'mceSave'});\r
+                       ed.addButton('cancel', {title : 'save.cancel_desc', cmd : 'mceCancel'});\r
+\r
+                       ed.onNodeChange.add(t._nodeChange, t);\r
+                       ed.addShortcut('ctrl+s', ed.getLang('save.save_desc'), 'mceSave');\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Save',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               // Private methods\r
+\r
+               _nodeChange : function(ed, cm, n) {\r
+                       var ed = this.editor;\r
+\r
+                       if (ed.getParam('save_enablewhendirty')) {\r
+                               cm.setDisabled('save', !ed.isDirty());\r
+                               cm.setDisabled('cancel', !ed.isDirty());\r
+                       }\r
+               },\r
+\r
+               // Private methods\r
+\r
+               _save : function() {\r
+                       var ed = this.editor, formObj, os, i, elementId;\r
+\r
+                       formObj = tinymce.DOM.get(ed.id).form || tinymce.DOM.getParent(ed.id, 'form');\r
+\r
+                       if (ed.getParam("save_enablewhendirty") && !ed.isDirty())\r
+                               return;\r
+\r
+                       tinyMCE.triggerSave();\r
+\r
+                       // Use callback instead\r
+                       if (os = ed.getParam("save_onsavecallback")) {\r
+                               if (ed.execCallback('save_onsavecallback', ed)) {\r
+                                       ed.startContent = tinymce.trim(ed.getContent({format : 'raw'}));\r
+                                       ed.nodeChanged();\r
+                               }\r
+\r
+                               return;\r
+                       }\r
+\r
+                       if (formObj) {\r
+                               ed.isNotDirty = true;\r
+\r
+                               if (formObj.onsubmit == null || formObj.onsubmit() != false)\r
+                                       formObj.submit();\r
+\r
+                               ed.nodeChanged();\r
+                       } else\r
+                               ed.windowManager.alert("Error: No form element found.");\r
+               },\r
+\r
+               _cancel : function() {\r
+                       var ed = this.editor, os, h = tinymce.trim(ed.startContent);\r
+\r
+                       // Use callback instead\r
+                       if (os = ed.getParam("save_oncancelcallback")) {\r
+                               ed.execCallback('save_oncancelcallback', ed);\r
+                               return;\r
+                       }\r
+\r
+                       ed.setContent(h);\r
+                       ed.undoManager.clear();\r
+                       ed.nodeChanged();\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('save', tinymce.plugins.Save);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/css/searchreplace.css b/webcit/tiny_mce/plugins/searchreplace/css/searchreplace.css
new file mode 100644 (file)
index 0000000..ecdf58c
--- /dev/null
@@ -0,0 +1,6 @@
+.panel_wrapper {height:85px;}\r
+.panel_wrapper div.current {height:85px;}\r
+\r
+/* IE */\r
+* html .panel_wrapper {height:100px;}\r
+* html .panel_wrapper div.current {height:100px;}\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/editor_plugin.js b/webcit/tiny_mce/plugins/searchreplace/editor_plugin.js
new file mode 100644 (file)
index 0000000..165bc12
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){window.focus();a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/webcit/tiny_mce/plugins/searchreplace/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..4c87e8f
--- /dev/null
@@ -0,0 +1,61 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.SearchReplacePlugin', {\r
+               init : function(ed, url) {\r
+                       function open(m) {\r
+                               // Keep IE from writing out the f/r character to the editor\r
+                               // instance while initializing a new dialog. See: #3131190\r
+                               window.focus();\r
+\r
+                               ed.windowManager.open({\r
+                                       file : url + '/searchreplace.htm',\r
+                                       width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)),\r
+                                       height : 170 + 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
+       // Register plugin\r
+       tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/js/searchreplace.js b/webcit/tiny_mce/plugins/searchreplace/js/searchreplace.js
new file mode 100644 (file)
index 0000000..80284b9
--- /dev/null
@@ -0,0 +1,142 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var SearchReplaceDialog = {\r
+       init : function(ed) {\r
+               var t = this, f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode");\r
+\r
+               t.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
+               mcTabs.onChange.add(function(tab_id, panel_id) {\r
+                       t.switchMode(tab_id.substring(0, tab_id.indexOf('_')));\r
+               });\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
+               if (tinymce.isIE) {\r
+                       r = ed.getDoc().selection.createRange();\r
+               }\r
+\r
+               if (s == '')\r
+                       return;\r
+\r
+               function fix() {\r
+                       // Correct Firefox graphics glitches\r
+                       // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions? \r
+                       r = se.getRng().cloneRange();\r
+                       ed.getDoc().execCommand('SelectAll', false, null);\r
+                       se.setRng(r);\r
+               };\r
+\r
+               function replace() {\r
+                       ed.selection.setContent(rs); // Needs to be duplicated due to selection bug in IE\r
+               };\r
+\r
+               // IE flags\r
+               if (ca)\r
+                       fl = fl | 4;\r
+\r
+               switch (a) {\r
+                       case 'all':\r
+                               // Move caret to beginning of text\r
+                               ed.execCommand('SelectAll');\r
+                               ed.selection.collapse(true);\r
+\r
+                               if (tinymce.isIE) {\r
+                                       ed.focus();\r
+                                       r = ed.getDoc().selection.createRange();\r
+\r
+                                       while (r.findText(s, b ? -1 : 1, fl)) {\r
+                                               r.scrollIntoView();\r
+                                               r.select();\r
+                                               replace();\r
+                                               fo = 1;\r
+\r
+                                               if (b) {\r
+                                                       r.moveEnd("character", -(rs.length)); // Otherwise will loop forever\r
+                                               }\r
+                                       }\r
+\r
+                                       tinyMCEPopup.storeSelection();\r
+                               } else {\r
+                                       while (w.find(s, ca, b, false, false, false, false)) {\r
+                                               replace();\r
+                                               fo = 1;\r
+                                       }\r
+                               }\r
+\r
+                               if (fo)\r
+                                       tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.allreplaced'));\r
+                               else\r
+                                       tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));\r
+\r
+                               return;\r
+\r
+                       case 'current':\r
+                               if (!ed.selection.isCollapsed())\r
+                                       replace();\r
+\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
+                       ed.focus();\r
+                       r = ed.getDoc().selection.createRange();\r
+\r
+                       if (r.findText(s, b ? -1 : 1, fl)) {\r
+                               r.scrollIntoView();\r
+                               r.select();\r
+                       } else\r
+                               tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));\r
+\r
+                       tinyMCEPopup.storeSelection();\r
+               } else {\r
+                       if (!w.find(s, ca, b, false, false, false, false))\r
+                               tinyMCEPopup.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/webcit/tiny_mce/plugins/searchreplace/langs/bg_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..6560e0f
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.searchreplace_dlg',{findwhat:"\u0422\u044a\u0440\u0441\u0438",replacewith:"\u0417\u0430\u043c\u0435\u0441\u0442\u0438 \u0441",direction:"\u041f\u043e\u0441\u043e\u043a\u0430",up:"\u041d\u0430\u0433\u043e\u0440\u0435",down:"\u041d\u0430\u0434\u043e\u043b\u0443",mcase:"\u0421\u044a\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u044a\u0440\u0430",findnext:"\u0422\u044a\u0440\u0441\u0438 \u0441\u043b\u0435\u0434\u0432\u0430\u0449\u0438",allreplaced:"\u0412\u0441\u0438\u0447\u043a\u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438 \u0434\u0443\u043c\u0438 \u0431\u044f\u0445\u0430 \u0437\u0430\u043c\u0435\u0441\u0442\u0435\u043d\u0438.","searchnext_desc":"\u0422\u044a\u0440\u0441\u0438 \u043e\u0442\u043d\u043e\u0432\u043e",notfound:"\u0422\u044a\u0440\u0441\u0435\u043d\u0435\u0442\u043e \u0437\u0430\u0432\u044a\u0440\u0448\u0438. \u0422\u044a\u0440\u0441\u0435\u043d\u0438\u0442\u0435 \u0434\u0443\u043c\u0438 \u043d\u0435 \u0431\u044f\u0445\u0430 \u043e\u0442\u043a\u0440\u0438\u0442\u0438.","search_title":"\u0422\u044a\u0440\u0441\u0438","replace_title":"\u0422\u044a\u0440\u0441\u0438/\u0417\u0430\u043c\u0435\u0441\u0442\u0438",replaceall:"\u0417\u0430\u043c\u0435\u0441\u0442\u0438 \u0432\u0441\u0438\u0447\u043a\u0438",replace:"\u0417\u0430\u043c\u0435\u0441\u0442\u0438"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/cs_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..8165408
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.searchreplace_dlg',{findwhat:"Co hledat",replacewith:"\u010c\u00edm nahradit",direction:"Sm\u011br",up:"Nahoru",down:"Dol\u016f",mcase:"Rozli\u0161ovat velikost",findnext:"Naj\u00edt dal\u0161\u00ed",allreplaced:"V\u0161echny v\u00fdskyty byly nahrazeny.","searchnext_desc":"Naj\u00edt dal\u0161\u00ed",notfound:"Hled\u00e1n\u00ed bylo dokon\u010deno. Hledan\u00fd text nebyl nalezen.","search_title":"Naj\u00edt","replace_title":"Naj\u00edt/nahradit",replaceall:"Nahradit v\u0161e",replace:"Nahradit"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/da_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..b551cea
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.searchreplace_dlg',{findwhat:"S\u00f8g efter",replacewith:"Erstat med",direction:"Retning",up:"Op",down:"Ned",mcase:"Forskel p\u00e5 store og sm\u00e5 bogstaver",findnext:"Find n\u00e6ste",allreplaced:"Alle forekomster af s\u00f8gestrengen er erstattet.","searchnext_desc":"S\u00f8g igen",notfound:"S\u00f8gningen gav intet resultat.","search_title":"S\u00f8g","replace_title":"S\u00f8g / erstat",replaceall:"Erstat alle",replace:"Erstat"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/de_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..7c40acd
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.searchreplace_dlg',{findwhat:"Zu suchender Text",replacewith:"Ersetzen durch",direction:"Suchrichtung",up:"Aufw\u00e4rts",down:"Abw\u00e4rts",mcase:"Gro\u00df-/Kleinschreibung beachten",findnext:"Weitersuchen",allreplaced:"Alle Vorkommen der Zeichenkette wurden ersetzt.","searchnext_desc":"Weitersuchen",notfound:"Die Suche ist am Ende angelangt. Die Zeichenkette konnte nicht gefunden werden.","search_title":"Suchen","replace_title":"Suchen/Ersetzen",replaceall:"Alle ersetzen",replace:"Ersetzen"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/el_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..10e564d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.searchreplace_dlg',{findwhat:"\u0395\u03cd\u03c1\u03b5\u03c3\u03b7 \u03c4\u03bf\u03c5",replacewith:"\u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03bc\u03b5",direction:"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7",up:"\u03a0\u03ac\u03bd\u03c9",down:"\u039a\u03ac\u03c4\u03c9",mcase:"\u03a4\u03b1\u03af\u03c1\u03b9\u03b1\u03c3\u03bc\u03b1 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03b1/\u03bc\u03b9\u03ba\u03c1\u03ac",findnext:"\u0392\u03c1\u03b5\u03c2 \u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf",allreplaced:"\u038c\u03bb\u03b5\u03c2 \u03bf\u03b9 \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 \u03b6\u03b7\u03c4\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c5 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ac\u03b8\u03b7\u03ba\u03b1\u03bd.","searchnext_desc":"\u0395\u03cd\u03c1\u03b5\u03c3\u03b7 \u03be\u03b1\u03bd\u03ac",notfound:"\u0397 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03c4\u03b5\u03bb\u03b5\u03af\u03c9\u03c3\u03b5. \u03a4\u03bf \u03b6\u03b7\u03c4\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5.","search_title":"\u0395\u03cd\u03c1\u03b5\u03c3\u03b7","replace_title":"\u0395\u03cd\u03c1\u03b5\u03c3\u03b7/\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7",replaceall:"\u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4. \u03cc\u03bb\u03c9\u03bd",replace:"\u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/en_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..8a65900
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.searchreplace_dlg',{findwhat:"Find What",replacewith:"Replace with",direction:"Direction",up:"Up",down:"Down",mcase:"Match Case",findnext:"Find Next",allreplaced:"All occurrences of the search string were replaced.","searchnext_desc":"Find Again",notfound:"The search has been completed. The search string could not be found.","search_title":"Find","replace_title":"Find/Replace",replaceall:"Replace All",replace:"Replace"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/es_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..62e178d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.searchreplace_dlg',{findwhat:"Qu\u00e9 buscar",replacewith:"Reemplazar por",direction:"Direcci\u00f3n",up:"Arriba",down:"Abajo",mcase:"Min\u00fas./May\u00fas.",findnext:"Buscar siguiente",allreplaced:"Se ha reemplazado el texto.","searchnext_desc":"Buscar de nuevo",notfound:"La b\u00fasqueda se ha completado. No se encontr\u00f3 el texto introducido.","search_title":"Buscar","replace_title":"Buscar/Reemplazar",replaceall:"Reemplazar todo",replace:"Reemplazar"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/et_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..ef567f7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.searchreplace_dlg',{findwhat:"Otsi mida",replacewith:"Asenda millega",direction:"Suund",up:"\u00dcles",down:"Alla",mcase:"Vasta suurusele",findnext:"Otsi j\u00e4rgmine",allreplaced:"K\u00f5ik otsis\u00f5na ilmingud on asendatud.","searchnext_desc":"Otsi uuesti",notfound:"Otsing on l\u00f5petatud. Otsis\u00f5na ei leitud.","search_title":"Otsi","replace_title":"Otsi/Asenda",replaceall:"Asenda k\u00f5ik",replace:"Asenda"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/fi_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..c2617c3
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.searchreplace_dlg',{findwhat:"Etsit\u00e4\u00e4n",replacewith:"Korvataan",direction:"Suunta",up:"Yl\u00f6s",down:"Alas",mcase:"Huomioi isot ja pienet kirjaimet",findnext:"Etsi seuraavaa",allreplaced:"Kaikki l\u00f6ydetyt merkkijonot korvattiin.","searchnext_desc":"Etsi uudestaan",notfound:"Haku on valmis. Haettua teksti\u00e4 ei l\u00f6ytynyt.","search_title":"Haku","replace_title":"Etsi ja korvaa",replaceall:"Korvaa kaikki",replace:"Korvaa"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/fr_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..707b5c2
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.searchreplace_dlg',{findwhat:"Rechercher ceci",replacewith:"Remplacer par",direction:"Direction",up:"Vers le haut",down:"Vers le bas",mcase:"Sensible \u00e0 la casse",findnext:"Rechercher le suivant",allreplaced:"Toutes les occurrences de la cha\u00eene recherch\u00e9e ont \u00e9t\u00e9 remplac\u00e9es.","searchnext_desc":"Suivant",notfound:"La recherche est termin\u00e9e. La cha\u00eene recherch\u00e9e n\'a pas \u00e9t\u00e9 trouv\u00e9e.","search_title":"Rechercher","replace_title":"Rechercher / remplacer",replaceall:"Tout remplacer",replace:"Remplacer"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/hu_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..4165838
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.searchreplace_dlg',{findwhat:"Mit keres",replacewith:"Mire cser\u00e9l",direction:"Ir\u00e1ny",up:"Fel",down:"Le",mcase:"Kis- \u00e9s nagybet\u0171k megk\u00fcl\u00f6nb\u00f6ztet\u00e9se",findnext:"K\u00f6vetkez\u0151",allreplaced:"A keresett r\u00e9szsz\u00f6veg minden el\u0151fordul\u00e1sa cser\u00e9lve lett.","searchnext_desc":"Keres\u00e9s megint",notfound:"A keres\u00e9s v\u00e9get \u00e9rt. A keresett sz\u00f6vegr\u00e9sz nem tal\u00e1lhat\u00f3.","search_title":"Keres\u00e9s","replace_title":"Keres\u00e9s/Csere",replaceall:"\u00d6sszes cser\u00e9je",replace:"Csere"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/it_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..da34e5d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.searchreplace_dlg',{findwhat:"Trova:",replacewith:"Sostituisci con:",direction:"Direzione",up:"Avanti",down:"Indietro",mcase:"Maiuscole/minuscole",findnext:"Trova succ.",allreplaced:"Tutte le occorrenze del criterio di ricerca sono state sostituite.","searchnext_desc":"Trova successivo",notfound:"Ricerca completata. Nessun risultato trovato.","search_title":"Trova","replace_title":"Trova/Sostituisci",replaceall:"Sost. tutto",replace:"Sostituisci"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/searchreplace/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..8891247
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.searchreplace_dlg',{findwhat:"\u67e5\u627e\u76ee\u6807",replacewith:"\u66ff\u6362\u4e3a",direction:"\u67e5\u627e\u65b9\u5411",up:"\u5411\u4e0a",down:"\u5411\u4e0b",mcase:"\u533a\u5206\u5927\u5c0f\u5199",findnext:"\u67e5\u627e\u4e0b\u4e00\u4e2a",allreplaced:"\u6240\u6709\u51fa\u73b0\u7684\u5b57\u7b26\u5747\u5df2\u66ff\u6362\u3002","searchnext_desc":"\u7ee7\u7eed\u67e5\u627e",notfound:"\u67e5\u627e\u5b8c\u6210\uff0c\u672a\u627e\u5230\u7b26\u5408\u7684\u6587\u5b57\u3002","search_title":"\u67e5\u627e","replace_title":"\u67e5\u627e/\u66ff\u6362",replaceall:"\u5168\u90e8\u66ff\u6362",replace:"\u66ff\u6362"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/searchreplace.htm b/webcit/tiny_mce/plugins/searchreplace/searchreplace.htm
new file mode 100644 (file)
index 0000000..5a22d8a
--- /dev/null
@@ -0,0 +1,100 @@
+<!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>{#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
+</head>\r
+<body style="display:none;" role="application" aria-labelledby="app_title">\r
+<span id="app_title" style="display:none">{#searchreplace_dlg.replace_title}</span>\r
+<form onsubmit="SearchReplaceDialog.searchNext('none');return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="search_tab" aria-controls="search_panel"><span><a href="javascript:SearchReplaceDialog.switchMode('search');" onmousedown="return false;">{#searchreplace.search_desc}</a></span></li>\r
+                       <li id="replace_tab" aria-controls="replace_panel"><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
+               <div id="search_panel" class="panel">\r
+                       <table role="presentation" border="0" cellspacing="0" cellpadding="2">\r
+                               <tr>\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" aria-required="true" /></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table role="presentation" border="0" cellspacing="0" cellpadding="0" class="direction">\r
+                                                       <tr role="group" aria-labelledby="search_panel_backwards_label">\r
+                                                               <td><label id="search_panel_backwards_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">{#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
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table role="presentation" 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">{#searchreplace_dlg.mcase}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                       </table>\r
+               </div>\r
+\r
+               <div id="replace_panel" class="panel">\r
+                       <table role="presentation" border="0" cellspacing="0" cellpadding="2">\r
+                               <tr>\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" aria-required="true" /></td>\r
+                               </tr>\r
+                               <tr>\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" aria-required="true" /></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table role="presentation" border="0" cellspacing="0" cellpadding="0" class="direction">\r
+                                                       <tr role="group" aria-labelledby="replace_panel_dir_label">\r
+                                                               <td><label id="replace_panel_dir_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">{#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
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table role="presentation" 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">{#searchreplace_dlg.mcase}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                       </table>\r
+               </div>\r
+\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <input type="submit" id="insert" name="insert" value="{#searchreplace_dlg.findnext}" />\r
+               <input type="button" class="button" id="replaceBtn" name="replaceBtn" value="{#searchreplace_dlg.replace}" onclick="SearchReplaceDialog.searchNext('current');" />\r
+               <input type="button" class="button" id="replaceAllBtn" name="replaceAllBtn" value="{#searchreplace_dlg.replaceall}" onclick="SearchReplaceDialog.searchNext('all');" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/spellchecker/css/content.css b/webcit/tiny_mce/plugins/spellchecker/css/content.css
new file mode 100644 (file)
index 0000000..24efa02
--- /dev/null
@@ -0,0 +1 @@
+.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;}\r
diff --git a/webcit/tiny_mce/plugins/spellchecker/editor_plugin.js b/webcit/tiny_mce/plugins/spellchecker/editor_plugin.js
new file mode 100644 (file)
index 0000000..0c42739
--- /dev/null
@@ -0,0 +1 @@
+(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');for(d=0;d<f.length;d++){e+="\\"+f.charAt(d)}return e},_getWords:function(){var e=this.editor,g=[],d="",f={},h=[];this._walk(e.getBody(),function(i){if(i.nodeType==3){d+=i.nodeValue+" "}});if(e.getParam("spellchecker_word_pattern")){h=d.match("("+e.getParam("spellchecker_word_pattern")+")","gi")}else{d=d.replace(new RegExp("([0-9]|["+this._getSeparators()+"])","g")," ");d=tinymce.trim(d.replace(/(\s+)/g," "));h=d.split(" ")}c(h,function(i){if(!f[i]){g.push(i);f[i]=1}});return g},_removeWords:function(e){var f=this.editor,h=f.dom,g=f.selection,d=g.getBookmark();c(h.select("span").reverse(),function(i){if(i&&(h.hasClass(i,"mceItemHiddenSpellWord")||h.hasClass(i,"mceItemHidden"))){if(!e||h.decode(i.innerHTML)==e){h.remove(i,1)}}});g.moveToBookmark(d)},_markWords:function(l){var g=this.editor,f=g.dom,j=g.getDoc(),h=g.selection,i=h.getBookmark(),d=[],k=l.join("|"),m=this._getSeparators(),e=new RegExp("(^|["+m+"])("+k+")(?=["+m+"]|$)","g");this._walk(g.getBody(),function(o){if(o.nodeType==3){d.push(o)}});c(d,function(t){var r,q,o,s,p=t.nodeValue;if(e.test(p)){p=f.encode(p);q=f.create("span",{"class":"mceItemHidden"});if(tinymce.isIE){p=p.replace(e,"$1<mcespell>$2</mcespell>");while((s=p.indexOf("<mcespell>"))!=-1){o=p.substring(0,s);if(o.length){r=j.createTextNode(f.decode(o));q.appendChild(r)}p=p.substring(s+10);s=p.indexOf("</mcespell>");o=p.substring(0,s);p=p.substring(s+11);q.appendChild(f.create("span",{"class":"mceItemHiddenSpellWord"},o))}if(p.length){r=j.createTextNode(f.decode(p));q.appendChild(r)}}else{q.innerHTML=p.replace(e,'$1<span class="mceItemHiddenSpellWord">$2</span>')}f.replace(q,t)}});h.moveToBookmark(i)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=b.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/spellchecker/editor_plugin_src.js b/webcit/tiny_mce/plugins/spellchecker/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..ee4df88
--- /dev/null
@@ -0,0 +1,434 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var 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
+                       t.rpcUrl = ed.getParam("spellchecker_rpc_url", "{backend}");\r
+\r
+                       if (t.rpcUrl == '{backend}') {\r
+                               // Sniff if the browser supports native spellchecking (Don't know of a better way)\r
+                               if (tinymce.isIE)\r
+                                       return;\r
+\r
+                               t.hasSupport = true;\r
+\r
+                               // Disable the context menu when spellchecking is active\r
+                               ed.onContextMenu.addToTop(function(ed, e) {\r
+                                       if (t.active)\r
+                                               return false;\r
+                               });\r
+                       }\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceSpellCheck', function() {\r
+                               if (t.rpcUrl == '{backend}') {\r
+                                       // Enable/disable native spellchecker\r
+                                       t.editor.getBody().spellcheck = t.active = !t.active;\r
+                                       return;\r
+                               }\r
+\r
+                               if (!t.active) {\r
+                                       ed.setProgressState(1);\r
+                                       t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) {\r
+                                               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
+\r
+                                                       if (ed.getParam('spellchecker_report_no_misspellings', true))\r
+                                                               ed.windowManager.alert('spellchecker.no_mpell');\r
+                                               }\r
+                                       });\r
+                               } else\r
+                                       t._done();\r
+                       });\r
+\r
+                       if (ed.settings.content_css !== false)\r
+                               ed.contentCSS.push(url + '/css/content.css');\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
+\r
+                               t.languages[k] = v;\r
+                       });\r
+               },\r
+\r
+               createControl : function(n, cm) {\r
+                       var t = this, c, ed = t.editor;\r
+\r
+                       if (n == 'spellchecker') {\r
+                               // Use basic button if we use the native spellchecker\r
+                               if (t.rpcUrl == '{backend}') {\r
+                                       // Create simple toggle button if we have native support\r
+                                       if (t.hasSupport)\r
+                                               c = cm.createButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});\r
+\r
+                                       return c;\r
+                               }\r
+\r
+                               c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});\r
+\r
+                               c.onRenderMenu.add(function(c, m) {\r
+                                       m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
+                                       each(t.languages, function(v, k) {\r
+                                               var o = {icon : 1}, mi;\r
+\r
+                                               o.onclick = function() {\r
+                                                       if (v == t.selectedLang) {\r
+                                                               return;\r
+                                                       }\r
+                                                       mi.setSelected(1);\r
+                                                       t.selectedItem.setSelected(0);\r
+                                                       t.selectedItem = mi;\r
+                                                       t.selectedLang = v;\r
+                                               };\r
+\r
+                                               o.title = k;\r
+                                               mi = m.add(o);\r
+                                               mi.setSelected(v == t.selectedLang);\r
+\r
+                                               if (v == t.selectedLang)\r
+                                                       t.selectedItem = mi;\r
+                                       })\r
+                               });\r
+\r
+                               return c;\r
+                       }\r
+               },\r
+\r
+               // Internal functions\r
+\r
+               _walk : function(n, f) {\r
+                       var d = this.editor.getDoc(), 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(this, n);\r
+                       } else\r
+                               tinymce.walk(n, f, 'childNodes');\r
+               },\r
+\r
+               _getSeparators : function() {\r
+                       var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');\r
+\r
+                       // Build word separator regexp\r
+                       for (i=0; i<str.length; i++)\r
+                               re += '\\' + str.charAt(i);\r
+\r
+                       return re;\r
+               },\r
+\r
+               _getWords : function() {\r
+                       var ed = this.editor, wl = [], tx = '', lo = {}, rawWords = [];\r
+\r
+                       // Get area text\r
+                       this._walk(ed.getBody(), function(n) {\r
+                               if (n.nodeType == 3)\r
+                                       tx += n.nodeValue + ' ';\r
+                       });\r
+\r
+                       // split the text up into individual words\r
+                       if (ed.getParam('spellchecker_word_pattern')) {\r
+                               // look for words that match the pattern\r
+                               rawWords = tx.match('(' + ed.getParam('spellchecker_word_pattern') + ')', 'gi');\r
+                       } else {\r
+                               // Split words by separator\r
+                               tx = tx.replace(new RegExp('([0-9]|[' + this._getSeparators() + '])', 'g'), ' ');\r
+                               tx = tinymce.trim(tx.replace(/(\s+)/g, ' '));\r
+                               rawWords = tx.split(' ');\r
+                       }\r
+\r
+                       // Build word array and remove duplicates\r
+                       each(rawWords, function(v) {\r
+                               if (!lo[v]) {\r
+                                       wl.push(v);\r
+                                       lo[v] = 1;\r
+                               }\r
+                       });\r
+\r
+                       return wl;\r
+               },\r
+\r
+               _removeWords : function(w) {\r
+                       var ed = this.editor, dom = ed.dom, se = ed.selection, b = se.getBookmark();\r
+\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
+                       se.moveToBookmark(b);\r
+               },\r
+\r
+               _markWords : function(wl) {\r
+                       var ed = this.editor, dom = ed.dom, doc = ed.getDoc(), se = ed.selection, b = se.getBookmark(), nl = [],\r
+                               w = wl.join('|'), re = this._getSeparators(), rx = new RegExp('(^|[' + re + '])(' + w + ')(?=[' + re + ']|$)', 'g');\r
+\r
+                       // Collect all text nodes\r
+                       this._walk(ed.getBody(), function(n) {\r
+                               if (n.nodeType == 3) {\r
+                                       nl.push(n);\r
+                               }\r
+                       });\r
+\r
+                       // Wrap incorrect words in spans\r
+                       each(nl, function(n) {\r
+                               var node, elem, txt, pos, v = n.nodeValue;\r
+\r
+                               if (rx.test(v)) {\r
+                                       // Encode the content\r
+                                       v = dom.encode(v);\r
+                                       // Create container element\r
+                                       elem = dom.create('span', {'class' : 'mceItemHidden'});\r
+\r
+                                       // Following code fixes IE issues by creating text nodes\r
+                                       // using DOM methods instead of innerHTML.\r
+                                       // Bug #3124: <PRE> elements content is broken after spellchecking.\r
+                                       // Bug #1408: Preceding whitespace characters are removed\r
+                                       // @TODO: I'm not sure that both are still issues on IE9.\r
+                                       if (tinymce.isIE) {\r
+                                               // Enclose mispelled words with temporal tag\r
+                                               v = v.replace(rx, '$1<mcespell>$2</mcespell>');\r
+                                               // Loop over the content finding mispelled words\r
+                                               while ((pos = v.indexOf('<mcespell>')) != -1) {\r
+                                                       // Add text node for the content before the word\r
+                                                       txt = v.substring(0, pos);\r
+                                                       if (txt.length) {\r
+                                                               node = doc.createTextNode(dom.decode(txt));\r
+                                                               elem.appendChild(node);\r
+                                                       }\r
+                                                       v = v.substring(pos+10);\r
+                                                       pos = v.indexOf('</mcespell>');\r
+                                                       txt = v.substring(0, pos);\r
+                                                       v = v.substring(pos+11);\r
+                                                       // Add span element for the word\r
+                                                       elem.appendChild(dom.create('span', {'class' : 'mceItemHiddenSpellWord'}, txt));\r
+                                               }\r
+                                               // Add text node for the rest of the content\r
+                                               if (v.length) {\r
+                                                       node = doc.createTextNode(dom.decode(v));\r
+                                                       elem.appendChild(node);\r
+                                               }\r
+                                       } else {\r
+                                               // Other browsers preserve whitespace characters on innerHTML usage\r
+                                               elem.innerHTML = v.replace(rx, '$1<span class="mceItemHiddenSpellWord">$2</span>');\r
+                                       }\r
+\r
+                                       // Finally, replace the node with the container\r
+                                       dom.replace(elem, n);\r
+                               }\r
+                       });\r
+\r
+                       se.moveToBookmark(b);\r
+               },\r
+\r
+               _showMenu : function(ed, e) {\r
+                       var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin()), wordSpan = e.target;\r
+\r
+                       e = 0; // Fixes IE memory leak\r
+\r
+                       if (!m) {\r
+                               m = ed.controlManager.createDropMenu('spellcheckermenu', {'class' : 'mceNoIcons'});\r
+                               t._menu = m;\r
+                       }\r
+\r
+                       if (dom.hasClass(wordSpan, 'mceItemHiddenSpellWord')) {\r
+                               m.removeAll();\r
+                               m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
+\r
+                               t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(wordSpan.innerHTML)], function(r) {\r
+                                       var ignoreRpc;\r
+\r
+                                       m.removeAll();\r
+\r
+                                       if (r.length > 0) {\r
+                                               m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
+                                               each(r, function(v) {\r
+                                                       m.add({title : v, onclick : function() {\r
+                                                               dom.replace(ed.getDoc().createTextNode(v), wordSpan);\r
+                                                               t._checkDone();\r
+                                                       }});\r
+                                               });\r
+\r
+                                               m.addSeparator();\r
+                                       } else\r
+                                               m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
+\r
+                                       ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", '');\r
+                                       m.add({\r
+                                               title : 'spellchecker.ignore_word',\r
+                                               onclick : function() {\r
+                                                       var word = wordSpan.innerHTML;\r
+\r
+                                                       dom.remove(wordSpan, 1);\r
+                                                       t._checkDone();\r
+\r
+                                                       // tell the server if we need to\r
+                                                       if (ignoreRpc) {\r
+                                                               ed.setProgressState(1);\r
+                                                               t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) {\r
+                                                                       ed.setProgressState(0);\r
+                                                               });\r
+                                                       }\r
+                                               }\r
+                                       });\r
+\r
+                                       m.add({\r
+                                               title : 'spellchecker.ignore_words',\r
+                                               onclick : function() {\r
+                                                       var word = wordSpan.innerHTML;\r
+\r
+                                                       t._removeWords(dom.decode(word));\r
+                                                       t._checkDone();\r
+\r
+                                                       // tell the server if we need to\r
+                                                       if (ignoreRpc) {\r
+                                                               ed.setProgressState(1);\r
+                                                               t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) {\r
+                                                                       ed.setProgressState(0);\r
+                                                               });\r
+                                                       }\r
+                                               }\r
+                                       });\r
+\r
+                                       if (t.editor.getParam("spellchecker_enable_learn_rpc")) {\r
+                                               m.add({\r
+                                                       title : 'spellchecker.learn_word',\r
+                                                       onclick : function() {\r
+                                                               var word = wordSpan.innerHTML;\r
+\r
+                                                               dom.remove(wordSpan, 1);\r
+                                                               t._checkDone();\r
+\r
+                                                               ed.setProgressState(1);\r
+                                                               t._sendRPC('learnWord', [t.selectedLang, word], function(r) {\r
+                                                                       ed.setProgressState(0);\r
+                                                               });\r
+                                                       }\r
+                                               });\r
+                                       }\r
+\r
+                                       m.update();\r
+                               });\r
+\r
+                               p1 = DOM.getPos(ed.getContentAreaContainer());\r
+                               m.settings.offset_x = p1.x;\r
+                               m.settings.offset_y = p1.y;\r
+\r
+                               ed.selection.select(wordSpan);\r
+                               p1 = dom.getPos(wordSpan);\r
+                               m.showMenu(p1.x, p1.y + wordSpan.offsetHeight - vp.y);\r
+\r
+                               return tinymce.dom.Event.cancel(e);\r
+                       } else\r
+                               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
+                       if (!o)\r
+                               t._done();\r
+               },\r
+\r
+               _done : function() {\r
+                       var t = this, la = t.active;\r
+\r
+                       if (t.active) {\r
+                               t.active = 0;\r
+                               t._removeWords();\r
+\r
+                               if (t._menu)\r
+                                       t._menu.hideMenu();\r
+\r
+                               if (la)\r
+                                       t.editor.nodeChanged();\r
+                       }\r
+               },\r
+\r
+               _sendRPC : function(m, p, cb) {\r
+                       var t = this;\r
+\r
+                       JSONRequest.sendRPC({\r
+                               url : t.rpcUrl,\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
+       // Register plugin\r
+       tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin);\r
+})();\r
diff --git a/webcit/tiny_mce/plugins/spellchecker/img/wline.gif b/webcit/tiny_mce/plugins/spellchecker/img/wline.gif
new file mode 100644 (file)
index 0000000..7d0a4db
Binary files /dev/null and b/webcit/tiny_mce/plugins/spellchecker/img/wline.gif differ
diff --git a/webcit/tiny_mce/plugins/style/css/props.css b/webcit/tiny_mce/plugins/style/css/props.css
new file mode 100644 (file)
index 0000000..eb1f264
--- /dev/null
@@ -0,0 +1,13 @@
+#text_font {width:250px;}\r
+#text_size {width:70px;}\r
+.mceAddSelectValue {background:#DDD;}\r
+select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {width:70px;}\r
+#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {width:70px;}\r
+#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {width:70px;}\r
+#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {width:70px;}\r
+.panel_wrapper div.current {padding-top:10px;height:230px;}\r
+.delim {border-left:1px solid gray;}\r
+.tdelim {border-bottom:1px solid gray;}\r
+#block_display {width:145px;}\r
+#list_type {width:115px;}\r
+.disabled {background:#EEE;}\r
diff --git a/webcit/tiny_mce/plugins/style/editor_plugin.js b/webcit/tiny_mce/plugins/style/editor_plugin.js
new file mode 100644 (file)
index 0000000..cab2153
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.StylePlugin",{init:function(a,b){a.addCommand("mceStyleProps",function(){a.windowManager.open({file:b+"/props.htm",width:480+parseInt(a.getLang("style.delta_width",0)),height:320+parseInt(a.getLang("style.delta_height",0)),inline:1},{plugin_url:b,style_text:a.selection.getNode().style.cssText})});a.addCommand("mceSetElementStyle",function(d,c){if(e=a.selection.getNode()){a.dom.setAttrib(e,"style",c);a.execCommand("mceRepaint")}});a.onNodeChange.add(function(d,c,f){c.setDisabled("styleprops",f.nodeName==="BODY")});a.addButton("styleprops",{title:"style.desc",cmd:"mceStyleProps"})},getInfo:function(){return{longname:"Style",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("style",tinymce.plugins.StylePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/editor_plugin_src.js b/webcit/tiny_mce/plugins/style/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..5f7755f
--- /dev/null
@@ -0,0 +1,55 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.StylePlugin', {\r
+               init : function(ed, url) {\r
+                       // Register commands\r
+                       ed.addCommand('mceStyleProps', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/props.htm',\r
+                                       width : 480 + parseInt(ed.getLang('style.delta_width', 0)),\r
+                                       height : 320 + parseInt(ed.getLang('style.delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url,\r
+                                       style_text : ed.selection.getNode().style.cssText\r
+                               });\r
+                       });\r
+\r
+                       ed.addCommand('mceSetElementStyle', function(ui, v) {\r
+                               if (e = ed.selection.getNode()) {\r
+                                       ed.dom.setAttrib(e, 'style', v);\r
+                                       ed.execCommand('mceRepaint');\r
+                               }\r
+                       });\r
+\r
+                       ed.onNodeChange.add(function(ed, cm, n) {\r
+                               cm.setDisabled('styleprops', n.nodeName === 'BODY');\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('styleprops', {title : 'style.desc', cmd : 'mceStyleProps'});\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Style',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('style', tinymce.plugins.StylePlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/js/props.js b/webcit/tiny_mce/plugins/style/js/props.js
new file mode 100644 (file)
index 0000000..6800a9a
--- /dev/null
@@ -0,0 +1,635 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var defaultFonts = "" + \r
+       "Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + \r
+       "Times New Roman, Times, serif=Times New Roman, Times, serif;" + \r
+       "Courier New, Courier, mono=Courier New, Courier, mono;" + \r
+       "Times New Roman, Times, serif=Times New Roman, Times, serif;" + \r
+       "Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + \r
+       "Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + \r
+       "Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif";\r
+\r
+var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger";\r
+var defaultMeasurement = "+pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%";\r
+var defaultSpacingMeasurement = "pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;+ems=em;exs=ex;%";\r
+var defaultIndentMeasurement = "pixels=px;+points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%";\r
+var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900";\r
+var defaultTextStyle = "normal;italic;oblique";\r
+var defaultVariant = "normal;small-caps";\r
+var defaultLineHeight = "normal";\r
+var defaultAttachment = "fixed;scroll";\r
+var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y";\r
+var defaultPosH = "left;center;right";\r
+var defaultPosV = "top;center;bottom";\r
+var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom";\r
+var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none";\r
+var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset";\r
+var defaultBorderWidth = "thin;medium;thick";\r
+var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none";\r
+\r
+function init() {\r
+       var ce = document.getElementById('container'), h;\r
+\r
+       ce.style.cssText = tinyMCEPopup.getWindowArg('style_text');\r
+\r
+       h = getBrowserHTML('background_image_browser','background_image','image','advimage');\r
+       document.getElementById("background_image_browser").innerHTML = h;\r
+\r
+       document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color');\r
+       document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color');\r
+       document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top');\r
+       document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right');\r
+       document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom');\r
+       document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left');\r
+\r
+       fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true);\r
+       fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true);\r
+       fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true);\r
+       fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true);\r
+       fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true);\r
+       fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true);\r
+       fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true);\r
+       fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true);\r
+       fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true);\r
+\r
+       fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true);\r
+       fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true);\r
+\r
+       fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true);\r
+       fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true);\r
+       fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true);\r
+       fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true);\r
+       fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true);\r
+       fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true);\r
+       fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true);\r
+       fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true);\r
+       fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true);\r
+       fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true);\r
+       fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true);\r
+       fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true);\r
+       fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true);\r
+       fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true);\r
+\r
+       fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true);\r
+       fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true);\r
+       fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true);\r
+       fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true);\r
+\r
+       fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true);\r
+       fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true);\r
+\r
+       fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true);\r
+       fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true);\r
+\r
+       fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true);\r
+\r
+       fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true);\r
+\r
+       TinyMCE_EditableSelects.init();\r
+       setupFormData();\r
+       showDisabledControls();\r
+}\r
+\r
+function setupFormData() {\r
+       var ce = document.getElementById('container'), f = document.forms[0], s, b, i;\r
+\r
+       // Setup text fields\r
+\r
+       selectByValue(f, 'text_font', ce.style.fontFamily, true, true);\r
+       selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true);\r
+       selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize));\r
+       selectByValue(f, 'text_weight', ce.style.fontWeight, true, true);\r
+       selectByValue(f, 'text_style', ce.style.fontStyle, true, true);\r
+       selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true);\r
+       selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight));\r
+       selectByValue(f, 'text_case', ce.style.textTransform, true, true);\r
+       selectByValue(f, 'text_variant', ce.style.fontVariant, true, true);\r
+       f.text_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.color);\r
+       updateColor('text_color_pick', 'text_color');\r
+       f.text_underline.checked = inStr(ce.style.textDecoration, 'underline');\r
+       f.text_overline.checked = inStr(ce.style.textDecoration, 'overline');\r
+       f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through');\r
+       f.text_blink.checked = inStr(ce.style.textDecoration, 'blink');\r
+\r
+       // Setup background fields\r
+\r
+       f.background_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.backgroundColor);\r
+       updateColor('background_color_pick', 'background_color');\r
+       f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true);\r
+       selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true);\r
+       selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true);\r
+       selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0)));\r
+       selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true);\r
+       selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1)));\r
+\r
+       // Setup block fields\r
+\r
+       selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true);\r
+       selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing));\r
+       selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true);\r
+       selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing));\r
+       selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true);\r
+       selectByValue(f, 'block_text_align', ce.style.textAlign, true, true);\r
+       f.block_text_indent.value = getNum(ce.style.textIndent);\r
+       selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent));\r
+       selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true);\r
+       selectByValue(f, 'block_display', ce.style.display, true, true);\r
+\r
+       // Setup box fields\r
+\r
+       f.box_width.value = getNum(ce.style.width);\r
+       selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width));\r
+\r
+       f.box_height.value = getNum(ce.style.height);\r
+       selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height));\r
+       selectByValue(f, 'box_float', ce.style.cssFloat || ce.style.styleFloat, true, true);\r
+\r
+       selectByValue(f, 'box_clear', ce.style.clear, true, true);\r
+\r
+       setupBox(f, ce, 'box_padding', 'padding', '');\r
+       setupBox(f, ce, 'box_margin', 'margin', '');\r
+\r
+       // Setup border fields\r
+\r
+       setupBox(f, ce, 'border_style', 'border', 'Style');\r
+       setupBox(f, ce, 'border_width', 'border', 'Width');\r
+       setupBox(f, ce, 'border_color', 'border', 'Color');\r
+\r
+       updateColor('border_color_top_pick', 'border_color_top');\r
+       updateColor('border_color_right_pick', 'border_color_right');\r
+       updateColor('border_color_bottom_pick', 'border_color_bottom');\r
+       updateColor('border_color_left_pick', 'border_color_left');\r
+\r
+       f.elements.border_color_top.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_top.value);\r
+       f.elements.border_color_right.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_right.value);\r
+       f.elements.border_color_bottom.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_bottom.value);\r
+       f.elements.border_color_left.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_left.value);\r
+\r
+       // Setup list fields\r
+\r
+       selectByValue(f, 'list_type', ce.style.listStyleType, true, true);\r
+       selectByValue(f, 'list_position', ce.style.listStylePosition, true, true);\r
+       f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+\r
+       // Setup box fields\r
+\r
+       selectByValue(f, 'positioning_type', ce.style.position, true, true);\r
+       selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true);\r
+       selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true);\r
+       f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : "";\r
+\r
+       f.positioning_width.value = getNum(ce.style.width);\r
+       selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width));\r
+\r
+       f.positioning_height.value = getNum(ce.style.height);\r
+       selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height));\r
+\r
+       setupBox(f, ce, 'positioning_placement', '', '', ['top', 'right', 'bottom', 'left']);\r
+\r
+       s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       s = s.replace(/,/g, ' ');\r
+\r
+       if (!hasEqualValues([getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)])) {\r
+               f.positioning_clip_top.value = getNum(getVal(s, 0));\r
+               selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));\r
+               f.positioning_clip_right.value = getNum(getVal(s, 1));\r
+               selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1)));\r
+               f.positioning_clip_bottom.value = getNum(getVal(s, 2));\r
+               selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2)));\r
+               f.positioning_clip_left.value = getNum(getVal(s, 3));\r
+               selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3)));\r
+       } else {\r
+               f.positioning_clip_top.value = getNum(getVal(s, 0));\r
+               selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));\r
+               f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value;\r
+       }\r
+\r
+//     setupBox(f, ce, '', 'border', 'Color');\r
+}\r
+\r
+function getMeasurement(s) {\r
+       return s.replace(/^([0-9.]+)(.*)$/, "$2");\r
+}\r
+\r
+function getNum(s) {\r
+       if (new RegExp('^(?:[0-9.]+)(?:[a-z%]+)$', 'gi').test(s))\r
+               return s.replace(/[^0-9.]/g, '');\r
+\r
+       return s;\r
+}\r
+\r
+function inStr(s, n) {\r
+       return new RegExp(n, 'gi').test(s);\r
+}\r
+\r
+function getVal(s, i) {\r
+       var a = s.split(' ');\r
+\r
+       if (a.length > 1)\r
+               return a[i];\r
+\r
+       return "";\r
+}\r
+\r
+function setValue(f, n, v) {\r
+       if (f.elements[n].type == "text")\r
+               f.elements[n].value = v;\r
+       else\r
+               selectByValue(f, n, v, true, true);\r
+}\r
+\r
+function setupBox(f, ce, fp, pr, sf, b) {\r
+       if (typeof(b) == "undefined")\r
+               b = ['Top', 'Right', 'Bottom', 'Left'];\r
+\r
+       if (isSame(ce, pr, sf, b)) {\r
+               f.elements[fp + "_same"].checked = true;\r
+\r
+               setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));\r
+               f.elements[fp + "_top"].disabled = false;\r
+\r
+               f.elements[fp + "_right"].value = "";\r
+               f.elements[fp + "_right"].disabled = true;\r
+               f.elements[fp + "_bottom"].value = "";\r
+               f.elements[fp + "_bottom"].disabled = true;\r
+               f.elements[fp + "_left"].value = "";\r
+               f.elements[fp + "_left"].disabled = true;\r
+\r
+               if (f.elements[fp + "_top_measurement"]) {\r
+                       selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));\r
+                       f.elements[fp + "_left_measurement"].disabled = true;\r
+                       f.elements[fp + "_bottom_measurement"].disabled = true;\r
+                       f.elements[fp + "_right_measurement"].disabled = true;\r
+               }\r
+       } else {\r
+               f.elements[fp + "_same"].checked = false;\r
+\r
+               setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));\r
+               f.elements[fp + "_top"].disabled = false;\r
+\r
+               setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf]));\r
+               f.elements[fp + "_right"].disabled = false;\r
+\r
+               setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf]));\r
+               f.elements[fp + "_bottom"].disabled = false;\r
+\r
+               setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf]));\r
+               f.elements[fp + "_left"].disabled = false;\r
+\r
+               if (f.elements[fp + "_top_measurement"]) {\r
+                       selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));\r
+                       selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf]));\r
+                       selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf]));\r
+                       selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf]));\r
+                       f.elements[fp + "_left_measurement"].disabled = false;\r
+                       f.elements[fp + "_bottom_measurement"].disabled = false;\r
+                       f.elements[fp + "_right_measurement"].disabled = false;\r
+               }\r
+       }\r
+}\r
+\r
+function isSame(e, pr, sf, b) {\r
+       var a = [], i, x;\r
+\r
+       if (typeof(b) == "undefined")\r
+               b = ['Top', 'Right', 'Bottom', 'Left'];\r
+\r
+       if (typeof(sf) == "undefined" || sf == null)\r
+               sf = "";\r
+\r
+       a[0] = e.style[pr + b[0] + sf];\r
+       a[1] = e.style[pr + b[1] + sf];\r
+       a[2] = e.style[pr + b[2] + sf];\r
+       a[3] = e.style[pr + b[3] + sf];\r
+\r
+       for (i=0; i<a.length; i++) {\r
+               if (a[i] == null)\r
+                       return false;\r
+\r
+               for (x=0; x<a.length; x++) {\r
+                       if (a[x] != a[i])\r
+                               return false;\r
+               }\r
+       }\r
+\r
+       return true;\r
+};\r
+\r
+function hasEqualValues(a) {\r
+       var i, x;\r
+\r
+       for (i=0; i<a.length; i++) {\r
+               if (a[i] == null)\r
+                       return false;\r
+\r
+               for (x=0; x<a.length; x++) {\r
+                       if (a[x] != a[i])\r
+                               return false;\r
+               }\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+function applyAction() {\r
+       var ce = document.getElementById('container'), ed = tinyMCEPopup.editor;\r
+\r
+       generateCSS();\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       ed.dom.setAttrib(ed.selection.getSelectedBlocks(), 'style', tinyMCEPopup.editor.dom.serializeStyle(tinyMCEPopup.editor.dom.parseStyle(ce.style.cssText)));\r
+}\r
+\r
+function updateAction() {\r
+       applyAction();\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function generateCSS() {\r
+       var ce = document.getElementById('container'), f = document.forms[0], num = new RegExp('[0-9]+', 'g'), s, t;\r
+\r
+       ce.style.cssText = "";\r
+\r
+       // Build text styles\r
+       ce.style.fontFamily = f.text_font.value;\r
+       ce.style.fontSize = f.text_size.value + (isNum(f.text_size.value) ? (f.text_size_measurement.value || 'px') : "");\r
+       ce.style.fontStyle = f.text_style.value;\r
+       ce.style.lineHeight = f.text_lineheight.value + (isNum(f.text_lineheight.value) ? f.text_lineheight_measurement.value : "");\r
+       ce.style.textTransform = f.text_case.value;\r
+       ce.style.fontWeight = f.text_weight.value;\r
+       ce.style.fontVariant = f.text_variant.value;\r
+       ce.style.color = f.text_color.value;\r
+\r
+       s = "";\r
+       s += f.text_underline.checked ? " underline" : "";\r
+       s += f.text_overline.checked ? " overline" : "";\r
+       s += f.text_linethrough.checked ? " line-through" : "";\r
+       s += f.text_blink.checked ? " blink" : "";\r
+       s = s.length > 0 ? s.substring(1) : s;\r
+\r
+       if (f.text_none.checked)\r
+               s = "none";\r
+\r
+       ce.style.textDecoration = s;\r
+\r
+       // Build background styles\r
+\r
+       ce.style.backgroundColor = f.background_color.value;\r
+       ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : "";\r
+       ce.style.backgroundRepeat = f.background_repeat.value;\r
+       ce.style.backgroundAttachment = f.background_attachment.value;\r
+\r
+       if (f.background_hpos.value != "") {\r
+               s = "";\r
+               s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " ";\r
+               s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : "");\r
+               ce.style.backgroundPosition = s;\r
+       }\r
+\r
+       // Build block styles\r
+\r
+       ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : "");\r
+       ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : "");\r
+       ce.style.verticalAlign = f.block_vertical_alignment.value;\r
+       ce.style.textAlign = f.block_text_align.value;\r
+       ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : "");\r
+       ce.style.whiteSpace = f.block_whitespace.value;\r
+       ce.style.display = f.block_display.value;\r
+\r
+       // Build box styles\r
+\r
+       ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : "");\r
+       ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : "");\r
+       ce.style.styleFloat = f.box_float.value;\r
+       ce.style.cssFloat = f.box_float.value;\r
+\r
+       ce.style.clear = f.box_clear.value;\r
+\r
+       if (!f.box_padding_same.checked) {\r
+               ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");\r
+               ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : "");\r
+               ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : "");\r
+               ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : "");\r
+       } else\r
+               ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");               \r
+\r
+       if (!f.box_margin_same.checked) {\r
+               ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");\r
+               ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : "");\r
+               ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : "");\r
+               ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : "");\r
+       } else\r
+               ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");           \r
+\r
+       // Build border styles\r
+\r
+       if (!f.border_style_same.checked) {\r
+               ce.style.borderTopStyle = f.border_style_top.value;\r
+               ce.style.borderRightStyle = f.border_style_right.value;\r
+               ce.style.borderBottomStyle = f.border_style_bottom.value;\r
+               ce.style.borderLeftStyle = f.border_style_left.value;\r
+       } else\r
+               ce.style.borderStyle = f.border_style_top.value;\r
+\r
+       if (!f.border_width_same.checked) {\r
+               ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : "");\r
+               ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : "");\r
+               ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : "");\r
+               ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : "");\r
+       } else\r
+               ce.style.borderWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : "");\r
+\r
+       if (!f.border_color_same.checked) {\r
+               ce.style.borderTopColor = f.border_color_top.value;\r
+               ce.style.borderRightColor = f.border_color_right.value;\r
+               ce.style.borderBottomColor = f.border_color_bottom.value;\r
+               ce.style.borderLeftColor = f.border_color_left.value;\r
+       } else\r
+               ce.style.borderColor = f.border_color_top.value;\r
+\r
+       // Build list styles\r
+\r
+       ce.style.listStyleType = f.list_type.value;\r
+       ce.style.listStylePosition = f.list_position.value;\r
+       ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : "";\r
+\r
+       // Build positioning styles\r
+\r
+       ce.style.position = f.positioning_type.value;\r
+       ce.style.visibility = f.positioning_visibility.value;\r
+\r
+       if (ce.style.width == "")\r
+               ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : "");\r
+\r
+       if (ce.style.height == "")\r
+               ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : "");\r
+\r
+       ce.style.zIndex = f.positioning_zindex.value;\r
+       ce.style.overflow = f.positioning_overflow.value;\r
+\r
+       if (!f.positioning_placement_same.checked) {\r
+               ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");\r
+               ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : "");\r
+               ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : "");\r
+               ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : "");\r
+       } else {\r
+               s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");\r
+               ce.style.top = s;\r
+               ce.style.right = s;\r
+               ce.style.bottom = s;\r
+               ce.style.left = s;\r
+       }\r
+\r
+       if (!f.positioning_clip_same.checked) {\r
+               s = "rect(";\r
+               s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " ";\r
+               s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " ";\r
+               s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " ";\r
+               s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto");\r
+               s += ")";\r
+\r
+               if (s != "rect(auto auto auto auto)")\r
+                       ce.style.clip = s;\r
+       } else {\r
+               s = "rect(";\r
+               t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto";\r
+               s += t + " ";\r
+               s += t + " ";\r
+               s += t + " ";\r
+               s += t + ")";\r
+\r
+               if (s != "rect(auto auto auto auto)")\r
+                       ce.style.clip = s;\r
+       }\r
+\r
+       ce.style.cssText = ce.style.cssText;\r
+}\r
+\r
+function isNum(s) {\r
+       return new RegExp('[0-9]+', 'g').test(s);\r
+}\r
+\r
+function showDisabledControls() {\r
+       var f = document.forms, i, a;\r
+\r
+       for (i=0; i<f.length; i++) {\r
+               for (a=0; a<f[i].elements.length; a++) {\r
+                       if (f[i].elements[a].disabled)\r
+                               tinyMCEPopup.editor.dom.addClass(f[i].elements[a], "disabled");\r
+                       else\r
+                               tinyMCEPopup.editor.dom.removeClass(f[i].elements[a], "disabled");\r
+               }\r
+       }\r
+}\r
+\r
+function fillSelect(f, s, param, dval, sep, em) {\r
+       var i, ar, p, se;\r
+\r
+       f = document.forms[f];\r
+       sep = typeof(sep) == "undefined" ? ";" : sep;\r
+\r
+       if (em)\r
+               addSelectValue(f, s, "", "");\r
+\r
+       ar = tinyMCEPopup.getParam(param, dval).split(sep);\r
+       for (i=0; i<ar.length; i++) {\r
+               se = false;\r
+\r
+               if (ar[i].charAt(0) == '+') {\r
+                       ar[i] = ar[i].substring(1);\r
+                       se = true;\r
+               }\r
+\r
+               p = ar[i].split('=');\r
+\r
+               if (p.length > 1) {\r
+                       addSelectValue(f, s, p[0], p[1]);\r
+\r
+                       if (se)\r
+                               selectByValue(f, s, p[1]);\r
+               } else {\r
+                       addSelectValue(f, s, p[0], p[0]);\r
+\r
+                       if (se)\r
+                               selectByValue(f, s, p[0]);\r
+               }\r
+       }\r
+}\r
+\r
+function toggleSame(ce, pre) {\r
+       var el = document.forms[0].elements, i;\r
+\r
+       if (ce.checked) {\r
+               el[pre + "_top"].disabled = false;\r
+               el[pre + "_right"].disabled = true;\r
+               el[pre + "_bottom"].disabled = true;\r
+               el[pre + "_left"].disabled = true;\r
+\r
+               if (el[pre + "_top_measurement"]) {\r
+                       el[pre + "_top_measurement"].disabled = false;\r
+                       el[pre + "_right_measurement"].disabled = true;\r
+                       el[pre + "_bottom_measurement"].disabled = true;\r
+                       el[pre + "_left_measurement"].disabled = true;\r
+               }\r
+       } else {\r
+               el[pre + "_top"].disabled = false;\r
+               el[pre + "_right"].disabled = false;\r
+               el[pre + "_bottom"].disabled = false;\r
+               el[pre + "_left"].disabled = false;\r
+\r
+               if (el[pre + "_top_measurement"]) {\r
+                       el[pre + "_top_measurement"].disabled = false;\r
+                       el[pre + "_right_measurement"].disabled = false;\r
+                       el[pre + "_bottom_measurement"].disabled = false;\r
+                       el[pre + "_left_measurement"].disabled = false;\r
+               }\r
+       }\r
+\r
+       showDisabledControls();\r
+}\r
+\r
+function synch(fr, to) {\r
+       var f = document.forms[0];\r
+\r
+       f.elements[to].value = f.elements[fr].value;\r
+\r
+       if (f.elements[fr + "_measurement"])\r
+               selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value);\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/webcit/tiny_mce/plugins/style/langs/bg_dlg.js b/webcit/tiny_mce/plugins/style/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..ed26e0e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.style_dlg',{"text_lineheight":"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430 \u043d\u0430 \u0440\u0435\u0434\u0430","text_variant":"\u041f\u0440\u043e\u043c\u0435\u043d\u043b\u0438\u0432","text_style":"\u0421\u0442\u0438\u043b","text_weight":"\u0422\u0435\u0433\u043b\u043e","text_size":"\u0420\u0430\u0437\u043c\u0435\u0440","text_font":"\u0428\u0440\u0438\u0444\u0442","text_props":"\u0422\u0435\u043a\u0441\u0442","positioning_tab":"\u041f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0430\u043d\u0435","list_tab":"\u0421\u043f\u0438\u0441\u044a\u043a","border_tab":"\u0420\u0430\u043c\u043a\u0430","box_tab":"\u041a\u0443\u0442\u0438\u044f","block_tab":"\u0411\u043b\u043e\u043a","background_tab":"\u0424\u043e\u043d","text_tab":"\u0422\u0435\u043a\u0441\u0442",apply:"\u041f\u043e\u0442\u0432\u044a\u0440\u0434\u0438",title:"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 CSS \u0441\u0442\u0438\u043b",clip:"\u041e\u0442\u0440\u0435\u0436\u0438",placement:"\u0420\u0430\u0437\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435",overflow:"Overflow",zindex:"Z-index",visibility:"\u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442","positioning_type":"\u0422\u0438\u043f",position:"\u041f\u043e\u0437\u0438\u0446\u0438\u044f","bullet_image":"\u0413\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u0432\u043e\u0434\u0430\u0447\u0438\u0442\u0435","list_type":"\u0422\u0438\u043f",color:"\u0426\u0432\u044f\u0442",height:"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",style:"\u0421\u0442\u0438\u043b",margin:"Margin",left:"\u041b\u044f\u0432\u043e",bottom:"\u0414\u043e\u043b\u0443",right:"\u0414\u044f\u0441\u043d\u043e",top:"\u0413\u043e\u0440\u0435",same:"\u0417\u0430 \u0432\u0441\u0438\u0447\u043a\u0438",padding:"Padding","box_clear":"\u0418\u0437\u0447\u0438\u0441\u0442\u0438","box_float":"Float","box_height":"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430","box_width":"\u0428\u0438\u0440\u0438\u043d\u0430","block_display":"\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435","block_whitespace":"\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b","block_text_indent":"\u041e\u0442\u0441\u0442\u044a\u043f \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430","block_text_align":"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430","block_vertical_alignment":"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435","block_letterspacing":"\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0431\u0443\u043a\u0432\u0438\u0442\u0435","block_wordspacing":"\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0443\u043c\u0438\u0442\u0435","background_vpos":"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f","background_hpos":"\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f","background_attachment":"\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u0438","background_repeat":"\u041f\u043e\u0432\u0442\u043e\u0440\u0438","background_image":"\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0437\u0430 \u0444\u043e\u043d","background_color":"\u0426\u0432\u044f\u0442 \u0437\u0430 \u0444\u043e\u043d","text_none":"\u043d\u0438\u0449\u043e","text_blink":"\u043c\u0438\u0433\u0430","text_case":"\u0420\u0435\u0433\u0438\u0441\u0442\u044a\u0440","text_striketrough":"\u0437\u0430\u0447\u0435\u0440\u0442\u0430\u043d","text_underline":"\u043f\u043e\u0434\u0447\u0435\u0440\u0442\u0430\u043d","text_overline":"\u043d\u0430\u0434\u0447\u0435\u0440\u0442\u0430\u043d","text_decoration":"\u0414\u0435\u043a\u043e\u0440\u0430\u0446\u0438\u044f","text_color":"\u0426\u0432\u044f\u0442",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/cs_dlg.js b/webcit/tiny_mce/plugins/style/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..76eb97f
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.style_dlg',{"text_lineheight":"V\u00fd\u0161ka \u0159\u00e1dku","text_variant":"Varianta","text_style":"Styl textu","text_weight":"Tu\u010dnost p\u00edsma","text_size":"Velikost","text_font":"P\u00edsmo","text_props":"Text","positioning_tab":"Um\u00edst\u011bn\u00ed","list_tab":"Seznam","border_tab":"Ohrani\u010den\u00ed","box_tab":"Box","block_tab":"Blok","background_tab":"Pozad\u00ed","text_tab":"Text",apply:"Pou\u017e\u00edt",title:"Upravit CSS styl",clip:"O\u0159ez\u00e1n\u00ed (clip)",placement:"Um\u00edst\u011bni",overflow:"P\u0159ete\u010den\u00ed (overflow)",zindex:"Z-index",visibility:"Viditelnost","positioning_type":"Typ",position:"Um\u00edst\u011bn\u00ed","bullet_image":"Styl odr\u00e1\u017eek","list_type":"Typ",color:"Barva",height:"V\u00fd\u0161ka",width:"\u0160\u00ed\u0159ka",style:"Styl",margin:"Okraje (margin)",left:"Vlevo",bottom:"Dole",right:"Vpravo",top:"Naho\u0159e",same:"Stejn\u00e9 pro v\u0161echny",padding:"Odsazen\u00ed (padding)","box_clear":"Vy\u010distit","box_float":"Plovouc\u00ed","box_height":"V\u00fd\u0161ka","box_width":"\u0160\u00ed\u0159ka","block_display":"Blokov\u00e9 zobrazen\u00ed","block_whitespace":"Zalamov\u00e1n\u00ed textu","block_text_indent":"Odsazen\u00ed textu","block_text_align":"Zarovn\u00e1n\u00ed textu","block_vertical_alignment":"Vertik\u00e1ln\u00ed zarovn\u00e1n\u00ed","block_letterspacing":"Rozestup znak\u016f","block_wordspacing":"Rozestup slov","background_vpos":"Vertik\u00e1ln\u00ed um\u00edst\u011bn\u00ed","background_hpos":"Horizont\u00e1ln\u00ed um\u00edst\u011bn\u00ed","background_attachment":"Rolov\u00e1n\u00ed","background_repeat":"Opakov\u00e1n\u00ed","background_image":"Obr\u00e1zek pozad\u00ed","background_color":"Barva pozad\u00ed","text_none":"\u017e\u00e1dn\u00e1","text_blink":"blik\u00e1n\u00ed","text_case":"Velk\u00e1 p\u00edsmena","text_striketrough":"p\u0159e\u0161krtnut\u00ed","text_underline":"podtr\u017een\u00ed","text_overline":"nadtr\u017een\u00ed","text_decoration":"Dekorace","text_color":"Barva",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/da_dlg.js b/webcit/tiny_mce/plugins/style/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..63d62e4
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.style_dlg',{"text_lineheight":"Linieh\u00f8jde","text_variant":"Variant","text_style":"Stil","text_weight":"V\u00e6gt","text_size":"St\u00f8rrelse","text_font":"Skrifttype","text_props":"Tekst","positioning_tab":"Positionering","list_tab":"Liste","border_tab":"Kant","box_tab":"Boks","block_tab":"Blok","background_tab":"Baggrund","text_tab":"Tekst",apply:"Anvend",title:"Rediger CSS stil",clip:"Klip",placement:"Placering",overflow:"Overl\u00f8b",zindex:"Z-index",visibility:"Synlighed","positioning_type":"Type",position:"Position","bullet_image":"Punktopstillings-billede","list_type":"Type",color:"Farve",height:"H\u00f8jde",width:"Bredde",style:"Style",margin:"Margin",left:"Venstre",bottom:"Bund",right:"H\u00f8jre",top:"Top",same:"Ens for alle",padding:"Afstand til indhold","box_clear":"Ryd","box_float":"Flydende","box_height":"H\u00f8jde","box_width":"Bredde","block_display":"Vis","block_whitespace":"Mellemrum","block_text_indent":"Tekstindrykning","block_text_align":"Tekstjustering","block_vertical_alignment":"Vertikal justering","block_letterspacing":"Afstand mellem bogstaver","block_wordspacing":"Afstand mellem ord","background_vpos":"Vertikal position","background_hpos":"Horisontal position","background_attachment":"Vedh\u00e6ftede fil","background_repeat":"Gentag","background_image":"Baggrundsbillede","background_color":"Baggrundsfarve","text_none":"ingen","text_blink":"blink","text_case":"Vesaltilstand","text_striketrough":"gennemstreget","text_underline":"understreget","text_overline":"overstreget","text_decoration":"Dekoration","text_color":"Farve",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/de_dlg.js b/webcit/tiny_mce/plugins/style/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..ad04664
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.style_dlg',{"text_lineheight":"Zeilenh\u00f6he","text_variant":"Variante","text_style":"Stil","text_weight":"Dicke","text_size":"Gr\u00f6\u00dfe","text_font":"Schriftart","text_props":"Text","positioning_tab":"Positionierung","list_tab":"Liste","border_tab":"Rahmen","box_tab":"Box","block_tab":"Block","background_tab":"Hintergrund","text_tab":"Text",apply:"\u00dcbernehmen",title:"CSS-Styles bearbeiten",clip:"Ausschnitt",placement:"Platzierung",overflow:"Verhalten bei \u00dcbergr\u00f6\u00dfe",zindex:"Z-Wert",visibility:"Sichtbar","positioning_type":"Art der Positionierung",position:"Positionierung","bullet_image":"Listenpunkt-Grafik","list_type":"Listenpunkt-Art",color:"Textfarbe",height:"H\u00f6he",width:"Breite",style:"Format",margin:"\u00c4u\u00dferer Abstand",left:"Links",bottom:"Unten",right:"Rechts",top:"Oben",same:"Alle gleich",padding:"Innerer Abstand","box_clear":"Umflie\u00dfung verhindern","box_float":"Umflie\u00dfung","box_height":"H\u00f6he","box_width":"Breite","block_display":"Umbruchverhalten","block_whitespace":"Automatischer Umbruch","block_text_indent":"Einr\u00fcckung","block_text_align":"Ausrichtung","block_vertical_alignment":"Vertikale Ausrichtung","block_letterspacing":"Buchstabenabstand","block_wordspacing":"Wortabstand","background_vpos":"Position Y","background_hpos":"Position X","background_attachment":"Wasserzeicheneffekt","background_repeat":"Wiederholung","background_image":"Hintergrundbild","background_color":"Hintergrundfarbe","text_none":"keine","text_blink":"blinkend","text_case":"Schreibung","text_striketrough":"durchgestrichen","text_underline":"unterstrichen","text_overline":"\u00fcberstrichen","text_decoration":"Gestaltung","text_color":"Farbe",text:"Text",background:"Hintergrund",block:"Block",box:"Box",border:"Rahmen",list:"Liste"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/el_dlg.js b/webcit/tiny_mce/plugins/style/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..9da2d86
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.style_dlg',{"text_lineheight":"\u038e\u03c8\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2","text_variant":"\u03a0\u03b1\u03c1\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae","text_style":"\u03a3\u03c4\u03c5\u03bb","text_weight":"\u0392\u03ac\u03c1\u03bf\u03c2","text_size":"\u039c\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ac\u03c4\u03c9\u03bd","text_font":"\u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac","text_props":"\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf","positioning_tab":"\u03a4\u03bf\u03c0\u03bf\u03b8\u03ad\u03c4\u03b7\u03c3\u03b7","list_tab":"\u039b\u03af\u03c3\u03c4\u03b1","border_tab":"\u03a0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf","box_tab":"\u039a\u03bf\u03c5\u03c4\u03af","block_tab":"\u039c\u03c0\u03bb\u03bf\u03ba","background_tab":"\u03a6\u03cc\u03bd\u03c4\u03bf","text_tab":"\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf",apply:"\u0395\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae",title:"\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03a3\u03c4\u03c5\u03bb CSS",clip:"Clip",placement:"\u03a4\u03bf\u03c0\u03bf\u03b8\u03ad\u03c4\u03b7\u03c3\u03b7",overflow:"\u03a5\u03c0\u03b5\u03c1\u03c7\u03b5\u03af\u03bb\u03b9\u03c3\u03b7",zindex:"Z-index",visibility:"\u039f\u03c1\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1","positioning_type":"\u03a4\u03cd\u03c0\u03bf\u03c2",position:"\u0398\u03ad\u03c3\u03b7","bullet_image":"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1 \u03c4\u03b5\u03bb\u03b5\u03af\u03b1\u03c2","list_type":"\u03a4\u03cd\u03c0\u03bf\u03c2",color:"\u03a7\u03c1\u03ce\u03bc\u03b1",height:"\u038e\u03c8\u03bf\u03c2",width:"\u03a0\u03bb\u03ac\u03c4\u03bf\u03c2",style:"\u03a3\u03c4\u03c5\u03bb",margin:"\u03a0\u03b5\u03c1\u03b9\u03b8\u03ce\u03c1\u03b9\u03bf",left:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",bottom:"\u039a\u03ac\u03c4\u03c9",right:"\u0394\u03b5\u03be\u03b9\u03ac",top:"\u03a0\u03ac\u03bd\u03c9",same:"\u038a\u03b4\u03b9\u03bf \u03b3\u03b9\u03b1 \u03cc\u03bb\u03b1",padding:"\u0393\u03ad\u03bc\u03b9\u03c3\u03bc\u03b1","box_clear":"Clear","box_float":"Float","box_height":"\u038e\u03c8\u03bf\u03c2","box_width":"\u03a0\u03bb\u03ac\u03c4\u03bf\u03c2","block_display":"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7","block_whitespace":"\u039a\u03b5\u03bd\u03cc\u03c2 \u03c7\u03ce\u03c1\u03bf\u03c2","block_text_indent":"\u0395\u03c3\u03bf\u03c7\u03ae \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5","block_text_align":"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5","block_vertical_alignment":"\u039a\u03b1\u03c4\u03b1\u03ba\u03cc\u03c1\u03c5\u03c6\u03b7 \u03c3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7","block_letterspacing":"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03c9\u03bd","block_wordspacing":"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03bb\u03ad\u03be\u03b5\u03c9\u03bd","background_vpos":"\u039a\u03b1\u03c4\u03b1\u03ba\u03cc\u03c1\u03c5\u03c6\u03b7 \u03b8\u03ad\u03c3\u03b7","background_hpos":"\u039f\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03b8\u03ad\u03c3\u03b7","background_attachment":"\u03a0\u03c1\u03bf\u03c3\u03ac\u03c1\u03c4\u03b7\u03bc\u03b1","background_repeat":"\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7","background_image":"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5","background_color":"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5","text_none":"\u039a\u03b1\u03bc\u03af\u03b1","text_blink":"\u039d\u03b1 \u03b1\u03bd\u03b1\u03b2\u03bf\u03c3\u03b2\u03ae\u03bd\u03b5\u03b9","text_case":"\u039a\u03b5\u03c6./\u039c\u03b9\u03ba\u03c1\u03ac","text_striketrough":"\u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03bc\u03bc\u03b9\u03c3\u03b7","text_underline":"\u03a5\u03c0\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b9\u03c3\u03b7","text_overline":"\u03a5\u03c0\u03b5\u03c1\u03b3\u03c1\u03ac\u03bc\u03bc\u03b9\u03c3\u03b7","text_decoration":"\u0394\u03b9\u03b1\u03ba\u03cc\u03c3\u03bc\u03b7\u03c3\u03b7","text_color":"\u03a7\u03c1\u03ce\u03bc\u03b1",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/en_dlg.js b/webcit/tiny_mce/plugins/style/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..9a1d4a2
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.style_dlg',{"text_lineheight":"Line Height","text_variant":"Variant","text_style":"Style","text_weight":"Weight","text_size":"Size","text_font":"Font","text_props":"Text","positioning_tab":"Positioning","list_tab":"List","border_tab":"Border","box_tab":"Box","block_tab":"Block","background_tab":"Background","text_tab":"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility","positioning_type":"Type",position:"Position","bullet_image":"Bullet Image","list_type":"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for All",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Height","box_width":"Width","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Text Indent","block_text_align":"Text Align","block_vertical_alignment":"Vertical Alignment","block_letterspacing":"Letter Spacing","block_wordspacing":"Word Spacing","background_vpos":"Vertical Position","background_hpos":"Horizontal Position","background_attachment":"Attachment","background_repeat":"Repeat","background_image":"Background Image","background_color":"Background Color","text_none":"None","text_blink":"Blink","text_case":"Case","text_striketrough":"Strikethrough","text_underline":"Underline","text_overline":"Overline","text_decoration":"Decoration","text_color":"Color",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/es_dlg.js b/webcit/tiny_mce/plugins/style/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..5c1cb61
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.style_dlg',{"text_lineheight":"Ancho de la fila","text_variant":"Variante","text_style":"Estilo","text_weight":"Peso","text_size":"Tama\u00f1o","text_font":"Fuente","text_props":"Texto","positioning_tab":"Posici\u00f3n","list_tab":"Lista","border_tab":"Borde","box_tab":"Caja","block_tab":"Bloque","background_tab":"Fondo","text_tab":"Texto",apply:"Aplicar",title:"Editar Estilo CSS",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibilidad","positioning_type":"Tipo",position:"Posici\u00f3n","bullet_image":"Imagen de la vi\u00f1eta","list_type":"Tipo",color:"Color",height:"Alto",width:"Ancho",style:"Estilo",margin:"Margen",left:"Izquierda",bottom:"Debajo",right:"Derecha",top:"Arriba",same:"Lo mismo en todos",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Alto","box_width":"Ancho","block_display":"Display","block_whitespace":"Espacio en blanco","block_text_indent":"Sangr\u00eda","block_text_align":"Alineaci\u00f3n del texto","block_vertical_alignment":"Alineaci\u00f3n vertical","block_letterspacing":"Espacio entre letra","block_wordspacing":"Espacio entre palabra","background_vpos":"Posici\u00f3n vertical","background_hpos":"Posici\u00f3n horizontal","background_attachment":"Adjunto","background_repeat":"Repetici\u00f3n","background_image":"Imagen de fondo","background_color":"Color de fondo","text_none":"Ninguno","text_blink":"Parpadeo","text_case":"Min\u00fas./May\u00fas.","text_striketrough":"Tachado","text_underline":"Subrayado","text_overline":"Subrayado superior","text_decoration":"Decorativos","text_color":"Color",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/et_dlg.js b/webcit/tiny_mce/plugins/style/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..bbd3efd
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.style_dlg',{"text_lineheight":"Joone k\u00f5rgus","text_variant":"Variant","text_style":"Stiil","text_weight":"Raskus","text_size":"Suurus","text_font":"Font","text_props":"Tekst","positioning_tab":"Positsioneerimine","list_tab":"Nimekiri","border_tab":"Raam","box_tab":"Kast","block_tab":"Plokk","background_tab":"Taust","text_tab":"Tekst",apply:"Rakenda",title:"Muuda CSS stiili",clip:"Klipp",placement:"Asetus",overflow:"\u00dclevool",zindex:"Z-viit",visibility:"N\u00e4htavus","positioning_type":"T\u00fc\u00fcp",position:"Positsioon","bullet_image":"Punkt pilt","list_type":"T\u00fc\u00fcp",color:"V\u00e4rv",height:"K\u00f5rgus",width:"Laius",style:"Stiil",margin:"Serv",left:"Vasakul",bottom:"All",right:"Paremal",top:"\u00dcleval",same:"Sama k\u00f5igile",padding:"T\u00e4idis","box_clear":"Puhas","box_float":"H\u00f5ljuv","box_height":"K\u00f5rgus","box_width":"Laius","block_display":"Kuva","block_whitespace":"T\u00fchimik","block_text_indent":"Teksti taandus","block_text_align":"Teksti joondus","block_vertical_alignment":"Vertikaalne joondus","block_letterspacing":"T\u00e4he avardamine","block_wordspacing":"S\u00f5nade avardamine","background_vpos":"Vertikaalne asend","background_hpos":"Horisontaalne asend","background_attachment":"Manus","background_repeat":"Kordus","background_image":"Tausta pilt","background_color":"Tausta v\u00e4rv","text_none":"mitte \u00fckski","text_blink":"vilgutus","text_case":"Kast","text_striketrough":"l\u00e4bikriipsutus","text_underline":"alajoon","text_overline":"\u00fclejoon","text_decoration":"Dekoratioon","text_color":"V\u00e4rv",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/fi_dlg.js b/webcit/tiny_mce/plugins/style/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..4f174cc
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.style_dlg',{"text_lineheight":"Rivin korkeus","text_variant":"Variantti","text_style":"Tyyli","text_weight":"Paino","text_size":"Koko","text_font":"Kirjasin","text_props":"Teksti","positioning_tab":"Sijainti","list_tab":"Lista","border_tab":"Kehys","box_tab":"Laatikko","block_tab":"Palkki","background_tab":"Tausta","text_tab":"Teksti",apply:"K\u00e4yt\u00e4",title:"Muokkaa CSS-tyyli\u00e4",clip:"Leike",placement:"Sijoittelu",overflow:"Ylivuoto",zindex:"Z-indeksi",visibility:"N\u00e4kyvyys","positioning_type":"Tyyppi",position:"Sijainti","bullet_image":"Listauskuva","list_type":"Tyyppi",color:"V\u00e4ri",height:"Korkeus",width:"Leveys",style:"Tyyli",margin:"Marginaali",left:"Vasemmalla",bottom:"Alhaalla",right:"Oikealla",top:"Ylh\u00e4\u00e4ll\u00e4",same:"Sama kaikille",padding:"Tyhj\u00e4 tila","box_clear":"Nollaus","box_float":"Kellunta","box_height":"Korkeus","box_width":"Leveys","block_display":"N\u00e4ytt\u00f6","block_whitespace":"Tyhj\u00e4 tila","block_text_indent":"Tekstin sisennys","block_text_align":"Tekstin asettelu","block_vertical_alignment":"Pystyasettelu","block_letterspacing":"Kirjainten v\u00e4listys","block_wordspacing":"Sanojen v\u00e4listys","background_vpos":"Pystyasettelu","background_hpos":"Vaaka-asettelu","background_attachment":"Liite","background_repeat":"Toistuvuus","background_image":"Taustakuva","background_color":"Taustav\u00e4ri","text_none":"ei mit\u00e4\u00e4n","text_blink":"V\u00e4l\u00e4hdys","text_case":"Isot/pienet kirjaimet","text_striketrough":"Yliviivattu","text_underline":"Alleviivattu (Ctrl+U)","text_overline":"Yliviivattu","text_decoration":"Koristelu","text_color":"V\u00e4ri",text:"Teksti",background:"Tausta",block:"Lohko",box:"Laatikko",border:"Reunus",list:"Lista"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/fr_dlg.js b/webcit/tiny_mce/plugins/style/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..8ab5e6c
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.style_dlg',{"text_lineheight":"Hauteur de ligne","text_variant":"Variante","text_style":"Style","text_weight":"Gras","text_size":"Taille","text_font":"Police","text_props":"Texte","positioning_tab":"Positionnement","list_tab":"Liste","border_tab":"Bordure","box_tab":"Bo\u00eete","block_tab":"Bloc","background_tab":"Fond","text_tab":"Texte",apply:"Appliquer",title:"\u00c9diter la feuille de style",clip:"Clip",placement:"Placement",overflow:"D\u00e9bordement",zindex:"Z-index",visibility:"Visibilit\u00e9","positioning_type":"Type",position:"Position","bullet_image":"Image de puce","list_type":"Type",color:"Couleur",height:"Hauteur",width:"Largeur",style:"Style",margin:"Marge",left:"Gauche",bottom:"Bas",right:"Droit",top:"Haut",same:"Identique pour tous",padding:"Espacement","box_clear":"Vider","box_float":"Flottant","box_height":"Hauteur","box_width":"Largeur","block_display":"Affichage","block_whitespace":"Fin de ligne","block_text_indent":"Indentation du texte","block_text_align":"Alignement du texte","block_vertical_alignment":"Alignement vertical","block_letterspacing":"Espacement des lettres","block_wordspacing":"Espacement des mots ","background_vpos":"Position verticale","background_hpos":"Position horizontale","background_attachment":"Attachement","background_repeat":"R\u00e9p\u00e9ter","background_image":"Image de fond","background_color":"Couleur de fond","text_none":"aucun","text_blink":"clignotant","text_case":"Casse","text_striketrough":"barr\u00e9","text_underline":"soulign\u00e9","text_overline":"ligne au-dessus","text_decoration":"D\u00e9coration","text_color":"Couleur",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/hu_dlg.js b/webcit/tiny_mce/plugins/style/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..36f9766
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.style_dlg',{"text_lineheight":"Sormagass\u00e1g","text_variant":"V\u00e1ltozat","text_style":"St\u00edlus","text_weight":"Sz\u00e9less\u00e9g","text_size":"M\u00e9ret","text_font":"Bet\u0171t\u00edpus","text_props":"Sz\u00f6veg","positioning_tab":"Poz\u00edci\u00f3","list_tab":"Lista","border_tab":"Keret","box_tab":"Doboz","block_tab":"Blokk","background_tab":"H\u00e1tt\u00e9r","text_tab":"Sz\u00f6veg",apply:"Alkalmaz",title:"CSS st\u00edlus szerkest\u00e9se",clip:"Lev\u00e1g\u00e1s",placement:"Elhelyez\u00e9s",overflow:"Kifut\u00e1s",zindex:"Z-index",visibility:"L\u00e1that\u00f3s\u00e1g","positioning_type":"T\u00edpus",position:"Poz\u00edci\u00f3","bullet_image":"Elemk\u00e9p","list_type":"T\u00edpus",color:"Sz\u00edn",height:"Magass\u00e1g",width:"Sz\u00e9less\u00e9g",style:"St\u00edlus",margin:"Marg\u00f3",left:"Balra",bottom:"Lent",right:"Jobbra",top:"Fel\u00fcl",same:"Mindenhol ugyanaz",padding:"Bels\u0151 marg\u00f3","box_clear":"Lebeg\u00e9s (float) t\u00f6rl\u00e9se","box_float":"Lebeg\u00e9s (float)","box_height":"Magass\u00e1g","box_width":"Sz\u00e9less\u00e9g","block_display":"Megjelen\u00edt\u00e9s","block_whitespace":"T\u00e9rk\u00f6z","block_text_indent":"Sz\u00f6veg beh\u00faz\u00e1sa","block_text_align":"Sz\u00f6veg igaz\u00edt\u00e1sa","block_vertical_alignment":"F\u00fcgg\u0151leges igaz\u00edt\u00e1s","block_letterspacing":"Bet\u0171t\u00e1vols\u00e1g","block_wordspacing":"Sz\u00f3t\u00e1vols\u00e1g","background_vpos":"F\u00fcgg\u0151leges hely","background_hpos":"V\u00edzszintes hely","background_attachment":"Csatolm\u00e1ny","background_repeat":"Ism\u00e9tl\u00e9s","background_image":"H\u00e1tt\u00e9rk\u00e9p","background_color":"H\u00e1tt\u00e9rsz\u00edn","text_none":"egyik sem","text_blink":"villog\u00e1s","text_case":"eset","text_striketrough":"\u00e1th\u00fazott","text_underline":"al\u00e1h\u00fazott","text_overline":"fel\u00fclh\u00fazott","text_decoration":"dekor\u00e1ci\u00f3","text_color":"sz\u00edn",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/it_dlg.js b/webcit/tiny_mce/plugins/style/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..3ffc088
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.style_dlg',{"text_lineheight":"Altezza linea","text_variant":"Variante","text_style":"Stile","text_weight":"Spessore","text_size":"Dimensione","text_font":"Carattere","text_props":"Testo","positioning_tab":"Posizionamento","list_tab":"Liste","border_tab":"Bordi","box_tab":"Contenitore","block_tab":"Blocco","background_tab":"Sfondo","text_tab":"Testo",apply:"Applica",title:"Modifica stile CSS",clip:"Clip",placement:"Piazzamento",overflow:"Overflow",zindex:"Z-index",visibility:"Visibilit\u00e0","positioning_type":"Tipo",position:"Posizione","bullet_image":"Immagine Punto","list_type":"Tipo",color:"Colore",height:"Altezza",width:"Larghezza",style:"Stile",margin:"Margine",left:"Sinistro",bottom:"Inferiore",right:"Destro",top:"Superiore",same:"Uguale per tutti",padding:"Spazio dal bordo","box_clear":"Pulito","box_float":"Fluttuante","box_height":"Altezza","box_width":"Larghezza","block_display":"Visualizzazione","block_whitespace":"Whitespace","block_text_indent":"Indentazione testo","block_text_align":"Allineamento testo","block_vertical_alignment":"Allineamento verticale","block_letterspacing":"Spaziatura caratteri","block_wordspacing":"Spaziatura parole","background_vpos":"Posizione verticale","background_hpos":"Posizione orizzontale","background_attachment":"Allegato","background_repeat":"Repetizione","background_image":"Immagine sfondo","background_color":"Colore sfondo","text_none":"nessuna","text_blink":"lampeggiante","text_case":"Tipo","text_striketrough":"barrato","text_underline":"sottolineato","text_overline":"sopralineato","text_decoration":"Decorazione","text_color":"Colore",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/style/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..c5fc08b
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.style_dlg',{"text_lineheight":"\u884c\u9ad8","text_variant":"\u53d8\u5f62","text_style":"\u6837\u5f0f","text_weight":"\u7c97\u7ec6","text_size":"\u5927\u5c0f","text_font":"\u5b57\u4f53","text_props":"\u6587\u672c","positioning_tab":"\u4f4d\u7f6e","list_tab":"\u5217\u8868","border_tab":"\u8fb9\u6846","box_tab":"Box","block_tab":"\u533a\u5757","background_tab":"\u80cc\u666f","text_tab":"\u6587\u672c",apply:"\u5e94\u7528",title:"\u7f16\u8f91CSS\u6837\u5f0f",clip:"\u526a\u8f91",placement:"\u653e\u7f6e",overflow:"\u6ea2\u51fa",zindex:"Z-Index",visibility:"\u53ef\u89c1","positioning_type":"\u7c7b\u578b",position:"\u4f4d\u7f6e","bullet_image":"\u56fe\u7247\u9879\u76ee\u7b26\u53f7","list_type":"\u7c7b\u578b",color:"\u989c\u8272",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",style:"\u6837\u5f0f",margin:"\u5916\u8fb9\u8ddd",left:"\u5de6",bottom:"\u4e0b",right:"\u53f3",top:"\u4e0a",same:"\u5168\u90e8\u76f8\u540c",padding:"\u5185\u8fb9\u8ddd","box_clear":"\u6e05\u9664\u6d6e\u52a8","box_float":"\u6d6e\u52a8","box_height":"\u9ad8\u5ea6","box_width":"\u5bbd\u5ea6","block_display":"\u663e\u793a","block_whitespace":"\u7a7a\u683c","block_text_indent":"\u6587\u5b57\u7f29\u6392","block_text_align":"\u6587\u5b57\u5bf9\u9f50","block_vertical_alignment":"\u5782\u76f4\u5bf9\u9f50","block_letterspacing":"\u5b57\u95f4\u8ddd","block_wordspacing":"\u8bcd\u95f4\u8ddd","background_vpos":"\u5782\u76f4\u4f4d\u7f6e","background_hpos":"\u6c34\u5e73\u4f4d\u7f6e","background_attachment":"\u9644\u4ef6","background_repeat":"\u91cd\u590d","background_image":"\u80cc\u666f\u56fe\u7247","background_color":"\u80cc\u666f\u989c\u8272","text_none":"\u65e0","text_blink":"\u95ea\u70c1","text_case":"\u5b57\u4f53\u5f62\u5f0f","text_striketrough":"\u5220\u9664\u7ebf","text_underline":"\u4e0b\u5212\u7ebf","text_overline":"\u4e0a\u5212\u7ebf","text_decoration":"\u5b57\u4f53\u88c5\u9970","text_color":"\u989c\u8272",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/style/props.htm b/webcit/tiny_mce/plugins/style/props.htm
new file mode 100644 (file)
index 0000000..76ab68d
--- /dev/null
@@ -0,0 +1,840 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+       <title>{#style_dlg.title}</title>
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>
+       <script type="text/javascript" src="js/props.js"></script>
+       <link href="css/props.css" rel="stylesheet" type="text/css" />
+</head>
+
+<body id="styleprops" style="display: none" role="application" aria-labelledby="app_title">
+<span id="app_title" style="display:none">{#style_dlg.title}</span>
+<form onsubmit="updateAction();return false;" action="#">
+<div class="tabs">
+       <ul>
+               <li id="text_tab" class="current" aria-controls="text_panel"><span><a href="javascript:mcTabs.displayTab('text_tab','text_panel');" onMouseDown="return false;">{#style_dlg.text_tab}</a></span></li>
+               <li id="background_tab" aria-controls="background_panel"><span><a href="javascript:mcTabs.displayTab('background_tab','background_panel');" onMouseDown="return false;">{#style_dlg.background_tab}</a></span></li>
+               <li id="block_tab" aria-controls="block_panel"><span><a href="javascript:mcTabs.displayTab('block_tab','block_panel');" onMouseDown="return false;">{#style_dlg.block_tab}</a></span></li>
+               <li id="box_tab" aria-controls="box_panel"><span><a href="javascript:mcTabs.displayTab('box_tab','box_panel');" onMouseDown="return false;">{#style_dlg.box_tab}</a></span></li>
+               <li id="border_tab" aria-controls="border_panel"><span><a href="javascript:mcTabs.displayTab('border_tab','border_panel');" onMouseDown="return false;">{#style_dlg.border_tab}</a></span></li>
+               <li id="list_tab" aria-controls="list_panel"><span><a href="javascript:mcTabs.displayTab('list_tab','list_panel');" onMouseDown="return false;">{#style_dlg.list_tab}</a></span></li>
+               <li id="positioning_tab" aria-controls="positioning_panel"><span><a href="javascript:mcTabs.displayTab('positioning_tab','positioning_panel');" onMouseDown="return false;">{#style_dlg.positioning_tab}</a></span></li>
+       </ul>
+</div>
+
+<div class="panel_wrapper">
+<div id="text_panel" class="panel current">
+       <fieldset>
+               <legend>{#style_dlg.text}</legend>
+               <table role="presentation" border="0" width="100%">
+                       <tr>
+                               <td><label for="text_font">{#style_dlg.text_font}</label></td>
+                               <td colspan="3">
+                                       <select id="text_font" name="text_font" class="mceEditableSelect mceFocus"></select>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="text_size">{#style_dlg.text_size}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><select id="text_size" name="text_size" class="mceEditableSelect"></select></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="text_size_measurement_label" for="text_size_measurement" style="display: none; visibility: hidden;">Text Size Measurement Unit</label>
+                                                               <select id="text_size_measurement" name="text_size_measurement" aria-labelledby="text_size_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                               <td><label for="text_weight">{#style_dlg.text_weight}</label></td>
+                               <td>
+                                       <select id="text_weight" name="text_weight"></select>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="text_style">{#style_dlg.text_style}</label></td>
+                               <td>
+                                       <select id="text_style" name="text_style" class="mceEditableSelect"></select>
+                               </td>
+                               <td><label for="text_variant">{#style_dlg.text_variant}</label></td>
+                               <td>
+                                       <select id="text_variant" name="text_variant"></select>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="text_lineheight">{#style_dlg.text_lineheight}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td>
+                                                               <select id="text_lineheight" name="text_lineheight" class="mceEditableSelect"></select>
+                                                       </td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="text_lineheight_measurement_label" for="text_lineheight_measurement" style="display: none; visibility: hidden;">Line Height Measurement Unit</label>
+                                                               <select id="text_lineheight_measurement" name="text_lineheight_measurement" aria-labelledby="text_lineheight_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                               <td><label for="text_case">{#style_dlg.text_case}</label></td>
+                               <td>
+                                       <select id="text_case" name="text_case"></select>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="text_color">{#style_dlg.text_color}</label></td>
+                               <td colspan="2">
+                                       <table role="presentation" border="0" cellpadding="0" cellspacing="0">
+                                               <tr>
+                                                       <td><input id="text_color" name="text_color" type="text" value="" size="9" onChange="updateColor('text_color_pick','text_color');" /></td>
+                                                       <td id="text_color_pickcontainer">&nbsp;</td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td valign="top" style="vertical-align: top; padding-top: 3px;">{#style_dlg.text_decoration}</td>
+                               <td colspan="2">
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input id="text_underline" name="text_underline" class="checkbox" type="checkbox" /></td>
+                                                       <td><label for="text_underline">{#style_dlg.text_underline}</label></td>
+                                               </tr>
+                                               <tr>
+                                                       <td><input id="text_overline" name="text_overline" class="checkbox" type="checkbox" /></td>
+                                                       <td><label for="text_overline">{#style_dlg.text_overline}</label></td>
+                                               </tr>
+                                               <tr>
+                                                       <td><input id="text_linethrough" name="text_linethrough" class="checkbox" type="checkbox" /></td>
+                                                       <td><label for="text_linethrough">{#style_dlg.text_striketrough}</label></td>
+                                               </tr>
+                                               <tr>
+                                                       <td><input id="text_blink" name="text_blink" class="checkbox" type="checkbox" /></td>
+                                                       <td><label for="text_blink">{#style_dlg.text_blink}</label></td>
+                                               </tr>
+                                               <tr>
+                                                       <td><input id="text_none" name="text_none" class="checkbox" type="checkbox" /></td>
+                                                       <td><label for="text_none">{#style_dlg.text_none}</label></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+
+<div id="background_panel" class="panel">
+       <fieldset>
+               <legend>{#style_dlg.background}</legend>
+               <table role="presentation" border="0">
+                       <tr>
+                               <td><label for="background_color">{#style_dlg.background_color}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellpadding="0" cellspacing="0">
+                                               <tr>
+                                                       <td><input id="background_color" name="background_color" type="text" value="" size="9" onChange="updateColor('background_color_pick','background_color');" /></td>
+                                                       <td id="background_color_pickcontainer">&nbsp;</td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="background_image">{#style_dlg.background_image}</label></td>
+                               <td><table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                       <tr> 
+                                               <td><input id="background_image" name="background_image" type="text" /></td> 
+                                               <td id="background_image_browser">&nbsp;</td>
+                                       </tr>
+                                       </table>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="background_repeat">{#style_dlg.background_repeat}</label></td>
+                               <td><select id="background_repeat" name="background_repeat" class="mceEditableSelect"></select></td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="background_attachment">{#style_dlg.background_attachment}</label></td>
+                               <td><select id="background_attachment" name="background_attachment" class="mceEditableSelect"></select></td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="background_hpos">{#style_dlg.background_hpos}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><select id="background_hpos" name="background_hpos" class="mceEditableSelect"></select></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="background_hpos_measurement_label" for="background_hpos_measurement" style="display: none; visibility: hidden;">Horizontal position measurement unit</label>
+                                                               <select id="background_hpos_measurement" name="background_hpos_measurement" aria-labelledby="background_hpos_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="background_vpos">{#style_dlg.background_vpos}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><select id="background_vpos" name="background_vpos" class="mceEditableSelect"></select></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+
+                                                               <label id="background_vpos_measurement_label" for="background_vpos_measurement" style="display: none; visibility: hidden;">Vertical position measurement unit</label>
+                                                               <select id="background_vpos_measurement" name="background_vpos_measurement" aria-labelledby="background_vpos_measurement_label">></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+
+<div id="block_panel" class="panel">
+       <fieldset>
+               <legend>{#style_dlg.block}</legend>
+               <table role="presentation" border="0">
+                       <tr>
+                               <td><label for="block_wordspacing">{#style_dlg.block_wordspacing}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><select id="block_wordspacing" name="block_wordspacing" class="mceEditableSelect"></select></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="block_wordspacing_measurement_label" for="block_wordspacing_measurement" style="display: none; visibility: hidden;">Word spacing measurement unit</label>
+                                                               <select id="block_wordspacing_measurement" name="block_wordspacing_measurement" aria-labelledby="block_wordspacing_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="block_letterspacing">{#style_dlg.block_letterspacing}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><select id="block_letterspacing" name="block_letterspacing" class="mceEditableSelect"></select></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="block_letterspacing_measurement_label" for="block_letterspacing_measurement" style="display: none; visibility: hidden;">Letter spacing measurement unit</label>
+                                                               <select id="block_letterspacing_measurement" name="block_letterspacing_measurement" aria-labelledby="block_letterspacing_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="block_vertical_alignment">{#style_dlg.block_vertical_alignment}</label></td>
+                               <td><select id="block_vertical_alignment" name="block_vertical_alignment" class="mceEditableSelect"></select></td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="block_text_align">{#style_dlg.block_text_align}</label></td>
+                               <td><select id="block_text_align" name="block_text_align" class="mceEditableSelect"></select></td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="block_text_indent">{#style_dlg.block_text_indent}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="block_text_indent" name="block_text_indent" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="block_text_indent_measurement_label" for="block_text_indent_measurement" style="display: none; visibility: hidden;">Text Indent Measurement Unit</label>
+
+                                                               <select id="block_text_indent_measurement" name="block_text_indent_measurement" aria-labelledby="block_text_indent_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="block_whitespace">{#style_dlg.block_whitespace}</label></td>
+                               <td><select id="block_whitespace" name="block_whitespace" class="mceEditableSelect"></select></td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="block_display">{#style_dlg.block_display}</label></td>
+                               <td><select id="block_display" name="block_display" class="mceEditableSelect"></select></td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+
+<div id="box_panel" class="panel">
+       <fieldset>
+               <legend>{#style_dlg.box}</legend>
+               <table role="presentation" border="0">
+                       <tr>
+                               <td><label for="box_width">{#style_dlg.box_width}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_width" name="box_width" class="mceEditableSelect" onChange="synch('box_width','positioning_width');" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_width_measurement_label" for="box_width_measurement" style="display: none; visibility: hidden;">Box Width Measurement Unit</label>
+                                                               <select id="box_width_measurement" name="box_width_measurement" aria-labelledby="box_width_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                               <td>&nbsp;&nbsp;&nbsp;<label for="box_float">{#style_dlg.box_float}</label></td>
+                               <td><select id="box_float" name="box_float" class="mceEditableSelect"></select></td>
+                       </tr>
+
+                       <tr>
+                               <td><label for="box_height">{#style_dlg.box_height}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_height" name="box_height" class="mceEditableSelect" onChange="synch('box_height','positioning_height');" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_height_measurement_label" for="box_height_measurement" style="display: none; visibility: hidden;">Box Height Measurement Unit</label>
+                                                               <select id="box_height_measurement" name="box_height_measurement" aria-labelledby="box_height_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                               <td>&nbsp;&nbsp;&nbsp;<label for="box_clear">{#style_dlg.box_clear}</label></td>
+                               <td><select id="box_clear" name="box_clear" class="mceEditableSelect"></select></td>
+                       </tr>
+               </table>
+       </fieldset>
+
+<div style="float: left; width: 49%">
+       <fieldset>
+               <legend>{#style_dlg.padding}</legend>
+
+               <table role="presentation" border="0">
+                       <tr>
+                               <td>&nbsp;</td>
+                               <td><input type="checkbox" id="box_padding_same" name="box_padding_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_padding');" /> <label for="box_padding_same">{#style_dlg.same}</label></td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_padding_top">{#style_dlg.top}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_padding_top" name="box_padding_top" class="mceEditableSelect" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_padding_top_measurement_label" for="box_padding_top_measurement" style="display: none; visibility: hidden;">Padding Top Measurement Unit</label>
+                                                               <select id="box_padding_top_measurement" name="box_padding_top_measurement" aria-labelledby="box_padding_top_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_padding_right">{#style_dlg.right}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_padding_right" name="box_padding_right" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_padding_right_measurement_label" for="box_padding_right_measurement" style="display: none; visibility: hidden;">Padding Right Measurement Unit</label>
+                                                               <select id="box_padding_right_measurement" name="box_padding_right_measurement" disabled="disabled" aria-labelledby="box_padding_right_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_padding_bottom">{#style_dlg.bottom}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_padding_bottom" name="box_padding_bottom" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_padding_bottom_measurement_label" for="box_padding_bottom_measurement" style="display: none; visibility: hidden;">Padding Bottom Measurement Unit</label>
+                                                               <select id="box_padding_bottom_measurement" name="box_padding_bottom_measurement" disabled="disabled" aria-labelledby="box_padding_bottom_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_padding_left">{#style_dlg.left}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_padding_left" name="box_padding_left" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_padding_left_measurement_label" for="box_padding_left_measurement" style="display: none; visibility: hidden;">Padding Left Measurement Unit</label>
+                                                               <select id="box_padding_left_measurement" name="box_padding_left_measurement" disabled="disabled" aria-labelledby="box_padding_left_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+
+<div style="float: right; width: 49%">
+       <fieldset>
+               <legend>{#style_dlg.margin}</legend>
+
+               <table role="presentation" border="0">
+                       <tr>
+                               <td>&nbsp;</td>
+                               <td><input type="checkbox" id="box_margin_same" name="box_margin_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_margin');" /> <label for="box_margin_same">{#style_dlg.same}</label></td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_margin_top">{#style_dlg.top}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_margin_top" name="box_margin_top" class="mceEditableSelect" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_margin_top_measurement_label" for="box_margin_top_measurement" style="display: none; visibility: hidden;">Margin Top Measurement Unit</label>
+                                                               <select id="box_margin_top_measurement" name="box_margin_top_measurement" aria-labelledby="box_margin_top_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_margin_right">{#style_dlg.right}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_margin_right" name="box_margin_right" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_margin_right_measurement_label" for="box_margin_right_measurement" style="display: none; visibility: hidden;">Margin Right Measurement Unit</label>
+                                                               <select id="box_margin_right_measurement" name="box_margin_right_measurement" disabled="disabled" aria-labelledby="box_margin_right_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_margin_bottom">{#style_dlg.bottom}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_margin_bottom" name="box_margin_bottom" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_margin_bottom_measurement_label" for="box_margin_bottom_measurement" style="display: none; visibility: hidden;">Margin Bottom Measurement Unit</label>
+                                                               <select id="box_margin_bottom_measurement" name="box_margin_bottom_measurement" disabled="disabled" aria-labelledby="box_margin_bottom_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_margin_left">{#style_dlg.left}</label></td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_margin_left" name="box_margin_left" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="box_margin_left_measurement_label" for="box_margin_left_measurement" style="display: none; visibility: hidden;">Margin Left Measurement Unit</label>
+                                                               <select id="box_margin_left_measurement" name="box_margin_left_measurement" disabled="disabled" aria-labelledby="box_margin_left_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+<br style="clear: both" />
+</div>
+
+<div id="border_panel" class="panel">
+       <fieldset>
+               <legend>{#style_dlg.border}</legend>    
+               <table role="presentation" border="0" cellspacing="0" cellpadding="0" width="100%">
+               <tr>
+                       <td class="tdelim">&nbsp;</td>
+                       <td class="tdelim delim">&nbsp;</td>
+                       <td class="tdelim">{#style_dlg.style}</td>
+                       <td class="tdelim delim">&nbsp;</td>
+                       <td class="tdelim">{#style_dlg.width}</td>
+                       <td class="tdelim delim">&nbsp;</td>
+                       <td class="tdelim">{#style_dlg.color}</td>
+               </tr>
+
+               <tr>
+                       <td>&nbsp;</td>
+                       <td class="delim">&nbsp;</td>
+                       <td><input type="checkbox" id="border_style_same" name="border_style_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_style');" /> <label for="border_style_same">{#style_dlg.same}</label></td>
+                       <td class="delim">&nbsp;</td>
+                       <td><input type="checkbox" id="border_width_same" name="border_width_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_width');" /> <label for="border_width_same">{#style_dlg.same}</label></td>
+                       <td class="delim">&nbsp;</td>
+                       <td><input type="checkbox" id="border_color_same" name="border_color_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_color');" /> <label for="border_color_same">{#style_dlg.same}</label></td>
+               </tr>
+
+               <tr>
+                       <td>{#style_dlg.top}</td>
+                       <td class="delim">&nbsp;</td>
+                       <td><select id="border_style_top" name="border_style_top" class="mceEditableSelect"></select></td>
+                       <td class="delim">&nbsp;</td>
+                       <td>
+                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><select id="border_width_top" name="border_width_top" class="mceEditableSelect"></select></td>
+                                               <td>&nbsp;</td>
+                                               <td>
+                                                       <label id="border_width_top_measurement_label" for="border_width_top_measurement" style="display: none; visibility: hidden;">Width top Measurement Unit</label>
+                                                       <select id="border_width_top_measurement" name="border_width_top_measurement" aria-labelledby="border_width_top_measurement_label"></select>
+                                               </td>
+                                       </tr>
+                               </table>
+                       </td>
+                       <td class="delim">&nbsp;</td>
+                       <td>
+                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">
+                                       <tr>
+                                               <td><input id="border_color_top" name="border_color_top" type="text" value="" size="9" onChange="updateColor('border_color_top_pick','border_color_top');" /></td>
+                                               <td id="border_color_top_pickcontainer">&nbsp;</td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+
+               <tr>
+                       <td>{#style_dlg.right}</td>
+                       <td class="delim">&nbsp;</td>
+                       <td><select id="border_style_right" name="border_style_right" class="mceEditableSelect" disabled="disabled"></select></td>
+                       <td class="delim">&nbsp;</td>
+                       <td>
+                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><select id="border_width_right" name="border_width_right" class="mceEditableSelect" disabled="disabled"></select></td>
+                                               <td>&nbsp;</td>
+                                               <td>
+                                                       <label id="border_width_right_measurement_label" for="border_width_right_measurement" style="display: none; visibility: hidden;">Width Right Measurement Unit</label>
+                                                       <select id="border_width_right_measurement" name="border_width_right_measurement" disabled="disabled" aria-labelledby="border_width_right_measurement_label"></select>
+                                               </td>
+                                       </tr>
+                               </table>
+                       </td>
+                       <td class="delim">&nbsp;</td>
+                       <td>
+                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">
+                                       <tr>
+                                               <td><input id="border_color_right" name="border_color_right" type="text" value="" size="9" onChange="updateColor('border_color_right_pick','border_color_right');" disabled="disabled" /></td>
+                                               <td id="border_color_right_pickcontainer">&nbsp;</td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+
+               <tr>
+                       <td>{#style_dlg.bottom}</td>
+                       <td class="delim">&nbsp;</td>
+                       <td><select id="border_style_bottom" name="border_style_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
+                       <td class="delim">&nbsp;</td>
+                       <td>
+                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><select id="border_width_bottom" name="border_width_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
+                                               <td>&nbsp;</td>
+                                               <td>
+                                                       <label id="border_width_bottom_measurement_label" for="border_width_bottom_measurement" style="display: none; visibility: hidden;">Width Bottom Measurement Unit</label>
+                                                       <select id="border_width_bottom_measurement" name="border_width_bottom_measurement" disabled="disabled" aria-labelledby="border_width_bottom_measurement_label"></select>
+                                               </td>
+                                       </tr>
+                               </table>
+                       </td>
+                       <td class="delim">&nbsp;</td>
+                       <td>
+                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">
+                                       <tr>
+                                               <td><input id="border_color_bottom" name="border_color_bottom" type="text" value="" size="9" onChange="updateColor('border_color_bottom_pick','border_color_bottom');" disabled="disabled" /></td>
+                                               <td id="border_color_bottom_pickcontainer">&nbsp;</td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+
+               <tr>
+                       <td>{#style_dlg.left}</td>
+                       <td class="delim">&nbsp;</td>
+                       <td><select id="border_style_left" name="border_style_left" class="mceEditableSelect" disabled="disabled"></select></td>
+                       <td class="delim">&nbsp;</td>
+                       <td>
+                               <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><select id="border_width_left" name="border_width_left" class="mceEditableSelect" disabled="disabled"></select></td>
+                                               <td>&nbsp;</td>
+                                               <td>
+                                                       <label id="border_width_left_measurement_label" for="border_width_left_measurement" style="display: none; visibility: hidden;">Width Left Measurement Unit</label>
+                                                       <select id="border_width_left_measurement" name="border_width_left_measurement" disabled="disabled" aria-labelledby="border_width_left_measurement_label"></select>
+                                               </td>
+                                       </tr>
+                               </table>
+                       </td>
+                       <td class="delim">&nbsp;</td>
+                       <td>
+                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">
+                                       <tr>
+                                               <td><input id="border_color_left" name="border_color_left" type="text" value="" size="9" onChange="updateColor('border_color_left_pick','border_color_left');" disabled="disabled" /></td>
+                                               <td id="border_color_left_pickcontainer">&nbsp;</td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+               </table>
+       </fieldset>
+</div>
+
+<div id="list_panel" class="panel">
+<fieldset>
+       <legend>{#style_dlg.list}</legend>
+       <table role="presentation" border="0">
+               <tr>
+                       <td><label for="list_type">{#style_dlg.list_type}</label></td>
+                       <td><select id="list_type" name="list_type" class="mceEditableSelect"></select></td>
+               </tr>
+
+               <tr>
+                       <td><label for="list_bullet_image">{#style_dlg.bullet_image}</label></td>
+                       <td><input id="list_bullet_image" name="list_bullet_image" type="text" /></td>
+               </tr>
+
+               <tr>
+                       <td><label for="list_position">{#style_dlg.position}</label></td>
+                       <td><select id="list_position" name="list_position" class="mceEditableSelect"></select></td>
+               </tr>
+       </table>
+</fieldset>
+</div>
+
+<div id="positioning_panel" class="panel">
+<fieldset>
+       <legend>{#style_dlg.position}</legend>
+<table role="presentation" border="0">
+       <tr>
+               <td><label for="positioning_type">{#style_dlg.positioning_type}</label></td>
+               <td><select id="positioning_type" name="positioning_type" class="mceEditableSelect"></select></td>
+               <td>&nbsp;&nbsp;&nbsp;<label for="positioning_visibility">{#style_dlg.visibility}</label></td>
+               <td><select id="positioning_visibility" name="positioning_visibility" class="mceEditableSelect"></select></td>
+       </tr>
+
+       <tr>
+               <td><label for="positioning_width">{#style_dlg.width}</label></td>
+               <td>
+                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                               <tr>
+                                       <td><input type="text" id="positioning_width" name="positioning_width" onChange="synch('positioning_width','box_width');" /></td>
+                                       <td>&nbsp;</td>
+                                       <td>
+                                               <label id="positioning_width_measurement_label" for="positioning_width_measurement" style="display: none; visibility: hidden;">Positioning width Measurement Unit</label>
+                                               <select id="positioning_width_measurement" name="positioning_width_measurement" aria-labelledby="positioning_width_measurement_label"></select>
+                                       </td>
+                               </tr>
+                       </table>
+               </td>
+               <td>&nbsp;&nbsp;&nbsp;<label for="positioning_zindex">{#style_dlg.zindex}</label></td>
+               <td><input type="text" id="positioning_zindex" name="positioning_zindex" /></td>
+       </tr>
+
+       <tr>
+               <td><label for="positioning_height">{#style_dlg.height}</label></td>
+               <td>
+                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                               <tr>
+                                       <td><input type="text" id="positioning_height" name="positioning_height" onChange="synch('positioning_height','box_height');" /></td>
+                                       <td>&nbsp;</td>
+                                       <td>
+                                               <label id="positioning_height_measurement_label" for="positioning_height_measurement" style="display: none; visibility: hidden;">Positioning Height Measurement Unit</label>
+                                               <select id="positioning_height_measurement" name="positioning_height_measurement" aria-labelledby="positioning_height_measurement_label"></select>
+                                       </td>
+                               </tr>
+                       </table>
+               </td>
+               <td>&nbsp;&nbsp;&nbsp;<label for="positioning_overflow">{#style_dlg.overflow}</label></td>
+               <td><select id="positioning_overflow" name="positioning_overflow" class="mceEditableSelect"></select></td>
+       </tr>
+</table>
+</fieldset>
+
+<div style="float: left; width: 49%">
+       <fieldset>
+               <legend>{#style_dlg.placement}</legend>
+
+               <table role="presentation" border="0">
+                       <tr>
+                               <td>&nbsp;</td>
+                               <td><input type="checkbox" id="positioning_placement_same" name="positioning_placement_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_placement');" /> <label for="positioning_placement_same">{#style_dlg.same}</label></td>
+                       </tr>
+                       <tr>
+                               <td>{#style_dlg.top}</td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_placement_top" name="positioning_placement_top" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="positioning_placement_top_measurement_label" for="positioning_placement_top_measurement" style="display: none; visibility: hidden;">Placement Top Measurement Unit</label>
+                                                               <select id="positioning_placement_top_measurement" name="positioning_placement_top_measurement" aria-labelledby="positioning_placement_top_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{#style_dlg.right}</td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_placement_right" name="positioning_placement_right" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="positioning_placement_right_measurement_label" for="positioning_placement_right_measurement" style="display: none; visibility: hidden;">Placement Right Measurement Unit</label>
+                                                               <select id="positioning_placement_right_measurement" name="positioning_placement_right_measurement" disabled="disabled" aria-labelledby="positioning_placement_right_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{#style_dlg.bottom}</td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_placement_bottom" name="positioning_placement_bottom" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="positioning_placement_bottom_measurement_label" for="positioning_placement_bottom_measurement" style="display: none; visibility: hidden;">Placement Bottom Measurement Unit</label>
+                                                               <select id="positioning_placement_bottom_measurement" name="positioning_placement_bottom_measurement" disabled="disabled" aria-labelledby="positioning_placement_bottom_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{#style_dlg.left}</td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_placement_left" name="positioning_placement_left" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="positioning_placement_left_measurement_label" for="positioning_placement_left_measurement" style="display: none; visibility: hidden;">Placement Left Measurement Unit</label>
+                                                               <select id="positioning_placement_left_measurement" name="positioning_placement_left_measurement" disabled="disabled" aria-labelledby="positioning_placement_left_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+
+<div style="float: right; width: 49%">
+       <fieldset>
+               <legend>{#style_dlg.clip}</legend>
+
+               <table role="presentation" border="0">
+                       <tr>
+                               <td>&nbsp;</td>
+                               <td><input type="checkbox" id="positioning_clip_same" name="positioning_clip_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_clip');" /> <label for="positioning_clip_same">{#style_dlg.same}</label></td>
+                       </tr>
+                       <tr>
+                               <td>{#style_dlg.top}</td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_clip_top" name="positioning_clip_top" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="positioning_clip_top_measurement_label" for="positioning_clip_top_measurement" style="display: none; visibility: hidden;">Clip Top Measurement Unit</label>
+                                                               <select id="positioning_clip_top_measurement" name="positioning_clip_top_measurement" aria-labelledby="positioning_clip_top_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{#style_dlg.right}</td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_clip_right" name="positioning_clip_right" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="positioning_clip_right_measurement_label" for="positioning_clip_right_measurement" style="display: none; visibility: hidden;">Clip Right Measurement Unit</label>
+                                                               <select id="positioning_clip_right_measurement" name="positioning_clip_right_measurement" disabled="disabled" aria-labelledby="positioning_clip_right_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{#style_dlg.bottom}</td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_clip_bottom" name="positioning_clip_bottom" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="positioning_clip_bottom_measurement_label" for="positioning_clip_bottom_measurement" style="display: none; visibility: hidden;">Clip Bottom Measurement Unit</label>
+                                                               <select id="positioning_clip_bottom_measurement" name="positioning_clip_bottom_measurement" disabled="disabled" aria-labelledby="positioning_clip_bottom_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{#style_dlg.left}</td>
+                               <td>
+                                       <table role="presentation" border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_clip_left" name="positioning_clip_left" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+                                                       <td>
+                                                               <label id="positioning_clip_left_measurement_label" for="positioning_clip_left_measurement" style="display: none; visibility: hidden;">Clip Left Measurement Unit</label>
+                                                               <select id="positioning_clip_left_measurement" name="positioning_clip_left_measurement" disabled="disabled" aria-labelledby="positioning_clip_left_measurement_label"></select>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+<br style="clear: both" />
+</div>
+</div>
+
+<div class="mceActionPanel">
+       <input type="submit" id="insert" name="insert" value="{#update}" />
+       <input type="button" class="button" id="apply" name="apply" value="{#style_dlg.apply}" onClick="applyAction();" />
+       <input type="button" id="cancel" name="cancel" value="{#cancel}" onClick="tinyMCEPopup.close();" />
+</div>
+</form>
+
+<div style="display: none">
+       <div id="container"></div>
+</div>
+
+</body>
+</html>
diff --git a/webcit/tiny_mce/plugins/tabfocus/editor_plugin.js b/webcit/tiny_mce/plugins/tabfocus/editor_plugin.js
new file mode 100644 (file)
index 0000000..42a82d1
--- /dev/null
@@ -0,0 +1 @@
+(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(t){n=c.select(":input:enabled,*[tabindex]");function s(v){return v.nodeName==="BODY"||(v.type!="hidden"&&!(v.style.display=="none")&&!(v.style.visibility=="hidden")&&s(v.parentNode))}function i(v){return v.attributes.tabIndex.specified||v.nodeName=="INPUT"||v.nodeName=="TEXTAREA"}function u(){return tinymce.isIE6||tinymce.isIE7}function r(v){return((!u()||i(v)))&&v.getAttribute("tabindex")!="-1"&&s(v)}d(n,function(w,v){if(w.id==l.id){j=v;return false}});if(t>0){for(m=j+1;m<n.length;m++){if(r(n[m])){return n[m]}}}else{for(m=j-1;m>=0;m--){if(r(n[m])){return n[m]}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(n.id&&(l=tinymce.get(n.id||n.name))){l.focus()}else{window.setTimeout(function(){if(!tinymce.isWebKit){window.focus()}n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/tabfocus/editor_plugin_src.js b/webcit/tiny_mce/plugins/tabfocus/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..a1579c8
--- /dev/null
@@ -0,0 +1,122 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode;
+
+       tinymce.create('tinymce.plugins.TabFocusPlugin', {
+               init : function(ed, url) {
+                       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) {
+                                       el = DOM.select(':input:enabled,*[tabindex]');
+
+                                       function canSelectRecursive(e) {
+                                               return e.nodeName==="BODY" || (e.type != 'hidden' &&
+                                                       !(e.style.display == "none") &&
+                                                       !(e.style.visibility == "hidden") && canSelectRecursive(e.parentNode));
+                                       }
+                                       function canSelectInOldIe(el) {
+                                               return el.attributes["tabIndex"].specified || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA";
+                                       }
+                                       function isOldIe() {
+                                               return tinymce.isIE6 || tinymce.isIE7;
+                                       }
+                                       function canSelect(el) {
+                                               return ((!isOldIe() || canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el);
+                                       }
+
+                                       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 (canSelect(el[i]))
+                                                               return el[i];
+                                               }
+                                       } else {
+                                               for (i = x - 1; i >= 0; i--) {
+                                                       if (canSelect(el[i]))
+                                                               return el[i];
+                                               }
+                                       }
+
+                                       return null;
+                               }
+
+                               if (e.keyCode === 9) {
+                                       v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next')));
+
+                                       if (v.length == 1) {
+                                               v[1] = v[0];
+                                               v[0] = ':prev';
+                                       }
+
+                                       // Find element to focus
+                                       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 (el.id && (ed = tinymce.get(el.id || el.name)))
+                                                       ed.focus();
+                                               else
+                                                       window.setTimeout(function() {
+                                                               if (!tinymce.isWebKit)
+                                                                       window.focus();
+                                                               el.focus();
+                                                       }, 10);
+
+                                               return Event.cancel(e);
+                                       }
+                               }
+                       }
+
+                       ed.onKeyUp.add(tabCancel);
+
+                       if (tinymce.isGecko) {
+                               ed.onKeyPress.add(tabHandler);
+                               ed.onKeyDown.add(tabCancel);
+                       } else
+                               ed.onKeyDown.add(tabHandler);
+
+               },
+
+               getInfo : function() {
+                       return {
+                               longname : 'Tabfocus',
+                               author : 'Moxiecode Systems AB',
+                               authorurl : 'http://tinymce.moxiecode.com',
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus',
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion
+                       };
+               }
+       });
+
+       // Register plugin
+       tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin);
+})();
diff --git a/webcit/tiny_mce/plugins/table/cell.htm b/webcit/tiny_mce/plugins/table/cell.htm
new file mode 100644 (file)
index 0000000..a72a8d6
--- /dev/null
@@ -0,0 +1,180 @@
+<!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>{#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/validate.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
+</head>\r
+<body id="tablecell" style="display: none" role="application">\r
+       <form onsubmit="updateAction();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current" aria-controls="general_panel"><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" aria-controls="advanced_panel"><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>{#table_dlg.general_props}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="align">{#table_dlg.align}</label></td>\r
+                                                       <td>\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">{#table_dlg.cell_type}</label></td>\r
+                                                       <td>\r
+                                                               <select id="celltype" name="celltype">\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">{#table_dlg.valign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="valign" name="valign">\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">{#table_dlg.scope}</label></td>\r
+                                                       <td>\r
+                                                               <select id="scope" name="scope">\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">{#table_dlg.width}</label></td>\r
+                                                       <td><input id="width" name="width" type="text" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>\r
+\r
+                                                       <td><label for="height">{#table_dlg.height}</label></td>\r
+                                                       <td><input id="height" name="height" type="text" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr id="styleSelectRow">\r
+                                                       <td><label for="class">{#class_name}</label></td>\r
+                                                       <td colspan="3">\r
+                                                               <select id="class" name="class" class="mceEditableSelect">\r
+                                                                       <option value="" selected="selected">{#not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{#table_dlg.advanced_props}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\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">{#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">{#table_dlg.langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" style="width: 200px"> \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">{#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">{#table_dlg.bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr role="group" aria-labelledby="bordercolor_label">\r
+                                                       <td class="column1"><label id="bordercolor_label" for="bordercolor">{#table_dlg.bordercolor}</label></td> \r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>\r
+                                                                               <td id="bordercolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr role="group" aria-labelledby="bgcolor_label">\r
+                                                       <td class="column1"><label id="bgcolor_label" for="bgcolor">{#table_dlg.bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div>\r
+                               <select id="action" name="action">\r
+                                       <option value="cell">{#table_dlg.cell_cell}</option>\r
+                                       <option value="row">{#table_dlg.cell_row}</option>\r
+                                       <option value="col">{#table_dlg.cell_col}</option>\r
+                                       <option value="all">{#table_dlg.cell_all}</option>\r
+                               </select>\r
+                       </div>\r
+\r
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/table/css/cell.css b/webcit/tiny_mce/plugins/table/css/cell.css
new file mode 100644 (file)
index 0000000..a067ecd
--- /dev/null
@@ -0,0 +1,17 @@
+/* CSS file for cell dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 200px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#action {\r
+       margin-bottom: 3px;\r
+}\r
+\r
+#class {\r
+       width: 150px;\r
+}
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/css/row.css b/webcit/tiny_mce/plugins/table/css/row.css
new file mode 100644 (file)
index 0000000..1f7755d
--- /dev/null
@@ -0,0 +1,25 @@
+/* CSS file for row dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 200px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#action {\r
+       margin-bottom: 3px;\r
+}\r
+\r
+#rowtype,#align,#valign,#class,#height {\r
+       width: 150px;\r
+}\r
+\r
+#height {\r
+       width: 50px;    \r
+}\r
+\r
+.col2 {\r
+       padding-left: 20px;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/table/css/table.css b/webcit/tiny_mce/plugins/table/css/table.css
new file mode 100644 (file)
index 0000000..d11c3f6
--- /dev/null
@@ -0,0 +1,13 @@
+/* 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
diff --git a/webcit/tiny_mce/plugins/table/editor_plugin.js b/webcit/tiny_mce/plugins/table/editor_plugin.js
new file mode 100644 (file)
index 0000000..94e3c21
--- /dev/null
@@ -0,0 +1 @@
+(function(d){var e=d.each;function c(g,h){var j=h.ownerDocument,f=j.createRange(),k;f.setStartBefore(h);f.setEnd(g.endContainer,g.endOffset);k=j.createElement("body");k.appendChild(f.cloneContents());return k.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(g,f){return parseInt(g.getAttribute(f)||1)}function b(H,G,K){var g,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;g=[];e(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);e(O,function(P,Q){Q+=M;e(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(g[Q]){while(g[Q][R]){R++}}U=a(W,"rowspan");V=a(W,"colspan");for(T=Q;T<Q+U;T++){if(!g[T]){g[T]=[]}for(S=R;S<R+V;S++){g[T][S]={part:N,real:T==Q&&S==R,elm:W,rowspan:U,colspan:V}}}})});M+=O.length})}function z(M,O){var N;N=g[O];if(N){return N[M]}}function s(O,M,N){if(O){N=parseInt(N);if(N===1){O.removeAttribute(M,1)}else{O.setAttribute(M,N,1)}}}function j(M){return M&&(G.hasClass(M.elm,"mceSelected")||M==o)}function k(){var M=[];e(H.rows,function(N){e(N.cells,function(O){if(G.hasClass(O,"mceSelected")||O==o.elm){M.push(N);return false}})});return M}function r(){var M=G.createRng();M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H)}function f(M){var N;d.walk(M,function(P){var O;if(P.nodeType==3){e(G.getParents(P.parentNode,null,M).reverse(),function(Q){Q=A(Q,false);if(!N){N=O=Q}else{if(O){O.appendChild(Q)}}O=Q});if(O){O.innerHTML=d.isIE?"&nbsp;":'<br data-mce-bogus="1" />'}return false}},"childNodes");M=A(M,false);s(M,"rowSpan",1);s(M,"colSpan",1);if(N){M.appendChild(N)}else{if(!d.isIE){M.innerHTML='<br data-mce-bogus="1" />'}}return M}function q(){var M=G.createRng();e(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}e(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=g[Math.min(g.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=g[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=g[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(f(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(f(P.cells[0]),P.cells[0])}}}}}function C(){e(g,function(M,N){e(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=a(P,"colspan");R=a(P,"rowspan");if(S>1||R>1){s(P,"rowSpan",1);s(P,"colSpan",1);for(Q=0;Q<S-1;Q++){G.insertAfter(f(P),P)}u(O,N,R-1,S)}}})})}function p(V,S,Y){var P,O,X,W,U,R,T,M,V,N,Q;if(V){pos=F(V);P=pos.x;O=pos.y;X=P+(S-1);W=O+(Y-1)}else{P=L.x;O=L.y;X=D.x;W=D.y}T=z(P,O);M=z(X,W);if(T&&M&&T.part==M.part){C();t();T=z(P,O).elm;s(T,"colSpan",(X-P)+1);s(T,"rowSpan",(W-O)+1);for(R=O;R<=W;R++){for(U=P;U<=X;U++){if(!g[R]||!g[R][U]){continue}V=g[R][U].elm;if(V!=T){N=d.grep(V.childNodes);e(N,function(Z){T.appendChild(Z)});if(N.length){N=d.grep(T.childNodes);Q=0;e(N,function(Z){if(Z.nodeName=="BR"&&G.getAttrib(Z,"data-mce-bogus")&&Q++<N.length-1){T.removeChild(Z)}})}G.remove(V)}}}q()}}function l(Q){var M,S,P,R,T,U,N,V,O;e(g,function(W,X){e(W,function(Z,Y){if(j(Z)){Z=Z.elm;T=Z.parentNode;U=A(T,false);M=X;if(Q){return false}}});if(Q){return !M}});for(R=0;R<g[0].length;R++){if(!g[M][R]){continue}S=g[M][R].elm;if(S!=P){if(!Q){O=a(S,"rowspan");if(O>1){s(S,"rowSpan",O+1);continue}}else{if(M>0&&g[M-1][R]){V=g[M-1][R].elm;O=a(V,"rowSpan");if(O>1){s(V,"rowSpan",O+1);continue}}}N=f(S);s(N,"colSpan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function h(N){var O,M;e(g,function(P,Q){e(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});e(g,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=a(P,"colspan");Q=a(P,"rowspan");if(R==1){if(!N){G.insertAfter(f(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(f(P),P);u(O,T,Q-1,R)}}else{s(P,"colSpan",P.colSpan+1)}M=P}})}function n(){var M=[];e(g,function(N,O){e(N,function(Q,P){if(j(Q)&&d.inArray(M,P)===-1){e(g,function(T){var R=T[P].elm,S;S=a(R,"colSpan");if(S>1){s(R,"colSpan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");e(Q.cells,function(S){var T=a(S,"rowSpan");if(T>1){s(S,"rowSpan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);e(g[R.y],function(S){var T;S=S.elm;if(S!=O){T=a(S,"rowSpan");if(T<=1){G.remove(S)}else{s(S,"rowSpan",T-1)}O=S}})}N=k();e(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();e(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;e(g,function(S){var R;Q=0;e(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}e(O,function(T){var S=T.cells.length,R;for(i=0;i<S;i++){R=T.cells[i];s(R,"colSpan",1);s(R,"rowSpan",1)}for(i=S;i<Q;i++){T.appendChild(f(T.cells[S-1]))}for(i=Q;i<S;i++){G.remove(T.cells[i])}if(N){M.parentNode.insertBefore(T,M)}else{G.insertAfter(T,M)}})}function F(M){var N;e(g,function(O,P){e(O,function(R,Q){if(R.elm==M){N={x:Q,y:P};return false}});return !N});return N}function w(M){L=F(M)}function I(){var O,N,M;N=M=0;e(g,function(P,Q){e(P,function(S,R){var U,T;if(j(S)){S=g[Q][R];if(R>N){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=g[y][P];if(!S.real){if(P-(S.colspan-1)<P){P-=S.colspan-1}}}for(x=P;x<=N;x++){S=g[O][x];if(!S.real){if(O-(S.rowspan-1)<O){O-=S.rowspan-1}}}for(y=O;y<=T;y++){for(x=P;x<=U;x++){S=g[y][x];if(S.real){Q=S.colspan-1;R=S.rowspan-1;if(Q){if(x+Q>N){N=x+Q}}if(R){if(y+R>M){M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=O;y<=M;y++){for(x=P;x<=N;x++){if(g[y][x]){G.addClass(g[y][x].elm,"mceSelected")}}}}}d.extend(this,{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:h,deleteCols:n,deleteRows:m,cutRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}d.create("tinymce.plugins.TablePlugin",{init:function(g,h){var f,m,j=true;function l(p){var o=g.selection,n=g.dom.getParent(p||o.getNode(),"table");if(n){return new b(n,g.dom,o)}}function k(){g.getBody().style.webkitUserSelect="";if(j){g.dom.removeClass(g.dom.select("td.mceSelected,th.mceSelected"),"mceSelected");j=false}}e([["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(n){g.addButton(n[0],{title:n[1],cmd:n[2],ui:n[3]})});if(!d.isIE){g.onClick.add(function(n,o){o=o.target;if(o.nodeName==="TABLE"){n.selection.select(o);n.nodeChanged()}})}g.onPreProcess.add(function(o,p){var n,q,r,t=o.dom,s;n=t.select("table",p.node);q=n.length;while(q--){r=n[q];t.setAttrib(r,"data-mce-style","");if((s=t.getAttrib(r,"width"))){t.setStyle(r,"width",s);t.setAttrib(r,"width","")}if((s=t.getAttrib(r,"height"))){t.setStyle(r,"height",s);t.setAttrib(r,"height","")}}});g.onNodeChange.add(function(q,o,s){var r;s=q.selection.getStart();r=q.dom.getParent(s,"td,th,caption");o.setActive("table",s.nodeName==="TABLE"||!!r);if(r&&r.nodeName==="CAPTION"){r=0}o.setDisabled("delete_table",!r);o.setDisabled("delete_col",!r);o.setDisabled("delete_table",!r);o.setDisabled("delete_row",!r);o.setDisabled("col_after",!r);o.setDisabled("col_before",!r);o.setDisabled("row_after",!r);o.setDisabled("row_before",!r);o.setDisabled("row_props",!r);o.setDisabled("cell_props",!r);o.setDisabled("split_cells",!r);o.setDisabled("merge_cells",!r)});g.onInit.add(function(r){var p,t,q=r.dom,u;f=r.windowManager;r.onMouseDown.add(function(w,z){if(z.button!=2){k();t=q.getParent(z.target,"td,th");p=q.getParent(t,"table")}});q.bind(r.getDoc(),"mouseover",function(C){var A,z,B=C.target;if(t&&(u||B!=t)&&(B.nodeName=="TD"||B.nodeName=="TH")){z=q.getParent(B,"table");if(z==p){if(!u){u=l(z);u.setStartCell(t);r.getBody().style.webkitUserSelect="none"}u.setEndCell(B);j=true}A=r.selection.getSel();try{if(A.removeAllRanges){A.removeAllRanges()}else{A.empty()}}catch(w){}C.preventDefault()}});r.onMouseUp.add(function(F,G){var z,B=F.selection,H,I=B.getSel(),w,C,A,E;if(t){if(u){F.getBody().style.webkitUserSelect=""}function D(J,L){var K=new d.dom.TreeWalker(J,J);do{if(J.nodeType==3&&d.trim(J.nodeValue).length!=0){if(L){z.setStart(J,0)}else{z.setEnd(J,J.nodeValue.length)}return}if(J.nodeName=="BR"){if(L){z.setStartBefore(J)}else{z.setEndBefore(J)}return}}while(J=(L?K.next():K.prev()))}H=q.select("td.mceSelected,th.mceSelected");if(H.length>0){z=q.createRng();C=H[0];E=H[H.length-1];z.setStartBefore(C);z.setEndAfter(C);D(C,1);w=new d.dom.TreeWalker(C,q.getParent(H[0],"table"));do{if(C.nodeName=="TD"||C.nodeName=="TH"){if(!q.hasClass(C,"mceSelected")){break}A=C}}while(C=w.next());D(A);B.setRng(z)}F.nodeChanged();t=u=p=null}});r.onKeyUp.add(function(w,z){k()});r.onKeyDown.add(function(w,z){n(w)});r.onMouseDown.add(function(w,z){if(z.button!=2){n(w)}});function o(D,z,A,F){var B=3,G=D.dom.getParent(z.startContainer,"TABLE"),C,w,E;if(G){C=G.parentNode}w=z.startContainer.nodeType==B&&z.startOffset==0&&z.endOffset==0&&F&&(A.nodeName=="TR"||A==C);E=(A.nodeName=="TD"||A.nodeName=="TH")&&!F;return w||E}function n(A){if(!d.isWebKit){return}var z=A.selection.getRng();var C=A.selection.getNode();var B=A.dom.getParent(z.startContainer,"TD");if(!o(A,z,C,B)){return}if(!B){B=C}var w=B.lastChild;while(w.lastChild){w=w.lastChild}z.setEnd(w,w.nodeValue.length);A.selection.setRng(z)}r.plugins.table.fixTableCellSelection=n;if(r&&r.plugins.contextmenu){r.plugins.contextmenu.onContextMenu.add(function(A,w,C){var D,B=r.selection,z=B.getNode()||r.getBody();if(r.dom.getParent(C,"td")||r.dom.getParent(C,"th")||r.dom.select("td.mceSelected,th.mceSelected").length){w.removeAll();if(z.nodeName=="A"&&!r.dom.getAttrib(z,"name")){w.add({title:"advanced.link_desc",icon:"link",cmd:r.plugins.advlink?"mceAdvLink":"mceLink",ui:true});w.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});w.addSeparator()}if(z.nodeName=="IMG"&&z.className.indexOf("mceItem")==-1){w.add({title:"advanced.image_desc",icon:"image",cmd:r.plugins.advimage?"mceAdvImage":"mceImage",ui:true});w.addSeparator()}w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});w.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});w.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});w.addSeparator();D=w.addMenu({title:"table.cell"});D.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});D.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});D.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});D=w.addMenu({title:"table.row"});D.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});D.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});D.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});D.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});D.addSeparator();D.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});D.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});D.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!m);D.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!m);D=w.addMenu({title:"table.col"});D.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});D.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});D.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(d.isWebKit){function v(B,M){function F(Q){B.selection.setCursorLocation(Q,0)}function H(R,Q){return R.keyCode==z?Q.previousSibling:Q.nextSibling}function G(R,S){var Q=H(R,S);return Q!==null&&Q.tagName==="TR"?Q:null}function C(Q,R){return Q.dom.getParent(R,"table")}function O(Q){var R=C(B,Q);return H(M,R)}function A(Q){return Q.keyCode==z||Q.keyCode==I}function D(Q){var S=Q.selection.getNode();var R=Q.dom.getParent(S,"tr");return R!==null}function N(R){var Q=0;var S=R;while(S.previousSibling){S=S.previousSibling;Q=Q+a(S,"colspan")}return Q}function E(S,Q){var T=0;var R=0;e(S.children,function(U,V){T=T+a(U,"colspan");R=V;if(T>Q){return false}});return R}function w(S,T,V){var U=N(S.dom.getParent(T,"td,th"));var R=E(V,U);var Q=V.childNodes[R];F(Q)}function L(R,T){var Q=O(R);if(Q!==null){F(Q);return d.dom.Event.cancel(T)}else{var S=T.keyCode==z?R.firstChild:R.lastChild;F(S);return true}}var z=38;var I=40;if(A(M)&&D(B)){var J=B.selection.getNode();var P=B.dom.getParent(J,"tr");var K=G(M,P);if(K==null){return L(P,M)}else{w(B,J,K);d.dom.Event.cancel(M);return true}}}r.onKeyDown.add(v)}if(!d.isIE){function s(){var w;for(w=r.getBody().lastChild;w&&w.nodeType==3&&!w.nodeValue.length;w=w.previousSibling){}if(w&&w.nodeName=="TABLE"){r.dom.add(r.getBody(),"p",null,'<br mce_bogus="1" />')}}if(d.isGecko){r.onKeyDown.add(function(z,B){var w,A,C=z.dom;if(B.keyCode==37||B.keyCode==38){w=z.selection.getRng();A=C.getParent(w.startContainer,"table");if(A&&z.getBody().firstChild==A){if(c(w,A)){w=C.createRng();w.setStartBefore(A);w.setEndBefore(A);z.selection.setRng(w);B.preventDefault()}}}})}r.onKeyUp.add(s);r.onSetContent.add(s);r.onVisualAid.add(s);r.onPreProcess.add(function(w,A){var z=A.node.lastChild;if(z&&z.childNodes.length==1&&z.firstChild.nodeName=="BR"){w.dom.remove(z)}});s();r.startContent=r.getContent({format:"raw"})}});e({mceTableSplitCells:function(n){n.split()},mceTableMergeCells:function(o){var p,q,n;n=g.dom.getParent(g.selection.getNode(),"th,td");if(n){p=n.rowSpan;q=n.colSpan}if(!g.dom.select("td.mceSelected,th.mceSelected").length){f.open({url:h+"/merge_cells.htm",width:240+parseInt(g.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(g.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:p,cols:q,onaction:function(r){o.merge(n,r.cols,r.rows)},plugin_url:h})}else{o.merge()}},mceTableInsertRowBefore:function(n){n.insertRow(true)},mceTableInsertRowAfter:function(n){n.insertRow()},mceTableInsertColBefore:function(n){n.insertCol(true)},mceTableInsertColAfter:function(n){n.insertCol()},mceTableDeleteCol:function(n){n.deleteCols()},mceTableDeleteRow:function(n){n.deleteRows()},mceTableCutRow:function(n){m=n.cutRows()},mceTableCopyRow:function(n){m=n.copyRows()},mceTablePasteRowBefore:function(n){n.pasteRows(m,true)},mceTablePasteRowAfter:function(n){n.pasteRows(m)},mceTableDelete:function(n){n.deleteTable()}},function(o,n){g.addCommand(n,function(){var p=l();if(p){o(p);g.execCommand("mceRepaint");k()}})});e({mceInsertTable:function(n){f.open({url:h+"/table.htm",width:400+parseInt(g.getLang("table.table_delta_width",0)),height:320+parseInt(g.getLang("table.table_delta_height",0)),inline:1},{plugin_url:h,action:n?n.action:0})},mceTableRowProps:function(){f.open({url:h+"/row.htm",width:400+parseInt(g.getLang("table.rowprops_delta_width",0)),height:295+parseInt(g.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:h})},mceTableCellProps:function(){f.open({url:h+"/cell.htm",width:400+parseInt(g.getLang("table.cellprops_delta_width",0)),height:295+parseInt(g.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:h})}},function(o,n){g.addCommand(n,function(p,q){o(q)})})}});d.PluginManager.add("table",d.plugins.TablePlugin)})(tinymce);
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/editor_plugin_src.js b/webcit/tiny_mce/plugins/table/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..ccfe808
--- /dev/null
@@ -0,0 +1,1364 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function(tinymce) {
+       var each = tinymce.each;
+
+       // Checks if the selection/caret is at the start of the specified block element
+       function isAtStart(rng, par) {
+               var doc = par.ownerDocument, rng2 = doc.createRange(), elm;
+
+               rng2.setStartBefore(par);
+               rng2.setEnd(rng.endContainer, rng.endOffset);
+
+               elm = doc.createElement('body');
+               elm.appendChild(rng2.cloneContents());
+
+               // Check for text characters of other elements that should be treated as content
+               return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0;
+       };
+
+       function getSpanVal(td, name) {
+               return parseInt(td.getAttribute(name) || 1);
+       }
+
+       /**
+        * Table Grid class.
+        */
+       function TableGrid(table, dom, selection) {
+               var grid, startPos, endPos, selectedCell;
+
+               buildGrid();
+               selectedCell = dom.getParent(selection.getStart(), 'th,td');
+               if (selectedCell) {
+                       startPos = getPos(selectedCell);
+                       endPos = findEndPos();
+                       selectedCell = getCell(startPos.x, startPos.y);
+               }
+
+               function cloneNode(node, children) {
+                       node = node.cloneNode(children);
+                       node.removeAttribute('id');
+
+                       return node;
+               }
+
+               function buildGrid() {
+                       var startY = 0;
+
+                       grid = [];
+
+                       each(['thead', 'tbody', 'tfoot'], function(part) {
+                               var rows = dom.select('> ' + part + ' tr', table);
+
+                               each(rows, function(tr, y) {
+                                       y += startY;
+
+                                       each(dom.select('> td, > th', tr), function(td, x) {
+                                               var x2, y2, rowspan, colspan;
+
+                                               // Skip over existing cells produced by rowspan
+                                               if (grid[y]) {
+                                                       while (grid[y][x])
+                                                               x++;
+                                               }
+
+                                               // Get col/rowspan from cell
+                                               rowspan = getSpanVal(td, 'rowspan');
+                                               colspan = getSpanVal(td, 'colspan');
+
+                                               // Fill out rowspan/colspan right and down
+                                               for (y2 = y; y2 < y + rowspan; y2++) {
+                                                       if (!grid[y2])
+                                                               grid[y2] = [];
+
+                                                       for (x2 = x; x2 < x + colspan; x2++) {
+                                                               grid[y2][x2] = {
+                                                                       part : part,
+                                                                       real : y2 == y && x2 == x,
+                                                                       elm : td,
+                                                                       rowspan : rowspan,
+                                                                       colspan : colspan
+                                                               };
+                                                       }
+                                               }
+                                       });
+                               });
+
+                               startY += rows.length;
+                       });
+               };
+
+               function getCell(x, y) {
+                       var row;
+
+                       row = grid[y];
+                       if (row)
+                               return row[x];
+               };
+
+               function setSpanVal(td, name, val) {
+                       if (td) {
+                               val = parseInt(val);
+
+                               if (val === 1)
+                                       td.removeAttribute(name, 1);
+                               else
+                                       td.setAttribute(name, val, 1);
+                       }
+               }
+
+               function isCellSelected(cell) {
+                       return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell);
+               };
+
+               function getSelectedRows() {
+                       var rows = [];
+
+                       each(table.rows, function(row) {
+                               each(row.cells, function(cell) {
+                                       if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) {
+                                               rows.push(row);
+                                               return false;
+                                       }
+                               });
+                       });
+
+                       return rows;
+               };
+
+               function deleteTable() {
+                       var rng = dom.createRng();
+
+                       rng.setStartAfter(table);
+                       rng.setEndAfter(table);
+
+                       selection.setRng(rng);
+
+                       dom.remove(table);
+               };
+
+               function cloneCell(cell) {
+                       var formatNode;
+
+                       // Clone formats
+                       tinymce.walk(cell, function(node) {
+                               var curNode;
+
+                               if (node.nodeType == 3) {
+                                       each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) {
+                                               node = cloneNode(node, false);
+
+                                               if (!formatNode)
+                                                       formatNode = curNode = node;
+                                               else if (curNode)
+                                                       curNode.appendChild(node);
+
+                                               curNode = node;
+                                       });
+
+                                       // Add something to the inner node
+                                       if (curNode)
+                                               curNode.innerHTML = tinymce.isIE ? '&nbsp;' : '<br data-mce-bogus="1" />';
+
+                                       return false;
+                               }
+                       }, 'childNodes');
+
+                       cell = cloneNode(cell, false);
+                       setSpanVal(cell, 'rowSpan', 1);
+                       setSpanVal(cell, 'colSpan', 1);
+
+                       if (formatNode) {
+                               cell.appendChild(formatNode);
+                       } else {
+                               if (!tinymce.isIE)
+                                       cell.innerHTML = '<br data-mce-bogus="1" />';
+                       }
+
+                       return cell;
+               };
+
+               function cleanup() {
+                       var rng = dom.createRng();
+
+                       // Empty rows
+                       each(dom.select('tr', table), function(tr) {
+                               if (tr.cells.length == 0)
+                                       dom.remove(tr);
+                       });
+
+                       // Empty table
+                       if (dom.select('tr', table).length == 0) {
+                               rng.setStartAfter(table);
+                               rng.setEndAfter(table);
+                               selection.setRng(rng);
+                               dom.remove(table);
+                               return;
+                       }
+
+                       // Empty header/body/footer
+                       each(dom.select('thead,tbody,tfoot', table), function(part) {
+                               if (part.rows.length == 0)
+                                       dom.remove(part);
+                       });
+
+                       // Restore selection to start position if it still exists
+                       buildGrid();
+
+                       // Restore the selection to the closest table position
+                       row = grid[Math.min(grid.length - 1, startPos.y)];
+                       if (row) {
+                               selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true);
+                               selection.collapse(true);
+                       }
+               };
+
+               function fillLeftDown(x, y, rows, cols) {
+                       var tr, x2, r, c, cell;
+
+                       tr = grid[y][x].elm.parentNode;
+                       for (r = 1; r <= rows; r++) {
+                               tr = dom.getNext(tr, 'tr');
+
+                               if (tr) {
+                                       // Loop left to find real cell
+                                       for (x2 = x; x2 >= 0; x2--) {
+                                               cell = grid[y + r][x2].elm;
+
+                                               if (cell.parentNode == tr) {
+                                                       // Append clones after
+                                                       for (c = 1; c <= cols; c++)
+                                                               dom.insertAfter(cloneCell(cell), cell);
+
+                                                       break;
+                                               }
+                                       }
+
+                                       if (x2 == -1) {
+                                               // Insert nodes before first cell
+                                               for (c = 1; c <= cols; c++)
+                                                       tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]);
+                                       }
+                               }
+                       }
+               };
+
+               function split() {
+                       each(grid, function(row, y) {
+                               each(row, function(cell, x) {
+                                       var colSpan, rowSpan, newCell, i;
+
+                                       if (isCellSelected(cell)) {
+                                               cell = cell.elm;
+                                               colSpan = getSpanVal(cell, 'colspan');
+                                               rowSpan = getSpanVal(cell, 'rowspan');
+
+                                               if (colSpan > 1 || rowSpan > 1) {
+                                                       setSpanVal(cell, 'rowSpan', 1);
+                                                       setSpanVal(cell, 'colSpan', 1);
+
+                                                       // Insert cells right
+                                                       for (i = 0; i < colSpan - 1; i++)
+                                                               dom.insertAfter(cloneCell(cell), cell);
+
+                                                       fillLeftDown(x, y, rowSpan - 1, colSpan);
+                                               }
+                                       }
+                               });
+                       });
+               };
+
+               function merge(cell, cols, rows) {
+                       var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count;
+
+                       // Use specified cell and cols/rows
+                       if (cell) {
+                               pos = getPos(cell);
+                               startX = pos.x;
+                               startY = pos.y;
+                               endX = startX + (cols - 1);
+                               endY = startY + (rows - 1);
+                       } else {
+                               // Use selection
+                               startX = startPos.x;
+                               startY = startPos.y;
+                               endX = endPos.x;
+                               endY = endPos.y;
+                       }
+
+                       // Find start/end cells
+                       startCell = getCell(startX, startY);
+                       endCell = getCell(endX, endY);
+
+                       // Check if the cells exists and if they are of the same part for example tbody = tbody
+                       if (startCell && endCell && startCell.part == endCell.part) {
+                               // Split and rebuild grid
+                               split();
+                               buildGrid();
+
+                               // Set row/col span to start cell
+                               startCell = getCell(startX, startY).elm;
+                               setSpanVal(startCell, 'colSpan', (endX - startX) + 1);
+                               setSpanVal(startCell, 'rowSpan', (endY - startY) + 1);
+
+                               // Remove other cells and add it's contents to the start cell
+                               for (y = startY; y <= endY; y++) {
+                                       for (x = startX; x <= endX; x++) {
+                                               if (!grid[y] || !grid[y][x])
+                                                       continue;
+
+                                               cell = grid[y][x].elm;
+
+                                               if (cell != startCell) {
+                                                       // Move children to startCell
+                                                       children = tinymce.grep(cell.childNodes);
+                                                       each(children, function(node) {
+                                                               startCell.appendChild(node);
+                                                       });
+
+                                                       // Remove bogus nodes if there is children in the target cell
+                                                       if (children.length) {
+                                                               children = tinymce.grep(startCell.childNodes);
+                                                               count = 0;
+                                                               each(children, function(node) {
+                                                                       if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1)
+                                                                               startCell.removeChild(node);
+                                                               });
+                                                       }
+                                                       
+                                                       // Remove cell
+                                                       dom.remove(cell);
+                                               }
+                                       }
+                               }
+
+                               // Remove empty rows etc and restore caret location
+                               cleanup();
+                       }
+               };
+
+               function insertRow(before) {
+                       var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan;
+
+                       // Find first/last row
+                       each(grid, function(row, y) {
+                               each(row, function(cell, x) {
+                                       if (isCellSelected(cell)) {
+                                               cell = cell.elm;
+                                               rowElm = cell.parentNode;
+                                               newRow = cloneNode(rowElm, false);
+                                               posY = y;
+
+                                               if (before)
+                                                       return false;
+                                       }
+                               });
+
+                               if (before)
+                                       return !posY;
+                       });
+
+                       for (x = 0; x < grid[0].length; x++) {
+                               // Cell not found could be because of an invalid table structure
+                               if (!grid[posY][x])
+                                       continue;
+
+                               cell = grid[posY][x].elm;
+
+                               if (cell != lastCell) {
+                                       if (!before) {
+                                               rowSpan = getSpanVal(cell, 'rowspan');
+                                               if (rowSpan > 1) {
+                                                       setSpanVal(cell, 'rowSpan', rowSpan + 1);
+                                                       continue;
+                                               }
+                                       } else {
+                                               // Check if cell above can be expanded
+                                               if (posY > 0 && grid[posY - 1][x]) {
+                                                       otherCell = grid[posY - 1][x].elm;
+                                                       rowSpan = getSpanVal(otherCell, 'rowSpan');
+                                                       if (rowSpan > 1) {
+                                                               setSpanVal(otherCell, 'rowSpan', rowSpan + 1);
+                                                               continue;
+                                                       }
+                                               }
+                                       }
+
+                                       // Insert new cell into new row
+                                       newCell = cloneCell(cell);
+                                       setSpanVal(newCell, 'colSpan', cell.colSpan);
+
+                                       newRow.appendChild(newCell);
+
+                                       lastCell = cell;
+                               }
+                       }
+
+                       if (newRow.hasChildNodes()) {
+                               if (!before)
+                                       dom.insertAfter(newRow, rowElm);
+                               else
+                                       rowElm.parentNode.insertBefore(newRow, rowElm);
+                       }
+               };
+
+               function insertCol(before) {
+                       var posX, lastCell;
+
+                       // Find first/last column
+                       each(grid, function(row, y) {
+                               each(row, function(cell, x) {
+                                       if (isCellSelected(cell)) {
+                                               posX = x;
+
+                                               if (before)
+                                                       return false;
+                                       }
+                               });
+
+                               if (before)
+                                       return !posX;
+                       });
+
+                       each(grid, function(row, y) {
+                               var cell, rowSpan, colSpan;
+
+                               if (!row[posX])
+                                       return;
+
+                               cell = row[posX].elm;
+                               if (cell != lastCell) {
+                                       colSpan = getSpanVal(cell, 'colspan');
+                                       rowSpan = getSpanVal(cell, 'rowspan');
+
+                                       if (colSpan == 1) {
+                                               if (!before) {
+                                                       dom.insertAfter(cloneCell(cell), cell);
+                                                       fillLeftDown(posX, y, rowSpan - 1, colSpan);
+                                               } else {
+                                                       cell.parentNode.insertBefore(cloneCell(cell), cell);
+                                                       fillLeftDown(posX, y, rowSpan - 1, colSpan);
+                                               }
+                                       } else
+                                               setSpanVal(cell, 'colSpan', cell.colSpan + 1);
+
+                                       lastCell = cell;
+                               }
+                       });
+               };
+
+               function deleteCols() {
+                       var cols = [];
+
+                       // Get selected column indexes
+                       each(grid, function(row, y) {
+                               each(row, function(cell, x) {
+                                       if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) {
+                                               each(grid, function(row) {
+                                                       var cell = row[x].elm, colSpan;
+
+                                                       colSpan = getSpanVal(cell, 'colSpan');
+
+                                                       if (colSpan > 1)
+                                                               setSpanVal(cell, 'colSpan', colSpan - 1);
+                                                       else
+                                                               dom.remove(cell);
+                                               });
+
+                                               cols.push(x);
+                                       }
+                               });
+                       });
+
+                       cleanup();
+               };
+
+               function deleteRows() {
+                       var rows;
+
+                       function deleteRow(tr) {
+                               var nextTr, pos, lastCell;
+
+                               nextTr = dom.getNext(tr, 'tr');
+
+                               // Move down row spanned cells
+                               each(tr.cells, function(cell) {
+                                       var rowSpan = getSpanVal(cell, 'rowSpan');
+
+                                       if (rowSpan > 1) {
+                                               setSpanVal(cell, 'rowSpan', rowSpan - 1);
+                                               pos = getPos(cell);
+                                               fillLeftDown(pos.x, pos.y, 1, 1);
+                                       }
+                               });
+
+                               // Delete cells
+                               pos = getPos(tr.cells[0]);
+                               each(grid[pos.y], function(cell) {
+                                       var rowSpan;
+
+                                       cell = cell.elm;
+
+                                       if (cell != lastCell) {
+                                               rowSpan = getSpanVal(cell, 'rowSpan');
+
+                                               if (rowSpan <= 1)
+                                                       dom.remove(cell);
+                                               else
+                                                       setSpanVal(cell, 'rowSpan', rowSpan - 1);
+
+                                               lastCell = cell;
+                                       }
+                               });
+                       };
+
+                       // Get selected rows and move selection out of scope
+                       rows = getSelectedRows();
+
+                       // Delete all selected rows
+                       each(rows.reverse(), function(tr) {
+                               deleteRow(tr);
+                       });
+
+                       cleanup();
+               };
+
+               function cutRows() {
+                       var rows = getSelectedRows();
+
+                       dom.remove(rows);
+                       cleanup();
+
+                       return rows;
+               };
+
+               function copyRows() {
+                       var rows = getSelectedRows();
+
+                       each(rows, function(row, i) {
+                               rows[i] = cloneNode(row, true);
+                       });
+
+                       return rows;
+               };
+
+               function pasteRows(rows, before) {
+                       var selectedRows = getSelectedRows(),
+                               targetRow = selectedRows[before ? 0 : selectedRows.length - 1],
+                               targetCellCount = targetRow.cells.length;
+
+                       // Calc target cell count
+                       each(grid, function(row) {
+                               var match;
+
+                               targetCellCount = 0;
+                               each(row, function(cell, x) {
+                                       if (cell.real)
+                                               targetCellCount += cell.colspan;
+
+                                       if (cell.elm.parentNode == targetRow)
+                                               match = 1;
+                               });
+
+                               if (match)
+                                       return false;
+                       });
+
+                       if (!before)
+                               rows.reverse();
+
+                       each(rows, function(row) {
+                               var cellCount = row.cells.length, cell;
+
+                               // Remove col/rowspans
+                               for (i = 0; i < cellCount; i++) {
+                                       cell = row.cells[i];
+                                       setSpanVal(cell, 'colSpan', 1);
+                                       setSpanVal(cell, 'rowSpan', 1);
+                               }
+
+                               // Needs more cells
+                               for (i = cellCount; i < targetCellCount; i++)
+                                       row.appendChild(cloneCell(row.cells[cellCount - 1]));
+
+                               // Needs less cells
+                               for (i = targetCellCount; i < cellCount; i++)
+                                       dom.remove(row.cells[i]);
+
+                               // Add before/after
+                               if (before)
+                                       targetRow.parentNode.insertBefore(row, targetRow);
+                               else
+                                       dom.insertAfter(row, targetRow);
+                       });
+               };
+
+               function getPos(target) {
+                       var pos;
+
+                       each(grid, function(row, y) {
+                               each(row, function(cell, x) {
+                                       if (cell.elm == target) {
+                                               pos = {x : x, y : y};
+                                               return false;
+                                       }
+                               });
+
+                               return !pos;
+                       });
+
+                       return pos;
+               };
+
+               function setStartCell(cell) {
+                       startPos = getPos(cell);
+               };
+
+               function findEndPos() {
+                       var pos, maxX, maxY;
+
+                       maxX = maxY = 0;
+
+                       each(grid, function(row, y) {
+                               each(row, function(cell, x) {
+                                       var colSpan, rowSpan;
+
+                                       if (isCellSelected(cell)) {
+                                               cell = grid[y][x];
+
+                                               if (x > maxX)
+                                                       maxX = x;
+
+                                               if (y > maxY)
+                                                       maxY = y;
+
+                                               if (cell.real) {
+                                                       colSpan = cell.colspan - 1;
+                                                       rowSpan = cell.rowspan - 1;
+
+                                                       if (colSpan) {
+                                                               if (x + colSpan > maxX)
+                                                                       maxX = x + colSpan;
+                                                       }
+
+                                                       if (rowSpan) {
+                                                               if (y + rowSpan > maxY)
+                                                                       maxY = y + rowSpan;
+                                                       }
+                                               }
+                                       }
+                               });
+                       });
+
+                       return {x : maxX, y : maxY};
+               };
+
+               function setEndCell(cell) {
+                       var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan;
+
+                       endPos = getPos(cell);
+
+                       if (startPos && endPos) {
+                               // Get start/end positions
+                               startX = Math.min(startPos.x, endPos.x);
+                               startY = Math.min(startPos.y, endPos.y);
+                               endX = Math.max(startPos.x, endPos.x);
+                               endY = Math.max(startPos.y, endPos.y);
+
+                               // Expand end positon to include spans
+                               maxX = endX;
+                               maxY = endY;
+
+                               // Expand startX
+                               for (y = startY; y <= maxY; y++) {
+                                       cell = grid[y][startX];
+
+                                       if (!cell.real) {
+                                               if (startX - (cell.colspan - 1) < startX)
+                                                       startX -= cell.colspan - 1;
+                                       }
+                               }
+
+                               // Expand startY
+                               for (x = startX; x <= maxX; x++) {
+                                       cell = grid[startY][x];
+
+                                       if (!cell.real) {
+                                               if (startY - (cell.rowspan - 1) < startY)
+                                                       startY -= cell.rowspan - 1;
+                                       }
+                               }
+
+                               // Find max X, Y
+                               for (y = startY; y <= endY; y++) {
+                                       for (x = startX; x <= endX; x++) {
+                                               cell = grid[y][x];
+
+                                               if (cell.real) {
+                                                       colSpan = cell.colspan - 1;
+                                                       rowSpan = cell.rowspan - 1;
+
+                                                       if (colSpan) {
+                                                               if (x + colSpan > maxX)
+                                                                       maxX = x + colSpan;
+                                                       }
+
+                                                       if (rowSpan) {
+                                                               if (y + rowSpan > maxY)
+                                                                       maxY = y + rowSpan;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Remove current selection
+                               dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
+
+                               // Add new selection
+                               for (y = startY; y <= maxY; y++) {
+                                       for (x = startX; x <= maxX; x++) {
+                                               if (grid[y][x])
+                                                       dom.addClass(grid[y][x].elm, 'mceSelected');
+                                       }
+                               }
+                       }
+               };
+
+               // Expose to public
+               tinymce.extend(this, {
+                       deleteTable : deleteTable,
+                       split : split,
+                       merge : merge,
+                       insertRow : insertRow,
+                       insertCol : insertCol,
+                       deleteCols : deleteCols,
+                       deleteRows : deleteRows,
+                       cutRows : cutRows,
+                       copyRows : copyRows,
+                       pasteRows : pasteRows,
+                       getPos : getPos,
+                       setStartCell : setStartCell,
+                       setEndCell : setEndCell
+               });
+       };
+
+       tinymce.create('tinymce.plugins.TablePlugin', {
+               init : function(ed, url) {
+                       var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload
+
+                       function createTableGrid(node) {
+                               var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table');
+
+                               if (tblElm)
+                                       return new TableGrid(tblElm, ed.dom, selection);
+                       };
+
+                       function cleanup() {
+                               // Restore selection possibilities
+                               ed.getBody().style.webkitUserSelect = '';
+
+                               if (hasCellSelection) {
+                                       ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
+                                       hasCellSelection = false;
+                               }
+                       };
+
+                       // Register buttons
+                       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]});
+                       });
+
+                       // Select whole table is a table border is clicked
+                       if (!tinymce.isIE) {
+                               ed.onClick.add(function(ed, e) {
+                                       e = e.target;
+
+                                       if (e.nodeName === 'TABLE') {
+                                               ed.selection.select(e);
+                                               ed.nodeChanged();
+                                       }
+                               });
+                       }
+
+                       ed.onPreProcess.add(function(ed, args) {
+                               var nodes, i, node, dom = ed.dom, value;
+
+                               nodes = dom.select('table', args.node);
+                               i = nodes.length;
+                               while (i--) {
+                                       node = nodes[i];
+                                       dom.setAttrib(node, 'data-mce-style', '');
+
+                                       if ((value = dom.getAttrib(node, 'width'))) {
+                                               dom.setStyle(node, 'width', value);
+                                               dom.setAttrib(node, 'width', '');
+                                       }
+
+                                       if ((value = dom.getAttrib(node, 'height'))) {
+                                               dom.setStyle(node, 'height', value);
+                                               dom.setAttrib(node, 'height', '');
+                                       }
+                               }
+                       });
+
+                       // Handle node change updates
+                       ed.onNodeChange.add(function(ed, cm, n) {
+                               var p;
+
+                               n = ed.selection.getStart();
+                               p = ed.dom.getParent(n, 'td,th,caption');
+                               cm.setActive('table', n.nodeName === 'TABLE' || !!p);
+
+                               // Disable table tools if we are in caption
+                               if (p && p.nodeName === 'CAPTION')
+                                       p = 0;
+
+                               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);
+                               cm.setDisabled('merge_cells', !p);
+                       });
+
+                       ed.onInit.add(function(ed) {
+                               var startTable, startCell, dom = ed.dom, tableGrid;
+
+                               winMan = ed.windowManager;
+
+                               // Add cell selection logic
+                               ed.onMouseDown.add(function(ed, e) {
+                                       if (e.button != 2) {
+                                               cleanup();
+
+                                               startCell = dom.getParent(e.target, 'td,th');
+                                               startTable = dom.getParent(startCell, 'table');
+                                       }
+                               });
+
+                               dom.bind(ed.getDoc(), 'mouseover', function(e) {
+                                       var sel, table, target = e.target;
+
+                                       if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) {
+                                               table = dom.getParent(target, 'table');
+                                               if (table == startTable) {
+                                                       if (!tableGrid) {
+                                                               tableGrid = createTableGrid(table);
+                                                               tableGrid.setStartCell(startCell);
+
+                                                               ed.getBody().style.webkitUserSelect = 'none';
+                                                       }
+
+                                                       tableGrid.setEndCell(target);
+                                                       hasCellSelection = true;
+                                               }
+
+                                               // Remove current selection
+                                               sel = ed.selection.getSel();
+
+                                               try {
+                                                       if (sel.removeAllRanges)
+                                                               sel.removeAllRanges();
+                                                       else
+                                                               sel.empty();
+                                               } catch (ex) {
+                                                       // IE9 might throw errors here
+                                               }
+
+                                               e.preventDefault();
+                                       }
+                               });
+
+                               ed.onMouseUp.add(function(ed, e) {
+                                       var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode;
+
+                                       // Move selection to startCell
+                                       if (startCell) {
+                                               if (tableGrid)
+                                                       ed.getBody().style.webkitUserSelect = '';
+
+                                               function setPoint(node, start) {
+                                                       var walker = new tinymce.dom.TreeWalker(node, node);
+
+                                                       do {
+                                                               // Text node
+                                                               if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {
+                                                                       if (start)
+                                                                               rng.setStart(node, 0);
+                                                                       else
+                                                                               rng.setEnd(node, node.nodeValue.length);
+
+                                                                       return;
+                                                               }
+
+                                                               // BR element
+                                                               if (node.nodeName == 'BR') {
+                                                                       if (start)
+                                                                               rng.setStartBefore(node);
+                                                                       else
+                                                                               rng.setEndBefore(node);
+
+                                                                       return;
+                                                               }
+                                                       } while (node = (start ? walker.next() : walker.prev()));
+                                               }
+
+                                               // Try to expand text selection as much as we can only Gecko supports cell selection
+                                               selectedCells = dom.select('td.mceSelected,th.mceSelected');
+                                               if (selectedCells.length > 0) {
+                                                       rng = dom.createRng();
+                                                       node = selectedCells[0];
+                                                       endNode = selectedCells[selectedCells.length - 1];
+                                                       rng.setStartBefore(node);
+                                                       rng.setEndAfter(node);
+
+                                                       setPoint(node, 1);
+                                                       walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table'));
+
+                                                       do {
+                                                               if (node.nodeName == 'TD' || node.nodeName == 'TH') {
+                                                                       if (!dom.hasClass(node, 'mceSelected'))
+                                                                               break;
+
+                                                                       lastNode = node;
+                                                               }
+                                                       } while (node = walker.next());
+
+                                                       setPoint(lastNode);
+
+                                                       sel.setRng(rng);
+                                               }
+
+                                               ed.nodeChanged();
+                                               startCell = tableGrid = startTable = null;
+                                       }
+                               });
+
+                               ed.onKeyUp.add(function(ed, e) {
+                                       cleanup();
+                               });
+
+                               ed.onKeyDown.add(function (ed, e) {
+                                       fixTableCellSelection(ed);
+                               });
+
+                               ed.onMouseDown.add(function (ed, e) {
+                                       if (e.button != 2) {
+                                               fixTableCellSelection(ed);
+                                       }
+                               });
+                               function tableCellSelected(ed, rng, n, currentCell) {
+                                       // The decision of when a table cell is selected is somewhat involved.  The fact that this code is
+                                       // required is actually a pointer to the root cause of this bug. A cell is selected when the start 
+                                       // and end offsets are 0, the start container is a text, and the selection node is either a TR (most cases)
+                                       // or the parent of the table (in the case of the selection containing the last cell of a table).
+                                       var TEXT_NODE = 3, table = ed.dom.getParent(rng.startContainer, 'TABLE'), 
+                                       tableParent, allOfCellSelected, tableCellSelection;
+                                       if (table) 
+                                       tableParent = table.parentNode;
+                                       allOfCellSelected =rng.startContainer.nodeType == TEXT_NODE && 
+                                               rng.startOffset == 0 && 
+                                               rng.endOffset == 0 && 
+                                               currentCell && 
+                                               (n.nodeName=="TR" || n==tableParent);
+                                       tableCellSelection = (n.nodeName=="TD"||n.nodeName=="TH")&& !currentCell;       
+                                       return  allOfCellSelected || tableCellSelection;
+                                       // return false;
+                               }
+                               
+                               // this nasty hack is here to work around some WebKit selection bugs.
+                               function fixTableCellSelection(ed) {
+                                       if (!tinymce.isWebKit)
+                                               return;
+
+                                       var rng = ed.selection.getRng();
+                                       var n = ed.selection.getNode();
+                                       var currentCell = ed.dom.getParent(rng.startContainer, 'TD');
+                               
+                                       if (!tableCellSelected(ed, rng, n, currentCell))
+                                               return;
+                                               if (!currentCell) {
+                                                       currentCell=n;
+                                               }
+                                       
+                                       // Get the very last node inside the table cell
+                                       var end = currentCell.lastChild;
+                                       while (end.lastChild)
+                                               end = end.lastChild;
+                    
+                                       // Select the entire table cell. Nothing outside of the table cell should be selected.
+                                       rng.setEnd(end, end.nodeValue.length);
+                                       ed.selection.setRng(rng);
+                               }
+                               ed.plugins.table.fixTableCellSelection=fixTableCellSelection;
+
+                               // Add context menu
+                               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') || ed.dom.select('td.mceSelected,th.mceSelected').length) {
+                                                       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', value : {action : 'insert'}});
+                                                       m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'});
+                                                       m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'});
+                                                       m.addSeparator();
+
+                                                       // Cell menu
+                                                       sm = m.addMenu({title : 'table.cell'});
+                                                       sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'});
+                                                       sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'});
+                                                       sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'});
+
+                                                       // Row menu
+                                                       sm = m.addMenu({title : 'table.row'});
+                                                       sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'});
+                                                       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'}).setDisabled(!clipboardRows);
+                                                       sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows);
+
+                                                       // Column menu
+                                                       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'});
+                                       });
+                               }
+
+                               // Fix to allow navigating up and down in a table in WebKit browsers.
+                               if (tinymce.isWebKit) {
+                                       function moveSelection(ed, e) {
+
+                                               function moveCursorToStartOfElement(n) {
+                                                       ed.selection.setCursorLocation(n, 0);
+                                               }
+
+                                               function getSibling(event, element) {
+                                                       return event.keyCode == UP_ARROW ? element.previousSibling : element.nextSibling;
+                                               }
+
+                                               function getNextRow(e, row) {
+                                                       var sibling = getSibling(e, row);
+                                                       return sibling !== null && sibling.tagName === 'TR' ? sibling : null;
+                                               }
+
+                                               function getTable(ed, currentRow) {
+                                                       return ed.dom.getParent(currentRow, 'table');
+                                               }
+
+                                               function getTableSibling(currentRow) {
+                                                       var table = getTable(ed, currentRow);
+                                                       return getSibling(e, table);
+                                               }
+
+                                               function isVerticalMovement(event) {
+                                                       return event.keyCode == UP_ARROW || event.keyCode == DOWN_ARROW;
+                                               }
+
+                                               function isInTable(ed) {
+                                                       var node = ed.selection.getNode();
+                                                       var currentRow = ed.dom.getParent(node, 'tr');
+                                                       return currentRow !== null;
+                                               }
+
+                                               function columnIndex(column) {
+                                                       var colIndex = 0;
+                                                       var c = column;
+                                                       while (c.previousSibling) {
+                                                               c = c.previousSibling;
+                                                               colIndex = colIndex + getSpanVal(c, "colspan");
+                                                       }
+                                                       return colIndex;
+                                               }
+
+                                               function findColumn(rowElement, columnIndex) {
+                                                       var c = 0;
+                                                       var r = 0;
+                                                       each(rowElement.children, function(cell, i) {
+                                                               c = c + getSpanVal(cell, "colspan");
+                                                               r = i;
+                                                               if (c > columnIndex)
+                                                                       return false;
+                                                       });
+                                                       return r;
+                                               }
+
+                                               function moveCursorToRow(ed, node, row) {
+                                                       var srcColumnIndex = columnIndex(ed.dom.getParent(node, 'td,th'));
+                                                       var tgtColumnIndex = findColumn(row, srcColumnIndex)
+                                                       var tgtNode = row.childNodes[tgtColumnIndex];
+                                                       moveCursorToStartOfElement(tgtNode);
+                                               }
+
+                                               function escapeTable(currentRow, e) {
+                                                       var tableSiblingElement = getTableSibling(currentRow);
+                                                       if (tableSiblingElement !== null) {
+                                                               moveCursorToStartOfElement(tableSiblingElement);
+                                                               return tinymce.dom.Event.cancel(e);
+                                                       } else {
+                                                               var element = e.keyCode == UP_ARROW ? currentRow.firstChild : currentRow.lastChild;
+                                                               // rely on default behaviour to escape table after we are in the last cell of the last row
+                                                               moveCursorToStartOfElement(element);
+                                                               return true;
+                                                       }
+                                               }
+
+                                               var UP_ARROW = 38;
+                                               var DOWN_ARROW = 40;
+
+                                               if (isVerticalMovement(e) && isInTable(ed)) {
+                                                       var node = ed.selection.getNode();
+                                                       var currentRow = ed.dom.getParent(node, 'tr');
+                                                       var nextRow = getNextRow(e, currentRow);
+
+                                                       // If we're at the first or last row in the table, we should move the caret outside of the table
+                                                       if (nextRow == null) {
+                                                               return escapeTable(currentRow, e);
+                                                       } else {
+                                                               moveCursorToRow(ed, node, nextRow);
+                                                               tinymce.dom.Event.cancel(e);
+                                                               return true;
+                                                       }
+                                               }
+                                       }
+
+                                       ed.onKeyDown.add(moveSelection);
+                               }
+                                                               
+                               // Fixes an issue on Gecko where it's impossible to place the caret behind a table
+                               // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
+                               if (!tinymce.isIE) {
+                                       function fixTableCaretPos() {
+                                               var last;
+
+                                               // Skip empty text nodes form the end
+                                               for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ;
+
+                                               if (last && last.nodeName == 'TABLE')
+                                                       ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />');
+                                       };
+
+                                       // Fixes an bug where it's impossible to place the caret before a table in Gecko
+                                       // this fix solves it by detecting when the caret is at the beginning of such a table
+                                       // and then manually moves the caret infront of the table
+                                       if (tinymce.isGecko) {
+                                               ed.onKeyDown.add(function(ed, e) {
+                                                       var rng, table, dom = ed.dom;
+
+                                                       // On gecko it's not possible to place the caret before a table
+                                                       if (e.keyCode == 37 || e.keyCode == 38) {
+                                                               rng = ed.selection.getRng();
+                                                               table = dom.getParent(rng.startContainer, 'table');
+
+                                                               if (table && ed.getBody().firstChild == table) {
+                                                                       if (isAtStart(rng, table)) {
+                                                                               rng = dom.createRng();
+
+                                                                               rng.setStartBefore(table);
+                                                                               rng.setEndBefore(table);
+
+                                                                               ed.selection.setRng(rng);
+
+                                                                               e.preventDefault();
+                                                                       }
+                                                               }
+                                                       }
+                                               });
+                                       }
+
+                                       ed.onKeyUp.add(fixTableCaretPos);
+                                       ed.onSetContent.add(fixTableCaretPos);
+                                       ed.onVisualAid.add(fixTableCaretPos);
+
+                                       ed.onPreProcess.add(function(ed, o) {
+                                               var last = o.node.lastChild;
+
+                                               if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR')
+                                                       ed.dom.remove(last);
+                                       });
+
+                                       fixTableCaretPos();
+                                       ed.startContent = ed.getContent({format : 'raw'});
+                               }
+                       });
+
+                       // Register action commands
+                       each({
+                               mceTableSplitCells : function(grid) {
+                                       grid.split();
+                               },
+
+                               mceTableMergeCells : function(grid) {
+                                       var rowSpan, colSpan, cell;
+
+                                       cell = ed.dom.getParent(ed.selection.getNode(), 'th,td');
+                                       if (cell) {
+                                               rowSpan = cell.rowSpan;
+                                               colSpan = cell.colSpan;
+                                       }
+
+                                       if (!ed.dom.select('td.mceSelected,th.mceSelected').length) {
+                                               winMan.open({
+                                                       url : url + '/merge_cells.htm',
+                                                       width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)),
+                                                       height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)),
+                                                       inline : 1
+                                               }, {
+                                                       rows : rowSpan,
+                                                       cols : colSpan,
+                                                       onaction : function(data) {
+                                                               grid.merge(cell, data.cols, data.rows);
+                                                       },
+                                                       plugin_url : url
+                                               });
+                                       } else
+                                               grid.merge();
+                               },
+
+                               mceTableInsertRowBefore : function(grid) {
+                                       grid.insertRow(true);
+                               },
+
+                               mceTableInsertRowAfter : function(grid) {
+                                       grid.insertRow();
+                               },
+
+                               mceTableInsertColBefore : function(grid) {
+                                       grid.insertCol(true);
+                               },
+
+                               mceTableInsertColAfter : function(grid) {
+                                       grid.insertCol();
+                               },
+
+                               mceTableDeleteCol : function(grid) {
+                                       grid.deleteCols();
+                               },
+
+                               mceTableDeleteRow : function(grid) {
+                                       grid.deleteRows();
+                               },
+
+                               mceTableCutRow : function(grid) {
+                                       clipboardRows = grid.cutRows();
+                               },
+
+                               mceTableCopyRow : function(grid) {
+                                       clipboardRows = grid.copyRows();
+                               },
+
+                               mceTablePasteRowBefore : function(grid) {
+                                       grid.pasteRows(clipboardRows, true);
+                               },
+
+                               mceTablePasteRowAfter : function(grid) {
+                                       grid.pasteRows(clipboardRows);
+                               },
+
+                               mceTableDelete : function(grid) {
+                                       grid.deleteTable();
+                               }
+                       }, function(func, name) {
+                               ed.addCommand(name, function() {
+                                       var grid = createTableGrid();
+
+                                       if (grid) {
+                                               func(grid);
+                                               ed.execCommand('mceRepaint');
+                                               cleanup();
+                                       }
+                               });
+                       });
+
+                       // Register dialog commands
+                       each({
+                               mceInsertTable : function(val) {
+                                       winMan.open({
+                                               url : url + '/table.htm',
+                                               width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)),
+                                               height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)),
+                                               inline : 1
+                                       }, {
+                                               plugin_url : url,
+                                               action : val ? val.action : 0
+                                       });
+                               },
+
+                               mceTableRowProps : function() {
+                                       winMan.open({
+                                               url : url + '/row.htm',
+                                               width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)),
+                                               height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)),
+                                               inline : 1
+                                       }, {
+                                               plugin_url : url
+                                       });
+                               },
+
+                               mceTableCellProps : function() {
+                                       winMan.open({
+                                               url : url + '/cell.htm',
+                                               width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)),
+                                               height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)),
+                                               inline : 1
+                                       }, {
+                                               plugin_url : url
+                                       });
+                               }
+                       }, function(func, name) {
+                               ed.addCommand(name, function(ui, val) {
+                                       func(val);
+                               });
+                       });
+               }
+       });
+
+       // Register plugin
+       tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
+})(tinymce);
diff --git a/webcit/tiny_mce/plugins/table/js/cell.js b/webcit/tiny_mce/plugins/table/js/cell.js
new file mode 100644 (file)
index 0000000..d6f3290
--- /dev/null
@@ -0,0 +1,319 @@
+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.getStart(), "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
+       if (!ed.dom.hasClass(tdElm, 'mceSelected')) {\r
+               formObj.bordercolor.value = bordercolor;\r
+               formObj.bgcolor.value = bgcolor;\r
+               formObj.backgroundimage.value = backgroundimage;\r
+               formObj.width.value = width;\r
+               formObj.height.value = height;\r
+               formObj.id.value = id;\r
+               formObj.lang.value = lang;\r
+               formObj.style.value = ed.dom.serializeStyle(st);\r
+               selectByValue(formObj, 'align', align);\r
+               selectByValue(formObj, 'valign', valign);\r
+               selectByValue(formObj, 'class', className, true, true);\r
+               selectByValue(formObj, 'celltype', celltype);\r
+               selectByValue(formObj, 'dir', dir);\r
+               selectByValue(formObj, 'scope', scope);\r
+\r
+               // Resize some elements\r
+               if (isVisible('backgroundimagebrowser'))\r
+                       document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+               updateColor('bordercolor_pick', 'bordercolor');\r
+               updateColor('bgcolor_pick', 'bgcolor');\r
+       } else\r
+               tinyMCEPopup.dom.hide('action');\r
+}\r
+\r
+function updateAction() {\r
+       var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0];\r
+\r
+       if (!AutoValidator.validate(formObj)) {\r
+               tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.');\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       el = ed.selection.getStart();\r
+       tdElm = ed.dom.getParent(el, "td,th");\r
+       trElm = ed.dom.getParent(el, "tr");\r
+       tableElm = ed.dom.getParent(el, "table");\r
+\r
+       // Cell is selected\r
+       if (ed.dom.hasClass(tdElm, 'mceSelected')) {\r
+               // Update all selected sells\r
+               tinymce.each(ed.dom.select('td.mceSelected,th.mceSelected'), function(td) {\r
+                       updateCell(td);\r
+               });\r
+\r
+               ed.addVisual();\r
+               ed.nodeChanged();\r
+               inst.execCommand('mceEndUndoLevel');\r
+               tinyMCEPopup.close();\r
+               return;\r
+       }\r
+\r
+       switch (getSelectValue(formObj, 'action')) {\r
+               case "cell":\r
+                       var celltype = getSelectValue(formObj, 'celltype');\r
+                       var scope = getSelectValue(formObj, 'scope');\r
+\r
+                       function doUpdate(s) {\r
+                               if (s) {\r
+                                       updateCell(tdElm);\r
+\r
+                                       ed.addVisual();\r
+                                       ed.nodeChanged();\r
+                                       inst.execCommand('mceEndUndoLevel');\r
+                                       tinyMCEPopup.close();\r
+                               }\r
+                       };\r
+\r
+                       if (ed.getParam("accessibility_warnings", 1)) {\r
+                               if (celltype == "th" && scope == "")\r
+                                       tinyMCEPopup.confirm(ed.getLang('table_dlg.missing_scope', '', true), doUpdate);\r
+                               else\r
+                                       doUpdate(1);\r
+\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 "col":\r
+                       var curr, col = 0, cell = trElm.firstChild, rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       if (cell.nodeName != "TD" && cell.nodeName != "TH")\r
+                               cell = nextCell(cell);\r
+\r
+                       do {\r
+                               if (cell == tdElm)\r
+                                       break;\r
+                               col += cell.getAttribute("colspan");\r
+                       } while ((cell = nextCell(cell)) != null);\r
+\r
+                       for (var i=0; i<rows.length; i++) {\r
+                               cell = rows[i].firstChild;\r
+\r
+                               if (cell.nodeName != "TD" && cell.nodeName != "TH")\r
+                                       cell = nextCell(cell);\r
+\r
+                               curr = 0;\r
+                               do {\r
+                                       if (curr == col) {\r
+                                               cell = updateCell(cell, true);\r
+                                               break;\r
+                                       }\r
+                                       curr += cell.getAttribute("colspan");\r
+                               } while ((cell = nextCell(cell)) != null);\r
+                       }\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
+               dom.setAttrib(td, 'id', formObj.id.value);\r
+\r
+       dom.setAttrib(td, 'align', formObj.align.value);\r
+       dom.setAttrib(td, 'vAlign', formObj.valign.value);\r
+       dom.setAttrib(td, 'lang', formObj.lang.value);\r
+       dom.setAttrib(td, 'dir', getSelectValue(formObj, 'dir'));\r
+       dom.setAttrib(td, 'style', ed.dom.serializeStyle(ed.dom.parseStyle(formObj.style.value)));\r
+       dom.setAttrib(td, 'scope', formObj.scope.value);\r
+       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/webcit/tiny_mce/plugins/table/js/merge_cells.js b/webcit/tiny_mce/plugins/table/js/merge_cells.js
new file mode 100644 (file)
index 0000000..7ee4bf0
--- /dev/null
@@ -0,0 +1,27 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var MergeCellsDialog = {\r
+       init : function() {\r
+               var f = document.forms[0];\r
+\r
+               f.numcols.value = tinyMCEPopup.getWindowArg('cols', 1);\r
+               f.numrows.value = tinyMCEPopup.getWindowArg('rows', 1);\r
+       },\r
+\r
+       merge : function() {\r
+               var func, f = document.forms[0];\r
+\r
+               tinyMCEPopup.restoreSelection();\r
+\r
+               func = tinyMCEPopup.getWindowArg('onaction');\r
+\r
+               func({\r
+                       cols : f.numcols.value,\r
+                       rows : f.numrows.value\r
+               });\r
+\r
+               tinyMCEPopup.close();\r
+       }\r
+};\r
+\r
+tinyMCEPopup.onInit.add(MergeCellsDialog.init, MergeCellsDialog);\r
diff --git a/webcit/tiny_mce/plugins/table/js/row.js b/webcit/tiny_mce/plugins/table/js/row.js
new file mode 100644 (file)
index 0000000..a13d695
--- /dev/null
@@ -0,0 +1,237 @@
+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.getStart(), "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
+       selectByValue(formObj, 'rowtype', rowtype);\r
+\r
+       // Any cells selected\r
+       if (dom.select('td.mceSelected,th.mceSelected', trElm).length == 0) {\r
+               // Setup form\r
+               addClassesToList('class', 'table_row_styles');\r
+               TinyMCE_EditableSelects.init();\r
+\r
+               formObj.bgcolor.value = bgcolor;\r
+               formObj.backgroundimage.value = backgroundimage;\r
+               formObj.height.value = height;\r
+               formObj.id.value = id;\r
+               formObj.lang.value = lang;\r
+               formObj.style.value = dom.serializeStyle(st);\r
+               selectByValue(formObj, 'align', align);\r
+               selectByValue(formObj, 'valign', valign);\r
+               selectByValue(formObj, 'class', className, true, true);\r
+               selectByValue(formObj, 'dir', dir);\r
+\r
+               // Resize some elements\r
+               if (isVisible('backgroundimagebrowser'))\r
+                       document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+               updateColor('bgcolor_pick', 'bgcolor');\r
+       } else\r
+               tinyMCEPopup.dom.hide('action');\r
+}\r
+\r
+function updateAction() {\r
+       var inst = tinyMCEPopup.editor, dom = inst.dom, trElm, tableElm, formObj = document.forms[0];\r
+       var action = getSelectValue(formObj, 'action');\r
+\r
+       if (!AutoValidator.validate(formObj)) {\r
+               tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.');\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       trElm = dom.getParent(inst.selection.getStart(), "tr");\r
+       tableElm = dom.getParent(inst.selection.getStart(), "table");\r
+\r
+       // Update all selected rows\r
+       if (dom.select('td.mceSelected,th.mceSelected', trElm).length > 0) {\r
+               tinymce.each(tableElm.rows, function(tr) {\r
+                       var i;\r
+\r
+                       for (i = 0; i < tr.cells.length; i++) {\r
+                               if (dom.hasClass(tr.cells[i], 'mceSelected')) {\r
+                                       updateRow(tr, true);\r
+                                       return;\r
+                               }\r
+                       }\r
+               });\r
+\r
+               inst.addVisual();\r
+               inst.nodeChanged();\r
+               inst.execCommand('mceEndUndoLevel');\r
+               tinyMCEPopup.close();\r
+               return;\r
+       }\r
+\r
+       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
+               dom.setAttrib(tr_elm, 'id', formObj.id.value);\r
+\r
+       dom.setAttrib(tr_elm, 'align', getSelectValue(formObj, 'align'));\r
+       dom.setAttrib(tr_elm, 'vAlign', getSelectValue(formObj, 'valign'));\r
+       dom.setAttrib(tr_elm, 'lang', formObj.lang.value);\r
+       dom.setAttrib(tr_elm, 'dir', getSelectValue(formObj, 'dir'));\r
+       dom.setAttrib(tr_elm, 'style', dom.serializeStyle(dom.parseStyle(formObj.style.value)));\r
+       dom.setAttrib(tr_elm, 'class', getSelectValue(formObj, 'class'));\r
+\r
+       // Clear deprecated attributes\r
+       dom.setAttrib(tr_elm, 'background', '');\r
+       dom.setAttrib(tr_elm, 'bgColor', '');\r
+       dom.setAttrib(tr_elm, '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 (theTable.firstChild.nodeName == 'CAPTION')\r
+                               inst.dom.insertAfter(newParent, theTable.firstChild);\r
+                       else\r
+                               theTable.insertBefore(newParent, theTable.firstChild);\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/webcit/tiny_mce/plugins/table/js/table.js b/webcit/tiny_mce/plugins/table/js/table.js
new file mode 100644 (file)
index 0000000..520d857
--- /dev/null
@@ -0,0 +1,450 @@
+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
+               tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.');\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 = getSelectValue(formObj, "align");\r
+       frame = getSelectValue(formObj, "tframe");\r
+       rules = getSelectValue(formObj, "rules");\r
+       width = formObj.elements['width'].value;\r
+       height = formObj.elements['height'].value;\r
+       bordercolor = formObj.elements['bordercolor'].value;\r
+       bgcolor = formObj.elements['bgcolor'].value;\r
+       className = getSelectValue(formObj, "class");\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
+               tinyMCEPopup.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit));\r
+               return false;\r
+       } else if (rowLimit && rows > rowLimit) {\r
+               tinyMCEPopup.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit));\r
+               return false;\r
+       } else if (cellLimit && cols * rows > cellLimit) {\r
+               tinyMCEPopup.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit));\r
+               return false;\r
+       }\r
+\r
+       // Update table\r
+       if (action == "update") {\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 data-mce-bogus="1"/>';\r
+\r
+                       elm.insertBefore(capEl, elm.firstChild);\r
+               }\r
+\r
+               if (width && inst.settings.inline_styles) {\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 && inst.settings.inline_styles) {\r
+                       dom.setStyle(elm, 'height', height);\r
+                       dom.setAttrib(elm, 'height', '');\r
+               } else {\r
+                       dom.setAttrib(elm, 'height', height, true);\r
+                       dom.setStyle(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
+       html += makeAttrib('data-mce-new', '1');\r
+\r
+       if (width && inst.settings.inline_styles) {\r
+               if (style)\r
+                       style += '; ';\r
+\r
+               // Force px\r
+               if (/^[0-9\.]+$/.test(width))\r
+                       width += 'px';\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 data-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 data-mce-bogus="1"/></td>';\r
+                       else\r
+                               html += '<td></td>';\r
+               }\r
+\r
+               html += "</tr>";\r
+       }\r
+\r
+       html += "</table>";\r
+\r
+       // Move table\r
+       if (inst.settings.fix_table_elements) {\r
+               var patt = '';\r
+\r
+               inst.focus();\r
+               inst.selection.setContent('<br class="_mce_marker" />');\r
+\r
+               tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) {\r
+                       if (patt)\r
+                               patt += ',';\r
+\r
+                       patt += n + ' ._mce_marker';\r
+               });\r
+\r
+               tinymce.each(inst.dom.select(patt), function(n) {\r
+                       inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n);\r
+               });\r
+\r
+               dom.setOuterHTML(dom.select('br._mce_marker')[0], html);\r
+       } else\r
+               inst.execCommand('mceInsertContent', false, html);\r
+\r
+       tinymce.each(dom.select('table[data-mce-new]'), function(node) {\r
+               var td = dom.select('td', node);\r
+\r
+               try {\r
+                       // IE9 might fail to do this selection\r
+                       inst.selection.select(td[0], true);\r
+                       inst.selection.collapse();\r
+               } catch (ex) {\r
+                       // Ignore\r
+               }\r
+\r
+               dom.setAttrib(node, 'data-mce-new', '');\r
+       });\r
+\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, 'tframe', 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/webcit/tiny_mce/plugins/table/langs/bg_dlg.js b/webcit/tiny_mce/plugins/table/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..30d4181
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.table_dlg',{"rules_border":"\u0433\u0440\u0430\u043d\u0438\u0446\u0430","rules_box":"\u043a\u0443\u0442\u0438\u044f","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"\u0441\u043b\u0435\u0434","rules_above":"\u043f\u0440\u0435\u0434\u0438","rules_void":"void",rules:"\u041f\u0440\u0430\u0432\u0438\u043b\u0430","frame_all":"\u0432\u0441\u0438\u0447\u043a\u0438","frame_cols":"\u043a\u043e\u043b\u043e\u043d\u0438","frame_rows":"\u0440\u0435\u0434\u043e\u0432\u0435","frame_groups":"\u0433\u0440\u0443\u043f\u0438","frame_none":"\u0431\u0435\u0437",frame:"\u0424\u0440\u0435\u0439\u043c",caption:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430","missing_scope":"\u0421\u0438\u0433\u0443\u0440\u0435\u043d \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u0431\u0435\u0437 \u0434\u0430 \u0441\u043b\u043e\u0436\u0438\u0442\u0435 \u043e\u0431\u0445\u0432\u0430\u0442 \u043d\u0430 \u0433\u043b\u0430\u0432\u0430\u0442\u0430 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430. \u0411\u0435\u0437 \u043d\u0435\u0433\u043e, \u043d\u044f\u043a\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0441 \u0443\u0432\u0440\u0435\u0436\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0433\u0430\u0442 \u0434\u0430 \u0438\u043c\u0430\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0434\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0430\u0442 \u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430.","cell_limit":"\u041f\u0440\u0435\u0432\u0438\u0448\u0438\u0445\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043d\u0430\u0442\u0430 \u0431\u0440\u043e\u0439\u043a\u0430 \u043a\u043b\u0435\u0442\u043a\u0438:  {$cells}.","row_limit":"\u041f\u0440\u0435\u0432\u0438\u0448\u0438\u0445\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043d\u0430\u0442\u0430 \u0431\u0440\u043e\u0439\u043a\u0430 \u0440\u0435\u0434\u043e\u0432\u0435:  {$rows}.","col_limit":"\u041f\u0440\u0435\u0432\u0438\u0448\u0438\u0445\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043d\u0430\u0442\u0430 \u0431\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043b\u043e\u043d\u0438: {$cols}.",colgroup:"\u0413\u0440\u0443\u043f\u0430 \u043a\u043e\u043b\u043e\u043d\u0438",rowgroup:"\u0413\u0440\u0443\u043f\u0430 \u0440\u0435\u0434\u043e\u0432\u0435",scope:"\u041e\u0431\u0445\u0432\u0430\u0442",tfoot:"\u0414\u044a\u043d\u043e \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",tbody:"\u0422\u044f\u043b\u043e \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",thead:"\u0413\u043b\u0430\u0432\u0430 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430","row_all":"\u041e\u0431\u043d\u043e\u0432\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u0440\u0435\u0434\u043e\u0432\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430","row_even":"\u041e\u0431\u043d\u043e\u0432\u0438 \u0447\u0435\u0442\u043d\u0438\u0442\u0435 \u0440\u0435\u0434\u043e\u0432\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430","row_odd":"\u041e\u0431\u043d\u043e\u0432\u0438 \u043d\u0435\u0447\u0435\u0442\u043d\u0438\u0442\u0435 \u0440\u0435\u0434\u043e\u0432\u0435 \u0432 \u0442\u0430\u043b\u0438\u0446\u0430\u0442\u0430","row_row":"\u041e\u0431\u043d\u043e\u0432\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u044f \u0440\u0435\u0434","cell_all":"\u041e\u0431\u043d\u043e\u0432\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u043a\u043b\u0435\u0442\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430","cell_row":"\u041e\u0431\u043d\u043e\u0432\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0430 \u0440\u0435\u0434\u0430","cell_cell":"\u041e\u0431\u043d\u043e\u0432\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u0442\u0430 \u043a\u043b\u0435\u0442\u043a\u0430",th:"\u0413\u043b\u0430\u0432\u0430",td:"\u0414\u0430\u043d\u0438\u043d",summary:"\u041e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0435",bgimage:"\u0424\u043e\u043d\u043e\u0432\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",rtl:"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e",ltr:"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e",mime:"MIME \u0442\u0438\u043f",langcode:"\u041a\u043e\u0434 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",langdir:"\u041f\u043e\u0441\u043e\u043a\u0430 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",style:"\u0421\u0442\u0438\u043b",id:"Id","merge_cells_title":"\u0421\u043b\u0435\u0439 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435",bgcolor:"\u0426\u0432\u044f\u0442 \u043d\u0430 \u0444\u043e\u043d\u0430",bordercolor:"\u0426\u0432\u044f\u0442 \u043d\u0430 \u0440\u0430\u043c\u043a\u0430\u0442\u0430","align_bottom":"\u0414\u043e\u043b\u0443","align_top":"\u0413\u043e\u0440\u0435",valign:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435","cell_type":"\u0422\u0438\u043f \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430","cell_title":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430","row_title":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0440\u0435\u0434\u0430","align_middle":"\u0426\u0435\u043d\u0442\u044a\u0440","align_right":"\u0414\u044f\u0441\u043d\u043e","align_left":"\u041b\u044f\u0432\u043e","align_default":"\u041f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435",align:"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",border:"\u0420\u0430\u043c\u043a\u0430",cellpadding:"\u041e\u0442\u0441\u0442\u044a\u043f \u0432 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435",cellspacing:"\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u044a\u0436\u0434\u0443 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435",rows:"\u0420\u0435\u0434\u043e\u0432\u0435",cols:"\u041a\u043e\u043b\u043e\u043d\u0438",height:"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",title:"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0430",rowtype:"\u0420\u043e\u043b\u044f \u043d\u0430 \u0440\u0435\u0434\u0430","advanced_props":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438","general_props":"\u041e\u0431\u0449\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438","advanced_tab":"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438","general_tab":"\u041e\u0431\u0449\u0438","cell_col":"\u041e\u0431\u043d\u043e\u0432\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u043a\u043b\u0435\u0442\u043a\u0438 \u0432 \u043a\u043e\u043b\u043e\u043d\u0430\u0442\u0430"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/cs_dlg.js b/webcit/tiny_mce/plugins/table/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..735c521
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.table_dlg',{"rules_border":"r\u00e1me\u010dek okolo","rules_box":"box okolo","rules_vsides":"vlevo a vpravo","rules_rhs":"vpravo","rules_lhs":"vlevo","rules_hsides":"naho\u0159e a dole","rules_below":"dole","rules_above":"naho\u0159e","rules_void":"\u017e\u00e1dn\u00fd",rules:"Vykreslen\u00ed m\u0159\u00ed\u017eky","frame_all":"v\u0161e","frame_cols":"sloupce","frame_rows":"\u0159\u00e1dky","frame_groups":"oblasti a skupiny sloupc\u016f","frame_none":"\u017e\u00e1dn\u00e1",frame:"R\u00e1me\u010dek tabulky",caption:"Nadpis tabulky","missing_scope":"Skute\u010dn\u011b chcete pokra\u010dovat bez ur\u010den\u00ed oblasti hlavi\u010dky t\u00e9to tabulky? Bez n\u00ed m\u016f\u017ee u n\u011bkter\u00fdch u\u017eivatel\u016f doch\u00e1zet k ur\u010dit\u00fdm probl\u00e9m\u016fm p\u0159i interpretaci a zobrazov\u00e1n\u00ed dat v tabulce.","cell_limit":"P\u0159ekro\u010dili jste maxim\u00e1ln\u00ed po\u010det bun\u011bk {$cells}.","row_limit":"P\u0159ekro\u010dili jste maxim\u00e1ln\u00ed po\u010det \u0159\u00e1dk\u016f {$rows}.","col_limit":"P\u0159ekro\u010dili jste maxim\u00e1ln\u00ed po\u010det sloupc\u016f {$cols}.",colgroup:"Skupina sloupc\u016f",rowgroup:"Skupina \u0159\u00e1dk\u016f",scope:"Hlavi\u010dka pro",tfoot:"Pata tabulky",tbody:"T\u011blo tabulky",thead:"Hlavi\u010dka tabulky","row_all":"Aktualizovat v\u0161echny \u0159\u00e1dky tabulky","row_even":"Aktualizovat sud\u00e9 \u0159\u00e1dky tabulky","row_odd":"Aktualizovat lich\u00e9 \u0159\u00e1dky tabulky","row_row":"Aktualizovat zvolen\u00fd \u0159\u00e1dek","cell_all":"Aktualizovat v\u0161echny bu\u0148ky v tabulce","cell_row":"Aktualizovat v\u0161echny bu\u0148ky v \u0159\u00e1dku","cell_cell":"Aktualizovat zvolenou bu\u0148ku",th:"Z\u00e1hlav\u00ed",td:"Data",summary:"Shrnut\u00ed obsahu",bgimage:"Obr\u00e1zek pozad\u00ed",rtl:"Zprava doleva",ltr:"Zleva doprava",mime:"MIME typ c\u00edle",langcode:"K\u00f3d jazyka",langdir:"Sm\u011br textu",style:"Styl",id:"ID","merge_cells_title":"Spojit bu\u0148ky",bgcolor:"Barva pozad\u00ed",bordercolor:"Barva r\u00e1me\u010dku","align_bottom":"Dol\u016f","align_top":"Nahoru",valign:"Vertik\u00e1ln\u00ed zarovn\u00e1n\u00ed","cell_type":"Typ bu\u0148ky","cell_title":"Vlastnosti bu\u0148ky","row_title":"Vlastnosti \u0159\u00e1dku","align_middle":"Na st\u0159ed","align_right":"Vpravo","align_left":"Vlevo","align_default":"V\u00fdchoz\u00ed",align:"Zarovn\u00e1n\u00ed",border:"R\u00e1me\u010dek",cellpadding:"Odsazen\u00ed obsahu",cellspacing:"Rozestup bun\u011bk",rows:"\u0158\u00e1dky",cols:"Sloupce",height:"V\u00fd\u0161ka",width:"\u0160\u00ed\u0159ka",title:"Vlo\u017eit/upravit tabulku",rowtype:"Typ \u0159\u00e1dku","advanced_props":"Roz\u0161\u00ed\u0159en\u00e9 parametry","general_props":"Obecn\u00e9 parametry","advanced_tab":"Roz\u0161\u00ed\u0159en\u00e9","general_tab":"Obecn\u00e9","cell_col":"Aktualizovat v\u0161echny bu\u0148ky ve sloupci"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/da_dlg.js b/webcit/tiny_mce/plugins/table/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..13220a5
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.table_dlg',{"rules_border":"kant","rules_box":"boks","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"under","rules_above":"over","rules_void":"void",rules:"Regler","frame_all":"alle","frame_cols":"kolonner","frame_rows":"r\u00e6kker","frame_groups":"grupper","frame_none":"ingen",frame:"Ramme",caption:"Tabeloverskrift","missing_scope":"Er du sikker p\u00e5, du vil forts\u00e6tte uden at angive forklaring for denne overskriftscelle? Uden forklaring vil v\u00e6re sv\u00e6rt for f.ek.s blinde at l\u00e6se og forst\u00e5 indholdet i tabellen.","cell_limit":"Du har overskredet antallet af tilladte celler p\u00e5 {$cells}.","row_limit":"Du har overskredet antallet af tilladte r\u00e6kker p\u00e5 {$rows}.","col_limit":"Du har overskredet antallet af tilladte kolonner p\u00e5 {$cols}.",colgroup:"Kolonnegruppe",rowgroup:"R\u00e6kkegruppe",scope:"Forklaring",tfoot:"Tabelfod",tbody:"Tabelkrop",thead:"Tabelhoved","row_all":"Opdater alle r\u00e6kker","row_even":"Opdater lige r\u00e6kker","row_odd":"Opdater ulige r\u00e6kker","row_row":"Opdater aktuelle celle","cell_all":"Opdater alle celler i tabellen","cell_row":"Opdater alle celler i r\u00e6kken","cell_cell":"Opdater aktuelle celle",th:"Hoved",td:"Data",summary:"Beskrivelse",bgimage:"Baggrundsbillede",rtl:"H\u00f8jre mod venstre",ltr:"Venstre mod h\u00f8jre",mime:"Destinations-MIME-type",langcode:"Sprogkode",langdir:"Sprogretning",style:"Style",id:"Id","merge_cells_title":"Flet celler",bgcolor:"Baggrundsfarve",bordercolor:"Kantfarve","align_bottom":"Bund","align_top":"Top",valign:"Vertikal justering","cell_type":"Celletype","cell_title":"Celleegenskaber","row_title":"R\u00e6kkeegenskaber","align_middle":"Centreret","align_right":"H\u00f8jre","align_left":"Venstre","align_default":"Standard",align:"Justering",border:"Kant",cellpadding:"Afstand til celleindhold",cellspacing:"Afstand mellem celler",rows:"R\u00e6kker",cols:"Kolonner",height:"H\u00f8jde",width:"Bredde",title:"Inds\u00e6t/rediger tabel",rowtype:"R\u00e6kke i tabel del","advanced_props":"Avancerede egenskaber","general_props":"Generelle egenskaber","advanced_tab":"Avanceret","general_tab":"Generelt","cell_col":"Opdat\u00e9r alle celler i en s\u00f8jle"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/de_dlg.js b/webcit/tiny_mce/plugins/table/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..5a64ebd
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.table_dlg',{"rules_border":"alle 4 Seiten (Border)","rules_box":"alle 4 Seiten (Box)","rules_vsides":"links und rechts","rules_rhs":"nur rechts","rules_lhs":"nur links","rules_hsides":"oben und unten","rules_below":"nur unten","rules_above":"nur oben","rules_void":"keins",rules:"Gitter","frame_all":"zwischen allen Zellen","frame_cols":"zwischen Spalten","frame_rows":"zwischen Zeilen","frame_groups":"zwischen Gruppen","frame_none":"keine",frame:"Rahmen",caption:"Beschriftung der Tabelle","missing_scope":"Wollen Sie wirklich keine Beziehung f\u00fcr diese \u00dcberschrift angeben? Benutzer mit k\u00f6rperlichen Einschr\u00e4nkungen k\u00f6nnten Schwierigkeiten haben, den Inhalt der Tabelle zu verstehen.","cell_limit":"Sie haben die maximale Zellenzahl von {$cells} \u00fcberschritten.","row_limit":"Sie haben die maximale Zeilenzahl von {$rows} \u00fcberschritten.","col_limit":"Sie haben die maximale Spaltenzahl von {$cols} \u00fcberschritten.",colgroup:"Horizontal gruppieren",rowgroup:"Vertikal gruppieren",scope:"Bezug",tfoot:"Tabellenfu\u00df",tbody:"Tabelleninhalt",thead:"Tabellenkopf","row_all":"Alle Zeilen ver\u00e4ndern","row_even":"Gerade Zeilen ver\u00e4ndern","row_odd":"Ungerade Zeilen ver\u00e4ndern","row_row":"Diese Zeile ver\u00e4ndern","cell_all":"Alle Zellen der Tabelle ver\u00e4ndern","cell_row":"Alle Zellen in dieser Zeile ver\u00e4ndern","cell_cell":"Diese Zelle ver\u00e4ndern",th:"\u00dcberschrift",td:"Textzelle",summary:"Zusammenfassung",bgimage:"Hintergrundbild",rtl:"Rechts nach links",ltr:"Links nach rechts",mime:"MIME-Type des Inhalts",langcode:"Sprachcode",langdir:"Schriftrichtung",style:"Format",id:"ID","merge_cells_title":"Zellen vereinen",bgcolor:"Hintergrundfarbe",bordercolor:"Rahmenfarbe","align_bottom":"Unten","align_top":"Oben",valign:"Vertikale Ausrichtung","cell_type":"Zellentyp","cell_title":"Eigenschaften der Zelle","row_title":"Eigenschaften der Zeile","align_middle":"Mittig","align_right":"Rechts","align_left":"Links","align_default":"Standard",align:"Ausrichtung",border:"Rahmen",cellpadding:"Abstand innerhalb der Zellen",cellspacing:"Zellenabstand",rows:"Zeilen",cols:"Spalten",height:"H\u00f6he",width:"Breite",title:"Tabelle einf\u00fcgen/bearbeiten",rowtype:"Gruppierung","advanced_props":"Erweiterte Einstellungen","general_props":"Allgemeine Einstellungen","advanced_tab":"Erweitert","general_tab":"Allgemein","cell_col":"Alle Zellen in dieser Spalte aktualisieren"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/el_dlg.js b/webcit/tiny_mce/plugins/table/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..f2510f0
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.table_dlg',{"rules_border":"\u03c0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf","rules_box":"\u03ba\u03bf\u03c5\u03c4\u03af","rules_vsides":"\u03ba\u03ac\u03b8\u03b5\u03c4\u03b5\u03c2 \u03c0\u03bb\u03b5\u03c5\u03c1\u03ad\u03c2","rules_rhs":"\u03b4\u03b5\u03be\u03b9\u03ac \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03c0\u03bb\u03b5\u03c5\u03c1\u03ac","rules_lhs":"\u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ae \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03c0\u03bb\u03b5\u03c5\u03c1\u03ac","rules_hsides":"\u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b5\u03c2 \u03c0\u03bb\u03b5\u03c5\u03c1\u03ad\u03c2","rules_below":"\u03b1\u03c0\u03cc \u03ba\u03ac\u03c4\u03c9","rules_above":"\u03b1\u03c0\u03cc \u03c0\u03ac\u03bd\u03c9","rules_void":"\u03ba\u03b5\u03bd\u03cc",rules:"\u039a\u03b1\u03bd\u03cc\u03bd\u03b5\u03c2","frame_all":"\u03cc\u03bb\u03b1","frame_cols":"\u03c3\u03c4\u03ae\u03bb\u03b5\u03c2","frame_rows":"\u03b3\u03c1\u03b1\u03bc\u03bc\u03ad\u03c2","frame_groups":"\u03bf\u03bc\u03ac\u03b4\u03b5\u03c2","frame_none":"\u03ba\u03b1\u03bd\u03ad\u03bd\u03b1",frame:"Frame",caption:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","missing_scope":"\u03a3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5 \u03c7\u03c9\u03c1\u03af\u03c2 \u03bd\u03b1 \u03ad\u03c7\u03b5\u03c4\u03b5 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03b7\u03bd \u03b5\u03bc\u03b2\u03ad\u03bb\u03b5\u03b9\u03b1 \u03c4\u03bf\u03c5 \u03ba\u03b5\u03bb\u03b9\u03bf\u03cd \u03c4\u03b7\u03c2 \u03ba\u03bf\u03c1\u03c5\u03c6\u03ae\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1. \u03a7\u03c9\u03c1\u03af\u03c2 \u03b1\u03c5\u03c4\u03ae, \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03cd\u03c3\u03ba\u03bf\u03bb\u03bf \u03b3\u03b9\u03b1 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03c5\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 \u03bc\u03b5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1 \u03bd\u03b1 \u03ba\u03b1\u03c4\u03b1\u03bb\u03ac\u03b2\u03bf\u03c5\u03bd \u03c4\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1.","cell_limit":"\u0388\u03c7\u03b5\u03c4\u03b5 \u03be\u03b5\u03c0\u03b5\u03c1\u03ac\u03c3\u03b5\u03b9 \u03c4\u03bf \u03cc\u03c1\u03b9\u03bf \u03c4\u03c9\u03bd \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c0\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9 {$cells}.","row_limit":"\u0388\u03c7\u03b5\u03c4\u03b5 \u03be\u03b5\u03c0\u03b5\u03c1\u03ac\u03c3\u03b5\u03b9 \u03c4\u03bf \u03cc\u03c1\u03b9\u03bf \u03c4\u03c9\u03bd \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03c0\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9 {$rows}.","col_limit":"\u0388\u03c7\u03b5\u03c4\u03b5 \u03be\u03b5\u03c0\u03b5\u03c1\u03ac\u03c3\u03b5\u03b9 \u03c4\u03bf \u03cc\u03c1\u03b9\u03bf \u03c4\u03c9\u03bd \u03c3\u03c4\u03b7\u03bb\u03c9\u03bd \u03c0\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9 {$cols}.",colgroup:"\u039f\u03bc\u03ac\u03b4\u03b1 \u03c3\u03c4\u03b7\u03bb\u03ce\u03bd",rowgroup:"\u039f\u03bc\u03ac\u03b4\u03b1 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd",scope:"\u0395\u03bc\u03b2\u03ad\u03bb\u03b5\u03b9\u03b1",tfoot:"\u0392\u03ac\u03c3\u03b7 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",tbody:"\u03a3\u03ce\u03bc\u03b1 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",thead:"\u039a\u03bf\u03c1\u03c5\u03c6\u03ae \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","row_all":"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","row_even":"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03b6\u03c5\u03b3\u03ce\u03bd \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","row_odd":"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03bc\u03bf\u03bd\u03ce\u03bd \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","row_row":"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2","cell_all":"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","cell_row":"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c4\u03b7\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2","cell_cell":"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd\u03c4\u03bf\u03c2 \u03ba\u03b5\u03bb\u03b9\u03bf\u03cd",th:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1",td:"\u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1",summary:"\u03a0\u03b5\u03c1\u03af\u03bb\u03b7\u03c8\u03b7",bgimage:"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5",rtl:"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",ltr:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac",mime:"\u03a4\u03cd\u03c0\u03bf\u03c2 MIME \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",langcode:"\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",langdir:"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",style:"\u03a3\u03c4\u03c5\u03bb",id:"Id","merge_cells_title":"\u03a3\u03c5\u03b3\u03c7\u03ce\u03bd\u03b5\u03c5\u03c3\u03b7 \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",bgcolor:"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5",bordercolor:"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c0\u03bb\u03b1\u03b9\u03c3\u03af\u03bf\u03c5","align_bottom":"\u039a\u03ac\u03c4\u03c9","align_top":"\u03a0\u03ac\u03bd\u03c9",valign:"\u039a\u03b1\u03c4\u03b1\u03ba\u03cc\u03c1\u03c5\u03c6\u03b7 \u03c3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7","cell_type":"\u03a4\u03cd\u03c0\u03bf\u03c2 \u03ba\u03b5\u03bb\u03b9\u03bf\u03cd","cell_title":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03ba\u03b5\u03bb\u03b9\u03bf\u03cd \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","row_title":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","align_middle":"\u039a\u03ad\u03bd\u03c4\u03c1\u03bf","align_right":"\u0394\u03b5\u03be\u03b9\u03ac","align_left":"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","align_default":"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7",align:"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7",border:"\u03a0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf",cellpadding:"\u0393\u03ad\u03bc\u03b9\u03c3\u03bc\u03b1 \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd",cellspacing:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd",rows:"\u0393\u03c1\u03b1\u03bc\u03bc\u03ad\u03c2",cols:"\u03a3\u03c4\u03ae\u03bb\u03b5\u03c2",height:"\u038e\u03c8\u03bf\u03c2",width:"\u03a0\u03bb\u03ac\u03c4\u03bf\u03c2",title:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",rowtype:"\u0393\u03c1\u03b1\u03bc\u03bc\u03ae \u03c3\u03b5 \u03bc\u03ad\u03c1\u03bf\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1","advanced_props":"\u03a0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2","general_props":"\u0393\u03b5\u03bd\u03b9\u03ba\u03ad\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2","advanced_tab":"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2","general_tab":"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac","cell_col":"\u0391\u03bd\u03b1\u03bd\u03ad\u03c9\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c3\u03c4\u03b7\u03bd \u03c3\u03c4\u03ae\u03bb\u03b7"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/en_dlg.js b/webcit/tiny_mce/plugins/table/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..463e09e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"Rules","frame_all":"all","frame_cols":"cols","frame_rows":"rows","frame_groups":"groups","frame_none":"none",frame:"Frame",caption:"Table Caption","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.","cell_limit":"You\'ve exceeded the maximum number of cells of {$cells}.","row_limit":"You\'ve exceeded the maximum number of rows of {$rows}.","col_limit":"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Footer",tbody:"Body",thead:"Header","row_all":"Update All Rows in Table","row_even":"Update Even Rows in Table","row_odd":"Update Odd Rows in Table","row_row":"Update Current Row","cell_all":"Update All Cells in Table","cell_row":"Update All Cells in Row","cell_cell":"Update Current Cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background Image",rtl:"Right to Left",ltr:"Left to Right",mime:"Target MIME Type",langcode:"Language Code",langdir:"Language Direction",style:"Style",id:"ID","merge_cells_title":"Merge Table Cells",bgcolor:"Background Color",bordercolor:"Border Color","align_bottom":"Bottom","align_top":"Top",valign:"Vertical Alignment","cell_type":"Cell Type","cell_title":"Table Cell Properties","row_title":"Table Row Properties","align_middle":"Center","align_right":"Right","align_left":"Left","align_default":"Default",align:"Alignment",border:"Border",cellpadding:"Cell Padding",cellspacing:"Cell Spacing",rows:"Rows",cols:"Columns",height:"Height",width:"Width",title:"Insert/Edit Table",rowtype:"Row Type","advanced_props":"Advanced Properties","general_props":"General Properties","advanced_tab":"Advanced","general_tab":"General","cell_col":"Update all cells in column"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/es_dlg.js b/webcit/tiny_mce/plugins/table/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..32701a8
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"debajo","rules_above":"encima","rules_void":"vac\u00edo",rules:"Reglas","frame_all":"todos","frame_cols":"cols","frame_rows":"filas","frame_groups":"grupos","frame_none":"ninguno",frame:"Recuadro",caption:"Subt\u00edtulo de la tabla","missing_scope":" \u00bfEst\u00e1 seguro que desea continuar sin especificar el alcance del encabezado de celda? Sin \u00e9l podr\u00eda ser dificultoso para algunos usuarios entender el contenido o los datos mostrados en la tabla.","cell_limit":"Ha superado el n\u00famero m\u00e1ximo de celdas: {$cells}.","row_limit":"Ha superado el n\u00famero m\u00e1ximo de filas: {$rows}.","col_limit":"Ha superado el n\u00famero m\u00e1ximo de columnas: {$cols}.",colgroup:"Grupo de columnas",rowgroup:"Grupo de filas",scope:"Alcance",tfoot:"Pie de la tabla",tbody:"Cuerpo de la tabla",thead:"Encabezado de la tabla","row_all":"Actualizar todas las filas","row_even":"Actualizar filas pares","row_odd":"Actualizar filas impares","row_row":"Actualizar fila actual","cell_all":"Actualizar todas las celdas en la tabla","cell_row":"Actualizar todas las celdas en la fila","cell_cell":"Actualizar celda actual",th:"Encabezado",td:"Datos",summary:"Resumen",bgimage:"Imagen de fondo",rtl:"Derecha a izquierda",ltr:"Izquierda a derecha",mime:"Tipo MIME",langcode:"C\u00f3digo del lenguaje",langdir:"Direcci\u00f3n del lenguaje",style:"Estilo",id:"Id","merge_cells_title":"Vincular celdas",bgcolor:"Color de fondo",bordercolor:"Color del borde","align_bottom":"Debajo","align_top":"Arriba",valign:"Alineaci\u00f3n vertical","cell_type":"Tipo de celda","cell_title":"Propiedades de la celda","row_title":"Propiedades de la fila","align_middle":"Centrado","align_right":"Derecha","align_left":"Izquierda","align_default":"Predet.",align:"Alineaci\u00f3n",border:"Borde",cellpadding:"Relleno de celda",cellspacing:"Espaciado de celda",rows:"Filas",cols:"Cols",height:"Alto",width:"Ancho",title:"Insertar/Modificar tabla",rowtype:"Tipo de fila","advanced_props":"Propiedades avanzadas","general_props":"Propiedades generales","advanced_tab":"Avanzado","general_tab":"General","cell_col":"Actualizar todas las celdas en la columna"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/et_dlg.js b/webcit/tiny_mce/plugins/table/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..ec2131d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.table_dlg',{"rules_border":"raam","rules_box":"kast","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"all","rules_above":"\u00fcleval","rules_void":"t\u00fchi",rules:"Reeglid","frame_all":"k\u00f5ik","frame_cols":"veerud","frame_rows":"read","frame_groups":"grupid","frame_none":"mitte \u00fckski",frame:"Raam",caption:"Tabeli seletus","missing_scope":"Oled kindel, et soovid j\u00e4tkata t\u00e4psustamata antud tabeli p\u00e4ise nime?","cell_limit":"Oled j\u00f5udnud maksimaalse arvu elementideni","row_limit":"Oled j\u00f5udnud maksimaalse arvu ridadeni","col_limit":"Oled j\u00f5udnud maksemaalse arvu veegudeni.",colgroup:"Veeru grupp",rowgroup:"Rea grupp",scope:"Ulatus",tfoot:"Tabeli jalus",tbody:"Tabeli sisu",thead:"Tabeli p\u00e4is","row_all":"Uuenda k\u00f5iki ridu tabelis","row_even":"Uuenda paaris ridu tabelis","row_odd":"Uuenda paarituid ridu tabelis","row_row":"Uuenda antud rida","cell_all":"Uuenda k\u00f5iki lahtreid tabelis","cell_row":"Uuenda k\u00f5iki lahtreid reas","cell_cell":"Uuenda antud lahtrit",th:"P\u00e4is",td:"Info",summary:"Kokkuv\u00f5te",bgimage:"Tausta pilt",rtl:"Paremalt vasakule",ltr:"Vasakult paremale",mime:"M\u00e4rgista MIME t\u00fc\u00fcp",langcode:"Keele kood",langdir:"Keele suund",style:"Stiil",id:"ID","merge_cells_title":"\u00dchenda lahtrid",bgcolor:"Tausta v\u00e4rv",bordercolor:"Raami v\u00e4rv","align_bottom":"All","align_top":"\u00dcleval",valign:"Vertikaalne joondus","cell_type":"Veeru t\u00fc\u00fcp","cell_title":"Tabeli veeru seaded","row_title":"Tabeli rea seaded","align_middle":"Keskel","align_right":"Parem","align_left":"Vasak","align_default":"Vaikimisi",align:"Joondus",border:"Raam",cellpadding:"Veeru t\u00e4ide",cellspacing:"Veeru laius",rows:"Ridu",cols:"Veerge",height:"K\u00f5rgus",width:"Laius",title:"Sisesta/muuda tabelit",rowtype:"Rida rea osas","advanced_props":"T\u00e4psustatud seaded","general_props":"\u00dcldised seaded","advanced_tab":"T\u00e4psustatud","general_tab":"\u00dcldine","cell_col":"Update all cells in column"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/fi_dlg.js b/webcit/tiny_mce/plugins/table/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..87ed836
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.table_dlg',{"rules_border":"kehys","rules_box":"laatikko","rules_vsides":"pystysuorat reunat","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"vaakasuorat reunat","rules_below":"alapuoli","rules_above":"yl\u00e4puoli","rules_void":"tyhj\u00e4",rules:"S\u00e4\u00e4nn\u00f6t","frame_all":"kaikki","frame_cols":"sarakkeet","frame_rows":"rivit","frame_groups":"ryhm\u00e4t","frame_none":"ei mit\u00e4\u00e4n",frame:"kehys",caption:"Taulukon seloste","missing_scope":"Haluatko varmasti jatkaa m\u00e4\u00e4ritt\u00e4m\u00e4tt\u00e4 tilaa t\u00e4lle taulukon otsakesolulle? Ilman sit\u00e4 joidenkin k\u00e4ytt\u00e4jien voi olla vaikea ymm\u00e4rt\u00e4\u00e4 taulukon sis\u00e4lt\u00e4m\u00e4\u00e4 informaatiota.","cell_limit":"Olet ylitt\u00e4nyt suurimman sallitun m\u00e4\u00e4r\u00e4n soluja {$cells}.","row_limit":"Olet ylitt\u00e4nyt suurimman sallitun m\u00e4\u00e4r\u00e4n rivej\u00e4 {$rows}.","col_limit":"Olet ylitt\u00e4nyt suurimman sallitun m\u00e4\u00e4r\u00e4n sarakkeita {$cols}.",colgroup:"Sarake ryhm\u00e4",rowgroup:"Rivi ryhm\u00e4",scope:"Tila",tfoot:"Taulukon alaosa",tbody:"Taulukon runko",thead:"Taulukon otsake","row_all":"P\u00e4ivit\u00e4 kaikki taulukon rivit","row_even":"P\u00e4ivit\u00e4 taulukon parilliset rivit","row_odd":"P\u00e4ivit\u00e4 taulukon parittomat rivit","row_row":"P\u00e4ivit\u00e4 rivi","cell_all":"P\u00e4ivit\u00e4 kaikki taulukon solut","cell_row":"P\u00e4ivit\u00e4 kaikki rivin solut","cell_cell":"P\u00e4ivit\u00e4 solu",th:"Otsake",td:"Tietue",summary:"Yhteenveto",bgimage:"Taustakuva",rtl:"Oikealta vasemmalle",ltr:"Vasemmalta oikealle",mime:"Kohteen MIME-tyyppi",langcode:"Kielen koodi",langdir:"Kielen suunta",style:"Tyyli",id:"Id","merge_cells_title":"Yhdist\u00e4 taulukon solut",bgcolor:"Taustan v\u00e4ri",bordercolor:"Kehyksen v\u00e4ri","align_bottom":"Alas","align_top":"Yl\u00f6s",valign:"Pystysuunnan tasaus","cell_type":"Solun tyyppi","cell_title":"Taulukon solun asetukset","row_title":"Taulukon rivin asetukset","align_middle":"Keskitetty","align_right":"Oikea","align_left":"Vasen","align_default":"Oletus",align:"Tasaus",border:"Kehys",cellpadding:"Solun tyhj\u00e4 tila",cellspacing:"Solun v\u00e4li",rows:"Rivit",cols:"Sarakkeet",height:"Korkeus",width:"Leveys",title:"Lis\u00e4\u00e4/muokkaa taulukkoa",rowtype:"Rivi taulukon osassa","advanced_props":"Edistyneet asetukset","general_props":"Yleiset asetukset","advanced_tab":"Edistynyt","general_tab":"Yleiset","cell_col":"P\u00e4ivit\u00e4 kaikki sarakkeen solut"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/fr_dlg.js b/webcit/tiny_mce/plugins/table/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..9f9488a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.table_dlg',{"rules_border":"bordure","rules_box":"bo\u00eete","rules_vsides":"verticales","rules_rhs":"\u00e0 droite","rules_lhs":"\u00e0 gauche","rules_hsides":"horizontales","rules_below":"au-dessous","rules_above":"au-dessus","rules_void":"aucune",rules:"R\u00e8gles","frame_all":"tous","frame_cols":"colonnes","frame_rows":"lignes","frame_groups":"groupe","frame_none":"aucun",frame:"Cadre",caption:"Afficher la l\u00e9gende du tableau","missing_scope":"\u00cates-vous s\u00fbr de vouloir continuer sans sp\u00e9cifier de port\u00e9e pour cette cellule de titre ? Sans port\u00e9e, cela peut \u00eatre difficile pour certains utilisateurs de comprendre le contenu ou les donn\u00e9es affich\u00e9es dans le tableau.","cell_limit":"Vous avez d\u00e9pass\u00e9 le nombre maximum de cellules ({$cells}).","row_limit":"Vous avez d\u00e9pass\u00e9 le nombre maximum de lignes ({$rows}).","col_limit":"Vous avez d\u00e9pass\u00e9 le nombre maximum de colonnes ({$cols}).",colgroup:"Groupe de colonnes",rowgroup:"Groupe de lignes",scope:"Port\u00e9e",tfoot:"Pied de tableau",tbody:"Corps de tableau",thead:"En-t\u00eates de tableau","row_all":"Mettre \u00e0 jour toutes les lignes du tableau","row_even":"Mettre \u00e0 jour les lignes paires","row_odd":"Mettre \u00e0 jour les lignes impaires","row_row":"Mettre \u00e0 jour la ligne courante","cell_all":"Mettre \u00e0 jour toutes les cellules du tableau","cell_row":"Mettre \u00e0 jour toutes les cellules de la ligne","cell_cell":"Mettre \u00e0 jour la cellule courante",th:"Titre",td:"Donn\u00e9es",summary:"R\u00e9sum\u00e9",bgimage:"Image de fond",rtl:"de droite \u00e0 gauche",ltr:"De gauche \u00e0 droite",mime:"Type MIME de la cible",langcode:"Code de la langue",langdir:"Sens de lecture",style:"Style",id:"Id","merge_cells_title":"Fusionner les cellules",bgcolor:"Couleur du fond",bordercolor:"Couleur de la bordure","align_bottom":"Bas","align_top":"Haut",valign:"Alignement vertical","cell_type":"Type de cellule","cell_title":"Propri\u00e9t\u00e9s de la cellule","row_title":"Propri\u00e9t\u00e9s de la ligne","align_middle":"Centr\u00e9","align_right":"Droite","align_left":"Gauche","align_default":"Par d\u00e9faut",align:"Alignement",border:"Bordure",cellpadding:"Espacement dans les cellules",cellspacing:"Espacement entre les cellules",rows:"Lignes",cols:"Colonnes",height:"Hauteur",width:"Largeur",title:"Ins\u00e9rer / modifier un tableau",rowtype:"Type de ligne","advanced_props":"Propri\u00e9t\u00e9s avanc\u00e9es","general_props":"Propri\u00e9t\u00e9s g\u00e9n\u00e9rales","advanced_tab":"Avanc\u00e9","general_tab":"G\u00e9n\u00e9ral","cell_col":"Mettre \u00e0 jour toutes les cellules de la colonne"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/hu_dlg.js b/webcit/tiny_mce/plugins/table/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..518c3ad
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.table_dlg',{"rules_border":"keret","rules_box":"doboz","rules_vsides":"f. oldalak","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"v. oldalak","rules_below":"alatta","rules_above":"f\u00f6l\u00f6tte","rules_void":"sehol",rules:"Vonalak","frame_all":"mind","frame_cols":"oszlopok","frame_rows":"sorok","frame_groups":"csoportok","frame_none":"nincs",frame:"Keret",caption:"C\u00edmsor","missing_scope":"Biztosan folytatni akarja an\u00e9lk\u00fcl, hogy hat\u00f3k\u00f6rt adna ennek a fejl\u00e9ccell\u00e1nak? Korl\u00e1toz\u00e1sokkal \u00e9l\u0151k sz\u00e1m\u00e1ra neh\u00e9z lesz meg\u00e9rteni a t\u00e1bl\u00e1zat tartalm\u00e1t.","cell_limit":"T\u00fall\u00e9pte a maxim\u00e1lis cellasz\u00e1mot, ami {$cells}.","row_limit":"T\u00fall\u00e9pte a maxim\u00e1lis sorsz\u00e1mot, ami {$rows}.","col_limit":"T\u00fall\u00e9pte a maxim\u00e1lis oszlopsz\u00e1mot, ami {$cols}.",colgroup:"Oszlop csoport",rowgroup:"Sor csoport",scope:"Hat\u00f3k\u00f6r",tfoot:"T\u00e1bl\u00e1zat l\u00e1bl\u00e9c",tbody:"T\u00e1bl\u00e1zat tartalom",thead:"T\u00e1bl\u00e1zat fejl\u00e9c","row_all":"Minden sor friss\u00edt\u00e9se","row_even":"P\u00e1ros sorok friss\u00edt\u00e9se","row_odd":"P\u00e1ratlan sorok friss\u00edt\u00e9se","row_row":"Sor friss\u00edt\u00e9se","cell_all":"T\u00e1bl\u00e1zat \u00f6sszes cell\u00e1j\u00e1nak friss\u00edt\u00e9se","cell_row":"Sor \u00f6sszes cell\u00e1j\u00e1nak friss\u00edt\u00e9se","cell_cell":"Cella friss\u00edt\u00e9se",th:"Fejl\u00e9c",td:"Adat",summary:"\u00d6sszegz\u00e9s",bgimage:"H\u00e1tt\u00e9rk\u00e9p",rtl:"Jobbr\u00f3l balra",ltr:"Balr\u00f3l jobbra",mime:"C\u00e9l MIME t\u00edpus",langcode:"Nyelvk\u00f3d",langdir:"\u00cdr\u00e1s ir\u00e1ny",style:"St\u00edlus",id:"Id","merge_cells_title":"Cell\u00e1k \u00f6sszevon\u00e1sa",bgcolor:"H\u00e1tt\u00e9rsz\u00edn",bordercolor:"Keretsz\u00edn","align_bottom":"Le","align_top":"Fel",valign:"F\u00fcgg\u0151leges igaz\u00edt\u00e1s","cell_type":"Cellat\u00edpus","cell_title":"Cella tulajdons\u00e1gai","row_title":"Sor tulajdons\u00e1gai","align_middle":"K\u00f6z\u00e9pre","align_right":"Jobbra","align_left":"Balra","align_default":"Alap\u00e9rtelmezett",align:"Igaz\u00edt\u00e1s",border:"Keret",cellpadding:"Cella bels\u0151 marg\u00f3",cellspacing:"Cella t\u00e1vols\u00e1g",rows:"Sorok",cols:"Oszlopok",height:"Magass\u00e1g",width:"Sz\u00e9less\u00e9g",title:"T\u00e1bl\u00e1zat besz\u00far\u00e1sa/szerkeszt\u00e9se",rowtype:"Sor a t\u00e1bl\u00e1ban","advanced_props":"Halad\u00f3 tulajdons\u00e1gok","general_props":"\u00c1ltal\u00e1nos tulajdons\u00e1gok","advanced_tab":"Halad\u00f3","general_tab":"\u00c1ltal\u00e1nos","cell_col":"\u00d6sszes cella friss\u00edt\u00e9se az oszlopban"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/it_dlg.js b/webcit/tiny_mce/plugins/table/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..2a847ed
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.table_dlg',{"rules_border":"bordo","rules_box":"box","rules_vsides":"lato vert.","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"lato orizz.","rules_below":"sotto","rules_above":"sopra","rules_void":"vuoto",rules:"Regole","frame_all":"tutte","frame_cols":"colonne","frame_rows":"righe","frame_groups":"gruppi","frame_none":"nessuna",frame:"Cornice",caption:"Didascalia tabella","missing_scope":"Sicuro di proseguire senza aver specificato uno scope per l\'intestazione di questa tabella? Senza di esso, potrebbe essere difficoltoso per alcuni utenti con disabilit\u00e0 capire il contenuto o i dati mostrati nella tabella.","cell_limit":"Superato il numero massimo di celle di {$cells}.","row_limit":"Superato il numero massimo di righe di {$rows}.","col_limit":"Superato il numero massimo di colonne di {$cols}.",colgroup:"Gruppo colonna",rowgroup:"Gruppo riga",scope:"Scope",tfoot:"Pedice tabella",tbody:"Corpo tabella",thead:"Intestazione tabella","row_all":"Update tutte le righe della tabella","row_even":"Aggiorna righe pari della tabella","row_odd":"Aggiorna righe dispari della tabella","row_row":"Aggiorna riga corrente","cell_all":"Aggiorna tutte le celle della tabella","cell_row":"Aggiorna tutte le celle della riga","cell_cell":"Aggiorna cella corrente",th:"Intestazione",td:"Data",summary:"Sommario",bgimage:"Immagine sfondo",rtl:"Destra verso sinistra",ltr:"Sinistra verso destra",mime:"Tipo MIME del target",langcode:"Lingua",langdir:"Direzione testo",style:"Stile",id:"Id","merge_cells_title":"Unisci celle",bgcolor:"Colore sfondo",bordercolor:"Colore bordo","align_bottom":"In basso","align_top":"In alto",valign:"Allineamento verticale","cell_type":"Tipo cella","cell_title":"Propriet\u00e0 cella","row_title":"Propriet\u00e0 riga","align_middle":"Centra","align_right":"A destra","align_left":"A sinistra","align_default":"Predefinito",align:"Allineamento",border:"Bordo",cellpadding:"Padding celle",cellspacing:"Spaziatura celle",rows:"Righe",cols:"Colonne",height:"Altezza",width:"Larghezza",title:"Inserisci/Modifica tabella",rowtype:"Riga in una parte di tabella","advanced_props":"Propriet\u00e0 avanzate","general_props":"Propriet\u00e0 generali","advanced_tab":"Avanzate","general_tab":"Generale","cell_col":"Aggiorna tutte le celle della colonna"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/table/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..4fe3003
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.table_dlg',{"rules_border":"\u8fb9\u6846","rules_box":"\u6846","rules_vsides":"\u5782\u76f4","rules_rhs":"\u53f3\u8fb9","rules_lhs":"\u5de6\u8fb9","rules_hsides":"\u6c34\u5e73","rules_below":"\u4e0b","rules_above":"\u4e0a","rules_void":"\u7a7a",rules:"\u89c4\u5219","frame_all":"\u5168\u90e8","frame_cols":"\u5217","frame_rows":"\u884c","frame_groups":"\u5206\u7ec4","frame_none":"\u65e0",frame:"\u6846\u67b6",caption:"\u683c\u6807\u9898","missing_scope":"\u60a8\u6ca1\u6709\u6307\u5b9a\u8868\u683c\u7684\u6807\u9898\u5355\u5143\uff0c\u5982\u679c\u4e0d\u8bbe\u7f6e\uff0c\u53ef\u80fd\u4f1a\u4f7f\u7528\u6237\u96be\u4ee5\u7406\u89e3\u60a8\u7684\u8868\u683c\u7684\u5185\u5bb9\u3002\u60a8\u8981\u7ee7\u7eed\u5417\uff1f","cell_limit":"\u5df2\u7ecf\u8d85\u51fa\u6700\u5927\u5355\u5143\u683c\u6570{$cells}\u3002","row_limit":"\u5df2\u7ecf\u8d85\u51fa\u6700\u5927\u884c\u6570{$rows}\u3002","col_limit":"\u5df2\u7ecf\u8d85\u51fa\u6700\u5927\u5217\u6570{$cols}\u3002",colgroup:"\u5217\u5206\u7ec4",rowgroup:"\u884c\u5206\u7ec4",scope:"\u8303\u56f4",tfoot:"\u8868\u5c3e",tbody:"\u8868\u683c\u4e3b\u4f53",thead:"\u8868\u5934","row_all":"\u66f4\u65b0\u8868\u683c\u7684\u6240\u6709\u884c","row_even":"\u66f4\u65b0\u8868\u683c\u7684\u5076\u6570\u884c","row_odd":"\u66f4\u65b0\u8868\u683c\u7684\u5947\u6570\u884c","row_row":"\u66f4\u65b0\u5f53\u524d\u884c","cell_all":"\u66f4\u65b0\u6240\u6709\u5355\u5143\u683c","cell_row":"\u66f4\u65b0\u5f53\u524d\u884c\u7684\u5355\u5143\u683c","cell_cell":"\u66f4\u65b0\u5f53\u524d\u5355\u5143\u683c",th:"\u8868\u5934",td:"\u5185\u5bb9",summary:"\u6458\u8981",bgimage:"\u80cc\u666f\u56fe\u7247",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",mime:"\u76ee\u6807MIME\u7c7b\u578b",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",style:"\u6837\u5f0f",id:"ID","merge_cells_title":"\u5408\u5e76\u5355\u5143\u683c",bgcolor:"\u80cc\u666f\u989c\u8272",bordercolor:"\u8fb9\u6846\u989c\u8272","align_bottom":"\u9760\u4e0b","align_top":"\u9760\u4e0a",valign:"\u5782\u76f4\u5bf9\u9f50","cell_type":"\u5355\u5143\u683c\u7c7b\u578b","cell_title":"\u5355\u5143\u683c\u5c5e\u6027","row_title":"\u884c\u5c5e\u6027","align_middle":"\u5c45\u4e2d","align_right":"\u53f3\u5bf9\u9f50","align_left":"\u5de6\u5bf9\u9f50","align_default":"\u9ed8\u8ba4",align:"\u5bf9\u9f50",border:"\u8fb9\u6846",cellpadding:"\u5355\u5143\u683c\u8fb9\u8ddd",cellspacing:"\u5355\u5143\u683c\u95f4\u8ddd",rows:"\u884c\u6570",cols:"\u5217\u6570",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",title:"\u63d2\u5165/\u7f16\u8f91 \u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e","advanced_props":"\u9ad8\u7ea7\u5c5e\u6027","general_props":"\u666e\u901a\u5c5e\u6027","advanced_tab":"\u9ad8\u7ea7","general_tab":"\u666e\u901a","cell_col":"\u66f4\u65b0\u8be5\u5217\u5168\u90e8\u5355\u5143\u683c"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/merge_cells.htm b/webcit/tiny_mce/plugins/table/merge_cells.htm
new file mode 100644 (file)
index 0000000..d231090
--- /dev/null
@@ -0,0 +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>{#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
+</head>\r
+<body style="margin: 8px" role="application">\r
+<form onsubmit="MergeCellsDialog.merge();return false;" action="#">\r
+       <fieldset>\r
+               <legend>{#table_dlg.merge_cells_title}</legend>\r
+               <table role="presentation" border="0" cellpadding="0" cellspacing="3" width="100%">\r
+                       <tr>\r
+                               <td><label for="numcols">{#table_dlg.cols}</label>:</td>\r
+                               <td align="right"><input type="text" id="numcols" name="numcols" value="" class="number min1 mceFocus" style="width: 30px" aria-required="true" /></td>\r
+                       </tr>\r
+                       <tr>\r
+                               <td><label for="numrows">{#table_dlg.rows}</label>:</td>\r
+                               <td align="right"><input type="text" id="numrows" name="numrows" value="" class="number min1" style="width: 30px" aria-required="true" /></td>\r
+                       </tr>\r
+               </table>\r
+       </fieldset>\r
+\r
+       <div class="mceActionPanel">\r
+               <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/table/row.htm b/webcit/tiny_mce/plugins/table/row.htm
new file mode 100644 (file)
index 0000000..1885401
--- /dev/null
@@ -0,0 +1,158 @@
+<!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>{#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/validate.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
+</head>\r
+<body id="tablerow" style="display: none" role="application">\r
+       <form onsubmit="updateAction();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current" aria-controls="general_panel"><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" aria-controls="advanced_panel"><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>{#table_dlg.general_props}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="rowtype">{#table_dlg.rowtype}</label></td>\r
+                                                       <td class="col2">\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">{#table_dlg.align}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="align" name="align">\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">{#table_dlg.valign}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="valign" name="valign">\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">{#class_name}</label></td>\r
+                                                       <td class="col2">\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">{#table_dlg.height}</label></td>\r
+                                                       <td class="col2"><input name="height" type="text" id="height" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{#table_dlg.advanced_props}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\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">{#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">{#table_dlg.langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" style="width: 200px"> \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">{#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">{#table_dlg.bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor" id="bgcolor_label">{#table_dlg.bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <span role="group" aria-labelledby="bgcolor_label">\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                               </span>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div>\r
+                               <select id="action" name="action">\r
+                                       <option value="row">{#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
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/table/table.htm b/webcit/tiny_mce/plugins/table/table.htm
new file mode 100644 (file)
index 0000000..09d3700
--- /dev/null
@@ -0,0 +1,188 @@
+<!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>{#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
+</head>\r
+<body id="table" style="display: none" role="application" aria-labelledby="app_title">\r
+       <span style="display:none;" id="app_title">{#table_dlg.title}</span>\r
+       <form onsubmit="insertTable();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" aria-controls="general_panel" 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" aria-controls="advanced_panel"><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>{#table_dlg.general_props}</legend>\r
+                                       <table role="presentation" border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                               <tr>\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" aria-required="true" /></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" aria-required="true" /></td>\r
+                                               </tr>\r
+                                               <tr>\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">{#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">{#table_dlg.align}</label></td>\r
+                                                       <td><select id="align" name="align">\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">{#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">{#table_dlg.width}</label></td>\r
+                                                       <td><input name="width" type="text" id="width" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>\r
+                                                       <td><label id="heightlabel" for="height">{#table_dlg.height}</label></td>\r
+                                                       <td><input name="height" type="text" id="height" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>\r
+                                               </tr>\r
+                                               <tr id="styleSelectRow" >\r
+                                                       <td><label id="classlabel" for="class">{#class_name}</label></td>\r
+                                                       <td colspan="3" >\r
+                                                        <select id="class" name="class" class="mceEditableSelect">\r
+                                                               <option value="" selected="selected">{#not_set}</option>\r
+                                                        </select></td>\r
+                                               </tr>\r
+                                               <tr>\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
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{#table_dlg.advanced_props}</legend>\r
+\r
+                                       <table role="presentation" border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\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">{#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">{#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 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">{#table_dlg.bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table role="presentation" aria-labelledby="backgroundimage_label" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" class="advfield" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="tframe">{#table_dlg.frame}</label></td> \r
+                                                       <td>\r
+                                                               <select id="tframe" name="tframe" class="advfield"> \r
+                                                                               <option value="">{#not_set}</option>\r
+                                                                               <option value="void">{#table_dlg.rules_void}</option>\r
+                                                                               <option value="above">{#table_dlg.rules_above}</option> \r
+                                                                               <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="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="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="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 role="group" aria-labelledby="bordercolor_label">\r
+                                                       <td class="column1"><label id="bordercolor_label" for="bordercolor">{#table_dlg.bordercolor}</label></td> \r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>\r
+                                                                               <td id="bordercolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr role="group" aria-labelledby="bgcolor_label">\r
+                                                       <td class="column1"><label id="bgcolor_label" for="bgcolor">{#table_dlg.bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table role="presentation" border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/template/blank.htm b/webcit/tiny_mce/plugins/template/blank.htm
new file mode 100644 (file)
index 0000000..ecde53f
--- /dev/null
@@ -0,0 +1,12 @@
+<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
+       <script type="text/javascript">\r
+               parent.TemplateDialog.loadCSSFiles(document);\r
+       </script>\r
+</head>\r
+<body id="mceTemplatePreview" class="mceContentBody">\r
+\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/template/css/template.css b/webcit/tiny_mce/plugins/template/css/template.css
new file mode 100644 (file)
index 0000000..2d23a49
--- /dev/null
@@ -0,0 +1,23 @@
+#frmbody {\r
+       padding: 10px;\r
+       background-color: #FFF;\r
+       border: 1px solid #CCC;\r
+}\r
+\r
+.frmRow {\r
+       margin-bottom: 10px;\r
+}\r
+\r
+#templatesrc {\r
+       border: none;\r
+       width: 320px;\r
+       height: 240px;\r
+}\r
+\r
+.title {\r
+       padding-bottom: 5px;\r
+}\r
+\r
+.mceActionPanel {\r
+       padding-top: 5px;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/template/editor_plugin.js b/webcit/tiny_mce/plugins/template/editor_plugin.js
new file mode 100644 (file)
index 0000000..ebe3c27
--- /dev/null
@@ -0,0 +1 @@
+(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.TemplatePlugin",{init:function(b,c){var d=this;d.editor=b;b.addCommand("mceTemplate",function(e){b.windowManager.open({file:c+"/template.htm",width:b.getParam("template_popup_width",750),height:b.getParam("template_popup_height",600),inline:1},{plugin_url:c})});b.addCommand("mceInsertTemplate",d._insertTemplate,d);b.addButton("template",{title:"template.desc",cmd:"mceTemplate"});b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("div",g.node),function(h){if(f.hasClass(h,"mceTmpl")){a(f.select("*",h),function(i){if(f.hasClass(i,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){i.innerHTML=d._getDateTime(new Date(),e.getParam("template_mdate_format",e.getLang("template.mdate_format")))}});d._replaceVals(h)}})})},getInfo:function(){return{longname:"Template plugin",author:"Moxiecode Systems AB",authorurl:"http://www.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_insertTemplate:function(i,j){var k=this,g=k.editor,f,c,d=g.dom,b=g.selection.getContent();f=j.content;a(k.editor.getParam("template_replace_values"),function(l,h){if(typeof(l)!="function"){f=f.replace(new RegExp("\\{\\$"+h+"\\}","g"),l)}});c=d.create("div",null,f);n=d.select(".mceTmpl",c);if(n&&n.length>0){c=d.create("div",null);c.appendChild(n[0].cloneNode(true))}function e(l,h){return new RegExp("\\b"+h+"\\b","g").test(l.className)}a(d.select("*",c),function(h){if(e(h,g.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_cdate_format",g.getLang("template.cdate_format")))}if(e(h,g.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_mdate_format",g.getLang("template.mdate_format")))}if(e(h,g.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))){h.innerHTML=b}});k._replaceVals(c);g.execCommand("mceInsertContent",false,c.innerHTML);g.addVisual()},_replaceVals:function(c){var d=this.editor.dom,b=this.editor.getParam("template_replace_values");a(d.select("*",c),function(f){a(b,function(g,e){if(d.hasClass(f,e)){if(typeof(b[e])=="function"){b[e](f)}}})})},_getDateTime:function(e,b){if(!b){return""}function c(g,d){var f;g=""+g;if(g.length<d){for(f=0;f<(d-g.length);f++){g="0"+g}}return g}b=b.replace("%D","%m/%d/%y");b=b.replace("%r","%I:%M:%S %p");b=b.replace("%Y",""+e.getFullYear());b=b.replace("%y",""+e.getYear());b=b.replace("%m",c(e.getMonth()+1,2));b=b.replace("%d",c(e.getDate(),2));b=b.replace("%H",""+c(e.getHours(),2));b=b.replace("%M",""+c(e.getMinutes(),2));b=b.replace("%S",""+c(e.getSeconds(),2));b=b.replace("%I",""+((e.getHours()+11)%12+1));b=b.replace("%p",""+(e.getHours()<12?"AM":"PM"));b=b.replace("%B",""+this.editor.getLang("template_months_long").split(",")[e.getMonth()]);b=b.replace("%b",""+this.editor.getLang("template_months_short").split(",")[e.getMonth()]);b=b.replace("%A",""+this.editor.getLang("template_day_long").split(",")[e.getDay()]);b=b.replace("%a",""+this.editor.getLang("template_day_short").split(",")[e.getDay()]);b=b.replace("%%","%");return b}});tinymce.PluginManager.add("template",tinymce.plugins.TemplatePlugin)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/editor_plugin_src.js b/webcit/tiny_mce/plugins/template/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..9cac269
--- /dev/null
@@ -0,0 +1,159 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.plugins.TemplatePlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceTemplate', function(ui) {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/template.htm',\r
+                                       width : ed.getParam('template_popup_width', 750),\r
+                                       height : ed.getParam('template_popup_height', 600),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       ed.addCommand('mceInsertTemplate', t._insertTemplate, t);\r
+\r
+                       // Register buttons\r
+                       ed.addButton('template', {title : 'template.desc', cmd : 'mceTemplate'});\r
+\r
+                       ed.onPreProcess.add(function(ed, o) {\r
+                               var dom = ed.dom;\r
+\r
+                               each(dom.select('div', o.node), function(e) {\r
+                                       if (dom.hasClass(e, 'mceTmpl')) {\r
+                                               each(dom.select('*', e), function(e) {\r
+                                                       if (dom.hasClass(e, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|')))\r
+                                                               e.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format")));\r
+                                               });\r
+\r
+                                               t._replaceVals(e);\r
+                                       }\r
+                               });\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Template plugin',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://www.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               _insertTemplate : function(ui, v) {\r
+                       var t = this, ed = t.editor, h, el, dom = ed.dom, sel = ed.selection.getContent();\r
+\r
+                       h = v.content;\r
+\r
+                       each(t.editor.getParam('template_replace_values'), function(v, k) {\r
+                               if (typeof(v) != 'function')\r
+                                       h = h.replace(new RegExp('\\{\\$' + k + '\\}', 'g'), v);\r
+                       });\r
+\r
+                       el = dom.create('div', null, h);\r
+\r
+                       // Find template element within div\r
+                       n = dom.select('.mceTmpl', el);\r
+                       if (n && n.length > 0) {\r
+                               el = dom.create('div', null);\r
+                               el.appendChild(n[0].cloneNode(true));\r
+                       }\r
+\r
+                       function hasClass(n, c) {\r
+                               return new RegExp('\\b' + c + '\\b', 'g').test(n.className);\r
+                       };\r
+\r
+                       each(dom.select('*', el), function(n) {\r
+                               // Replace cdate\r
+                               if (hasClass(n, ed.getParam('template_cdate_classes', 'cdate').replace(/\s+/g, '|')))\r
+                                       n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_cdate_format", ed.getLang("template.cdate_format")));\r
+\r
+                               // Replace mdate\r
+                               if (hasClass(n, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|')))\r
+                                       n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format")));\r
+\r
+                               // Replace selection\r
+                               if (hasClass(n, ed.getParam('template_selected_content_classes', 'selcontent').replace(/\s+/g, '|')))\r
+                                       n.innerHTML = sel;\r
+                       });\r
+\r
+                       t._replaceVals(el);\r
+\r
+                       ed.execCommand('mceInsertContent', false, el.innerHTML);\r
+                       ed.addVisual();\r
+               },\r
+\r
+               _replaceVals : function(e) {\r
+                       var dom = this.editor.dom, vl = this.editor.getParam('template_replace_values');\r
+\r
+                       each(dom.select('*', e), function(e) {\r
+                               each(vl, function(v, k) {\r
+                                       if (dom.hasClass(e, k)) {\r
+                                               if (typeof(vl[k]) == 'function')\r
+                                                       vl[k](e);\r
+                                       }\r
+                               });\r
+                       });\r
+               },\r
+\r
+               _getDateTime : function(d, fmt) {\r
+                               if (!fmt)\r
+                                       return "";\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
+                               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("%B", "" + this.editor.getLang("template_months_long").split(',')[d.getMonth()]);\r
+                               fmt = fmt.replace("%b", "" + this.editor.getLang("template_months_short").split(',')[d.getMonth()]);\r
+                               fmt = fmt.replace("%A", "" + this.editor.getLang("template_day_long").split(',')[d.getDay()]);\r
+                               fmt = fmt.replace("%a", "" + this.editor.getLang("template_day_short").split(',')[d.getDay()]);\r
+                               fmt = fmt.replace("%%", "%");\r
+\r
+                               return fmt;\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('template', tinymce.plugins.TemplatePlugin);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/js/template.js b/webcit/tiny_mce/plugins/template/js/template.js
new file mode 100644 (file)
index 0000000..bc3045d
--- /dev/null
@@ -0,0 +1,106 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var TemplateDialog = {\r
+       preInit : function() {\r
+               var url = tinyMCEPopup.getParam("template_external_list_url");\r
+\r
+               if (url != null)\r
+                       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></sc'+'ript>');\r
+       },\r
+\r
+       init : function() {\r
+               var ed = tinyMCEPopup.editor, tsrc, sel, x, u;\r
+\r
+               tsrc = ed.getParam("template_templates", false);\r
+               sel = document.getElementById('tpath');\r
+\r
+               // Setup external template list\r
+               if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') {\r
+                       for (x=0, tsrc = []; x<tinyMCETemplateList.length; x++)\r
+                               tsrc.push({title : tinyMCETemplateList[x][0], src : tinyMCETemplateList[x][1], description : tinyMCETemplateList[x][2]});\r
+               }\r
+\r
+               for (x=0; x<tsrc.length; x++)\r
+                       sel.options[sel.options.length] = new Option(tsrc[x].title, tinyMCEPopup.editor.documentBaseURI.toAbsolute(tsrc[x].src));\r
+\r
+               this.resize();\r
+               this.tsrc = tsrc;\r
+       },\r
+\r
+       resize : function() {\r
+               var w, h, e;\r
+\r
+               if (!self.innerWidth) {\r
+                       w = document.body.clientWidth - 50;\r
+                       h = document.body.clientHeight - 160;\r
+               } else {\r
+                       w = self.innerWidth - 50;\r
+                       h = self.innerHeight - 170;\r
+               }\r
+\r
+               e = document.getElementById('templatesrc');\r
+\r
+               if (e) {\r
+                       e.style.height = Math.abs(h) + 'px';\r
+                       e.style.width = Math.abs(w - 5) + 'px';\r
+               }\r
+       },\r
+\r
+       loadCSSFiles : function(d) {\r
+               var ed = tinyMCEPopup.editor;\r
+\r
+               tinymce.each(ed.getParam("content_css", '').split(','), function(u) {\r
+                       d.write('<link href="' + ed.documentBaseURI.toAbsolute(u) + '" rel="stylesheet" type="text/css" />');\r
+               });\r
+       },\r
+\r
+       selectTemplate : function(u, ti) {\r
+               var d = window.frames['templatesrc'].document, x, tsrc = this.tsrc;\r
+\r
+               if (!u)\r
+                       return;\r
+\r
+               d.body.innerHTML = this.templateHTML = this.getFileContents(u);\r
+\r
+               for (x=0; x<tsrc.length; x++) {\r
+                       if (tsrc[x].title == ti)\r
+                               document.getElementById('tmpldesc').innerHTML = tsrc[x].description || '';\r
+               }\r
+       },\r
+\r
+       insert : function() {\r
+               tinyMCEPopup.execCommand('mceInsertTemplate', false, {\r
+                       content : this.templateHTML,\r
+                       selection : tinyMCEPopup.editor.selection.getContent()\r
+               });\r
+\r
+               tinyMCEPopup.close();\r
+       },\r
+\r
+       getFileContents : function(u) {\r
+               var x, d, t = 'text/plain';\r
+\r
+               function g(s) {\r
+                       x = 0;\r
+\r
+                       try {\r
+                               x = new ActiveXObject(s);\r
+                       } catch (s) {\r
+                       }\r
+\r
+                       return x;\r
+               };\r
+\r
+               x = window.ActiveXObject ? g('Msxml2.XMLHTTP') || g('Microsoft.XMLHTTP') : new XMLHttpRequest();\r
+\r
+               // Synchronous AJAX load file\r
+               x.overrideMimeType && x.overrideMimeType(t);\r
+               x.open("GET", u, false);\r
+               x.send(null);\r
+\r
+               return x.responseText;\r
+       }\r
+};\r
+\r
+TemplateDialog.preInit();\r
+tinyMCEPopup.onInit.add(TemplateDialog.init, TemplateDialog);\r
diff --git a/webcit/tiny_mce/plugins/template/langs/bg_dlg.js b/webcit/tiny_mce/plugins/template/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..8791dcf
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.template_dlg',{title:"\u0422\u0435\u043c\u043f\u043b\u0435\u0439\u0442\u0438",label:"\u0422\u0435\u043c\u043f\u043b\u0435\u0439\u0442","desc_label":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",desc:"\u0412\u043c\u044a\u043a\u043d\u0438 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435\u0442\u043e \u043d\u0430 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442",select:"\u0418\u0437\u0431\u0435\u0440\u0438 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442",preview:"\u041f\u0440\u0435\u0433\u043b\u0435\u0434",warning:"\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u041e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0435\u0434\u0438\u043d \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442 \u0441 \u0434\u0440\u0443\u0433 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0434\u043e\u0432\u0435\u0434\u0435 \u0434\u043e \u0437\u0430\u0433\u0443\u0431\u0430 \u043d\u0430 \u0434\u0430\u043d\u043d\u0438.","mdate_format":"%Y-%m-%d %H:%M:%S","cdate_format":"%Y-%m-%d %H:%M:%S","months_long":"\u042f\u043d\u0443\u0430\u0440\u0438,\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438,\u041c\u0430\u0440\u0442,\u0410\u043f\u0440\u0438\u043b,\u041c\u0430\u0439,\u042e\u043d\u0438,\u042e\u043b\u0438,\u0410\u0432\u0433\u0443\u0441\u0442,\u0421\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438,\u041e\u043a\u0442\u043e\u043c\u0432\u0440\u0438,\u041d\u043e\u0435\u043c\u0432\u0440\u0438,\u0414\u0435\u043a\u0435\u043c\u0432\u0440\u0438","months_short":"\u042f\u043d\u0443,\u0424\u0435\u0432,\u041c\u0430\u0440,\u0410\u043f\u0440,\u041c\u0430\u0439,\u042e\u043d\u0438,\u042e\u043b\u0438,\u0410\u0432\u0433,\u0421\u0435\u043f,\u041e\u043a\u0442,\u041d\u043e\u0435,\u0414\u0435\u043a","day_long":"\u041d\u0435\u0434\u0435\u043b\u044f,\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a,\u0412\u0442\u043e\u0440\u043d\u0438\u043a,\u0421\u0440\u044f\u0434\u0430,\u0427\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a,\u041f\u0435\u0442\u044a\u043a,\u0421\u044a\u0431\u043e\u0442\u0430,\u041d\u0435\u0434\u0435\u043b\u044f","day_short":"\u041d\u0434,\u041f\u043d,\u0412\u0442,\u0421\u0440,\u0427\u0442,\u041f\u0442,\u0421\u0431,\u041d\u0434"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/cs_dlg.js b/webcit/tiny_mce/plugins/template/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..acf5e14
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.template_dlg',{title:"\u0160ablony",label:"\u0160ablona","desc_label":"Popis",desc:"Vlo\u017eit p\u0159eddefinovan\u00fd obsah ze \u0161ablony",select:"Vybrat \u0161ablonu",preview:"N\u00e1hled",warning:"Upozorn\u011bn\u00ed: Aktualizace \u0161ablony jinou zp\u016fsob\u00ed ztr\u00e1tu dat.","mdate_format":"%d.%m.%Y %H:%M:%S","cdate_format":"%d.%m.%Y %H:%M:%S","months_long":"Leden,\u00danor,B\u0159ezen,Duben,Kv\u011bten,\u010cerven,\u010cervenec,Srpen,Z\u00e1\u0159\u00ed,\u0158\u00edjen,Listopad,Prosinec","months_short":"Led,\u00dano,B\u0159e,Dub,Kv\u011b,\u010cer,\u010cvc,Srp,Z\u00e1\u0159,\u0158\u00edj,Lis,Pro","day_long":"Ned\u011ble,Pond\u011bl\u00ed,\u00dater\u00fd,St\u0159eda,\u010ctvrtek,P\u00e1tek,Sobota,Ned\u011ble","day_short":"Ne,Po,\u00dat,St,\u010ct,P\u00e1,So,Ne"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/da_dlg.js b/webcit/tiny_mce/plugins/template/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..5728ce1
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.template_dlg',{title:"Skabeloner",label:"Skabelon","desc_label":"Beskrivelse",desc:"Inds\u00e6t pr\u00e6defineret skabelonindhold",select:"V\u00e6lg en skabelon",preview:"Vis udskrift",warning:"Advarsel: Opdatering af en skabelon med en anden kan betyde datatab.","mdate_format":"%Y-%m-%d %H:%M:%S","cdate_format":"%Y-%m-%d %H:%M:%S","months_long":"Januar,Februar,Marts,April,Maj,Juni,Juli,August,September,Oktober,November,December","months_short":"Jan,Feb,Mar,Apr,Maj,Jun,Jul,Aug,Sep,Okt,Nov,Dec","day_long":"S\u00f8ndag,Mandag,Tirsdag,Onsdag,Torsdag,Fredag,L\u00f8rdag,S\u00f8ndag","day_short":"S\u00f8n,Man,Tirs,Ons,Tors,Fre,L\u00f8r,S\u00f8n"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/de_dlg.js b/webcit/tiny_mce/plugins/template/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..04c9fa1
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.template_dlg',{title:"Vorlagen",label:"Vorlage","desc_label":"Beschreibung",desc:"Inhalt aus Vorlage einf\u00fcgen",select:"Vorlage ausw\u00e4hlen",preview:"Vorschau",warning:"Warnung: Eine Vorlage mit einer anderen zu aktualisieren kann zu einem Datenverlust f\u00fchren!","mdate_format":"%Y-%m-%d %H:%M:%S","cdate_format":"%Y-%m-%d %H:%M:%S","months_long":"Januar,Februar,M\u00e4rz,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember","months_short":"Jan,Feb,M\u00e4r,Apr,Mai,Juni,Juli,Aug,Sept,Okt,Nov,Dez","day_long":"Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag","day_short":"So,Mo,Di,Mi,Do,Fr,Sa,So"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/el_dlg.js b/webcit/tiny_mce/plugins/template/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..4f53722
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.template_dlg',{title:"\u03a0\u03c1\u03cc\u03c4\u03c5\u03c0\u03b1",label:"\u03a0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf","desc_label":"\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae",desc:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5 \u03b3\u03b9\u03b1 \u03c0\u03c1\u03bf\u03ba\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03c0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf",select:"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5",preview:"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7",warning:"\u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae : \u0395\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03bd\u03bf\u03bd\u03c4\u03b1\u03c2 \u03ad\u03bd\u03b1 \u03c0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf \u03bc\u03b5 \u03ad\u03bd\u03b1 \u03ac\u03bb\u03bb\u03bf, \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c0\u03c1\u03bf\u03ba\u03b1\u03bb\u03ad\u03c3\u03b5\u03b9 \u03b1\u03c0\u03ce\u03bb\u03b5\u03b9\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd.","mdate_format":"%Y-%m-%d %H:%M:%S","cdate_format":"%Y-%m-%d %H:%M:%S","months_long":"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2,\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2,\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2,\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2,\u039c\u03ac\u03b9\u03bf\u03c2,\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2,\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2,\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2,\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2,\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2,\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2,\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2","months_short":"\u0399\u03b1\u03bd,\u03a6\u03b5\u03b2,\u039c\u03ac\u03c1,\u0391\u03c0\u03c1,\u039c\u03ac\u03b9,\u0399\u03bf\u03cd\u03bd,\u0399\u03bf\u03cd\u03bb,\u0391\u03cd\u03b3,\u03a3\u03b5\u03c0,\u039f\u03ba\u03c4,\u039d\u03bf\u03ad,\u0394\u03b5\u03ba","day_long":"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae,\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1,\u03a4\u03c1\u03af\u03c4\u03b7,\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7,\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7,\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae,\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf","day_short":"\u039a\u03c5,\u0394\u03b5,\u03a4\u03c1,\u03a4\u03b5\u03c4,\u03a0\u03ad\u03bc,\u03a0\u03b1\u03c1,\u03a3\u03b1\u03b2"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/en_dlg.js b/webcit/tiny_mce/plugins/template/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..83e599d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.template_dlg',{title:"Templates",label:"Template","desc_label":"Description",desc:"Insert Predefined Template Content",select:"Select a Template",preview:"Preview",warning:"Warning: Updating a template with a different one may cause data loss.","mdate_format":"%Y-%m-%d %H:%M:%S","cdate_format":"%Y-%m-%d %H:%M:%S","months_long":"January,February,March,April,May,June,July,August,September,October,November,December","months_short":"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec","day_long":"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","day_short":"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/es_dlg.js b/webcit/tiny_mce/plugins/template/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..185e45a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.template_dlg',{title:"Plantillas",label:"Plantilla","desc_label":"Descripci\u00f3n",desc:"Insertar contenido de plantilla predefinida",select:"Elegir plantilla",preview:"Vista previa",warning:"Cuidado: Actualizar una plantilla con otra puede causar p\u00e9rdida de datos.","mdate_format":"%d-%m-%Y %H:%M:%S","cdate_format":"%d-%m-%Y %H:%M:%S","months_long":"Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre","months_short":"Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic","day_long":"Domingo,Lunes,Martes,Mi\u00e9rcoles,Jueves,Viernes,S\u00e1bado,Domingo","day_short":"Dom,Lun,Mar,Mie,Jue,Vie,Sab,Dom"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/et_dlg.js b/webcit/tiny_mce/plugins/template/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..a1ad878
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.template_dlg',{title:"\u0160abloonid",label:"\u0160abloon","desc_label":"Kirjeldus",desc:"Sisesta eeldefineeritud \u0161ablooni sisu",select:"Vali \u0161abloon",preview:"Eelvaade",warning:"Hoiatus: \u0160ablooni uuendamine teistsugusega v\u00f5ib kaasa tuua andmete kaotsiminemist.","mdate_format":"%Y-%m-%d %H:%M:%S","cdate_format":"%Y-%m-%d %H:%M:%S","months_long":"Jaanuar,Veebruar,M\u00e4rts,Aprill,Mai,Juuni,Juuli,August,September,Oktoober,November,Detsember","months_short":"Jaan,Veeb,M\u00e4rts,Apr,Mai,Juuni,Juuli,Aug,Sep,Okt,Nov,Dets","day_long":"P\u00fchap\u00e4ev,Esmasp\u00e4ev,Teisip\u00e4ev,Kolmap\u00e4ev,Neljap\u00e4ev,reede,Laup\u00e4ev,P\u00fchap\u00e4ev","day_short":"P,E,T,K,N,R,L,P"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/fi_dlg.js b/webcit/tiny_mce/plugins/template/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..d3ce437
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.template_dlg',{title:"Sivupohjat",label:"Sivupohja","desc_label":"Kuvaus",desc:"Lis\u00e4\u00e4 esim\u00e4\u00e4ritetty\u00e4 sivupohjasis\u00e4lt\u00f6\u00e4",select:"Valitse sivupohja",preview:"Esikatselu",warning:"Varoitus: Sivupohjan p\u00e4ivitt\u00e4minen toisella saattaa aiheuttaa tiedon menetyksen.","mdate_format":"%d.%m.%Y %H:%M:%S","cdate_format":"%d.%m.%Y %H:%M:%S","months_long":"Tammikuu,Helmikuu,Maaliskuu,Huhtikuu,Toukokuu,Kes\u00e4kuu,Hein\u00e4kuu,Elokuu,Syyskuu,Lokakuu,Marraskuu,Joulukuu","months_short":"Tammi,Helmi,Maalis,Huhti,Touko,Kes\u00e4,Hein\u00e4,Elo,Syys,Loka,Marras,Joulu","day_long":"sunnuntai,maanantai,tiistai,keskiviikko,torstai,perjantai,lauantai,sunnuntai","day_short":"su,ma,ti,ke,to,pe,la,su"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/fr_dlg.js b/webcit/tiny_mce/plugins/template/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..a9ee124
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.template_dlg',{title:"Mod\u00e8les",label:"Mod\u00e8le","desc_label":"Description",desc:"Ins\u00e9rer un mod\u00e8le pr\u00e9d\u00e9fini",select:"Choisir un mod\u00e8le",preview:"Pr\u00e9visualisation",warning:"Attention : Mettre \u00e0 jour un mod\u00e8le pour un autre peut entra\u00eener une perte de donn\u00e9es !","mdate_format":"%d/%m/%Y %H:%M:%S","cdate_format":"%d/%m/%Y %H:%M:%S","months_long":"Janvier,F\u00e9vrier,Mars,Avril,Mai,Juin,Juillet,Ao\u00fbt,Septembre,Octobre,Novembre,D\u00e9cembre","months_short":"Jan,F\u00e9v,Mar,Avr,Mai,Juin,Juil,Ao\u00fbt,Sep,Oct,Nov,D\u00e9c","day_long":"Dimanche,Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche","day_short":"Dim,Lun,Mar,Mer,Jeu,Ven,Sam,Dim"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/hu_dlg.js b/webcit/tiny_mce/plugins/template/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..b28de5b
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.template_dlg',{title:"Sablon beilleszt\u00e9se",label:"Sablon","desc_label":"Le\u00edr\u00e1s",desc:"Sablon beilleszt\u00e9se",select:"Sablon v\u00e1laszt\u00e1sa",preview:"El\u0151n\u00e9zet",warning:"Figyelem: Egy m\u00e1r alkalmazott sablon friss\u00edt\u00e9se m\u00e1sikkal adatveszt\u00e9ssel j\u00e1rhat.","mdate_format":"%Y.%m.%d. %H:%M:%S","cdate_format":"%Y.%m.%d. %H:%M:%S","months_long":"janu\u00e1r,febru\u00e1r,m\u00e1rcius,\u00e1prilis,m\u00e1jus,j\u00fanius,j\u00falius,augusztus,szeptember,okt\u00f3ber,november,december","months_short":"jan,feb,m\u00e1r,\u00e1pr,m\u00e1j,j\u00fan,j\u00fal,aug,szep,okt,nov,dec","day_long":"vas\u00e1rnap,h\u00e9tf\u0151,kedd,szerda,cs\u00fct\u00f6rt\u00f6k,p\u00e9ntek,szombat,vas\u00e1rnap","day_short":"V,H,K,Sze,Cs,P,Szo,V"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/it_dlg.js b/webcit/tiny_mce/plugins/template/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..78abd1f
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.template_dlg',{title:"Modelli",label:"Modello","desc_label":"Descrizione",desc:"Inserisci contenuto da modello predefinito",select:"Seleziona un modello",preview:"Anteprima",warning:"Attenzione: Aggiornare un modello con un altro differente pu\u00f2 causare perdite di dati.","mdate_format":"%Y-%m-%d %H:%M:%S","cdate_format":"%Y-%m-%d %H:%M:%S","months_long":"Gennaio,Febbraio,Marzo,Aprile,Maggio,Giugno,Luglio,Agosto,Settembre,Ottobre,Novembre,Dicembre","months_short":"Gen,Feb,Mar,Apr,Mag,Giu,Lug,Ago,Set,Ott,Nov,Dic","day_long":"Domenica,Luned\u00ec,Marted\u00ec,Mercoled\u00ec,Gioved\u00ec,Venerd\u00ec,Sabato,Domenica","day_short":"Dom,Lun,Mar,Mer,Gio,Ven,Sab,Dom"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/template/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..a6217b9
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.template_dlg',{title:"\u6a21\u677f",label:"\u6a21\u677f","desc_label":"\u8bf4\u660e",desc:"\u63d2\u5165\u9884\u8bbe\u7684\u6a21\u677f\u5185\u5bb9",select:"\u9009\u62e9\u6a21\u677f",preview:"\u9884\u89c8",warning:"\u8b66\u544a\uff1a\u66f4\u65b0\u6a21\u677f\u53ef\u80fd\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u3002","mdate_format":"%Y-%m-%d %H:%M:%S","cdate_format":"%Y-%m-%d %H:%M:%S","months_long":"\u4e00\u6708,\u4e8c\u6708,\u4e09\u6708,\u56db\u6708,\u4e94\u6708,\u516d\u6708,\u4e03\u6708,\u516b\u6708,\u4e5d\u6708,\u5341\u6708,\u5341\u4e00\u6708,\u5341\u4e8c\u6708","months_short":"1\u6708,2\u6708,3\u6708,4\u6708,5\u6708,6\u6708,7\u6708,8\u6708,9\u6708,10\u6708,11\u6708,12\u6708","day_long":"\u661f\u671f\u65e5,\u661f\u671f\u4e00,\u661f\u671f\u4e8c,\u661f\u671f\u4e09,\u661f\u671f\u56db,\u661f\u671f\u4e94,\u661f\u671f\u516d,\u661f\u671f\u65e5","day_short":"\u5468\u65e5,\u5468\u4e00,\u5468\u4e8c,\u5468\u4e09,\u5468\u56db,\u5468\u4e94,\u5468\u516d,\u5468\u65e5"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/template/template.htm b/webcit/tiny_mce/plugins/template/template.htm
new file mode 100644 (file)
index 0000000..b2182e6
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#template_dlg.title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/template.js"></script>\r
+       <link href="css/template.css" rel="stylesheet" type="text/css" />\r
+</head>\r
+<body onresize="TemplateDialog.resize();"> \r
+       <form onsubmit="TemplateDialog.insert();return false;">\r
+               <div id="frmbody">\r
+                       <div class="title">{#template_dlg.desc}</div>\r
+                       <div class="frmRow"><label for="tpath" title="{#template_dlg.select}">{#template_dlg.label}:</label>\r
+                       <select id="tpath" name="tpath" onchange="TemplateDialog.selectTemplate(this.options[this.selectedIndex].value, this.options[this.selectedIndex].text);" class="mceFocus">\r
+                               <option value="">{#template_dlg.select}...</option>\r
+                       </select>\r
+                       <span id="warning"></span></div>\r
+                       <div class="frmRow"><label for="tdesc">{#template_dlg.desc_label}:</label>\r
+                       <span id="tmpldesc"></span></div>\r
+                       <fieldset>\r
+                               <legend>{#template_dlg.preview}</legend>\r
+                               <iframe id="templatesrc" name="templatesrc" src="blank.htm" width="690" height="400" frameborder="0"></iframe>\r
+                       </fieldset>\r
+               </div>\r
+               \r
+               <div class="mceActionPanel">\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </form>\r
+</body> \r
+</html> \r
diff --git a/webcit/tiny_mce/plugins/visualchars/editor_plugin.js b/webcit/tiny_mce/plugins/visualchars/editor_plugin.js
new file mode 100644 (file)
index 0000000..1a148e8
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.VisualChars",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceVisualChars",c._toggleVisualChars,c);a.addButton("visualchars",{title:"visualchars.desc",cmd:"mceVisualChars"});a.onBeforeGetContent.add(function(d,e){if(c.state&&e.format!="raw"&&!e.draft){c.state=true;c._toggleVisualChars(false)}})},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(m){var p=this,k=p.editor,a,g,j,n=k.getDoc(),o=k.getBody(),l,q=k.selection,e,c,f;p.state=!p.state;k.controlManager.setActive("visualchars",p.state);if(m){f=q.getBookmark()}if(p.state){a=[];tinymce.walk(o,function(b){if(b.nodeType==3&&b.nodeValue&&b.nodeValue.indexOf("\u00a0")!=-1){a.push(b)}},"childNodes");for(g=0;g<a.length;g++){l=a[g].nodeValue;l=l.replace(/(\u00a0)/g,'<span data-mce-bogus="1" class="mceItemHidden mceItemNbsp">$1</span>');c=k.dom.create("div",null,l);while(node=c.lastChild){k.dom.insertAfter(node,a[g])}k.dom.remove(a[g])}}else{a=k.dom.select("span.mceItemNbsp",o);for(g=a.length-1;g>=0;g--){k.dom.remove(a[g],1)}}q.moveToBookmark(f)}});tinymce.PluginManager.add("visualchars",tinymce.plugins.VisualChars)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/visualchars/editor_plugin_src.js b/webcit/tiny_mce/plugins/visualchars/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..df98590
--- /dev/null
@@ -0,0 +1,83 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       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 && o.format != 'raw' && !o.draft) {\r
+                                       t.state = true;\r
+                                       t._toggleVisualChars(false);\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(bookmark) {\r
+                       var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo, div, bm;\r
+\r
+                       t.state = !t.state;\r
+                       ed.controlManager.setActive('visualchars', t.state);\r
+\r
+                       if (bookmark)\r
+                               bm = s.getBookmark();\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 data-mce-bogus="1" class="mceItemHidden mceItemNbsp">$1</span>');\r
+\r
+                                       div = ed.dom.create('div', null, nv);\r
+                                       while (node = div.lastChild)\r
+                                               ed.dom.insertAfter(node, nl[i]);\r
+\r
+                                       ed.dom.remove(nl[i]);\r
+                               }\r
+                       } else {\r
+                               nl = ed.dom.select('span.mceItemNbsp', b);\r
+\r
+                               for (i = nl.length - 1; i >= 0; i--)\r
+                                       ed.dom.remove(nl[i], 1);\r
+                       }\r
+\r
+                       s.moveToBookmark(bm);\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('visualchars', tinymce.plugins.VisualChars);\r
+})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/wordcount/editor_plugin.js b/webcit/tiny_mce/plugins/wordcount/editor_plugin.js
new file mode 100644 (file)
index 0000000..a752ad3
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.WordCount",{block:0,id:null,countre:null,cleanre:null,init:function(a,b){var c=this,d=0;c.countre=a.getParam("wordcount_countregex",/[\w\u2019\'-]+/g);c.cleanre=a.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);c.id=a.id+"-word-count";a.onPostRender.add(function(f,e){var g,h;h=f.getParam("wordcount_target_id");if(!h){g=tinymce.DOM.get(f.id+"_path_row");if(g){tinymce.DOM.add(g.parentNode,"div",{style:"float: right"},f.getLang("wordcount.words","Words: ")+'<span id="'+c.id+'">0</span>')}}else{tinymce.DOM.add(h,"span",{},'<span id="'+c.id+'">0</span>')}});a.onInit.add(function(e){e.selection.onSetContent.add(function(){c._count(e)});c._count(e)});a.onSetContent.add(function(e){c._count(e)});a.onKeyUp.add(function(f,g){if(g.keyCode==d){return}if(13==g.keyCode||8==d||46==d){c._count(f)}d=g.keyCode})},_getCount:function(c){var a=0;var b=c.getContent({format:"raw"});if(b){b=b.replace(/\.\.\./g," ");b=b.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;/gi," ");b=b.replace(/(\w+)(&.+?;)+(\w+)/,"$1$3").replace(/&.+?;/g," ");b=b.replace(this.cleanre,"");var d=b.match(this.countre);if(d){a=d.length}}return a},_count:function(a){var b=this;if(b.block){return}b.block=1;setTimeout(function(){if(!a.destroyed){var c=b._getCount(a);tinymce.DOM.setHTML(b.id,c.toString());setTimeout(function(){b.block=0},2000)}},1)},getInfo:function(){return{longname:"Word Count plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("wordcount",tinymce.plugins.WordCount)})();
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/wordcount/editor_plugin_src.js b/webcit/tiny_mce/plugins/wordcount/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..e94743b
--- /dev/null
@@ -0,0 +1,114 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.WordCount', {\r
+               block : 0,\r
+               id : null,\r
+               countre : null,\r
+               cleanre : null,\r
+\r
+               init : function(ed, url) {\r
+                       var t = this, last = 0;\r
+\r
+                       t.countre = ed.getParam('wordcount_countregex', /[\w\u2019\'-]+/g); // u2019 == &rsquo;\r
+                       t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);\r
+                       t.id = ed.id + '-word-count';\r
+\r
+                       ed.onPostRender.add(function(ed, cm) {\r
+                               var row, id;\r
+\r
+                               // Add it to the specified id or the theme advanced path\r
+                               id = ed.getParam('wordcount_target_id');\r
+                               if (!id) {\r
+                                       row = tinymce.DOM.get(ed.id + '_path_row');\r
+\r
+                                       if (row)\r
+                                               tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '<span id="' + t.id + '">0</span>');\r
+                               } else {\r
+                                       tinymce.DOM.add(id, 'span', {}, '<span id="' + t.id + '">0</span>');\r
+                               }\r
+                       });\r
+\r
+                       ed.onInit.add(function(ed) {\r
+                               ed.selection.onSetContent.add(function() {\r
+                                       t._count(ed);\r
+                               });\r
+\r
+                               t._count(ed);\r
+                       });\r
+\r
+                       ed.onSetContent.add(function(ed) {\r
+                               t._count(ed);\r
+                       });\r
+\r
+                       ed.onKeyUp.add(function(ed, e) {\r
+                               if (e.keyCode == last)\r
+                                       return;\r
+\r
+                               if (13 == e.keyCode || 8 == last || 46 == last)\r
+                                       t._count(ed);\r
+\r
+                               last = e.keyCode;\r
+                       });\r
+               },\r
+\r
+               _getCount : function(ed) {\r
+                       var tc = 0;\r
+                       var tx = ed.getContent({ format: 'raw' });\r
+\r
+                       if (tx) {\r
+                                       tx = tx.replace(/\.\.\./g, ' '); // convert ellipses to spaces\r
+                                       tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/&nbsp;|&#160;/gi, ' '); // remove html tags and space chars\r
+\r
+                                       // deal with html entities\r
+                                       tx = tx.replace(/(\w+)(&.+?;)+(\w+)/, "$1$3").replace(/&.+?;/g, ' ');\r
+                                       tx = tx.replace(this.cleanre, ''); // remove numbers and punctuation\r
+\r
+                                       var wordArray = tx.match(this.countre);\r
+                                       if (wordArray) {\r
+                                                       tc = wordArray.length;\r
+                                       }\r
+                       }\r
+\r
+                       return tc;\r
+               },\r
+\r
+               _count : function(ed) {\r
+                       var t = this;\r
+\r
+                       // Keep multiple calls from happening at the same time\r
+                       if (t.block)\r
+                               return;\r
+\r
+                       t.block = 1;\r
+\r
+                       setTimeout(function() {\r
+                               if (!ed.destroyed) {\r
+                                       var tc = t._getCount(ed);\r
+                                       tinymce.DOM.setHTML(t.id, tc.toString());\r
+                                       setTimeout(function() {t.block = 0;}, 2000);\r
+                               }\r
+                       }, 1);\r
+               },\r
+\r
+               getInfo: function() {\r
+                       return {\r
+                               longname : 'Word Count plugin',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount);\r
+})();\r
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/abbr.htm b/webcit/tiny_mce/plugins/xhtmlxtras/abbr.htm
new file mode 100644 (file)
index 0000000..30a894f
--- /dev/null
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_abbr_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/abbr.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+</head>\r
+<body style="display: none" role="application" aria-labelledby="app_title">\r
+<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_abbr_element}</span>\r
+<form onsubmit="insertAbbr();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current" aria-controls="general_panel"><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 role="presentation" 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="style">{#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 role="presentation" 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
+               <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAbbr();" style="display: none;" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/acronym.htm b/webcit/tiny_mce/plugins/xhtmlxtras/acronym.htm
new file mode 100644 (file)
index 0000000..c109345
--- /dev/null
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_acronym_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/acronym.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+</head>\r
+<body style="display: none" role="application" aria-labelledby="app_title">\r
+<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_acronym_element}</span>\r
+<form onsubmit="insertAcronym();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current" aria-controls="general_panel"><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 role="presentation" 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="style">{#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 role="presentation" 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
+               <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAcronym();" style="display: none;" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/attributes.htm b/webcit/tiny_mce/plugins/xhtmlxtras/attributes.htm
new file mode 100644 (file)
index 0000000..e8d606a
--- /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.attribs_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="js/attributes.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/attributes.css" />\r
+</head>\r
+<body style="display: none" role="application" aria-labelledby="app_title">\r
+<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.attribs_title}</span>\r
+<form onsubmit="insertAction();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current" aria-controls="general_panel"><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" aria-controls="events_panel"><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 role="presentation" border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="mceFocus" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td><label id="classlabel" for="classlist">{#class_name}</label></td>\r
+                                               <td>\r
+                                                       <select id="classlist" name="classlist" class="mceEditableSelect">\r
+                                                               <option value="" selected="selected">{#not_set}</option>\r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="style">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir"> \r
+                                                               <option value="">{#not_set}</option> \r
+                                                               <option value="ltr">{#xhtmlxtras_dlg.option_ltr}</option> \r
+                                                               <option value="rtl">{#xhtmlxtras_dlg.option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" />\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                                       <td><label id="tabindexlabel" for="tabindex">{#xhtmlxtras_dlg.attribute_label_tabindex}</label></td>\r
+                                                       <td><input type="text" id="tabindex" name="tabindex" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="accesskeylabel" for="accesskey">{#xhtmlxtras_dlg.attribute_label_accesskey}</label></td>\r
+                                                       <td><input type="text" id="accesskey" name="accesskey" value="" /></td>\r
+                                               </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.attribute_events_tab}</legend>\r
+\r
+                               <table role="presentation" 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
+               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/cite.htm b/webcit/tiny_mce/plugins/xhtmlxtras/cite.htm
new file mode 100644 (file)
index 0000000..0ac6bdb
--- /dev/null
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_cite_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/cite.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+</head>\r
+<body style="display: none" role="application" aria-labelledby="app_title">\r
+<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_cite_element}</span>\r
+<form onsubmit="insertCite();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current" aria-controls="general_panel"><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 role="presentation" 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 role="presentation" 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
+               <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeCite();" style="display: none;" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/css/attributes.css b/webcit/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/webcit/tiny_mce/plugins/xhtmlxtras/css/popup.css b/webcit/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/webcit/tiny_mce/plugins/xhtmlxtras/del.htm b/webcit/tiny_mce/plugins/xhtmlxtras/del.htm
new file mode 100644 (file)
index 0000000..5f66751
--- /dev/null
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_del_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/del.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+</head>\r
+<body id="xhtmlxtrasins" style="display: none" role="application" aria-labelledby="app_title">\r
+<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_del_element}</span>\r
+<form onsubmit="insertDel();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current" aria-controls="general_panel"><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 role="presentation" 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 role="presentation" 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" role="button" aria-labelledby="datetimelabel"><span class="datetime" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td>\r
+                                               <td><input id="cite" name="cite" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
+                               <table role="presentation" 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="style">{#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 role="presentation" 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
+               <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeDel();" style="display: none;" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/webcit/tiny_mce/plugins/xhtmlxtras/editor_plugin.js
new file mode 100644 (file)
index 0000000..9b98a51
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(a,b){a.addCommand("mceCite",function(){a.windowManager.open({file:b+"/cite.htm",width:350+parseInt(a.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAcronym",function(){a.windowManager.open({file:b+"/acronym.htm",width:350+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.acronym_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAbbr",function(){a.windowManager.open({file:b+"/abbr.htm",width:350+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.abbr_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceDel",function(){a.windowManager.open({file:b+"/del.htm",width:340+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.del_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceIns",function(){a.windowManager.open({file:b+"/ins.htm",width:340+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.ins_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAttributes",function(){a.windowManager.open({file:b+"/attributes.htm",width:380+parseInt(a.getLang("xhtmlxtras.attr_delta_width",0)),height:370+parseInt(a.getLang("xhtmlxtras.attr_delta_height",0)),inline:1},{plugin_url:b})});a.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});a.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});a.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});a.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});a.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});a.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});a.onNodeChange.add(function(d,c,f,e){f=d.dom.getParent(f,"CITE,ACRONYM,ABBR,DEL,INS");c.setDisabled("cite",e);c.setDisabled("acronym",e);c.setDisabled("abbr",e);c.setDisabled("del",e);c.setDisabled("ins",e);c.setDisabled("attribs",f&&f.nodeName=="BODY");c.setActive("cite",0);c.setActive("acronym",0);c.setActive("abbr",0);c.setActive("del",0);c.setActive("ins",0);if(f){do{c.setDisabled(f.nodeName.toLowerCase(),0);c.setActive(f.nodeName.toLowerCase(),1)}while(f=f.parentNode)}});a.onPreInit.add(function(){a.dom.create("abbr")})},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/webcit/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/webcit/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..f240572
--- /dev/null
@@ -0,0 +1,132 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       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_height', 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_height', 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_height', 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_height', 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 + parseInt(ed.getLang('xhtmlxtras.attr_delta_width', 0)),\r
+                                       height : 370 + parseInt(ed.getLang('xhtmlxtras.attr_delta_height', 0)),\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
+                       ed.onNodeChange.add(function(ed, cm, n, co) {\r
+                               n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS');\r
+\r
+                               cm.setDisabled('cite', co);\r
+                               cm.setDisabled('acronym', co);\r
+                               cm.setDisabled('abbr', co);\r
+                               cm.setDisabled('del', co);\r
+                               cm.setDisabled('ins', co);\r
+                               cm.setDisabled('attribs', n && n.nodeName == 'BODY');\r
+                               cm.setActive('cite', 0);\r
+                               cm.setActive('acronym', 0);\r
+                               cm.setActive('abbr', 0);\r
+                               cm.setActive('del', 0);\r
+                               cm.setActive('ins', 0);\r
+\r
+                               // Activate all\r
+                               if (n) {\r
+                                       do {\r
+                                               cm.setDisabled(n.nodeName.toLowerCase(), 0);\r
+                                               cm.setActive(n.nodeName.toLowerCase(), 1);\r
+                                       } while (n = n.parentNode);\r
+                               }\r
+                       });\r
+\r
+                       ed.onPreInit.add(function() {\r
+                               // Fixed IE issue where it can't handle these elements correctly\r
+                               ed.dom.create('abbr');\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/webcit/tiny_mce/plugins/xhtmlxtras/ins.htm b/webcit/tiny_mce/plugins/xhtmlxtras/ins.htm
new file mode 100644 (file)
index 0000000..d001ac7
--- /dev/null
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_ins_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/ins.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+</head>\r
+<body id="xhtmlxtrasins" style="display: none" role="application" aria-labelledby="app_title">\r
+<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_ins_element}</span>\r
+<form onsubmit="insertIns();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current" aria-controls="general_panel"><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 role="presentation" 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 role="presentation" 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" role="button" aria-labelledby="datetimelabel"><span class="datetime" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr >\r
+                                               <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td> \r
+                                               <td><input id="cite" name="cite" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
+                               <table role="presentation" 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="style">{#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 role="presentation" 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
+               <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeIns();" style="display: none;" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/js/abbr.js b/webcit/tiny_mce/plugins/xhtmlxtras/js/abbr.js
new file mode 100644 (file)
index 0000000..4b51a25
--- /dev/null
@@ -0,0 +1,28 @@
+/**\r
+ * abbr.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+function init() {\r
+       SXE.initElementDialog('abbr');\r
+       if (SXE.currentAction == "update") {\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function insertAbbr() {\r
+       SXE.insertElement('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/webcit/tiny_mce/plugins/xhtmlxtras/js/acronym.js b/webcit/tiny_mce/plugins/xhtmlxtras/js/acronym.js
new file mode 100644 (file)
index 0000000..6ec2f88
--- /dev/null
@@ -0,0 +1,28 @@
+/**\r
+ * acronym.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+function 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/webcit/tiny_mce/plugins/xhtmlxtras/js/attributes.js b/webcit/tiny_mce/plugins/xhtmlxtras/js/attributes.js
new file mode 100644 (file)
index 0000000..9c99995
--- /dev/null
@@ -0,0 +1,111 @@
+/**\r
+ * attributes.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+function 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
+       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
+       dom.setAttrib(elm, attrib.toLowerCase(), value);\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/webcit/tiny_mce/plugins/xhtmlxtras/js/cite.js b/webcit/tiny_mce/plugins/xhtmlxtras/js/cite.js
new file mode 100644 (file)
index 0000000..009b715
--- /dev/null
@@ -0,0 +1,28 @@
+/**\r
+ * cite.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+function 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/webcit/tiny_mce/plugins/xhtmlxtras/js/del.js b/webcit/tiny_mce/plugins/xhtmlxtras/js/del.js
new file mode 100644 (file)
index 0000000..1f957dc
--- /dev/null
@@ -0,0 +1,53 @@
+/**\r
+ * del.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+function 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
+       elm.removeAttribute('data-mce-new');\r
+}\r
+\r
+function insertDel() {\r
+       var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL');\r
+\r
+       if (elm == null) {\r
+               var s = SXE.inst.selection.getContent();\r
+               if(s.length > 0) {\r
+                       insertInlineElement('del');\r
+                       var elementArray = SXE.inst.dom.select('del[data-mce-new]');\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/webcit/tiny_mce/plugins/xhtmlxtras/js/element_common.js b/webcit/tiny_mce/plugins/xhtmlxtras/js/element_common.js
new file mode 100644 (file)
index 0000000..4e5d9c3
--- /dev/null
@@ -0,0 +1,229 @@
+/**\r
+ * element_common.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+tinyMCEPopup.requireLangPack();\r
+\r
+function initCommonAttributes(elm) {\r
+       var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;\r
+\r
+       // Setup form data for common element attributes\r
+       setFormValue('title', dom.getAttrib(elm, 'title'));\r
+       setFormValue('id', dom.getAttrib(elm, 'id'));\r
+       selectByValue(formObj, 'class', dom.getAttrib(elm, 'class'), true);\r
+       setFormValue('style', dom.getAttrib(elm, 'style'));\r
+       selectByValue(formObj, 'dir', dom.getAttrib(elm, 'dir'));\r
+       setFormValue('lang', dom.getAttrib(elm, 'lang'));\r
+       setFormValue('onfocus', dom.getAttrib(elm, 'onfocus'));\r
+       setFormValue('onblur', dom.getAttrib(elm, 'onblur'));\r
+       setFormValue('onclick', dom.getAttrib(elm, 'onclick'));\r
+       setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick'));\r
+       setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown'));\r
+       setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup'));\r
+       setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover'));\r
+       setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove'));\r
+       setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout'));\r
+       setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress'));\r
+       setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown'));\r
+       setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup'));\r
+}\r
+\r
+function setFormValue(name, value) {\r
+       if(document.forms[0].elements[name]) document.forms[0].elements[name].value = value;\r
+}\r
+\r
+function insertDateTime(id) {\r
+       document.getElementById(id).value = getDateTime(new Date(), "%Y-%m-%dT%H:%M:%S");\r
+}\r
+\r
+function getDateTime(d, fmt) {\r
+       fmt = fmt.replace("%D", "%m/%d/%y");\r
+       fmt = fmt.replace("%r", "%I:%M:%S %p");\r
+       fmt = fmt.replace("%Y", "" + d.getFullYear());\r
+       fmt = fmt.replace("%y", "" + d.getYear());\r
+       fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));\r
+       fmt = fmt.replace("%d", addZeros(d.getDate(), 2));\r
+       fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));\r
+       fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));\r
+       fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));\r
+       fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));\r
+       fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));\r
+       fmt = fmt.replace("%%", "%");\r
+\r
+       return fmt;\r
+}\r
+\r
+function addZeros(value, len) {\r
+       var i;\r
+\r
+       value = "" + value;\r
+\r
+       if (value.length < len) {\r
+               for (i=0; i<(len-value.length); i++)\r
+                       value = "0" + value;\r
+       }\r
+\r
+       return value;\r
+}\r
+\r
+function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {\r
+       if (!form_obj || !form_obj.elements[field_name])\r
+               return;\r
+\r
+       var sel = form_obj.elements[field_name];\r
+\r
+       var found = false;\r
+       for (var i=0; i<sel.options.length; i++) {\r
+               var option = sel.options[i];\r
+\r
+               if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {\r
+                       option.selected = true;\r
+                       found = true;\r
+               } else\r
+                       option.selected = false;\r
+       }\r
+\r
+       if (!found && add_custom && value != '') {\r
+               var option = new Option('Value: ' + value, value);\r
+               option.selected = true;\r
+               sel.options[sel.options.length] = option;\r
+       }\r
+\r
+       return found;\r
+}\r
+\r
+function setAttrib(elm, attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib.toLowerCase()];\r
+       tinyMCEPopup.editor.dom.setAttrib(elm, attrib, value || valueElm.value);\r
+}\r
+\r
+function setAllCommonAttribs(elm) {\r
+       setAttrib(elm, 'title');\r
+       setAttrib(elm, 'id');\r
+       setAttrib(elm, 'class');\r
+       setAttrib(elm, 'style');\r
+       setAttrib(elm, 'dir');\r
+       setAttrib(elm, 'lang');\r
+       /*setAttrib(elm, 'onfocus');\r
+       setAttrib(elm, 'onblur');\r
+       setAttrib(elm, 'onclick');\r
+       setAttrib(elm, 'ondblclick');\r
+       setAttrib(elm, 'onmousedown');\r
+       setAttrib(elm, 'onmouseup');\r
+       setAttrib(elm, 'onmouseover');\r
+       setAttrib(elm, 'onmousemove');\r
+       setAttrib(elm, 'onmouseout');\r
+       setAttrib(elm, 'onkeypress');\r
+       setAttrib(elm, 'onkeydown');\r
+       setAttrib(elm, 'onkeyup');*/\r
+}\r
+\r
+SXE = {\r
+       currentAction : "insert",\r
+       inst : tinyMCEPopup.editor,\r
+       updateElement : null\r
+}\r
+\r
+SXE.focusElement = SXE.inst.selection.getNode();\r
+\r
+SXE.initElementDialog = function(element_name) {\r
+       addClassesToList('class', 'xhtmlxtras_styles');\r
+       TinyMCE_EditableSelects.init();\r
+\r
+       element_name = element_name.toLowerCase();\r
+       var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());\r
+       if (elm != null && elm.nodeName.toUpperCase() == element_name.toUpperCase()) {\r
+               SXE.currentAction = "update";\r
+       }\r
+\r
+       if (SXE.currentAction == "update") {\r
+               initCommonAttributes(elm);\r
+               SXE.updateElement = elm;\r
+       }\r
+\r
+       document.forms[0].insert.value = tinyMCEPopup.getLang(SXE.currentAction, 'Insert', true); \r
+}\r
+\r
+SXE.insertElement = function(element_name) {\r
+       var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()), h, tagName;\r
+\r
+       if (elm == null) {\r
+               var s = SXE.inst.selection.getContent();\r
+               if(s.length > 0) {\r
+                       tagName = element_name;\r
+\r
+                       insertInlineElement(element_name);\r
+                       var elementArray = tinymce.grep(SXE.inst.dom.select(element_name));\r
+                       for (var i=0; i<elementArray.length; i++) {\r
+                               var elm = elementArray[i];\r
+\r
+                               if (SXE.inst.dom.getAttrib(elm, 'data-mce-new')) {\r
+                                       elm.id = '';\r
+                                       elm.setAttribute('id', '');\r
+                                       elm.removeAttribute('id');\r
+                                       elm.removeAttribute('data-mce-new');\r
+\r
+                                       setAllCommonAttribs(elm);\r
+                               }\r
+                       }\r
+               }\r
+       } else {\r
+               setAllCommonAttribs(elm);\r
+       }\r
+       SXE.inst.nodeChanged();\r
+       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
+}\r
+\r
+SXE.removeElement = function(element_name){\r
+       element_name = element_name.toLowerCase();\r
+       elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());\r
+       if(elm && elm.nodeName.toUpperCase() == element_name.toUpperCase()){\r
+               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 = '';\r
+}\r
+\r
+SXE.containsClass = function(elm,cl) {\r
+       return (elm.className.indexOf(cl) > -1) ? true : false;\r
+}\r
+\r
+SXE.removeClass = function(elm,cl) {\r
+       if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) {\r
+               return true;\r
+       }\r
+       var classNames = elm.className.split(" ");\r
+       var newClassNames = "";\r
+       for (var x = 0, cnl = classNames.length; x < cnl; x++) {\r
+               if (classNames[x] != cl) {\r
+                       newClassNames += (classNames[x] + " ");\r
+               }\r
+       }\r
+       elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end\r
+}\r
+\r
+SXE.addClass = function(elm,cl) {\r
+       if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl;\r
+       return true;\r
+}\r
+\r
+function insertInlineElement(en) {\r
+       var ed = tinyMCEPopup.editor, dom = ed.dom;\r
+\r
+       ed.getDoc().execCommand('FontName', false, 'mceinline');\r
+       tinymce.each(dom.select('span,font'), function(n) {\r
+               if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline')\r
+                       dom.replace(dom.create(en, {'data-mce-new' : 1}), n, 1);\r
+       });\r
+}\r
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/js/ins.js b/webcit/tiny_mce/plugins/xhtmlxtras/js/ins.js
new file mode 100644 (file)
index 0000000..c4addfb
--- /dev/null
@@ -0,0 +1,53 @@
+/**\r
+ * ins.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+function 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
+       elm.removeAttribute('data-mce-new');\r
+}\r
+\r
+function insertIns() {\r
+       var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS');\r
+\r
+       if (elm == null) {\r
+               var s = SXE.inst.selection.getContent();\r
+               if(s.length > 0) {\r
+                       insertInlineElement('ins');\r
+                       var elementArray = SXE.inst.dom.select('ins[data-mce-new]');\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/webcit/tiny_mce/plugins/xhtmlxtras/langs/bg_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..4cf4ef9
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.xhtmlxtras_dlg',{"attribs_title":"\u0412\u043c\u044a\u043a\u043d\u0438/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438","option_rtl":"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e","option_ltr":"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e","insert_date":"\u0412\u043c\u044a\u043a\u043d\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u0442\u0430 \u0434\u0430\u0442\u0430/\u0446\u0430\u0441",remove:"\u041f\u0440\u0435\u043c\u0430\u0445\u043d\u0438","title_cite_element":"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0426\u0438\u0442\u0430\u0442","title_abbr_element":"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0421\u044a\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435","title_acronym_element":"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0410\u043a\u0440\u043e\u043d\u0438\u043c","title_del_element":"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435","title_ins_element":"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435","fieldset_events_tab":"\u0421\u044a\u0431\u0438\u0442\u0438\u044f \u043d\u0430 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430","fieldset_attrib_tab":"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u043d\u0430 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430","fieldset_general_tab":"\u041e\u0431\u0449\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438","events_tab":"\u0421\u044a\u0431\u0438\u0442\u0438\u044f","attrib_tab":"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438","general_tab":"\u041e\u0431\u0449\u0438","attribute_attrib_tab":"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438","attribute_events_tab":"\u0421\u044a\u0431\u0438\u0442\u0438\u044f","attribute_label_accesskey":"\u041a\u043b\u0430\u0432\u0438\u0448","attribute_label_tabindex":"\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u043d\u043e\u0441\u0442","attribute_label_langcode":"\u0415\u0437\u0438\u043a","attribute_option_rtl":"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e","attribute_option_ltr":"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e","attribute_label_langdir":"\u041f\u043e\u0441\u043e\u043a\u0430 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430","attribute_label_datetime":"\u0414\u0430\u0442\u0430/\u0412\u0440\u0435\u043c\u0435","attribute_label_cite":"\u0426\u0438\u0442\u0430\u0442","attribute_label_style":"\u0421\u0442\u0438\u043b","attribute_label_class":"\u041a\u043b\u0430\u0441","attribute_label_id":"ID","attribute_label_title":"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..55c8cab
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.xhtmlxtras_dlg',{"attribs_title":"Vlo\u017eit/upravit atributy","option_rtl":"Zprava doleva","option_ltr":"Zleva doprava","insert_date":"Vlo\u017eit aktu\u00e1ln\u00ed datum/\u010das",remove:"Odstranit","title_cite_element":"Citace","title_abbr_element":"Zkratka","title_acronym_element":"Akronym","title_del_element":"Odstran\u011bn\u00fd text","title_ins_element":"P\u0159idan\u00fd text","fieldset_events_tab":"Atributy ud\u00e1losti","fieldset_attrib_tab":"Atributy prvku","fieldset_general_tab":"Obecn\u00e9 parametry","events_tab":"Ud\u00e1losti","attrib_tab":"Atributy","general_tab":"Obecn\u00e9","attribute_attrib_tab":"Atributy","attribute_events_tab":"Ud\u00e1losti","attribute_label_accesskey":"Kl\u00e1vesov\u00e1 zkratka","attribute_label_tabindex":"Po\u0159ad\u00ed pro tabul\u00e1tor","attribute_label_langcode":"Jazyk","attribute_option_rtl":"Zprava doleva","attribute_option_ltr":"Zleva doprava","attribute_label_langdir":"Sm\u011br textu","attribute_label_datetime":"Datum/\u010cas","attribute_label_cite":"Citace","attribute_label_style":"Styl","attribute_label_class":"T\u0159\u00edda","attribute_label_id":"ID","attribute_label_title":"Titulek"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/da_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..cd9eb40
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.xhtmlxtras_dlg',{"attribs_title":"Inds\u00e6t/rediger attributter","option_rtl":"H\u00f8jre mod venstre","option_ltr":"Venstre mod h\u00f8jre","insert_date":"Inds\u00e6t nuv\u00e6rende dato/tid",remove:"Slet","title_cite_element":"Citationselement","title_abbr_element":"Forkortet element","title_acronym_element":"Akronym element","title_del_element":"Sletteklart element","title_ins_element":"Inds\u00e6tbart element","fieldset_events_tab":"Element-h\u00e6ndelser","fieldset_attrib_tab":"Element-attributter","fieldset_general_tab":"Genererelle indstillinger","events_tab":"H\u00e6ndelser","attrib_tab":"Attributter","general_tab":"Generelt","attribute_attrib_tab":"Attributter","attribute_events_tab":"H\u00e6ndelser","attribute_label_accesskey":"Adgangsn\u00f8gle","attribute_label_tabindex":"Tab-indeks","attribute_label_langcode":"Sprog","attribute_option_rtl":"H\u00f8jre mod venstre","attribute_option_ltr":"Venstre mod h\u00f8jre","attribute_label_langdir":"Tekstretning","attribute_label_datetime":"Dato/tid","attribute_label_cite":"Citat","attribute_label_style":"Stil","attribute_label_class":"Klasse","attribute_label_id":"ID","attribute_label_title":"Titel"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/de_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..4994355
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.xhtmlxtras_dlg',{"attribs_title":"Attribute einf\u00fcgen/bearbeiten","option_rtl":"Rechts nach links","option_ltr":"Links nach rechts","insert_date":"Aktuelle Zeit/Datum einf\u00fcgen",remove:"Entfernen","title_cite_element":"Quellenangabe","title_abbr_element":"Abk\u00fcrzung","title_acronym_element":"Akronym","title_del_element":"Entfernter Text","title_ins_element":"Eingef\u00fcgter Text","fieldset_events_tab":"Ereignisse","fieldset_attrib_tab":"Attribute","fieldset_general_tab":"Allgemeine Einstellungen","events_tab":"Ereignisse","attrib_tab":"Attribute","general_tab":"Allgemein","attribute_attrib_tab":"Attribute","attribute_events_tab":"Ereignisse","attribute_label_accesskey":"Tastenk\u00fcrzel","attribute_label_tabindex":"Tabindex","attribute_label_langcode":"Sprache","attribute_option_rtl":"Rechts nach links","attribute_option_ltr":"Links nach rechts","attribute_label_langdir":"Schriftrichtung","attribute_label_datetime":"Zeit/Datum","attribute_label_cite":"Quellenangabe","attribute_label_style":"Format","attribute_label_class":"Klasse","attribute_label_id":"ID","attribute_label_title":"Titel"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/el_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..cbc5fbb
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.xhtmlxtras_dlg',{"attribs_title":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b9\u03b4\u03b9\u03bf\u03c4\u03ae\u03c4\u03c9\u03bd","option_rtl":"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","option_ltr":"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac","insert_date":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1\u03c2 \u03b7\u03bc\u03ad\u03c1\u03b1\u03c2/\u03ce\u03c1\u03b1\u03c2",remove:"\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7","title_cite_element":"Citation \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5","title_abbr_element":"\u03a3\u03c5\u03bd\u03c4\u03bf\u03bc\u03bf\u03b3\u03c1\u03b1\u03c6\u03af\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5","title_acronym_element":"\u0391\u03ba\u03c1\u03bf\u03bd\u03cd\u03bc\u03b9\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5","title_del_element":"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5","title_ins_element":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5","fieldset_events_tab":"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5","fieldset_attrib_tab":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5","fieldset_general_tab":"\u0393\u03b5\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2","events_tab":"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1","attrib_tab":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2","general_tab":"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac","attribute_attrib_tab":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2","attribute_events_tab":"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1","attribute_label_accesskey":"\u03a0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"\u0393\u03bb\u03ce\u03c3\u03c3\u03b1","attribute_option_rtl":"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","attribute_option_ltr":"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac","attribute_label_langdir":"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5","attribute_label_datetime":"\u0397\u03bc\u03ad\u03c1\u03b1/\u038f\u03c1\u03b1","attribute_label_cite":"Cite","attribute_label_style":"\u03a3\u03c4\u03c5\u03bb","attribute_label_class":"\u039a\u03bb\u03ac\u03c3\u03b7","attribute_label_id":"ID","attribute_label_title":"\u03a4\u03af\u03c4\u03bb\u03bf\u03c2"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..c4569f8
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.xhtmlxtras_dlg',{"attribs_title":"Insert/Edit Attributes","option_rtl":"Right to Left","option_ltr":"Left to Right","insert_date":"Insert Current Date/Time",remove:"Remove","title_cite_element":"Citation Element","title_abbr_element":"Abbreviation Element","title_acronym_element":"Acronym Element","title_del_element":"Deletion Element","title_ins_element":"Insertion Element","fieldset_events_tab":"Element Events","fieldset_attrib_tab":"Element Attributes","fieldset_general_tab":"General Settings","events_tab":"Events","attrib_tab":"Attributes","general_tab":"General","attribute_attrib_tab":"Attributes","attribute_events_tab":"Events","attribute_label_accesskey":"AccessKey","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"Language","attribute_option_rtl":"Right to Left","attribute_option_ltr":"Left to Right","attribute_label_langdir":"Text Direction","attribute_label_datetime":"Date/Time","attribute_label_cite":"Cite","attribute_label_style":"Style","attribute_label_class":"Class","attribute_label_id":"ID","attribute_label_title":"Title"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/es_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..676e200
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.xhtmlxtras_dlg',{"attribs_title":"Insertar/Editar atributos","option_rtl":"Derecha a izquierda","option_ltr":"Izquierda a derecha","insert_date":"Insertar fecha/hora actuales",remove:"Suprimir","title_cite_element":"Cita","title_abbr_element":"Abreviatura","title_acronym_element":"Acr\u00f3nimo","title_del_element":"Borrar","title_ins_element":"Insertar","fieldset_events_tab":"Evento","fieldset_attrib_tab":"Atributos","fieldset_general_tab":"Configuraci\u00f3n general","events_tab":"Eventos","attrib_tab":"Atributos","general_tab":"General","attribute_attrib_tab":"Atributos","attribute_events_tab":"Eventos","attribute_label_accesskey":"Tecla de acceso","attribute_label_tabindex":"Orden de tabulaci\u00f3n","attribute_label_langcode":"Lenguaje","attribute_option_rtl":"Derecha a izquierda","attribute_option_ltr":"Izquierda a derecha","attribute_label_langdir":"Direcci\u00f3n de texto","attribute_label_datetime":"Fecha/Hora","attribute_label_cite":"Cita","attribute_label_style":"Estilo","attribute_label_class":"Clase","attribute_label_id":"ID","attribute_label_title":"T\u00edtulo"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/et_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..6e7ffcc
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.xhtmlxtras_dlg',{"attribs_title":"Sisesta/muuda atribuute","option_rtl":"Paremalt vasakule","option_ltr":"Vasakult paremale","insert_date":"Sisesta hetke kuup\u00e4ev/aeg",remove:"Eemalda","title_cite_element":"Elemendi tsitaat","title_abbr_element":"Elemendi l\u00fchend","title_acronym_element":"Elemendi akron\u00fc\u00fcm","title_del_element":"Elemendi kustutus","title_ins_element":"Elemendi sisestus","fieldset_events_tab":"Elementide s\u00fcndmused","fieldset_attrib_tab":"Elementide atribuudid","fieldset_general_tab":"\u00dcldised seaded","events_tab":"S\u00fcndmused","attrib_tab":"Atribuudid","general_tab":"\u00dcldine","attribute_attrib_tab":"Atribuudid","attribute_events_tab":"S\u00fcndmused","attribute_label_accesskey":"Ligip\u00e4\u00e4suklahv","attribute_label_tabindex":"Sisujuht","attribute_label_langcode":"Keel","attribute_option_rtl":"Paremalt vasakule","attribute_option_ltr":"Vasakult paremale","attribute_label_langdir":"Teksti suund","attribute_label_datetime":"Kuup\u00e4ev/aeg","attribute_label_cite":"Tsitaat","attribute_label_style":"Stiil","attribute_label_class":"Klass","attribute_label_id":"ID","attribute_label_title":"Pealkiri"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/fi_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..58c4e7e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.xhtmlxtras_dlg',{"attribs_title":"Lis\u00e4\u00e4/muokkaa attribuutteja","option_rtl":"Oikealta vasemmalle","option_ltr":"Vasemmalta oikealle","insert_date":"Lis\u00e4\u00e4 t\u00e4m\u00e4nhetkinen p\u00e4iv\u00e4/aika",remove:"Poista","title_cite_element":"Sitaatti elementit","title_abbr_element":"Lyhenne elementit","title_acronym_element":"Kirjainlyhenne elementit","title_del_element":"Poisto elementit","title_ins_element":"Lis\u00e4ys elementit","fieldset_events_tab":"Elementin tapahtumat","fieldset_attrib_tab":"Elementin attribuutit","fieldset_general_tab":"Yleiset asetukset","events_tab":"Tapahtumat","attrib_tab":"Attribuutit","general_tab":"Yleiset","attribute_attrib_tab":"Attribuutit","attribute_events_tab":"Tapahtumat","attribute_label_accesskey":"AccessKey","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"Kieli","attribute_option_rtl":"Oikealta vasemmalle","attribute_option_ltr":"Vasemmalta oikealle","attribute_label_langdir":"Tekstin suunta","attribute_label_datetime":"P\u00e4iv\u00e4/Aika","attribute_label_cite":"Sitaatti","attribute_label_style":"Tyyli","attribute_label_class":"Luokka","attribute_label_id":"ID","attribute_label_title":"Otsikko"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..4ae5a3b
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.xhtmlxtras_dlg',{"attribs_title":"Ins\u00e9rer / \u00e9diter les attributs","option_rtl":"De droite \u00e0 gauche","option_ltr":"De gauche \u00e0 droite","insert_date":"Ins\u00e9rer la date et l\'heure actuelles",remove:"Enlever","title_cite_element":"Citation","title_abbr_element":"Abr\u00e9viation","title_acronym_element":"Acronyme","title_del_element":"Suppression","title_ins_element":"Insertion","fieldset_events_tab":"\u00c9v\u00e9nements","fieldset_attrib_tab":"Attributs","fieldset_general_tab":"Param\u00e8tres g\u00e9n\u00e9raux","events_tab":"\u00c9v\u00e9nements","attrib_tab":"Attributs","general_tab":"G\u00e9n\u00e9ral","attribute_attrib_tab":"Attributs","attribute_events_tab":"\u00c9v\u00e8nements","attribute_label_accesskey":"Accesskey","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"Langue","attribute_option_rtl":"De droite \u00e0 gauche","attribute_option_ltr":"De gauche \u00e0 droite","attribute_label_langdir":"Sens de lecture","attribute_label_datetime":"Date / heure","attribute_label_cite":"Citation","attribute_label_style":"Style","attribute_label_class":"Classe","attribute_label_id":"ID","attribute_label_title":"Titre"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/hu_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..8af1666
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.xhtmlxtras_dlg',{"attribs_title":"Tulajdons\u00e1gok besz\u00far\u00e1sa/szerkeszt\u00e9se","option_rtl":"Jobbr\u00f3l balra","option_ltr":"Balr\u00f3l jobra","insert_date":"Aktu\u00e1lis d\u00e1tum/id\u0151 besz\u00far\u00e1sa",remove:"Elt\u00e1vol\u00edt\u00e1s","title_cite_element":"Id\u00e9zet elem","title_abbr_element":"R\u00f6vid\u00edt\u00e9s elem","title_acronym_element":"Bet\u0171sz\u00f3 elem","title_del_element":"T\u00f6r\u00f6lt elem","title_ins_element":"Besz\u00fart elem","fieldset_events_tab":"Elem esem\u00e9nyek","fieldset_attrib_tab":"Elem tulajdons\u00e1gok","fieldset_general_tab":"\u00c1ltal\u00e1nos be\u00e1ll\u00edt\u00e1sok","events_tab":"Esem\u00e9nyek","attrib_tab":"Tulajdons\u00e1gok","general_tab":"\u00c1ltal\u00e1nos","attribute_attrib_tab":"Tulajdons\u00e1gok","attribute_events_tab":"Esem\u00e9nyek","attribute_label_accesskey":"Gyorsbilenty\u0171","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"Nyelv","attribute_option_rtl":"Jobbr\u00f3l balra","attribute_option_ltr":"Balr\u00f3l jobbra","attribute_label_langdir":"Sz\u00f6veg ir\u00e1nya","attribute_label_datetime":"D\u00e1tum/Id\u0151","attribute_label_cite":"Id\u00e9zet","attribute_label_style":"Style","attribute_label_class":"Class","attribute_label_id":"ID","attribute_label_title":"C\u00edm"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/it_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..726be22
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.xhtmlxtras_dlg',{"attribs_title":"Inserisci/modifica attributi","option_rtl":"Destra verso sinistra","option_ltr":"Sinistra verso destra","insert_date":"Inserisci data/ora corrente",remove:"Rimuovi","title_cite_element":"Citazione elemento","title_abbr_element":"Abbreviazione elemento","title_acronym_element":"Acronimo elemento","title_del_element":"Cancellazione elemento","title_ins_element":"Inserimento elemento","fieldset_events_tab":"Eventi elemento","fieldset_attrib_tab":"Attributi elemento","fieldset_general_tab":"Impostazioni Generali","events_tab":"Eventi","attrib_tab":"Attributi","general_tab":"Generale","attribute_attrib_tab":"Attributi","attribute_events_tab":"Eventi","attribute_label_accesskey":"Tasto di accesso","attribute_label_tabindex":"Indice tabulazione","attribute_label_langcode":"Lingua","attribute_option_rtl":"Destra verso sinistra","attribute_option_ltr":"Sinistra verso destra","attribute_label_langdir":"Direzione del testo","attribute_label_datetime":"Date/Time","attribute_label_cite":"Citazione","attribute_label_style":"Style","attribute_label_class":"Classe","attribute_label_id":"ID","attribute_label_title":"Titolo"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/xhtmlxtras/langs/zh-cn_dlg.js b/webcit/tiny_mce/plugins/xhtmlxtras/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..eccbdf6
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.xhtmlxtras_dlg',{"attribs_title":"\u63d2\u5165/\u7f16\u8f91 \u5c5e\u6027","option_rtl":"\u4ece\u53f3\u5230\u5de6","option_ltr":"\u4ece\u5de6\u5230\u53f3","insert_date":"\u63d2\u5165\u5f53\u524d\u65e5\u671f/\u65f6\u95f4",remove:"\u79fb\u9664","title_cite_element":"\u5f15\u7528\u5143\u7d20","title_abbr_element":"\u7f29\u5199\u5143\u7d20","title_acronym_element":"\u9996\u5b57\u6bcd\u7f29\u5199\u5143\u7d20","title_del_element":"\u5220\u9664\u5143\u7d20","title_ins_element":"\u63d2\u5165\u5143\u7d20","fieldset_events_tab":"\u5143\u7d20\u4e8b\u4ef6","fieldset_attrib_tab":"\u5143\u7d20\u5c5e\u6027","fieldset_general_tab":"\u666e\u901a\u8bbe\u7f6e","events_tab":"\u4e8b\u4ef6","attrib_tab":"\u5c5e\u6027","general_tab":"\u666e\u901a","attribute_attrib_tab":"\u5c5e\u6027","attribute_events_tab":"\u4e8b\u4ef6","attribute_label_accesskey":"\u5feb\u6377\u952e","attribute_label_tabindex":"Tab\u7d22\u5f15","attribute_label_langcode":"\u8bed\u8a00","attribute_option_rtl":"\u4ece\u53f3\u5230\u5de6","attribute_option_ltr":"\u4ece\u5de6\u5230\u53f3","attribute_label_langdir":"\u6587\u5b57\u4e66\u5199\u65b9\u5411","attribute_label_datetime":"\u65e5\u671f/\u65f6\u95f4","attribute_label_cite":"\u5f15\u7528","attribute_label_style":"\u6837\u5f0f","attribute_label_class":"\u7c7b\u522b","attribute_label_id":"ID","attribute_label_title":"\u6807\u9898"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/about.htm b/webcit/tiny_mce/themes/advanced/about.htm
new file mode 100644 (file)
index 0000000..7a97cb7
--- /dev/null
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> \r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\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" style="display: none">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current" aria-controls="general_panel"><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" aria-hidden="true" aria-controls="help_panel"><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" aria-controls="plugins_panel"><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>{#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-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">\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
+                               </div>\r
+                       </div>\r
+\r
+                       <div id="plugins_panel" class="panel">\r
+                               <div id="pluginscontainer">\r
+                                       <h3>{#advanced_dlg.about_loaded}</h3>\r
+\r
+                                       <div id="plugintablecontainer">\r
+                                       </div>\r
+\r
+                                       <p>&nbsp;</p>\r
+                               </div>\r
+                       </div>\r
+\r
+                       <div id="help_panel" class="panel noscroll" style="overflow: visible;">\r
+                               <div id="iframecontainer"></div>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <input type="button" id="cancel" name="cancel" value="{#close}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/anchor.htm b/webcit/tiny_mce/themes/advanced/anchor.htm
new file mode 100644 (file)
index 0000000..75c93b7
--- /dev/null
@@ -0,0 +1,26 @@
+<!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.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
+</head>\r
+<body style="display: none" role="application" aria-labelledby="app_title">\r
+<form onsubmit="AnchorDialog.update();return false;" action="#">\r
+       <table border="0" cellpadding="4" cellspacing="0" role="presentation">\r
+               <tr>\r
+                       <td colspan="2" class="title" id="app_title">{#advanced_dlg.anchor_title}</td>\r
+               </tr>\r
+               <tr>\r
+                       <td class="nowrap"><label for="anchorName">{#advanced_dlg.anchor_name}:</label></td>\r
+                       <td><input name="anchorName" type="text" class="mceFocus" id="anchorName" value="" style="width: 200px" aria-required="true" /></td>\r
+               </tr>\r
+       </table>\r
+\r
+       <div class="mceActionPanel">\r
+               <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/charmap.htm b/webcit/tiny_mce/themes/advanced/charmap.htm
new file mode 100644 (file)
index 0000000..2c3b3f2
--- /dev/null
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#advanced_dlg.charmap_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/charmap.js"></script>\r
+</head>\r
+<body id="charmap" style="display:none">\r
+<table align="center" border="0" cellspacing="0" cellpadding="2" role="presentation">\r
+       <tr>\r
+               <td colspan="2" class="title" ><label for="charmapView" id="charmap_label">{#advanced_dlg.charmap_title}</label></td>\r
+       </tr>\r
+       <tr>\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" role="presentation">\r
+                               <tr>\r
+                                       <td id="codeV">&nbsp;</td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td id="codeN">&nbsp;</td>\r
+                               </tr>\r
+                       </table>\r
+               </td>\r
+       </tr>\r
+       <tr>\r
+               <td valign="bottom" style="padding-bottom: 3px;">\r
+                       <table width="100" align="center" border="0" cellpadding="2" cellspacing="0" role="presentation">\r
+                               <tr>\r
+                                       <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;"><label for="codeA">HTML-Code</label></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeA" align="center">&nbsp;</td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td style="font-size: 1px;">&nbsp;</td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;"><label for="codeB">NUM-Code</label></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeB" align="center">&nbsp;</td>\r
+                               </tr>\r
+                       </table>\r
+               </td>\r
+       </tr>\r
+</table>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/color_picker.htm b/webcit/tiny_mce/themes/advanced/color_picker.htm
new file mode 100644 (file)
index 0000000..ad1bb0f
--- /dev/null
@@ -0,0 +1,74 @@
+<!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.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
+</head>\r
+<body id="colorpicker" style="display: none" role="application" aria-labelledby="app_label">\r
+       <span class="mceVoiceLabel" id="app_label" style="display:none;">{#advanced_dlg.colorpicker_title}</span>\r
+<form onsubmit="insertAction();return false" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="picker_tab" aria-controls="picker_panel" 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" aria-controls="rgb_panel"><span><a href="javascript:;" onclick="mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_palette_tab}</a></span></li>\r
+                       <li id="named_tab" aria-controls="named_panel"><span><a  href="javascript:;" onclick="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>{#advanced_dlg.colorpicker_picker_title}</legend>\r
+                               <div id="picker">\r
+                                       <img id="colors" src="img/colorpicker.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" alt="" />\r
+\r
+                                       <div id="light">\r
+                                               <!-- Will be filled with divs -->\r
+                                       </div>\r
+\r
+                                       <br style="clear: both" />\r
+                               </div>\r
+                       </fieldset>\r
+               </div>\r
+\r
+               <div id="rgb_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend id="webcolors_title">{#advanced_dlg.colorpicker_palette_title}</legend>\r
+                               <div id="webcolors">\r
+                                       <!-- Gets filled with web safe colors-->\r
+                               </div>\r
+\r
+                               <br style="clear: both" />\r
+                       </fieldset>\r
+               </div>\r
+\r
+               <div id="named_panel" class="panel">\r
+                       <fieldset id="named_picker_label">\r
+                               <legend id="named_title">{#advanced_dlg.colorpicker_named_title}</legend>\r
+                               <div id="namedcolors" role="listbox" tabindex="0" aria-labelledby="named_picker_label">\r
+                                       <!-- Gets filled with named colors-->\r
+                               </div>\r
+\r
+                               <br style="clear: both" />\r
+\r
+                               <div id="colornamecontainer">\r
+                                       {#advanced_dlg.colorpicker_name} <span id="colorname"></span>\r
+                               </div>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <input type="submit" id="insert" name="insert" value="{#apply}" />\r
+\r
+               <div id="preview"></div>\r
+\r
+               <div id="previewblock">\r
+                       <label for="color">{#advanced_dlg.colorpicker_color}</label> <input id="color" type="text" size="8" class="text mceFocus" aria-required="true" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/editor_template.js b/webcit/tiny_mce/themes/advanced/editor_template.js
new file mode 100644 (file)
index 0000000..7f30c18
--- /dev/null
@@ -0,0 +1 @@
+(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);j.forcedHighContrastMode=j.settings.detect_highcontrast&&l._isHighContrast();j.settings.skin=j.forcedHighContrastMode?"highcontrast":j.settings.skin;l.settings=m=h({theme_advanced_path:true,theme_advanced_toolbar_location:"bottom",theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_font_selector:"span",theme_advanced_show_current_color:0,readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}if(j.settings.content_css!==false){j.contentCSS.push(j.baseURI.toAbsolute(k+"/skins/"+j.settings.skin+"/content.css"))}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l);j.onKeyUp.add(l._updateUndoStatus,l);j.onMouseUp.add(l._updateUndoStatus,l);j.dom.bind(j.dom.getRoot(),"dragend",function(){l._updateUndoStatus(j)})}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},_isHighContrast:function(){var i,j=d.add(d.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});i=(d.getStyle(j,"background-color",true)+"").toLowerCase().replace(/ /g,"");d.remove(j);return i!="rgb(171,239,86)"&&i!="#abef56"},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){if(p[0]){i.formatter.remove(p[0])}}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});if(m&&m.value==l){k.select(null)}return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});if(o&&(o.value.fontSize==i.fontSize||o.value["class"]==i["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(l){j.editor.execCommand("FormatBlock",false,l);return false}});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;if(r.settings){r.settings.aria_label=w.aria_label+r.getLang("advanced.help_shortcut")}m=j=d.create("span",{role:"application","aria-labelledby":r.id+"_voice",id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});d.add(m,"span",{"class":"mceVoiceLabel",style:"display:none;",id:r.id+"_voice"},w.aria_label);if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{role:"presentation",id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},"<!-- IE -->"),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;r.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){window.focus();v.toolbarGroup.focus();return b.cancel(n)}else{if(n.keyCode===o){d.get(p.id+"_path_row").focus();return b.cancel(n)}}}});r.addShortcut("alt+0","","mceShortcuts",v);return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_ifr");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,m,k){var j=this.editor,l=this.settings,n=d.get(j.id+"_tbl"),o=d.get(j.id+"_ifr");i=Math.max(l.theme_advanced_resizing_min_width||100,i);m=Math.max(l.theme_advanced_resizing_min_height||100,m);i=Math.min(l.theme_advanced_resizing_max_width||65535,i);m=Math.min(l.theme_advanced_resizing_max_height||65535,m);d.setStyle(n,"height","");d.setStyle(o,"height",m);if(l.theme_advanced_resize_horizontal){d.setStyle(n,"width","");d.setStyle(o,"width",i);if(i<n.clientWidth){i=n.clientWidth;d.setStyle(o,"width",n.clientWidth)}}if(k&&l.theme_advanced_resizing_use_cookie){a.setHash("TinyMCE_"+j.id+"_size",{cw:i,ch:m})}},destroy:function(){var i=this.editor.id;b.clear(i+"_resize");b.clear(i+"_path_row");b.clear(i+"_external_close")},_simpleLayout:function(y,r,k,i){var x=this,u=x.editor,v=y.theme_advanced_toolbar_location,m=y.theme_advanced_statusbar_location,l,j,q,w;if(y.readonly){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});return j}if(v=="top"){x._addToolbars(r,k)}if(v=="external"){l=w=d.create("div",{style:"position:relative"});l=d.add(l,"div",{id:u.id+"_external","class":"mceExternalToolbar"});d.add(l,"a",{id:u.id+"_external_close",href:"javascript:;","class":"mceExternalClose"});l=d.add(l,"table",{id:u.id+"_tblext",cellSpacing:0,cellPadding:0});q=d.add(l,"tbody");if(i.firstChild.className=="mceOldBoxModel"){i.firstChild.appendChild(w)}else{i.insertBefore(w,i.firstChild)}x._addToolbars(q,k);u.onMouseUp.add(function(){var o=d.get(u.id+"_external");d.show(o);d.hide(g);var n=b.add(u.id+"_external_close","click",function(){d.hide(u.id+"_external");b.remove(u.id+"_external_close","click",n)});d.show(o);d.setStyle(o,"top",0-d.getRect(u.id+"_tblext").h-1);d.hide(o);d.show(o);o.style.filter="";g=u.id+"_external";o=null})}if(m=="top"){x._addStatusBar(r,k)}if(!y.theme_advanced_toolbar_container){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"})}if(v=="bottom"){x._addToolbars(r,k)}if(m=="bottom"){x._addStatusBar(r,k)}return j},_rowLayout:function(w,m,k){var v=this,p=v.editor,u,x,i=p.controlManager,l,j,r,q;u=w.theme_advanced_containers_default_class||"";x=w.theme_advanced_containers_default_align||"center";f(c(w.theme_advanced_containers||""),function(s,o){var n=w["theme_advanced_container_"+s]||"";switch(s.toLowerCase()){case"mceeditor":l=d.add(m,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});break;case"mceelementpath":v._addStatusBar(m,k);break;default:q=(w["theme_advanced_container_"+s+"_align"]||x).toLowerCase();q="mce"+v._ufirst(q);l=d.add(d.add(m,"tr"),"td",{"class":"mceToolbar "+(w["theme_advanced_container_"+s+"_class"]||u)+" "+q||x});r=i.createToolbar("toolbar"+o);v._addControls(n,r);d.setHTML(l,r.renderHTML());k.deltaHeight-=w.theme_advanced_row_height}});return j},_addControls:function(j,i){var k=this,l=k.settings,m,n=k.editor.controlManager;if(l.theme_advanced_disable&&!k._disabled){m={};f(c(l.theme_advanced_disable),function(o){m[o]=1});k._disabled=m}else{m=k._disabled}f(c(j),function(p){var o;if(m&&m[p]){return}if(p=="tablecontrols"){f(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(q){q=k.createControl(q,n);if(q){i.add(q)}});return}o=k.createControl(p,n);if(o){i.add(o)}})},_addToolbars:function(x,k){var A=this,p,m,r=A.editor,B=A.settings,z,j=r.controlManager,u,l,q=[],y,w;w=j.createToolbarGroup("toolbargroup",{name:r.getLang("advanced.toolbar"),tab_focus_toolbar:r.getParam("theme_advanced_tab_focus_toolbar")});A.toolbarGroup=w;y=B.theme_advanced_toolbar_align.toLowerCase();y="mce"+A._ufirst(y);l=d.add(d.add(x,"tr",{role:"presentation"}),"td",{"class":"mceToolbar "+y,role:"presentation"});for(p=1;(z=B["theme_advanced_buttons"+p]);p++){m=j.createToolbar("toolbar"+p,{"class":"mceToolbarRow"+p});if(B["theme_advanced_buttons"+p+"_add"]){z+=","+B["theme_advanced_buttons"+p+"_add"]}if(B["theme_advanced_buttons"+p+"_add_before"]){z=B["theme_advanced_buttons"+p+"_add_before"]+","+z}A._addControls(z,m);w.add(m);k.deltaHeight-=B.theme_advanced_row_height}q.push(w.renderHTML());q.push(d.createHTML("a",{href:"#",accesskey:"z",title:r.getLang("advanced.toolbar_focus"),onfocus:"tinyMCE.getInstanceById('"+r.id+"').focus();"},"<!-- IE -->"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row",role:"group","aria-labelledby":p.id+"_path_voice"});if(w.theme_advanced_path){d.add(k,"span",{id:p.id+"_path_voice"},p.translate("advanced.path"));d.add(k,"span",{},": ")}else{d.add(k,"span",{},"&#160;")}if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize",tabIndex:"-1"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","click",function(n){n.preventDefault()});b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){G.preventDefault();n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E,true)}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_updateUndoStatus:function(j){var i=j.controlManager,k=j.undoManager;i.setDisabled("undo",!k.hasUndo()&&!k.typing);i.setDisabled("redo",!k.hasRedo())},_nodeChanged:function(m,r,D,q,E){var y=this,C,F=0,x,G,z=y.settings,w,k,u,B,l,j,i;e.each(y.stateControls,function(n){r.setActive(n,m.queryCommandState(y.controls[n][1]))});function o(p){var s,n=E.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s<n.length;s++){if(t(n[s])){return n[s]}}}r.setActive("visualaid",m.hasVisual);y._updateUndoStatus(m);r.setDisabled("outdent",!m.queryCommandState("Outdent"));C=o("A");if(G=r.get("link")){if(!C||!C.name){G.setDisabled(!C&&q);G.setActive(!!C)}}if(G=r.get("unlink")){G.setDisabled(!C&&q);G.setActive(!!C&&!C.name)}if(G=r.get("anchor")){G.setActive(!q&&!!C&&C.name)}C=o("IMG");if(G=r.get("image")){G.setActive(!q&&!!C&&D.className.indexOf("mceItem")==-1)}if(G=r.get("styleselect")){y._importClasses();j=[];f(G.items,function(n){j.push(n.value)});i=m.formatter.matchAll(j);G.select(i[0])}if(G=r.get("formatselect")){C=o(d.isBlock);if(C){G.select(C.nodeName.toLowerCase())}}o(function(p){if(p.nodeName==="SPAN"){if(!w&&p.className){w=p.className}}if(m.dom.is(p,z.theme_advanced_font_selector)){if(!k&&p.style.fontSize){k=p.style.fontSize}if(!u&&p.style.fontFamily){u=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}if(!B&&p.style.color){B=p.style.color}if(!l&&p.style.backgroundColor){l=p.style.backgroundColor}}return false});if(G=r.get("fontselect")){G.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==u})}if(G=r.get("fontsizeselect")){if(z.theme_advanced_runtime_fontsize&&!k&&!w){k=m.dom.getStyle(D,"fontSize",true)}G.select(function(n){if(n.fontSize&&n.fontSize===k){return true}if(n["class"]&&n["class"]===w){return true}})}if(z.theme_advanced_show_current_color){function A(p,n){if(G=r.get(p)){if(!n){n=G.settings.default_color}if(n!==G.value){G.displayColor(n)}}}A("forecolor",B);A("backcolor",l)}if(z.theme_advanced_show_current_color){function A(p,n){if(G=r.get(p)){if(!n){n=G.settings.default_color}if(n!==G.value){G.displayColor(n)}}}A("forecolor",B);A("backcolor",l)}if(z.theme_advanced_path&&z.theme_advanced_statusbar_location){C=d.get(m.id+"_path")||d.add(m.id+"_path_row","span",{id:m.id+"_path"});if(y.statusKeyboardNavigation){y.statusKeyboardNavigation.destroy();y.statusKeyboardNavigation=null}d.setHTML(C,"");o(function(H){var p=H.nodeName.toLowerCase(),s,v,t="";if(H.nodeType!=1||p==="br"||H.getAttribute("data-mce-bogus")||d.hasClass(H,"mceItemHidden")||d.hasClass(H,"mceItemRemoved")){return}if(e.isIE&&H.scopeName!=="HTML"){p=H.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(x=d.getAttrib(H,"src")){t+="src: "+x+" "}break;case"a":if(x=d.getAttrib(H,"name")){t+="name: "+x+" ";p+="#"+x}if(x=d.getAttrib(H,"href")){t+="href: "+x+" "}break;case"font":if(x=d.getAttrib(H,"face")){t+="font: "+x+" "}if(x=d.getAttrib(H,"size")){t+="size: "+x+" "}if(x=d.getAttrib(H,"color")){t+="color: "+x+" "}break;case"span":if(x=d.getAttrib(H,"style")){t+="style: "+x+" "}break}if(x=d.getAttrib(H,"id")){t+="id: "+x+" "}if(x=H.className){x=x.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(x){t+="class: "+x+" ";if(d.isBlock(H)||p=="img"||p=="span"){p+="."+x}}}p=p.replace(/(html:)/g,"");p={name:p,node:H,title:t};y.onResolveName.dispatch(y,p);t=p.title;p=p.name;v=d.create("a",{href:"javascript:;",role:"button",onmousedown:"return false;",title:t,"class":"mcePath_"+(F++)},p);if(C.hasChildNodes()){C.insertBefore(d.create("span",{"aria-hidden":"true"},"\u00a0\u00bb "),C.firstChild);C.insertBefore(v,C.firstChild)}else{C.appendChild(v)}},m.getBody());if(d.select("a",C).length>0){y.statusKeyboardNavigation=new e.ui.KeyboardNavigation({root:m.id+"_path_row",items:d.select("a",C),excludeFromTabOrder:true,onCancel:function(){m.focus()}},d)}}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var i=this.editor;i.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce));
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/editor_template_src.js b/webcit/tiny_mce/themes/advanced/editor_template_src.js
new file mode 100644 (file)
index 0000000..bee26e1
--- /dev/null
@@ -0,0 +1,1358 @@
+/**\r
+ * editor_template_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function(tinymce) {\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
+               sizes : [8, 10, 12, 14, 18, 24, 36],\r
+\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, o;\r
+       \r
+                       t.editor = ed;\r
+                       t.url = url;\r
+                       t.onResolveName = new tinymce.util.Dispatcher(this);\r
+\r
+                       ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast();\r
+                       ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin;\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_more_colors : 1,\r
+                               theme_advanced_row_height : 23,\r
+                               theme_advanced_resize_horizontal : 1,\r
+                               theme_advanced_resizing_use_cookie : 1,\r
+                               theme_advanced_font_sizes : "1,2,3,4,5,6,7",\r
+                               theme_advanced_font_selector : "span",\r
+                               theme_advanced_show_current_color: 0,\r
+                               readonly : ed.settings.readonly\r
+                       }, ed.settings);\r
+\r
+                       // Setup default font_size_style_values\r
+                       if (!s.font_size_style_values)\r
+                               s.font_size_style_values = "8pt,10pt,12pt,14pt,18pt,24pt,36pt";\r
+\r
+                       if (tinymce.is(s.theme_advanced_font_sizes, 'string')) {\r
+                               s.font_size_style_values = tinymce.explode(s.font_size_style_values);\r
+                               s.font_size_classes = tinymce.explode(s.font_size_classes || '');\r
+\r
+                               // Parse string value\r
+                               o = {};\r
+                               ed.settings.theme_advanced_font_sizes = s.theme_advanced_font_sizes;\r
+                               each(ed.getParam('theme_advanced_font_sizes', '', 'hash'), function(v, k) {\r
+                                       var cl;\r
+\r
+                                       if (k == v && v >= 1 && v <= 7) {\r
+                                               k = v + ' (' + t.sizes[v - 1] + 'pt)';\r
+                                               cl = s.font_size_classes[v - 1];\r
+                                               v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt');\r
+                                       }\r
+\r
+                                       if (/^\s*\./.test(v))\r
+                                               cl = v.replace(/\./g, '');\r
+\r
+                                       o[k] = cl ? {'class' : cl} : {fontSize : v};\r
+                               });\r
+\r
+                               s.theme_advanced_font_sizes = o;\r
+                       }\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
+                       if (ed.settings.content_css !== false)\r
+                               ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css"));\r
+\r
+                       // Init editor\r
+                       ed.onInit.add(function() {\r
+                               if (!ed.settings.readonly) {\r
+                                       ed.onNodeChange.add(t._nodeChanged, t);\r
+                                       ed.onKeyUp.add(t._updateUndoStatus, t);\r
+                                       ed.onMouseUp.add(t._updateUndoStatus, t);\r
+                                       ed.dom.bind(ed.dom.getRoot(), 'dragend', function() {\r
+                                               t._updateUndoStatus(ed);\r
+                                       });\r
+                               }\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(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css");\r
+\r
+                       if (s.skin_variant)\r
+                               DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css");\r
+               },\r
+\r
+               _isHighContrast : function() {\r
+                       var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'});\r
+\r
+                       actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, '');\r
+                       DOM.remove(div);\r
+\r
+                       return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56';\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(e) {\r
+                       var ed = this.editor, ctrl = ed.controlManager.get('styleselect');\r
+\r
+                       if (ctrl.getLength() == 0) {\r
+                               each(ed.dom.getClasses(), function(o, idx) {\r
+                                       var name = 'style_' + idx;\r
+\r
+                                       ed.formatter.register(name, {\r
+                                               inline : 'span',\r
+                                               attributes : {'class' : o['class']},\r
+                                               selector : '*'\r
+                                       });\r
+\r
+                                       ctrl.add(o['class'], name);\r
+                               });\r
+                       }\r
+               },\r
+\r
+               _createStyleSelect : function(n) {\r
+                       var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl;\r
+\r
+                       // Setup style select box\r
+                       ctrl = ctrlMan.createListBox('styleselect', {\r
+                               title : 'advanced.style_select',\r
+                               onselect : function(name) {\r
+                                       var matches, formatNames = [];\r
+\r
+                                       each(ctrl.items, function(item) {\r
+                                               formatNames.push(item.value);\r
+                                       });\r
+\r
+                                       ed.focus();\r
+                                       ed.undoManager.add();\r
+\r
+                                       // Toggle off the current format\r
+                                       matches = ed.formatter.matchAll(formatNames);\r
+                                       if (!name || matches[0] == name) {\r
+                                               if (matches[0]) \r
+                                                       ed.formatter.remove(matches[0]);\r
+                                       } else\r
+                                               ed.formatter.apply(name);\r
+\r
+                                       ed.undoManager.add();\r
+                                       ed.nodeChanged();\r
+\r
+                                       return false; // No auto select\r
+                               }\r
+                       });\r
+\r
+                       // Handle specified format\r
+                       ed.onInit.add(function() {\r
+                               var counter = 0, formats = ed.getParam('style_formats');\r
+\r
+                               if (formats) {\r
+                                       each(formats, function(fmt) {\r
+                                               var name, keys = 0;\r
+\r
+                                               each(fmt, function() {keys++;});\r
+\r
+                                               if (keys > 1) {\r
+                                                       name = fmt.name = fmt.name || 'style_' + (counter++);\r
+                                                       ed.formatter.register(name, fmt);\r
+                                                       ctrl.add(fmt.title, name);\r
+                                               } else\r
+                                                       ctrl.add(fmt.title);\r
+                                       });\r
+                               } else {\r
+                                       each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) {\r
+                                               var name;\r
+\r
+                                               if (val) {\r
+                                                       name = 'style_' + (counter++);\r
+\r
+                                                       ed.formatter.register(name, {\r
+                                                               inline : 'span',\r
+                                                               classes : val,\r
+                                                               selector : '*'\r
+                                                       });\r
+\r
+                                                       ctrl.add(t.editor.translate(key), name);\r
+                                               }\r
+                                       });\r
+                               }\r
+                       });\r
+\r
+                       // Auto import classes if the ctrl box is empty\r
+                       if (ctrl.getLength() == 0) {\r
+                               ctrl.onPostRender.add(function(ed, n) {\r
+                                       if (!ctrl.NativeListBox) {\r
+                                               Event.add(n.id + '_text', 'focus', t._importClasses, t);\r
+                                               Event.add(n.id + '_text', 'mousedown', t._importClasses, t);\r
+                                               Event.add(n.id + '_open', 'focus', t._importClasses, t);\r
+                                               Event.add(n.id + '_open', 'mousedown', t._importClasses, t);\r
+                                       } else\r
+                                               Event.add(n.id, 'focus', t._importClasses, t);\r
+                               });\r
+                       }\r
+\r
+                       return ctrl;\r
+               },\r
+\r
+               _createFontSelect : function() {\r
+                       var c, t = this, ed = t.editor;\r
+\r
+                       c = ed.controlManager.createListBox('fontselect', {\r
+                               title : 'advanced.fontdefault',\r
+                               onselect : function(v) {\r
+                                       var cur = c.items[c.selectedIndex];\r
+\r
+                                       if (!v && cur) {\r
+                                               ed.execCommand('FontName', false, cur.value);\r
+                                               return;\r
+                                       }\r
+\r
+                                       ed.execCommand('FontName', false, v);\r
+\r
+                                       // Fake selection, execCommand will fire a nodeChange and update the selection\r
+                                       c.select(function(sv) {\r
+                                               return v == sv;\r
+                                       });\r
+\r
+                                       if (cur && cur.value == v) {\r
+                                               c.select(null);\r
+                                       }\r
+\r
+                                       return false; // No auto select\r
+                               }\r
+                       });\r
+\r
+                       if (c) {\r
+                               each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) {\r
+                                       c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''});\r
+                               });\r
+                       }\r
+\r
+                       return c;\r
+               },\r
+\r
+               _createFontSizeSelect : function() {\r
+                       var t = this, ed = t.editor, c, i = 0, cl = [];\r
+\r
+                       c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) {\r
+                               var cur = c.items[c.selectedIndex];\r
+\r
+                               if (!v && cur) {\r
+                                       cur = cur.value;\r
+\r
+                                       if (cur['class']) {\r
+                                               ed.formatter.toggle('fontsize_class', {value : cur['class']});\r
+                                               ed.undoManager.add();\r
+                                               ed.nodeChanged();\r
+                                       } else {\r
+                                               ed.execCommand('FontSize', false, cur.fontSize);\r
+                                       }\r
+\r
+                                       return;\r
+                               }\r
+\r
+                               if (v['class']) {\r
+                                       ed.focus();\r
+                                       ed.undoManager.add();\r
+                                       ed.formatter.toggle('fontsize_class', {value : v['class']});\r
+                                       ed.undoManager.add();\r
+                                       ed.nodeChanged();\r
+                               } else\r
+                                       ed.execCommand('FontSize', false, v.fontSize);\r
+\r
+                               // Fake selection, execCommand will fire a nodeChange and update the selection\r
+                               c.select(function(sv) {\r
+                                       return v == sv;\r
+                               });\r
+\r
+                               if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] == v['class'])) {\r
+                                       c.select(null);\r
+                               }\r
+\r
+                               return false; // No auto select\r
+                       }});\r
+\r
+                       if (c) {\r
+                               each(t.settings.theme_advanced_font_sizes, function(v, k) {\r
+                                       var fz = v.fontSize;\r
+\r
+                                       if (fz >= 1 && fz <= 7)\r
+                                               fz = t.sizes[parseInt(fz) - 1] + 'pt';\r
+\r
+                                       c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))});\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', onselect : function(v) {\r
+                               t.editor.execCommand('FormatBlock', false, v);\r
+                               return false;\r
+                       }});\r
+\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
+                       if (s.theme_advanced_default_foreground_color)\r
+                               o.default_color = s.theme_advanced_default_foreground_color;\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
+                       if (s.theme_advanced_default_background_color)\r
+                               o.default_color = s.theme_advanced_default_background_color;\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
+                       if (ed.settings) {\r
+                               ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut');\r
+                       }\r
+\r
+                       // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for.\r
+                       // Maybe actually inherit it from the original textara?\r
+                       n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')});\r
+                       DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label);\r
+\r
+                       if (!DOM.boxModel)\r
+                               n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'});\r
+\r
+                       n = sc = DOM.add(n, 'table', {role : "presentation", 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 = sc.rows;\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'))\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
+                       ed.onKeyDown.add(function(ed, evt) {\r
+                               var DOM_VK_F10 = 121, DOM_VK_F11 = 122;\r
+\r
+                               if (evt.altKey) {\r
+                                       if (evt.keyCode === DOM_VK_F10) {\r
+                                               window.focus();\r
+                                               t.toolbarGroup.focus();\r
+                                               return Event.cancel(evt);\r
+                                       } else if (evt.keyCode === DOM_VK_F11) {\r
+                                               DOM.get(ed.id + '_path_row').focus();\r
+                                               return Event.cancel(evt);\r
+                                       }\r
+                               }\r
+                       });\r
+\r
+                       // alt+0 is the UK recommended shortcut for accessing the list of access controls.\r
+                       ed.addShortcut('alt+0', '', 'mceShortcuts', t);\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 + '_ifr');\r
+\r
+                       this.resizeTo(e.clientWidth + dw, e.clientHeight + dh);\r
+               },\r
+\r
+               resizeTo : function(w, h, store) {\r
+                       var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr');\r
+\r
+                       // Boundery fix box\r
+                       w = Math.max(s.theme_advanced_resizing_min_width || 100, w);\r
+                       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
+                       // Resize iframe and container\r
+                       DOM.setStyle(e, 'height', '');\r
+                       DOM.setStyle(ifr, 'height', h);\r
+\r
+                       if (s.theme_advanced_resize_horizontal) {\r
+                               DOM.setStyle(e, 'width', '');\r
+                               DOM.setStyle(ifr, 'width', w);\r
+\r
+                               // Make sure that the size is never smaller than the over all ui\r
+                               if (w < e.clientWidth) {\r
+                                       w = e.clientWidth;\r
+                                       DOM.setStyle(ifr, 'width', e.clientWidth);\r
+                               }\r
+                       }\r
+\r
+                       // Store away the size\r
+                       if (store && s.theme_advanced_resizing_use_cookie) {\r
+                               Cookie.setHash("TinyMCE_" + ed.id + "_size", {\r
+                                       cw : w,\r
+                                       ch : h\r
+                               });\r
+                       }\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
+                       if (s.readonly) {\r
+                               n = DOM.add(tb, 'tr');\r
+                               n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});\r
+                               return ic;\r
+                       }\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'] || da).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, toolbarGroup;\r
+\r
+                       toolbarGroup = cf.createToolbarGroup('toolbargroup', {\r
+                               'name': ed.getLang('advanced.toolbar'),\r
+                               'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar')\r
+                       });\r
+\r
+                       t.toolbarGroup = toolbarGroup;\r
+\r
+                       a = s.theme_advanced_toolbar_align.toLowerCase();\r
+                       a = 'mce' + t._ufirst(a);\r
+\r
+                       n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"presentation"});\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
+                               toolbarGroup.add(tb);\r
+\r
+                               o.deltaHeight -= s.theme_advanced_row_height;\r
+                       }\r
+                       h.push(toolbarGroup.renderHTML());\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', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'});\r
+                       if (s.theme_advanced_path) {\r
+                               DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path'));\r
+                               DOM.add(n, 'span', {}, ': ');\r
+                       } else {\r
+                               DOM.add(n, 'span', {}, '&#160;');\r
+                       }\r
+                       \r
+\r
+                       if (s.theme_advanced_resizing) {\r
+                               DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize', tabIndex:"-1"});\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
+                                               t.resizeTo(o.cw, o.ch);\r
+                                       });\r
+                               }\r
+\r
+                               ed.onPostRender.add(function() {\r
+                                       Event.add(ed.id + '_resize', 'click', function(e) {\r
+                                               e.preventDefault();\r
+                                       });\r
+\r
+                                       Event.add(ed.id + '_resize', 'mousedown', function(e) {\r
+                                               var mouseMoveHandler1, mouseMoveHandler2,\r
+                                                       mouseUpHandler1, mouseUpHandler2,\r
+                                                       startX, startY, startWidth, startHeight, width, height, ifrElm;\r
+\r
+                                               function resizeOnMove(e) {\r
+                                                       e.preventDefault();\r
+\r
+                                                       width = startWidth + (e.screenX - startX);\r
+                                                       height = startHeight + (e.screenY - startY);\r
+\r
+                                                       t.resizeTo(width, height);\r
+                                               };\r
+\r
+                                               function endResize(e) {\r
+                                                       // Stop listening\r
+                                                       Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1);\r
+                                                       Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2);\r
+                                                       Event.remove(DOM.doc, 'mouseup', mouseUpHandler1);\r
+                                                       Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2);\r
+\r
+                                                       width = startWidth + (e.screenX - startX);\r
+                                                       height = startHeight + (e.screenY - startY);\r
+                                                       t.resizeTo(width, height, true);\r
+                                               };\r
+\r
+                                               e.preventDefault();\r
+\r
+                                               // Get the current rect size\r
+                                               startX = e.screenX;\r
+                                               startY = e.screenY;\r
+                                               ifrElm = DOM.get(t.editor.id + '_ifr');\r
+                                               startWidth = width = ifrElm.clientWidth;\r
+                                               startHeight = height = ifrElm.clientHeight;\r
+\r
+                                               // Register envent handlers\r
+                                               mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove);\r
+                                               mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove);\r
+                                               mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize);\r
+                                               mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize);\r
+                                       });\r
+                               });\r
+                       }\r
+\r
+                       o.deltaHeight -= 21;\r
+                       n = tb = null;\r
+               },\r
+\r
+               _updateUndoStatus : function(ed) {\r
+                       var cm = ed.controlManager, um = ed.undoManager;\r
+\r
+                       cm.setDisabled('undo', !um.hasUndo() && !um.typing);\r
+                       cm.setDisabled('redo', !um.hasRedo());\r
+               },\r
+\r
+               _nodeChanged : function(ed, cm, n, co, ob) {\r
+                       var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches;\r
+\r
+                       tinymce.each(t.stateControls, function(c) {\r
+                               cm.setActive(c, ed.queryCommandState(t.controls[c][1]));\r
+                       });\r
+\r
+                       function getParent(name) {\r
+                               var i, parents = ob.parents, func = name;\r
+\r
+                               if (typeof(name) == 'string') {\r
+                                       func = function(node) {\r
+                                               return node.nodeName == name;\r
+                                       };\r
+                               }\r
+\r
+                               for (i = 0; i < parents.length; i++) {\r
+                                       if (func(parents[i]))\r
+                                               return parents[i];\r
+                               }\r
+                       };\r
+\r
+                       cm.setActive('visualaid', ed.hasVisual);\r
+                       t._updateUndoStatus(ed);\r
+                       cm.setDisabled('outdent', !ed.queryCommandState('Outdent'));\r
+\r
+                       p = getParent('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(!co && !!p && p.name);\r
+                       }\r
+\r
+                       p = getParent('IMG');\r
+                       if (c = cm.get('image'))\r
+                               c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1);\r
+\r
+                       if (c = cm.get('styleselect')) {\r
+                               t._importClasses();\r
+\r
+                               formatNames = [];\r
+                               each(c.items, function(item) {\r
+                                       formatNames.push(item.value);\r
+                               });\r
+\r
+                               matches = ed.formatter.matchAll(formatNames);\r
+                               c.select(matches[0]);\r
+                       }\r
+\r
+                       if (c = cm.get('formatselect')) {\r
+                               p = getParent(DOM.isBlock);\r
+\r
+                               if (p)\r
+                                       c.select(p.nodeName.toLowerCase());\r
+                       }\r
+\r
+                       // Find out current fontSize, fontFamily and fontClass\r
+                       getParent(function(n) {\r
+                               if (n.nodeName === 'SPAN') {\r
+                                       if (!cl && n.className)\r
+                                               cl = n.className;\r
+                               }\r
+\r
+                               if (ed.dom.is(n, s.theme_advanced_font_selector)) {\r
+                                       if (!fz && n.style.fontSize)\r
+                                               fz = n.style.fontSize;\r
+\r
+                                       if (!fn && n.style.fontFamily)\r
+                                               fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase();\r
+                                       \r
+                                       if (!fc && n.style.color)\r
+                                               fc = n.style.color;\r
+\r
+                                       if (!bc && n.style.backgroundColor)\r
+                                               bc = n.style.backgroundColor;\r
+                               }\r
+\r
+                               return false;\r
+                       });\r
+\r
+                       if (c = cm.get('fontselect')) {\r
+                               c.select(function(v) {\r
+                                       return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn;\r
+                               });\r
+                       }\r
+\r
+                       // Select font size\r
+                       if (c = cm.get('fontsizeselect')) {\r
+                               // Use computed style\r
+                               if (s.theme_advanced_runtime_fontsize && !fz && !cl)\r
+                                       fz = ed.dom.getStyle(n, 'fontSize', true);\r
+\r
+                               c.select(function(v) {\r
+                                       if (v.fontSize && v.fontSize === fz)\r
+                                               return true;\r
+\r
+                                       if (v['class'] && v['class'] === cl)\r
+                                               return true;\r
+                               });\r
+                       }\r
+                       \r
+                       if (s.theme_advanced_show_current_color) {\r
+                               function updateColor(controlId, color) {\r
+                                       if (c = cm.get(controlId)) {\r
+                                               if (!color)\r
+                                                       color = c.settings.default_color;\r
+                                               if (color !== c.value) {\r
+                                                       c.displayColor(color);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               updateColor('forecolor', fc);\r
+                               updateColor('backcolor', bc);\r
+                       }\r
+\r
+                       if (s.theme_advanced_show_current_color) {\r
+                               function updateColor(controlId, color) {\r
+                                       if (c = cm.get(controlId)) {\r
+                                               if (!color)\r
+                                                       color = c.settings.default_color;\r
+                                               if (color !== c.value) {\r
+                                                       c.displayColor(color);\r
+                                               }\r
+                                       }\r
+                               };\r
+\r
+                               updateColor('forecolor', fc);\r
+                               updateColor('backcolor', bc);\r
+                       }\r
+\r
+                       if (s.theme_advanced_path && s.theme_advanced_statusbar_location) {\r
+                               p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'});\r
+\r
+                               if (t.statusKeyboardNavigation) {\r
+                                       t.statusKeyboardNavigation.destroy();\r
+                                       t.statusKeyboardNavigation = null;\r
+                               }\r
+\r
+                               DOM.setHTML(p, '');\r
+\r
+                               getParent(function(n) {\r
+                                       var na = n.nodeName.toLowerCase(), u, pi, ti = '';\r
+\r
+                                       // Ignore non element and bogus/hidden elements\r
+                                       if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))\r
+                                               return;\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 (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(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, '')\r
+\r
+                                               if (v) {\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:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na);\r
+\r
+                                       if (p.hasChildNodes()) {\r
+                                               p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild);\r
+                                               p.insertBefore(pi, p.firstChild);\r
+                                       } else\r
+                                               p.appendChild(pi);\r
+                               }, ed.getBody());\r
+\r
+                               if (DOM.select('a', p).length > 0) {\r
+                                       t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({\r
+                                               root: ed.id + "_path_row",\r
+                                               items: DOM.select('a', p),\r
+                                               excludeFromTabOrder: true,\r
+                                               onCancel: function() {\r
+                                                       ed.focus();\r
+                                               }\r
+                                       }, DOM);\r
+                               }\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 : this.url + '/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 : this.url + '/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 : this.url + '/about.htm',\r
+                               width : 480,\r
+                               height : 380,\r
+                               inline : true\r
+                       }, {\r
+                               theme_url : this.url\r
+                       });\r
+               },\r
+\r
+               _mceShortcuts : function() {\r
+                       var ed = this.editor;\r
+                       ed.windowManager.open({\r
+                               url: this.url + '/shortcuts.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 : this.url + '/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 : this.url + '/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 : this.url + '/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 : this.url + '/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
+                               color: t.fgColor,\r
+                               func : function(co) {\r
+                                       t.fgColor = 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
+                               color: t.bgColor,\r
+                               func : function(co) {\r
+                                       t.bgColor = 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
+}(tinymce));\r
diff --git a/webcit/tiny_mce/themes/advanced/image.htm b/webcit/tiny_mce/themes/advanced/image.htm
new file mode 100644 (file)
index 0000000..b8ba729
--- /dev/null
@@ -0,0 +1,80 @@
+<!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
+</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 class="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 class="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 class="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 class="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 class="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 class="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 class="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
+               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/img/colorpicker.jpg b/webcit/tiny_mce/themes/advanced/img/colorpicker.jpg
new file mode 100644 (file)
index 0000000..b1a377a
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/colorpicker.jpg differ
diff --git a/webcit/tiny_mce/themes/advanced/img/flash.gif b/webcit/tiny_mce/themes/advanced/img/flash.gif
new file mode 100644 (file)
index 0000000..dec3f7c
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/flash.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/img/icons.gif b/webcit/tiny_mce/themes/advanced/img/icons.gif
new file mode 100644 (file)
index 0000000..641a9e3
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/icons.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/img/iframe.gif b/webcit/tiny_mce/themes/advanced/img/iframe.gif
new file mode 100644 (file)
index 0000000..410c7ad
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/iframe.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/img/pagebreak.gif b/webcit/tiny_mce/themes/advanced/img/pagebreak.gif
new file mode 100644 (file)
index 0000000..acdf408
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/pagebreak.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/img/quicktime.gif b/webcit/tiny_mce/themes/advanced/img/quicktime.gif
new file mode 100644 (file)
index 0000000..8f10e7a
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/quicktime.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/img/realmedia.gif b/webcit/tiny_mce/themes/advanced/img/realmedia.gif
new file mode 100644 (file)
index 0000000..fdfe0b9
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/realmedia.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/img/shockwave.gif b/webcit/tiny_mce/themes/advanced/img/shockwave.gif
new file mode 100644 (file)
index 0000000..9314d04
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/shockwave.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/img/trans.gif b/webcit/tiny_mce/themes/advanced/img/trans.gif
new file mode 100644 (file)
index 0000000..3884865
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/trans.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/img/video.gif b/webcit/tiny_mce/themes/advanced/img/video.gif
new file mode 100644 (file)
index 0000000..3570104
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/video.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/img/windowsmedia.gif b/webcit/tiny_mce/themes/advanced/img/windowsmedia.gif
new file mode 100644 (file)
index 0000000..ab50f2d
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/img/windowsmedia.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/js/about.js b/webcit/tiny_mce/themes/advanced/js/about.js
new file mode 100644 (file)
index 0000000..5b35845
--- /dev/null
@@ -0,0 +1,73 @@
+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
+               document.getElementById('help_tab').setAttribute("aria-hidden", "false");\r
+       }\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/webcit/tiny_mce/themes/advanced/js/anchor.js b/webcit/tiny_mce/themes/advanced/js/anchor.js
new file mode 100644 (file)
index 0000000..e528e4f
--- /dev/null
@@ -0,0 +1,42 @@
+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');\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, elm, name = document.forms[0].anchorName.value;\r
+\r
+               if (!name || !/^[a-z][a-z0-9\-\_:\.]*$/i.test(name)) {\r
+                       tinyMCEPopup.alert('advanced_dlg.anchor_invalid');\r
+                       return;\r
+               }\r
+\r
+               tinyMCEPopup.restoreSelection();\r
+\r
+               if (this.action != 'update')\r
+                       ed.selection.collapse(1);\r
+\r
+               elm = ed.dom.getParent(ed.selection.getNode(), 'A');\r
+               if (elm)\r
+                       elm.name = name;\r
+               else\r
+                       ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : name, 'class' : 'mceItemAnchor'}, ''));\r
+\r
+               tinyMCEPopup.close();\r
+       }\r
+};\r
+\r
+tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog);\r
diff --git a/webcit/tiny_mce/themes/advanced/js/charmap.js b/webcit/tiny_mce/themes/advanced/js/charmap.js
new file mode 100644 (file)
index 0000000..1cead6d
--- /dev/null
@@ -0,0 +1,355 @@
+/**\r
+ * charmap.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+tinyMCEPopup.requireLangPack();\r
+\r
+var charmap = [\r
+       ['&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;', true, '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
+       addKeyboardNavigation();\r
+});\r
+\r
+function addKeyboardNavigation(){\r
+       var tableElm, cells, settings;\r
+\r
+       cells = tinyMCEPopup.dom.select(".charmaplink", "charmapgroup");\r
+\r
+       settings ={\r
+               root: "charmapgroup",\r
+               items: cells\r
+       };\r
+\r
+       tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom);\r
+}\r
+\r
+function renderCharMapHTML() {\r
+       var charsPerRow = 20, tdWidth=20, tdHeight=20, i;\r
+       var html = '<div id="charmapgroup" aria-labelledby="charmap_label" tabindex="0" role="listbox">'+\r
+       '<table role="presentation" border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + \r
+       '"><tr height="' + tdHeight + '">';\r
+       var cols=-1;\r
+\r
+       for (i=0; i<charmap.length; i++) {\r
+               var previewCharFn;\r
+\r
+               if (charmap[i][2]==true) {\r
+                       cols++;\r
+                       previewCharFn = 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');';\r
+                       html += ''\r
+                               + '<td class="charmap">'\r
+                               + '<a class="charmaplink" role="button" onmouseover="'+previewCharFn+'" onfocus="'+previewCharFn+'" 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></div>';\r
+       html = html.replace(/<tr height="20"><\/tr>/g, '');\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/webcit/tiny_mce/themes/advanced/js/color_picker.js b/webcit/tiny_mce/themes/advanced/js/color_picker.js
new file mode 100644 (file)
index 0000000..7decac5
--- /dev/null
@@ -0,0 +1,329 @@
+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':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',\r
+       '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown',\r
+       '#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue',\r
+       '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod',\r
+       '#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green',\r
+       '#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue',\r
+       '#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue',\r
+       '#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green',\r
+       '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey',\r
+       '#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory',\r
+       '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue',\r
+       '#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green',\r
+       '#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey',\r
+       '#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',\r
+       '#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue',\r
+       '#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin',\r
+       '#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid',\r
+       '#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff',\r
+       '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue',\r
+       '#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver',\r
+       '#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green',\r
+       '#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',\r
+       '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green'\r
+};\r
+\r
+var namedLookup = {};\r
+\r
+function init() {\r
+       var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value;\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       generatePicker();\r
+       generateWebColors();\r
+       generateNamedColors();\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
+       for (key in named) {\r
+               value = named[key];\r
+               namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase();\r
+       }\r
+}\r
+\r
+function toHexColor(color) {\r
+       var matches, red, green, blue, toInt = parseInt;\r
+\r
+       function hex(value) {\r
+               value = parseInt(value).toString(16);\r
+\r
+               return value.length > 1 ? value : '0' + value; // Padd with leading zero\r
+       };\r
+\r
+       color = color.replace(/[\s#]+/g, '').toLowerCase();\r
+       color = namedLookup[color] || color;\r
+       matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)|([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})|([a-f0-9])([a-f0-9])([a-f0-9])$/.exec(color);\r
+\r
+       if (matches) {\r
+               if (matches[1]) {\r
+                       red = toInt(matches[1]);\r
+                       green = toInt(matches[2]);\r
+                       blue = toInt(matches[3]);\r
+               } else if (matches[4]) {\r
+                       red = toInt(matches[4], 16);\r
+                       green = toInt(matches[5], 16);\r
+                       blue = toInt(matches[6], 16);\r
+               } else if (matches[7]) {\r
+                       red = toInt(matches[7] + matches[7], 16);\r
+                       green = toInt(matches[8] + matches[8], 16);\r
+                       blue = toInt(matches[9] + matches[9], 16);\r
+               }\r
+\r
+               return '#' + hex(red) + hex(green) + hex(blue);\r
+       }\r
+\r
+       return '';\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(toHexColor(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.toUpperCase();\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
+       // TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby.\r
+       h += '<div role="listbox" aria-labelledby="webcolors_title" tabindex="0"><table role="presentation" 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();" role="option" tabindex="-1" aria-labelledby="web_colors_' + i + '" onfocus="showColor(\'' + colors[i] + '\');" onmouseover="showColor(\'' + colors[i] + '\');" style="display:block;width:10px;height:10px;overflow:hidden;">';\r
+               if (tinyMCEPopup.editor.forcedHighContrastMode) {\r
+                       h += '<canvas class="mceColorSwatch" height="10" width="10" data-color="' + colors[i] + '"></canvas>';\r
+               }\r
+               h += '<span class="mceVoiceLabel" style="display:none;" id="web_colors_' + i + '">' + colors[i].toUpperCase() + '</span>';\r
+               h += '</a></td>';\r
+               if ((i+1) % 18 == 0)\r
+                       h += '</tr><tr>';\r
+       }\r
+\r
+       h += '</table></div>';\r
+\r
+       el.innerHTML = h;\r
+       el.className = 'generated';\r
+\r
+       paintCanvas(el);\r
+       enableKeyboardNavigation(el.firstChild);\r
+}\r
+\r
+function paintCanvas(el) {\r
+       tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) {\r
+               var context;\r
+               if (canvas.getContext && (context = canvas.getContext("2d"))) {\r
+                       context.fillStyle = canvas.getAttribute('data-color');\r
+                       context.fillRect(0, 0, 10, 10);\r
+               }\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();" role="option" tabindex="-1" aria-labelledby="named_colors_' + i + '" onfocus="showColor(\'' + n + '\',\'' + v + '\');" onmouseover="showColor(\'' + n + '\',\'' + v + '\');" style="background-color: ' + n + '">';\r
+               if (tinyMCEPopup.editor.forcedHighContrastMode) {\r
+                       h += '<canvas class="mceColorSwatch" height="10" width="10" data-color="' + colors[i] + '"></canvas>';\r
+               }\r
+               h += '<span class="mceVoiceLabel" style="display:none;" id="named_colors_' + i + '">' + v + '</span>';\r
+               h += '</a>';\r
+               i++;\r
+       }\r
+\r
+       el.innerHTML = h;\r
+       el.className = 'generated';\r
+\r
+       paintCanvas(el);\r
+       enableKeyboardNavigation(el);\r
+}\r
+\r
+function enableKeyboardNavigation(el) {\r
+       tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', {\r
+               root: el,\r
+               items: tinyMCEPopup.dom.select('a', el)\r
+       }, tinyMCEPopup.dom);\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
+               setCol('gs' + i, '#'+color);\r
+       }\r
+}\r
+\r
+function changeFinalColor(color) {\r
+       if (color.indexOf('#') == -1)\r
+               color = convertRGBToHex(color);\r
+\r
+       setCol('preview', color);\r
+       document.getElementById('color').value = color;\r
+}\r
+\r
+function setCol(e, c) {\r
+       try {\r
+               document.getElementById(e).style.backgroundColor = c;\r
+       } catch (ex) {\r
+               // Ignore IE warning\r
+       }\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/webcit/tiny_mce/themes/advanced/js/image.js b/webcit/tiny_mce/themes/advanced/js/image.js
new file mode 100644 (file)
index 0000000..6c2489a
--- /dev/null
@@ -0,0 +1,251 @@
+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', tinyMCEPopup.getParam('external_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 = typeof(l) === 'function' ? 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.replace(/ /g, '%20'),\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
+                       tinyMCEPopup.editor.execCommand('mceRepaint');\r
+                       tinyMCEPopup.editor.focus();\r
+               } else {\r
+                       tinymce.each(args, function(value, name) {\r
+                               if (value === "") {\r
+                                       delete args[name];\r
+                               }\r
+                       });\r
+\r
+                       ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1});\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), 'img');\r
+                       this.styleVal = dom.serializeStyle(st, 'img');\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/webcit/tiny_mce/themes/advanced/js/link.js b/webcit/tiny_mce/themes/advanced/js/link.js
new file mode 100644 (file)
index 0000000..53ff409
--- /dev/null
@@ -0,0 +1,153 @@
+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, href = f.href.value.replace(/ /g, '%20');\r
+\r
+               tinyMCEPopup.restoreSelection();\r
+               e = ed.dom.getParent(ed.selection.getNode(), 'A');\r
+\r
+               // Remove element if there is no href\r
+               if (!f.href.value) {\r
+                       if (e) {\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
+               // Create new anchor elements\r
+               if (e == null) {\r
+                       ed.getDoc().execCommand("unlink", false, null);\r
+                       tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1});\r
+\r
+                       tinymce.each(ed.dom.select("a"), function(n) {\r
+                               if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') {\r
+                                       e = n;\r
+\r
+                                       ed.dom.setAttribs(e, {\r
+                                               href : href,\r
+                                               title : f.linktitle.value,\r
+                                               target : f.target_list ? getSelectValue(f, "target_list") : null,\r
+                                               'class' : f.class_list ? getSelectValue(f, "class_list") : null\r
+                                       });\r
+                               }\r
+                       });\r
+               } else {\r
+                       ed.dom.setAttribs(e, {\r
+                               href : href,\r
+                               title : f.linktitle.value,\r
+                               target : f.target_list ? getSelectValue(f, "target_list") : null,\r
+                               'class' : f.class_list ? getSelectValue(f, "class_list") : null\r
+                       });\r
+               }\r
+\r
+               // Don't move caret if selection was image\r
+               if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') {\r
+                       ed.focus();\r
+                       ed.selection.select(e);\r
+                       ed.selection.collapse(0);\r
+                       tinyMCEPopup.storeSelection();\r
+               }\r
+\r
+               tinyMCEPopup.execCommand("mceEndUndoLevel");\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/webcit/tiny_mce/themes/advanced/js/source_editor.js b/webcit/tiny_mce/themes/advanced/js/source_editor.js
new file mode 100644 (file)
index 0000000..84546ad
--- /dev/null
@@ -0,0 +1,56 @@
+tinyMCEPopup.requireLangPack();\r
+tinyMCEPopup.onInit.add(onLoadInit);\r
+\r
+function saveContent() {\r
+       tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true});\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({source_view : true});\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
+function resizeInputs() {\r
+       var vp = tinyMCEPopup.dom.getViewPort(window), el;\r
+\r
+       el = document.getElementById('htmlSource');\r
+\r
+       if (el) {\r
+               el.style.width = (vp.w - 20) + 'px';\r
+               el.style.height = (vp.h - 65) + 'px';\r
+       }\r
+}\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/bg.js b/webcit/tiny_mce/themes/advanced/langs/bg.js
new file mode 100644 (file)
index 0000000..6587c73
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.advanced',{"underline_desc":"\u041f\u043e\u0434\u0447\u0435\u0440\u0442\u0430\u043d (Ctrl+U)","italic_desc":"\u041a\u0443\u0440\u0441\u0438\u0432 (Ctrl+I)","bold_desc":"\u041f\u043e\u043b\u0443\u0447\u0435\u0440 (Ctrl+B)",dd:"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u044f",dt:"\u0414\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u044f ",samp:"\u041f\u0440\u043e\u043c\u0435\u0440\u0435\u043d \u043a\u043e\u0434",code:"\u041a\u043e\u0434",blockquote:"\u0426\u0438\u0442\u0430\u0442",h6:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 6",h5:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 5",h4:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 4",h3:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 3",h2:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 2",h1:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 1",pre:"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u043d\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d",address:"\u0410\u0434\u0440\u0435\u0441",div:"Div",paragraph:"\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444",block:"\u0424\u043e\u0440\u043c\u0430\u0442",fontdefault:"\u0428\u0440\u0438\u0444\u0442","font_size":"\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u0448\u0440\u0438\u0444\u0442\u0430","style_select":"\u0421\u0442\u0438\u043b\u043e\u0432\u0435","anchor_delta_height":"","more_colors":"\u041e\u0449\u0435 \u0446\u0432\u0435\u0442\u043e\u0432\u0435","toolbar_focus":"\u041e\u0442\u0438\u0434\u0438 \u043f\u0440\u0438 \u0431\u0443\u0442\u043e\u043d\u0438\u0442\u0435 - Alt+Q, \u041e\u0442\u0438\u0434\u0438 \u043f\u0440\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 - Alt-Z, \u041e\u0442\u0438\u0434\u0438 \u043f\u0440\u0438 \u043f\u044a\u0442\u0435\u043a\u0430\u0442\u0430 \u043d\u0430 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0442\u0435 - Alt-X",newdocument:"\u0421\u0438\u0433\u0443\u0440\u0435\u043d \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u0438\u0437\u0447\u0438\u0441\u0442\u0438\u0442\u0435 \u0446\u044f\u043b\u043e\u0442\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435?",path:"\u041f\u044a\u0442","clipboard_msg":"\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u0435/\u041e\u0442\u0440\u044f\u0437\u0432\u0430\u043d\u0435/\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435 \u043d\u0435 \u0435 \u0434\u043e\u0441\u0442\u044a\u043f\u043d\u043e \u043f\u043e\u0434 Mozilla \u0438 Firefox.\n\u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u043f\u043e\u0432\u0435\u0447\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430?","blockquote_desc":"\u0426\u0438\u0442\u0430\u0442","help_desc":"\u041f\u043e\u043c\u043e\u0449","newdocument_desc":"\u041d\u043e\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442","image_props_desc":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0442\u0430","paste_desc":"\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435","copy_desc":"\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u0435","cut_desc":"\u0418\u0437\u0440\u044f\u0437\u0432\u0430\u043d\u0435","anchor_desc":"\u0412\u043c\u044a\u043a\u043d\u0438/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043a\u043e\u0442\u0432\u0430","visualaid_desc":"\u0412\u043a\u043b./\u0438\u0437\u043a\u043b. \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u0438\u0442\u0435 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438","charmap_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u0441\u0438\u043c\u0432\u043e\u043b","backcolor_desc":"\u0418\u0437\u0431\u0435\u0440\u0438 \u0446\u0432\u044f\u0442 \u043d\u0430 \u0444\u043e\u043d\u0430","forecolor_desc":"\u0418\u0437\u0431\u0435\u0440\u0438 \u0446\u0432\u044f\u0442 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430","custom1_desc":"\u0412\u0430\u0448\u0435\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0443\u043a","removeformat_desc":"\u041f\u0440\u0435\u043c\u0430\u0445\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435\u0442\u043e","hr_desc":"\u0412\u043c\u044a\u043a\u043d\u0438 \u0445\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u0430 \u043b\u0438\u043d\u0438\u044f","sup_desc":"\u0413\u043e\u0440\u0435\u043d \u0438\u043d\u0434\u0435\u043a\u0441","sub_desc":"\u0414\u043e\u043b\u0435\u043d \u0438\u043d\u0434\u0435\u043a\u0441","code_desc":"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 HTML","cleanup_desc":"\u0418\u0437\u0447\u0438\u0441\u0442\u0438 \u043a\u043e\u0434\u0430","image_desc":"\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435/\u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430","unlink_desc":"\u041f\u0440\u0435\u043c\u0430\u0445\u043d\u0438 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430","link_desc":"\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435/\u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430","redo_desc":"\u0412\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 (Ctrl+Y)","undo_desc":"\u041e\u0442\u043c\u044f\u043d\u0430 (Ctrl+Z)","indent_desc":"\u0423\u0432\u0435\u043b\u0438\u0447\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u043e\u0442\u0441\u0442\u044a\u043f\u0430","outdent_desc":"\u041d\u0430\u043c\u0430\u043b\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043e\u0442\u0441\u0442\u044a\u043f\u0430","numlist_desc":"\u041d\u043e\u043c\u0435\u0440\u0430","bullist_desc":"\u0412\u043e\u0434\u0430\u0447\u0438","justifyfull_desc":"\u0414\u0432\u0443\u0441\u0442\u0440\u0430\u043d\u043d\u043e","justifyright_desc":"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435 \u043e\u0442\u0434\u044f\u0441\u043d\u043e","justifycenter_desc":"\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u0430\u043d\u043e","justifyleft_desc":"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435 \u043e\u0442\u043b\u044f\u0432\u043e","striketrough_desc":"\u0417\u0430\u0447\u0435\u0440\u0442\u0430\u043d","help_shortcut":"\u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 ALT-F10 \u0437\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438. \u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 ALT-0 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449","rich_text_area":"\u0417\u043e\u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d \u0442\u0435\u043a\u0441\u0442","shortcuts_desc":"\u0417\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e Help",toolbar:"\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/bg_dlg.js b/webcit/tiny_mce/themes/advanced/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..a0c2925
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.advanced_dlg',{"link_list":"\u0421\u043f\u0438\u0441\u044a\u043a \u043b\u0438\u043d\u043a\u043e\u0432\u0435","link_is_external":"URL-\u0442\u043e \u043a\u043e\u0435\u0442\u043e \u0432\u044a\u0432\u0435\u0434\u043e\u0445\u0442\u0435 \u0435 \u0432\u044a\u043d\u0448\u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430, \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u0438\u044f\u0442 http:// \u043f\u0440\u0435\u0444\u0438\u043a\u0441?","link_is_email":"URL-\u0442\u043e \u043a\u043e\u0435\u0442\u043e \u0432\u044a\u0432\u0435\u0434\u043e\u0445\u0442\u0435 \u0435 email \u0430\u0434\u0440\u0435\u0441, \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u0438\u044f\u0442 mailto: \u043f\u0440\u0435\u0444\u0438\u043a\u0441?","link_titlefield":"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435","link_target_blank":"\u041e\u0442\u0432\u043e\u0440\u0438 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430\u0442\u0430 \u0432 \u043d\u043e\u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446","link_target_same":"\u041e\u0442\u0432\u043e\u0440\u0438 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430\u0442\u0430 \u0432 \u0441\u044a\u0449\u0438\u044f\u0442 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446","link_target":"\u0426\u0435\u043b","link_url":"URL \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430","link_title":"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430","image_align_right":"\u0414\u044f\u0441\u043d\u043e","image_align_left":"\u041b\u044f\u0432\u043e","image_align_textbottom":"\u0422\u0435\u043a\u0441\u0442 \u0434\u043e\u043b\u0443","image_align_texttop":"\u0422\u0435\u043a\u0441\u0442 \u0433\u043e\u0440\u0435","image_align_bottom":"\u0414\u043e\u043b\u0443","image_align_middle":"\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u0430\u043d\u0435","image_align_top":"\u0413\u043e\u0440\u0435","image_align_baseline":"\u0411\u0430\u0437\u043e\u0432\u0430 \u043b\u0438\u043d\u0438\u044f","image_align":"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435","image_hspace":"\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435","image_vspace":"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435","image_dimensions":"\u0420\u0430\u0437\u043c\u0435\u0440\u0438","image_alt":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430","image_list":"\u0421\u043f\u0438\u0441\u044a\u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438","image_border":"\u0420\u0430\u043c\u043a\u0430","image_src":"URL \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430","image_title":"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430","charmap_title":"\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0441\u0438\u043c\u0432\u043e\u043b","colorpicker_name":"\u0418\u043c\u0435:","colorpicker_color":"\u0426\u0432\u044f\u0442:","colorpicker_named_title":"\u0418\u043c\u0435\u043d\u0443\u0432\u0430\u043d\u0438 \u0446\u0432\u0435\u0442\u043e\u0432\u0435","colorpicker_named_tab":"\u0418\u043c\u0435\u043d\u0443\u0432\u0430\u043d\u0438","colorpicker_palette_title":"\u0426\u0432\u0435\u0442\u043e\u0432\u0430 \u043f\u0430\u043b\u0438\u0442\u0440\u0430","colorpicker_palette_tab":"\u041f\u0430\u043b\u0438\u0442\u0440\u0430","colorpicker_picker_title":"\u0418\u0437\u0431\u043e\u0440 \u043d\u0430 \u0446\u0432\u044f\u0442","colorpicker_picker_tab":"\u0418\u0437\u0431\u043e\u0440","colorpicker_title":"\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0446\u0432\u044f\u0442","code_wordwrap":"\u041f\u0440\u0435\u043d\u043e\u0441 \u043d\u0430 \u0434\u0443\u043c\u0438","code_title":"\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043d\u0430 HTML","anchor_name":"\u0418\u043c\u0435 \u043d\u0430 \u043a\u043e\u0442\u0432\u0430\u0442\u0430","anchor_title":"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043a\u043e\u0442\u0432\u0430","about_loaded":"\u0417\u0430\u0440\u0435\u0434\u0435\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u043a\u0438","about_version":"\u0412\u0435\u0440\u0441\u0438\u044f","about_author":"\u0410\u0432\u0442\u043e\u0440","about_plugin":"\u0414\u043e\u0431\u0430\u0432\u043a\u0430","about_plugins":"\u0414\u043e\u0431\u0430\u0432\u043a\u0438","about_license":"\u041b\u0438\u0446\u0435\u043d\u0437","about_help":"\u041f\u043e\u043c\u043e\u0449","about_general":"\u041e\u0442\u043d\u043e\u0441\u043d\u043e","about_title":"\u041e\u0442\u043d\u043e\u0441\u043d\u043e TinyMCE","anchor_invalid":"\u041c\u043e\u043b\u044f \u0437\u0430\u0434\u0430\u0439\u0442\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u043e \u0438\u043c\u0435 \u0437\u0430 \u043a\u043e\u0442\u0432\u0430.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/cs.js b/webcit/tiny_mce/themes/advanced/langs/cs.js
new file mode 100644 (file)
index 0000000..f94e356
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.advanced',{"underline_desc":"Podtr\u017een\u00e9 (Ctrl+U)","italic_desc":"Kurz\u00edva (Ctrl+I)","bold_desc":"Tu\u010dn\u00e9 (Ctrl+B)",dd:"Popis definice",dt:"Term\u00edn definice",samp:"Uk\u00e1zka k\u00f3du",code:"K\u00f3d",blockquote:"Blokov\u00e1 citace",h6:"Nadpis 6",h5:"Nadpis 5",h4:"Nadpis 4",h3:"Nadpis 3",h2:"Nadpis 2",h1:"Nadpis 1",pre:"P\u0159edform\u00e1tov\u00e1no",address:"Adresa",div:"Odd\u00edl",paragraph:"Odstavec",block:"Form\u00e1t",fontdefault:"P\u00edsmo","font_size":"Velikost p\u00edsma","style_select":"Styly","more_colors":"Dal\u0161\u00ed barvy","toolbar_focus":"P\u0159echod na panel n\u00e1stroj\u016f - Alt-Q, p\u0159echod do editoru - Alt-Z, p\u0159echod na cestu prvk\u016f - Alt-X",newdocument:"Jste si opravdu jisti, \u017ee chcete odstranit ve\u0161ker\u00fd obsah?",path:"Cesta","clipboard_msg":"Funkce kop\u00edrovat/vyjmout/vlo\u017eit nejsou podporovan\u00e9 v prohl\u00ed\u017ee\u010d\u00edch Mozilla a Firefox.\nChcete v\u00edce informac\u00ed o tomto probl\u00e9mu?","blockquote_desc":"Blokov\u00e1 citace","help_desc":"N\u00e1pov\u011bda","newdocument_desc":"Nov\u00fd dokument","image_props_desc":"Vlastnosti obr\u00e1zku","paste_desc":"Vlo\u017eit","copy_desc":"Kop\u00edrovat","cut_desc":"Vyjmout","anchor_desc":"Vlo\u017eit/upravit z\u00e1lo\u017eku (kotvu)","visualaid_desc":"Zobrazit pomocn\u00e9 linky/skryt\u00e9 prvky","charmap_desc":"Vlo\u017eit speci\u00e1ln\u00ed znak","backcolor_desc":"Barva pozad\u00ed","forecolor_desc":"Barva textu","custom1_desc":"Libovoln\u00fd popisek","removeformat_desc":"Odstranit form\u00e1tov\u00e1n\u00ed","hr_desc":"Vlo\u017eit vodorovn\u00fd odd\u011blova\u010d","sup_desc":"Horn\u00ed index","sub_desc":"Doln\u00ed index","code_desc":"Upravit HTML zdroj","cleanup_desc":"Vy\u010distit k\u00f3d","image_desc":"Vlo\u017eit/upravit obr\u00e1zek","unlink_desc":"Odebrat odkaz","link_desc":"Vlo\u017eit/upravit odkaz","redo_desc":"Znovu (Ctrl+Y)","undo_desc":"Zp\u011bt (Ctrl+Z)","indent_desc":"Zv\u011bt\u0161it odsazen\u00ed","outdent_desc":"Zmen\u0161it odsazen\u00ed","numlist_desc":"\u010c\u00edslovan\u00fd seznam","bullist_desc":"Seznam s odr\u00e1\u017ekami","justifyfull_desc":"Zarovnat do bloku","justifyright_desc":"Zarovnat doprava","justifycenter_desc":"Zarovnat na st\u0159ed","justifyleft_desc":"Zarovnat doleva","striketrough_desc":"P\u0159e\u0161krtnut\u00e9","help_shortcut":"Stiskn\u011bte ALT-F10 pro panel n\u00e1stroj\u016f. Stiskn\u011bte ALT-0 pro n\u00e1pov\u011bdu.","rich_text_area":"Oblast s form\u00e1tovan\u00fdm textem","shortcuts_desc":"N\u00e1pov\u011bda",toolbar:"Panel n\u00e1stroj\u016f","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/cs_dlg.js b/webcit/tiny_mce/themes/advanced/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..ef13378
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.advanced_dlg',{"link_list":"Seznam odkaz\u016f","link_is_external":"Zadan\u00e9 URL vypad\u00e1 jako extern\u00ed odkaz, chcete doplnit povinn\u00fd prefix http://?","link_is_email":"Zadan\u00e9 URL vypad\u00e1 jako e-mailov\u00e1 adresa, chcete doplnit povinn\u00fd prefix mailto:?","link_titlefield":"Titulek","link_target_blank":"Otev\u0159\u00edt odkaz v nov\u00e9m okn\u011b","link_target_same":"Otev\u0159\u00edt odkaz ve stejn\u00e9m okn\u011b","link_target":"C\u00edl","link_url":"URL odkazu","link_title":"Vlo\u017eit/upravit odkaz","image_align_right":"Vpravo","image_align_left":"Vlevo","image_align_textbottom":"Se spodkem \u0159\u00e1dku","image_align_texttop":"S vrchem \u0159\u00e1dku","image_align_bottom":"Dol\u016f","image_align_middle":"Na st\u0159ed \u0159\u00e1dku","image_align_top":"Nahoru","image_align_baseline":"Na z\u00e1kladnu","image_align":"Zarovn\u00e1n\u00ed","image_hspace":"Horizont\u00e1ln\u00ed odsazen\u00ed","image_vspace":"Vertik\u00e1ln\u00ed odsazen\u00ed","image_dimensions":"Rozm\u011bry","image_alt":"Popis obr\u00e1zku","image_list":"Seznam obr\u00e1zk\u016f","image_border":"R\u00e1me\u010dek","image_src":"URL obr\u00e1zku","image_title":"Vlo\u017eit/upravit obr\u00e1zek","charmap_title":"Vlo\u017eit speci\u00e1ln\u00ed znak","colorpicker_name":"N\u00e1zev:","colorpicker_color":"Vybran\u00e1 barva:","colorpicker_named_title":"Pojmenovan\u00e9 barvy","colorpicker_named_tab":"N\u00e1zvy","colorpicker_palette_title":"Paleta barev","colorpicker_palette_tab":"Paleta","colorpicker_picker_title":"Kap\u00e1tko","colorpicker_picker_tab":"Kap\u00e1tko","colorpicker_title":"V\u00fdb\u011br barvy","code_wordwrap":"Zalamov\u00e1n\u00ed \u0159\u00e1dk\u016f","code_title":"Editor HTML","anchor_name":"N\u00e1zev z\u00e1lo\u017eky","anchor_title":"Vlo\u017eit/upravit z\u00e1lo\u017eku (kotvu)","about_loaded":"Na\u010dten\u00e9 z\u00e1suvn\u00e9 moduly","about_version":"Verze","about_author":"Autor","about_plugin":"Z\u00e1suvn\u00fd modul","about_plugins":"Z\u00e1suvn\u00e9 moduly","about_license":"Licence","about_help":"N\u00e1pov\u011bda","about_general":"O programu","about_title":"O TinyMCE","anchor_invalid":"Zadejte, pros\u00edm, platn\u00fd n\u00e1zev z\u00e1lo\u017eky (kotvy).","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/da.js b/webcit/tiny_mce/themes/advanced/langs/da.js
new file mode 100644 (file)
index 0000000..3d5fb8b
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.advanced',{"underline_desc":"Understreget (Ctrl+U)","italic_desc":"Kursiv (Ctrl+I)","bold_desc":"Fed (Ctrl+B)",dd:"Definitionsbeskrivelse",dt:"Definitionsterm ",samp:"Kodeeksempel",code:"Kode",blockquote:"Blokcitat",h6:"Overskrift 6",h5:"Overskrift 5",h4:"Overskrift 4",h3:"Overskrift 3",h2:"Overskrift 2",h1:"Overskrift 1",pre:"Pr\u00e6formatteret",address:"Adresse",div:"Div",paragraph:"Afsnit",block:"Format",fontdefault:"Skrifttype","font_size":"Skriftst\u00f8rrelse","style_select":"Typografier","more_colors":"Flere farver","toolbar_focus":"Hop til v\u00e6rkt\u00f8jsknapper - Alt+Q, Skift til redigering - Alt-Z, Skift til element sti - Alt-X",newdocument:"Er du sikker p\u00e5 du vil slette alt indhold?",path:"Sti","clipboard_msg":"Kopier/Klip/inds\u00e6t er ikke muligt i Mozilla og Firefox.\nVil du have mere information om dette emne?","blockquote_desc":"Blokcitat","help_desc":"Hj\u00e6lp","newdocument_desc":"Nyt dokument","image_props_desc":"Billedegenskaber","paste_desc":"Inds\u00e6t","copy_desc":"Kopier","cut_desc":"Klip","anchor_desc":"Inds\u00e6t/rediger anker","visualaid_desc":"Sl\u00e5 hj\u00e6lp/synlige elementer til/fra","charmap_desc":"Inds\u00e6t specialtegn","backcolor_desc":"V\u00e6lg baggrundsfarve","forecolor_desc":"V\u00e6lg tekstfarve","custom1_desc":"Din egen beskrivelse her","removeformat_desc":"Fjern formatering","hr_desc":"Inds\u00e6t horisontal linie","sup_desc":"H\u00e6vet skrift","sub_desc":"S\u00e6nket skrift","code_desc":"Rediger HTML-kilde","cleanup_desc":"Ryd op i uordentlig kode","image_desc":"Inds\u00e6t/rediger billede","unlink_desc":"Fjern link","link_desc":"Inds\u00e6t/rediger link","redo_desc":"Gendan (Ctrl+Y)","undo_desc":"Fortryd (Ctrl+Z)","indent_desc":"\u00d8g indrykning","outdent_desc":"Formindsk indrykning","numlist_desc":"Nummereret punktopstilling","bullist_desc":"Unummereret punktopstilling","justifyfull_desc":"Lige marginer","justifyright_desc":"H\u00f8jrejusteret","justifycenter_desc":"Centreret","justifyleft_desc":"Venstrejusteret","striketrough_desc":"Gennemstreget","help_shortcut":"Tryk ALT-F10 for v\u00e6rkt\u00f8jslinie. Tryk ALT-0 for hj\u00e6lp","rich_text_area":"Tekstomr\u00e5de med formatering","shortcuts_desc":"Hj\u00e6lp til tilg\u00e6ngelighed",toolbar:"V\u00e6rkt\u00f8jslinie","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/da_dlg.js b/webcit/tiny_mce/themes/advanced/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..5a1811d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.advanced_dlg',{"link_list":"Liste over links","link_is_external":"Den URL, der er indtastet, ser ud til at v\u00e6re et eksternt link. Vil du have tilf\u00f8jet det p\u00e5kr\u00e6vede http:// foran?","link_is_email":"Den URL, der er indtastet, ser ud til at v\u00e6re en emailadresse. Vil du have tilf\u00f8jet det p\u00e5kr\u00e6vede mailto: foran?","link_titlefield":"Titel","link_target_blank":"\u00c5ben link i nyt vindue","link_target_same":"\u00c5ben link i samme vindue","link_target":"Target","link_url":"Link URL","link_title":"Inds\u00e6t/rediger link","image_align_right":"H\u00f8jre","image_align_left":"Venstre","image_align_textbottom":"Tekst bunden","image_align_texttop":"Tekst toppen","image_align_bottom":"Bunden","image_align_middle":"Centreret","image_align_top":"Toppen","image_align_baseline":"Grundlinie","image_align":"Justering","image_hspace":"Horisontal afstand","image_vspace":"Vertikal afstand","image_dimensions":"Dimensioner","image_alt":"Billedbeskrivelse","image_list":"Liste over billeder","image_border":"Kant","image_src":"Billede URL","image_title":"Inds\u00e6t/rediger billede","charmap_title":"V\u00e6lg specialtegn","colorpicker_name":"Navn:","colorpicker_color":"Farve:","colorpicker_named_title":"Navngivet farve","colorpicker_named_tab":"Navngivet","colorpicker_palette_title":"Palette-farver","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Farvev\u00e6lger","colorpicker_picker_tab":"V\u00e6lger","colorpicker_title":"V\u00e6lg en farve","code_wordwrap":"Tekstombrydning","code_title":"HTML kildekode-redigering","anchor_name":"Navn p\u00e5 anker","anchor_title":"Inds\u00e6t/rediger anker","about_loaded":"Indl\u00e6ste udvidelser","about_version":"Version","about_author":"Forfatter","about_plugin":"Udvidelse","about_plugins":"Udvidelser","about_license":"Licens","about_help":"Hj\u00e6lp","about_general":"Om","about_title":"Om TinyMCE","anchor_invalid":"Angiv venligst et gyldigt anker navn.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/de.js b/webcit/tiny_mce/themes/advanced/langs/de.js
new file mode 100644 (file)
index 0000000..034195c
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.advanced',{"underline_desc":"Unterstrichen (Strg+U)","italic_desc":"Kursiv (Strg+I)","bold_desc":"Fett (Strg+B)",dd:"Definitionsbeschreibung",dt:"Definitionsbegriff",samp:"Beispiel",code:"Code",blockquote:"Zitatblock",h6:"\u00dcberschrift 6",h5:"\u00dcberschrift 5",h4:"\u00dcberschrift 4",h3:"\u00dcberschrift 3",h2:"\u00dcberschrift 2",h1:"\u00dcberschrift 1",pre:"Rohdaten",address:"Adresse",div:"Zusammenh\u00e4ngender Bereich",paragraph:"Absatz",block:"Vorlage",fontdefault:"Schriftart","font_size":"Schriftgr\u00f6\u00dfe","style_select":"Format","anchor_delta_width":"13","more_colors":"Weitere Farben","toolbar_focus":"Zur Werkzeugleiste springen: Alt+Q; Zum Editor springen: Alt-Z; Zum Elementpfad springen: Alt-X",newdocument:"Wollen Sie wirklich den ganzen Inhalt l\u00f6schen?",path:"Pfad","clipboard_msg":"Kopieren, Ausschneiden und Einf\u00fcgen sind im Mozilla Firefox nicht m\u00f6glich.\nWollen Sie mehr \u00fcber dieses Problem erfahren?","blockquote_desc":"Zitatblock","help_desc":"Hilfe","newdocument_desc":"Neues Dokument","image_props_desc":"Bildeigenschaften","paste_desc":"Einf\u00fcgen","copy_desc":"Kopieren","cut_desc":"Ausschneiden","anchor_desc":"Anker einf\u00fcgen/ver\u00e4ndern","visualaid_desc":"Hilfslinien und unsichtbare Elemente ein-/ausblenden","charmap_desc":"Sonderzeichen einf\u00fcgen","backcolor_desc":"Hintergrundfarbe","forecolor_desc":"Textfarbe","custom1_desc":"Benutzerdefinierte Beschreibung","removeformat_desc":"Formatierungen zur\u00fccksetzen","hr_desc":"Trennlinie einf\u00fcgen","sup_desc":"Hochgestellt","sub_desc":"Tiefgestellt","code_desc":"HTML-Quellcode bearbeiten","cleanup_desc":"Quellcode aufr\u00e4umen","image_desc":"Bild einf\u00fcgen/ver\u00e4ndern","unlink_desc":"Link entfernen","link_desc":"Link einf\u00fcgen/ver\u00e4ndern","redo_desc":"Wiederholen (Strg+Y)","undo_desc":"R\u00fcckg\u00e4ngig (Strg+Z)","indent_desc":"Einr\u00fccken","outdent_desc":"Ausr\u00fccken","numlist_desc":"Sortierte Liste","bullist_desc":"Unsortierte Liste","justifyfull_desc":"Blocksatz","justifyright_desc":"Rechtsb\u00fcndig","justifycenter_desc":"Zentriert","justifyleft_desc":"Linksb\u00fcndig","striketrough_desc":"Durchgestrichen","help_shortcut":"Dr\u00fccken Sie ALT-F10 f\u00fcr die Toolbar. Dr\u00fccken Sie ALT-0 f\u00fcr Hilfe","rich_text_area":"Rich Text Feld","shortcuts_desc":"Eingabehilfe",toolbar:"Toolbar","anchor_delta_height":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/de_dlg.js b/webcit/tiny_mce/themes/advanced/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..1754c19
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.advanced_dlg',{"link_list":"Linkliste","link_is_external":"Diese Adresse scheint ein externer Link zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"http://\" voranstellen?","link_is_email":"Diese Adresse scheint eine E-Mail-Adresse zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"mailto:\" voranstellen?","link_titlefield":"Titel","link_target_blank":"Neues Fenster \u00f6ffnen","link_target_same":"Im selben Fenster \u00f6ffnen","link_target":"Fenster","link_url":"Adresse","link_title":"Link einf\u00fcgen/ver\u00e4ndern","image_align_right":"Rechts","image_align_left":"Links","image_align_textbottom":"Unten im Text","image_align_texttop":"Oben im Text","image_align_bottom":"Unten","image_align_middle":"Mittig","image_align_top":"Oben","image_align_baseline":"Zeile","image_align":"Ausrichtung","image_hspace":"Horizontaler Abstand","image_vspace":"Vertikaler Abstand","image_dimensions":"Abmessungen","image_alt":"Alternativtext","image_list":"Bilderliste","image_border":"Rahmen","image_src":"Adresse","image_title":"Bild einf\u00fcgen/ver\u00e4ndern","charmap_title":"Sonderzeichen","colorpicker_name":"Name:","colorpicker_color":"Farbe:","colorpicker_named_title":"Benannte Farben","colorpicker_named_tab":"Benannte Farben","colorpicker_palette_title":"Farbpalette","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Farbwahl","colorpicker_picker_tab":"Farbwahl","colorpicker_title":"Farbe","code_wordwrap":"Automatischer Zeilenumbruch","code_title":"HTML-Quellcode bearbeiten","anchor_name":"Name des Ankers","anchor_title":"Anker einf\u00fcgen/ver\u00e4ndern","about_loaded":"Geladene Plugins","about_version":"Version","about_author":"Urheber","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"Lizenzbedingungen","about_help":"Hilfe","about_general":"\u00dcber","about_title":"\u00dcber TinyMCE","anchor_invalid":"Bitte geben Sie einen g\u00fcltigen Namen f\u00fcr den Anker ein!","accessibility_help":"Eingabehilfe","accessibility_usage_title":"Allgemeine Verwendung"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/el.js b/webcit/tiny_mce/themes/advanced/langs/el.js
new file mode 100644 (file)
index 0000000..3663ecc
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.advanced',{"underline_desc":"\u03a5\u03c0\u03bf\u03b3\u03c1\u03b1\u03bc\u03bc\u03b9\u03c3\u03bc\u03ad\u03bd\u03b1 (Ctrl+U)","italic_desc":"\u03a0\u03bb\u03ac\u03b3\u03b9\u03b1 (Ctrl+I)","bold_desc":"\u039c\u03b1\u03cd\u03c1\u03b1 (Ctrl+B)",dd:"\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u039f\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd",dt:"\u039f\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2",samp:"\u0394\u03b5\u03af\u03b3\u03bc\u03b1 \u039a\u03ce\u03b4\u03b9\u03ba\u03b1",code:"\u039a\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2",blockquote:"Blockquote",h6:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 6",h5:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 5",h4:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 4",h3:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 3",h2:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 2",h1:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 1",pre:"Pre",address:"\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7",div:"Div",paragraph:"\u03a0\u03b1\u03c1\u03ac\u03b3\u03c1\u03b1\u03c6\u03bf\u03c2",block:"\u039c\u03bf\u03c1\u03c6\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",fontdefault:"\u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac","font_size":"\u039c\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u0393\u03c1\u03b1\u03bc\u03bc\u03ac\u03c4\u03c9\u03bd","style_select":"\u03a3\u03c4\u03c5\u03bb","link_delta_width":"80","image_delta_width":"20","more_colors":"\u03a0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b1 \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1","toolbar_focus":"\u039c\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03b1 \u03ba\u03bf\u03c5\u03bc\u03c0\u03b9\u03ac \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03c9\u03bd - Alt+Q, \u039c\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf\u03bd \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03c4\u03ae \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 - Alt-Z, \u039c\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae \u03c4\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 - Alt-X",newdocument:"\u03a3\u03b9\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03ba\u03b1\u03b8\u03b1\u03c1\u03af\u03c3\u03b5\u03c4\u03b5 \u03cc\u03bb\u03bf \u03c4\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf ;",path:"\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae","clipboard_msg":"\u039f\u03b9 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b5\u03c2 \u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae/\u0391\u03c0\u03bf\u03ba\u03bf\u03c0\u03ae/\u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b5\u03c2 \u03c3\u03b5 Mozilla \u03ba\u03b1\u03b9 Firefox.\n\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 ;","blockquote_desc":"Blockquote","help_desc":"\u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1","newdocument_desc":"\u039d\u03ad\u03bf \u03ad\u03b3\u03b3\u03c1\u03b1\u03c6\u03bf","image_props_desc":"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2","paste_desc":"\u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7","copy_desc":"\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae","cut_desc":"\u0391\u03c0\u03bf\u03ba\u03bf\u03c0\u03ae","anchor_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 anchor","visualaid_desc":"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7/\u0391\u03c0\u03cc\u03ba\u03c1\u03c5\u03c8\u03b7 \u03b2\u03bf\u03b7\u03b8\u03b7\u03c4\u03b9\u03ba\u03ce\u03bd \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03ba\u03b1\u03b9 \u03b1\u03cc\u03c1\u03b1\u03c4\u03c9\u03bd \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03c9\u03bd","charmap_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b1","backcolor_desc":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5","forecolor_desc":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5","custom1_desc":"\u0397 \u03c0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03b1\u03c2 \u03b5\u03b4\u03ce","removeformat_desc":"\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03bc\u03bf\u03c1\u03c6\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2","hr_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2","sup_desc":"\u0395\u03ba\u03b8\u03ad\u03c4\u03b7\u03c2","sub_desc":"\u0394\u03b5\u03af\u03ba\u03c4\u03b7\u03c2","code_desc":"\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 HTML \u039a\u03ce\u03b4\u03b9\u03ba\u03b1","cleanup_desc":"\u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03bc\u03c0\u03b5\u03c1\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03c5 \u03ba\u03ce\u03b4\u03b9\u03ba\u03b1","image_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2","unlink_desc":"\u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5","link_desc":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5","redo_desc":"\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7 (Ctrl+Y)","undo_desc":"\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 (Ctrl+Z)","indent_desc":"\u0395\u03c3\u03bf\u03c7\u03ae","outdent_desc":"\u03a0\u03c1\u03bf\u03b5\u03be\u03bf\u03c7\u03ae","numlist_desc":"\u039b\u03af\u03c3\u03c4\u03b1 \u03bc\u03b5 \u03c3\u03b5\u03b9\u03c1\u03ac","bullist_desc":"\u039b\u03af\u03c3\u03c4\u03b1 \u03c7\u03c9\u03c1\u03af\u03c2 \u03c3\u03b5\u03b9\u03c1\u03ac","justifyfull_desc":"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7 \u03c0\u03bb\u03ae\u03c1\u03b7\u03c2","justifyright_desc":"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7 \u03b4\u03b5\u03be\u03b9\u03ac","justifycenter_desc":"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7 \u03ba\u03ad\u03bd\u03c4\u03c1\u03bf","justifyleft_desc":"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","striketrough_desc":"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03bc\u03bc\u03b9\u03c3\u03bc\u03ad\u03bd\u03b1",toolbar:"\u0393\u03c1\u03b1\u03bc\u03bc\u03ae \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03c9\u03bd","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","image_delta_height":"","help_shortcut":"Press ALT-F10 for toolbar. Press ALT-0 for help","rich_text_area":"Rich Text Area","shortcuts_desc":"Accessability Help"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/el_dlg.js b/webcit/tiny_mce/themes/advanced/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..5fcec47
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.advanced_dlg',{"link_list":"\u039b\u03af\u03c3\u03c4\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03c9\u03bd","link_is_external":"\u0397 \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c0\u03bf\u03c5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03be\u03c9\u03c4\u03b5\u03c1\u03b9\u03ba\u03cc\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2, \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b5\u03b8\u03b5\u03af \u03c4\u03bf \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03bf http:// ;","link_is_email":"\u0397 \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c0\u03bf\u03c5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 email, \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b5\u03b8\u03b5\u03af \u03c4\u03bf \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03bf mailto: ;","link_titlefield":"\u03a4\u03af\u03c4\u03bb\u03bf\u03c2","link_target_blank":"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03b5 \u03bd\u03ad\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf","link_target_same":"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03c4\u03bf \u03af\u03b4\u03b9\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf","link_target":"\u03a3\u03c4\u03cc\u03c7\u03bf\u03c2","link_url":"\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5","link_title":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5","image_align_right":"\u0394\u03b5\u03be\u03b9\u03ac","image_align_left":"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac","image_align_textbottom":"\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03ba\u03ac\u03c4\u03c9","image_align_texttop":"\u039a\u03ad\u03b9\u03bc\u03b5\u03bd\u03bf \u03c0\u03ac\u03bd\u03c9","image_align_bottom":"\u039a\u03ac\u03c4\u03c9","image_align_middle":"\u039c\u03ad\u03c3\u03b7","image_align_top":"\u0395\u03c0\u03ac\u03bd\u03c9","image_align_baseline":"\u0393\u03c1\u03b1\u03bc\u03bc\u03ae \u03c3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ac\u03c4\u03c9\u03bd","image_align":"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7","image_hspace":"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1","image_vspace":"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03ba\u03ac\u03b8\u03b5\u03c4\u03b7","image_dimensions":"\u0394\u03b9\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2","image_alt":"\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2","image_list":"\u039b\u03af\u03c3\u03c4\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03c9\u03bd","image_border":"\u03a0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf","image_src":"\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2","image_title":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2","charmap_title":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b1","colorpicker_name":"\u038c\u03bd\u03bf\u03bc\u03b1:","colorpicker_color":"\u03a7\u03c1\u03ce\u03bc\u03b1:","colorpicker_named_title":"\u039f\u03bd\u03bf\u03bc\u03b1\u03c3\u03c4\u03b9\u03ba\u03ac \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1","colorpicker_named_tab":"\u039f\u03bd\u03bf\u03bc\u03b1\u03c3\u03c4\u03b9\u03ba\u03ac","colorpicker_palette_title":"\u03a7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c0\u03b1\u03bb\u03ad\u03c4\u03b1\u03c2","colorpicker_palette_tab":"\u03a0\u03b1\u03bb\u03ad\u03c4\u03b1","colorpicker_picker_title":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2","colorpicker_picker_tab":"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae","colorpicker_title":"\u0394\u03b9\u03b1\u03bb\u03ad\u03be\u03c4\u03b5 \u03c7\u03c1\u03ce\u03bc\u03b1","code_wordwrap":"\u0391\u03bd\u03b1\u03b4\u03af\u03c0\u03bb\u03c9\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5","code_title":"\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03c4\u03ae\u03c2 \u03ba\u03ce\u03b4\u03b9\u03ba\u03b1 HTML","anchor_name":"\u038c\u03bd\u03bf\u03bc\u03b1 anchor","anchor_title":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 anchor","about_loaded":"\u03a6\u03bf\u03c1\u03c4\u03c9\u03bc\u03ad\u03bd\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c4\u03b1","about_version":"\u0388\u03ba\u03b4\u03bf\u03c3\u03b7","about_author":"\u03a3\u03c5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ad\u03b1\u03c2","about_plugin":"\u03a3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03bf \u03c0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c4\u03bf","about_plugins":"\u03a3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c4\u03b1","about_license":"\u0386\u03b4\u03b5\u03b9\u03b1","about_help":"\u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1","about_general":"\u03a3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac","about_title":"\u03a3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03bf TinyMCE","anchor_invalid":"\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 anchor.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/en.js b/webcit/tiny_mce/themes/advanced/langs/en.js
new file mode 100644 (file)
index 0000000..6e58481
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advanced',{"underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)",dd:"Definition Description",dt:"Definition Term ",samp:"Code Sample",code:"Code",blockquote:"Block Quote",h6:"Heading 6",h5:"Heading 5",h4:"Heading 4",h3:"Heading 3",h2:"Heading 2",h1:"Heading 1",pre:"Preformatted",address:"Address",div:"DIV",paragraph:"Paragraph",block:"Format",fontdefault:"Font Family","font_size":"Font Size","style_select":"Styles","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":"","more_colors":"More Colors...","toolbar_focus":"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",newdocument:"Are you sure you want clear all contents?",path:"Path","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","blockquote_desc":"Block Quote","help_desc":"Help","newdocument_desc":"New Document","image_props_desc":"Image Properties","paste_desc":"Paste (Ctrl+V)","copy_desc":"Copy (Ctrl+C)","cut_desc":"Cut (Ctrl+X)","anchor_desc":"Insert/Edit Anchor","visualaid_desc":"show/Hide Guidelines/Invisible Elements","charmap_desc":"Insert Special Character","backcolor_desc":"Select Background Color","forecolor_desc":"Select Text Color","custom1_desc":"Your Custom Description Here","removeformat_desc":"Remove Formatting","hr_desc":"Insert Horizontal Line","sup_desc":"Superscript","sub_desc":"Subscript","code_desc":"Edit HTML Source","cleanup_desc":"Cleanup Messy Code","image_desc":"Insert/Edit Image","unlink_desc":"Unlink","link_desc":"Insert/Edit Link","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","indent_desc":"Increase Indent","outdent_desc":"Decrease Indent","numlist_desc":"Insert/Remove Numbered List","bullist_desc":"Insert/Remove Bulleted List","justifyfull_desc":"Align Full","justifyright_desc":"Align Right","justifycenter_desc":"Align Center","justifyleft_desc":"Align Left","striketrough_desc":"Strikethrough","help_shortcut":"Press ALT-F10 for toolbar. Press ALT-0 for help","rich_text_area":"Rich Text Area","shortcuts_desc":"Accessability Help",toolbar:"Toolbar"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/en_dlg.js b/webcit/tiny_mce/themes/advanced/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..aae6a6b
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advanced_dlg',{"link_list":"Link List","link_is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","link_is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?","link_titlefield":"Title","link_target_blank":"Open Link in a New Window","link_target_same":"Open Link in the Same Window","link_target":"Target","link_url":"Link URL","link_title":"Insert/Edit Link","image_align_right":"Right","image_align_left":"Left","image_align_textbottom":"Text Bottom","image_align_texttop":"Text Top","image_align_bottom":"Bottom","image_align_middle":"Middle","image_align_top":"Top","image_align_baseline":"Baseline","image_align":"Alignment","image_hspace":"Horizontal Space","image_vspace":"Vertical Space","image_dimensions":"Dimensions","image_alt":"Image Description","image_list":"Image List","image_border":"Border","image_src":"Image URL","image_title":"Insert/Edit Image","charmap_title":"Select Special Character","colorpicker_name":"Name:","colorpicker_color":"Color:","colorpicker_named_title":"Named Colors","colorpicker_named_tab":"Named","colorpicker_palette_title":"Palette Colors","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Color Picker","colorpicker_picker_tab":"Picker","colorpicker_title":"Select a Color","code_wordwrap":"Word Wrap","code_title":"HTML Source Editor","anchor_name":"Anchor Name","anchor_title":"Insert/Edit Anchor","about_loaded":"Loaded Plugins","about_version":"Version","about_author":"Author","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"License","about_help":"Help","about_general":"About","about_title":"About TinyMCE","anchor_invalid":"Please specify a valid anchor name.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/es.js b/webcit/tiny_mce/themes/advanced/langs/es.js
new file mode 100644 (file)
index 0000000..ef9f264
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.advanced',{"underline_desc":"Subrayado (Ctrl+U)","italic_desc":"Cursiva (Ctrl+I)","bold_desc":"Negrita (Ctrl+B)",dd:"Descripci\u00f3n de definici\u00f3n",dt:"T\u00e9rmino de definici\u00f3n",samp:"Ejemplo de c\u00f3digo",code:"C\u00f3digo",blockquote:"Cita",h6:"Encabezado 6",h5:"Encabezado 5",h4:"Encabezado 4",h3:"Encabezado 3",h2:"Encabezado 2",h1:"Encabezado 1",pre:"Preformateado",address:"Direcci\u00f3n",div:"Div",paragraph:"P\u00e1rrafo",block:"Formato",fontdefault:"Fuente","font_size":"Tama\u00f1o","style_select":"Estilos","more_colors":"M\u00e1s colores","toolbar_focus":"Ir a los botones de herramientas - Alt+Q, Ir al editor - Alt-Z, Ir a la ruta del elemento - Alt-X",newdocument:" \u00bfSeguro que desea limpiar todo el contenido?",path:"Ruta","clipboard_msg":"Copiar/Cortar/Pegar no se encuentra disponible en Mozilla y Firefox.\n \u00bfQuiere m\u00e1s informaci\u00f3n sobre este tema?","blockquote_desc":"Cita","help_desc":"Ayuda","newdocument_desc":"Nuevo documento","image_props_desc":"Propiedades de imagen","paste_desc":"Pegar","copy_desc":"Copiar","cut_desc":"Cortar","anchor_desc":"Insertar/editar ancla","visualaid_desc":"Mostrar/ocultar l\u00ednea de gu\u00eda/elementos invisibles","charmap_desc":"Insertar caracteres personalizados","backcolor_desc":"Elegir color de fondo","forecolor_desc":"Elegir color del texto","custom1_desc":"Su descripci\u00f3n personal aqu\u00ed","removeformat_desc":"Limpiar formato","hr_desc":"Insertar regla horizontal","sup_desc":"Super\u00edndice","sub_desc":"Sub\u00edndice","code_desc":"Editar c\u00f3digo HTML","cleanup_desc":"Limpiar c\u00f3digo basura","image_desc":"Insertar/editar imagen","unlink_desc":"Quitar hiperv\u00ednculo","link_desc":"Insertar/editar hiperv\u00ednculo","redo_desc":"Rehacer (Ctrl+Y)","undo_desc":"Deshacer (Ctrl+Z)","indent_desc":"Aumentar sangr\u00eda","outdent_desc":"Reducir sangr\u00eda","numlist_desc":"Lista ordenada","bullist_desc":"Lista desordenada","justifyfull_desc":"Justificar","justifyright_desc":"Alinear a la derecha","justifycenter_desc":"Alinear al centro","justifyleft_desc":"Alinear a la izquierda","striketrough_desc":"Tachado","help_shortcut":"Presiones ALT-F10 para la barra de herramientas. Presione ALT-0 para ayuda.","rich_text_area":"\u00c1rea de texto con formato","shortcuts_desc":"Ayuda de accesibilidad",toolbar:"Barra de Herramientas","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/es_dlg.js b/webcit/tiny_mce/themes/advanced/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..c5ec002
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.advanced_dlg',{"link_list":"Lista de hiperv\u00ednculos","link_is_external":"La URL que introdujo parece ser un v\u00ednculo externo,  \u00bfdesea agregar el prefijo http:// necesario?","link_is_email":"La URL que introdujo parece ser una direcci\u00f3n de email,  \u00bfdesea agregar el prefijo mailto: necesario?","link_titlefield":"T\u00edtulo","link_target_blank":"Abrir v\u00ednculo en una ventana nueva","link_target_same":"Abrir v\u00ednculo en la misma ventana","link_target":"Destino","link_url":"URL del hiperv\u00ednculo","link_title":"Insertar/editar hiperv\u00ednculo","image_align_right":"Derecha","image_align_left":"Izquierda","image_align_textbottom":"Texto debajo","image_align_texttop":"Texto arriba","image_align_bottom":"Debajo","image_align_middle":"Medio","image_align_top":"Arriba","image_align_baseline":"L\u00ednea base","image_align":"Alineaci\u00f3n","image_hspace":"Espacio horizontal","image_vspace":"Espacio vertical","image_dimensions":"Dimensi\u00f3n","image_alt":"Descripci\u00f3n de la Imagen","image_list":"Lista de la Imagen","image_border":"Borde","image_src":"URL de la Imagen","image_title":"Insertar/editar imagen","charmap_title":"Elegir caracter personalizado","colorpicker_name":"Nombre:","colorpicker_color":"Color:","colorpicker_named_title":"Colores nombrados","colorpicker_named_tab":"Nombrados","colorpicker_palette_title":"Paleta de colores","colorpicker_palette_tab":"Paleta","colorpicker_picker_title":"Paleta de color","colorpicker_picker_tab":"Selector","colorpicker_title":"Elegir color","code_wordwrap":"Ajustar al margen","code_title":"Editor del c\u00f3digo fuente HTML","anchor_name":"Nombre del ancla","anchor_title":"Insertar/editar ancla","about_loaded":"Complementos cargados","about_version":"Versi\u00f3n","about_author":"Autor","about_plugin":"Complemento","about_plugins":"Complementos","about_license":"Licencia","about_help":"Ayuda","about_general":"Acerca de ","about_title":"Acerca de TinyMCE","anchor_invalid":"Especifique un nombre v\u00e1lido para liga","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/et.js b/webcit/tiny_mce/themes/advanced/langs/et.js
new file mode 100644 (file)
index 0000000..2ea027b
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.advanced',{"underline_desc":"Allajoonitud (Ctrl+U)","italic_desc":"Kursiiv (Ctrl+I)","bold_desc":"Rasvane (Ctrl+B)",dd:"Defineeringu kirjeldus",dt:"Defineeringu tingimus",samp:"Koodi n\u00e4ide",code:"Kood",blockquote:"Plokkviide",h6:"Heading 6",h5:"Heading 5",h4:"Heading 4",h3:"Heading 3",h2:"Heading 2",h1:"Heading 1",pre:"Eelformeeritud",address:"Aadress",div:"Div",paragraph:"Paragraaf",block:"Formaat",fontdefault:"Font","font_size":"Fondi suurus","style_select":"Stiilid","more_colors":"Rohkem v\u00e4rve","toolbar_focus":"H\u00fcppa t\u00f6\u00f6riista nuppudele - Alt+Q, H\u00fcppa redigeerijale - Alt-Z, H\u00fcppa elemendi teele - Alt-X",newdocument:"Oled sa kindel, et tahad kustutada k\u00f5ik sisud?",path:"Tee","clipboard_msg":"Kopeeri/L\u00f5ika/Kleebi ei ole Mozillas ja Firefoxis saadaval. Kas soovid rohkem infot selle probleemi kohta?","blockquote_desc":"Plokkviide","help_desc":"Abi","newdocument_desc":"Uus dokument","image_props_desc":"Pildi kirjeldus","paste_desc":"Kleebi","copy_desc":"Kopeeri","cut_desc":"L\u00f5ika","anchor_desc":"Sisesta/redigeeri ankur","visualaid_desc":"L\u00fclita \u00fcmber juhtjooned/n\u00e4htamatud elemendid","charmap_desc":"Sisesta kohandatud kirjam\u00e4rk","backcolor_desc":"Vali tausta v\u00e4rv","forecolor_desc":"Vali teksti v\u00e4rv","custom1_desc":"Teie kohandatud kirjeldus siia","removeformat_desc":"Eemalda vormindus","hr_desc":"Sisesta horisontaalne joonlaud","sup_desc":"\u00dclaindeks","sub_desc":"Alaindeks","code_desc":"Redigeeri HTML l\u00e4htekoodi","cleanup_desc":"Puhasta segane kood","image_desc":"Sisesta/redigeeri pilt","unlink_desc":"Eemalda link","link_desc":"Sisesta/redigeeri link","redo_desc":"Tee uuesti (Ctrl+Y)","undo_desc":"V\u00f5ta tagasi (Ctrl+Z)","indent_desc":"Taanda sisse","outdent_desc":"Taanda v\u00e4lja","numlist_desc":"Korrap\u00e4rane loetelu","bullist_desc":"Ebakorrap\u00e4rane loetelu","justifyfull_desc":"T\u00e4isjoondus","justifyright_desc":"Parem joondus","justifycenter_desc":"Keskjoondus","justifyleft_desc":"Vasak joondus","striketrough_desc":"L\u00e4bijoonitud","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":"","help_shortcut":"Press ALT-F10 for toolbar. Press ALT-0 for help","rich_text_area":"Rich Text Area","shortcuts_desc":"Accessability Help",toolbar:"Toolbar"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/et_dlg.js b/webcit/tiny_mce/themes/advanced/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..8c05e85
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.advanced_dlg',{"link_list":"Lingi loetelu","link_is_external":"URL, mille sisestasite, tundub olevat v\u00e4line link, kas soovite, et lisataks http:// eesliite?","link_is_email":"URL, mille te sisestasite, tundub olevat emaili aadress, kas soovite, et lisataks mailto: eesliite?","link_titlefield":"Tiitel","link_target_blank":"Ava link uues aknas","link_target_same":"Ava link samas aknas","link_target":"Sihtala","link_url":"Link URL","link_title":"Sisesta/redigeeri link","image_align_right":"Parem","image_align_left":"Vasak","image_align_textbottom":"Teksti p\u00f5hi","image_align_texttop":"Teksti tipp","image_align_bottom":"Alumine","image_align_middle":"Keskmine","image_align_top":"\u00dclemine","image_align_baseline":"Kirjajoondus","image_align":"Reastus","image_hspace":"Horisontaalne vahe","image_vspace":"Vertikaalne vahe","image_dimensions":"Dimensioonid","image_alt":"Pildi kirjeldus","image_list":"Pildi loend","image_border":"Raam","image_src":"Pildi URL","image_title":"Sisestal/redigeeri pilt","charmap_title":"Vali kohandatud t\u00e4hem\u00e4rk","colorpicker_name":"Nimi:","colorpicker_color":"V\u00e4rv:","colorpicker_named_title":"Nimetatud v\u00e4rvid","colorpicker_named_tab":"Nimetatud","colorpicker_palette_title":"Palett v\u00e4rvid","colorpicker_palette_tab":"Palett","colorpicker_picker_title":"V\u00e4rvi korjaja","colorpicker_picker_tab":"Korjaja","colorpicker_title":"Vali v\u00e4rv","code_wordwrap":"S\u00f5na pakkimine","code_title":"HTML koodi redaktor","anchor_name":"Ankru nimi","anchor_title":"Sisesta/redigeeri ankur","about_loaded":"Laetud lisad","about_version":"Versioon","about_author":"Autor","about_plugin":"Lisa","about_plugins":"Lisad","about_license":"Litsents","about_help":"Abi","about_general":"Teave","about_title":"Teave TinyMCE kohta","anchor_invalid":"Please specify a valid anchor name.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/fi.js b/webcit/tiny_mce/themes/advanced/langs/fi.js
new file mode 100644 (file)
index 0000000..2edb8f6
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.advanced',{"underline_desc":"Alleviivattu (Ctrl+U)","italic_desc":"Kursivoitu (Ctrl+I)","bold_desc":"Lihavoitu (Ctrl+B)",dd:"M\u00e4\u00e4rittelyn kuvaus",dt:"M\u00e4\u00e4rittelyn ehto ",samp:"Koodiesimerkki",code:"Koodi",blockquote:"Pitk\u00e4 lainaus",h6:"Otsikko 6",h5:"Otsikko 5",h4:"Otsikko 4",h3:"Otsikko 3",h2:"Otsikko 2",h1:"Otsikko 1",pre:"Esimuotoiltu (pre)",address:"Osoite",div:"Div",paragraph:"Kappale",block:"Muotoilu",fontdefault:"Kirjasin","font_size":"Kirjasinkoko","style_select":"Tyylit","more_colors":"Enemm\u00e4n v\u00e4rej\u00e4","toolbar_focus":"Siirry ty\u00f6kaluihin - Alt+Q, Siirry tekstieditoriin - Alt-Z, Siirry elementin polkuun - Alt-X",newdocument:"Haluatko varmasti tyhjent\u00e4\u00e4 kaiken sis\u00e4ll\u00f6n?",path:"Polku","clipboard_msg":"Kopioi/Leikkaa/Liit\u00e4 -painikkeet eiv\u00e4t toimi Mozilla ja Firefox -selaimilla. Voit kuitenkin k\u00e4ytt\u00e4\u00e4 n\u00e4pp\u00e4inyhdistelmi\u00e4 kopioimiseen (Ctrl+C), leikkaamiseen (Ctrl+X) ja liitt\u00e4miseen (Ctrl+V). Haluatko lis\u00e4\u00e4 tietoa?","blockquote_desc":"Pitk\u00e4 lainaus","help_desc":"Ohje","newdocument_desc":"Uusi tiedosto","image_props_desc":"Kuvan ominaisuudet","paste_desc":"Liit\u00e4","copy_desc":"Kopioi","cut_desc":"Leikkaa","anchor_desc":"Lis\u00e4\u00e4/Muokkaa ankkuri","visualaid_desc":"Suuntaviivat/N\u00e4kym\u00e4tt\u00f6m\u00e4t elementit","charmap_desc":"Lis\u00e4\u00e4 erikoismerkki","backcolor_desc":"Valitse taustan v\u00e4ri","forecolor_desc":"Valitse tekstin v\u00e4ri","custom1_desc":"Oma kuvauksesi t\u00e4h\u00e4n","removeformat_desc":"Poista muotoilu","hr_desc":"Lis\u00e4\u00e4 vaakasuora viivain","sup_desc":"Yl\u00e4indeksi","sub_desc":"Alaindeksi","code_desc":"Muokkaa HTML-koodia","cleanup_desc":"Siisti sekainen koodi","image_desc":"Lis\u00e4\u00e4/muuta kuva","unlink_desc":"Poista linkki","link_desc":"Lis\u00e4\u00e4/muuta linkki","redo_desc":"Tee uudelleen (Ctrl+Y)","undo_desc":"Peru (Ctrl+Z)","indent_desc":"Sisenn\u00e4","outdent_desc":"Loitonna","numlist_desc":"J\u00e4rjestetty lista","bullist_desc":"J\u00e4rjest\u00e4m\u00e4t\u00f6n lista","justifyfull_desc":"Tasattu","justifyright_desc":"Tasaus oikealle","justifycenter_desc":"Keskitetty","justifyleft_desc":"Tasaus vasemmalle","striketrough_desc":"Yliviivattu","help_shortcut":"Paina ALT F10 n\u00e4hd\u00e4ksesi ty\u00f6kalurivin. Paina ALT-0 n\u00e4hd\u00e4ksesi ohjeen.","rich_text_area":"Rikastettu tekstialue","shortcuts_desc":"Saavutettavuusohje",toolbar:"Ty\u00f6kalurivi","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/fi_dlg.js b/webcit/tiny_mce/themes/advanced/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..87b5c12
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.advanced_dlg',{"link_list":"Linkkilista","link_is_external":"Antamasi osoite n\u00e4ytt\u00e4\u00e4 johtavan ulkopuoliselle sivustolle. Haluatko lis\u00e4t\u00e4 linkin eteen http://-etuliitteen? (suositus)","link_is_email":"Antamasi osoite n\u00e4ytt\u00e4\u00e4 olevan s\u00e4hk\u00f6postiosoite. Haluatko lis\u00e4t\u00e4 siihen mailto:-etuliitteen?","link_titlefield":"Otsikko","link_target_blank":"Avaa linkki uuteen ikkunaan","link_target_same":"Avaa linkki samassa ikkunassa","link_target":"Kohde","link_url":"Linkin osoite","link_title":"Lis\u00e4\u00e4/muuta linkki","image_align_right":"Oikealle","image_align_left":"Vasemmalle","image_align_textbottom":"Tekstin alaosaan","image_align_texttop":"Tekstin yl\u00e4osaan","image_align_bottom":"Alas","image_align_middle":"Keskelle","image_align_top":"Yl\u00f6s","image_align_baseline":"Tekstin tasossa","image_align":"Tasaus","image_hspace":"Vaakasuuntainen tila","image_vspace":"Pystysuuntainen tila","image_dimensions":"Mitat","image_alt":"Kuvan kuvaus","image_list":"Kuvalista","image_border":"Reunus","image_src":"Kuvan osoite","image_title":"Lis\u00e4\u00e4/muokkaa kuvaa","charmap_title":"Valitse erikoismerkki","colorpicker_name":"Nimi:","colorpicker_color":"V\u00e4ri:","colorpicker_named_title":"Nimetyt v\u00e4rit","colorpicker_named_tab":"Nimetty","colorpicker_palette_title":"V\u00e4ripaletti","colorpicker_palette_tab":"Paletti","colorpicker_picker_title":"V\u00e4rin valitsin","colorpicker_picker_tab":"Valitsin","colorpicker_title":"Valitse v\u00e4ri","code_wordwrap":"Automaattinen rivinvaihto","code_title":"HTML-koodin muokkaus","anchor_name":"Ankkurin nimi","anchor_title":"Liit\u00e4/muokkaa ankkuria","about_loaded":"Ladatut lis\u00e4osat","about_version":"Versio","about_author":"Kirjoittaja","about_plugin":"Lis\u00e4osa","about_plugins":"Lis\u00e4osat","about_license":"Lisenssi","about_help":"Ohje","about_general":"Tietoja","about_title":"Tietoja TinyMCE:st\u00e4","anchor_invalid":"Ole hyv\u00e4 ja anna hyv\u00e4ksytty ankkurin nimi.","accessibility_help":"Saavutettavuusohje","accessibility_usage_title":"Yleinen k\u00e4ytt\u00f6"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/fr.js b/webcit/tiny_mce/themes/advanced/langs/fr.js
new file mode 100644 (file)
index 0000000..1e91abb
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.advanced',{"underline_desc":"Soulign\u00e9 (Ctrl+U)","italic_desc":"Italique (Ctrl+I)","bold_desc":"Gras (Ctrl+B)",dd:"D\u00e9finition du terme",dt:"Terme \u00e0 d\u00e9finir",samp:"Exemple de code",code:"Code",blockquote:"Bloc de citation",h6:"Titre 6",h5:"Titre 5",h4:"Titre 4",h3:"Titre 3",h2:"Titre 2",h1:"Titre 1",pre:"Pr\u00e9format\u00e9",address:"Adresse",div:"Div",paragraph:"Paragraphe",block:"Format",fontdefault:"Police","font_size":"Taille police","style_select":"Styles","more_colors":"Plus de couleurs","toolbar_focus":"Atteindre les boutons de l\'\u00e9diteur - Alt+Q, Aller \u00e0 l\'\u00e9diteur - Alt-Z, Aller au chemin de l\'\u00e9l\u00e9ment - Alt-X",newdocument:"\u00cates-vous s\u00fbr de vouloir effacer l\'int\u00e9gralit\u00e9 du document ?",path:"Chemin","clipboard_msg":"Les fonctions Copier/Couper/Coller ne sont pas valables sur Mozilla et Firefox.\nSouhaitez-vous avoir plus d\'informations sur ce sujet ?","blockquote_desc":"Citation","help_desc":"Aide","newdocument_desc":"Nouveau document","image_props_desc":"Propri\u00e9t\u00e9s de l\'image","paste_desc":"Coller","copy_desc":"Copier","cut_desc":"Couper","anchor_desc":"Ins\u00e9rer / \u00e9diter une ancre","visualaid_desc":"Activer / d\u00e9sactiver les guides et les \u00e9l\u00e9ments invisibles","charmap_desc":"Ins\u00e9rer des caract\u00e8res sp\u00e9ciaux","backcolor_desc":"Choisir la couleur de surlignage","forecolor_desc":"Choisir la couleur du texte","custom1_desc":"Votre description personnalis\u00e9e ici","removeformat_desc":"Supprimer le formatage","hr_desc":"Ins\u00e9rer un trait horizontal","sup_desc":"Exposant","sub_desc":"Indice","code_desc":"\u00c9diter le code source HTML","cleanup_desc":"Nettoyer le code","image_desc":"Ins\u00e9rer / \u00e9diter l\'image","unlink_desc":"Supprimer le lien","link_desc":"Ins\u00e9rer / \u00e9diter le lien","redo_desc":"R\u00e9tablir (Ctrl+Y)","undo_desc":"Annuler (Ctrl+Z)","indent_desc":"Indenter","outdent_desc":"Retirer l\'indentation","numlist_desc":"Liste num\u00e9rot\u00e9e","bullist_desc":"Liste \u00e0 puces","justifyfull_desc":"Justifi\u00e9","justifyright_desc":"Align\u00e9 \u00e0 droite","justifycenter_desc":"Centr\u00e9","justifyleft_desc":"Align\u00e9 \u00e0 gauche","striketrough_desc":"Barr\u00e9","help_shortcut":"Faites ALT-F10 pour acc\u00e9der \u00e0 la barre d\'outils. Faites ALT-0 pour acc\u00e9der \u00e0 l\'aide","rich_text_area":"Zone de texte enrichi","shortcuts_desc":"Aides \u00e0 l\'accessibilit\u00e9",toolbar:"Barre d\'outils","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/fr_dlg.js b/webcit/tiny_mce/themes/advanced/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..2976296
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.advanced_dlg',{"link_list":"Liste de liens","link_is_external":"L\'URL que vous avez saisie semble \u00eatre une adresse web externe. Souhaitez-vous ajouter le pr\u00e9fixe \u00ab http:// \u00bb ?","link_is_email":"L\'URL que vous avez saisie semble \u00eatre une adresse e-mail, souhaitez-vous ajouter le pr\u00e9fixe \u00ab mailto: \u00bb ?","link_titlefield":"Titre","link_target_blank":"Ouvrir dans une nouvelle fen\u00eatre","link_target_same":"Ouvrir dans la m\u00eame fen\u00eatre","link_target":"Cible","link_url":"URL du lien","link_title":"Ins\u00e9rer / \u00e9diter un lien","image_align_right":"Droite (flottant)","image_align_left":"Gauche (flottant)","image_align_textbottom":"Texte en bas","image_align_texttop":"Texte en haut","image_align_bottom":"En bas","image_align_middle":"Au milieu","image_align_top":"En haut","image_align_baseline":"Normal","image_align":"Alignement","image_hspace":"Espacement horizontal","image_vspace":"Espacement vertical","image_dimensions":"Dimensions","image_alt":"Description de l\'image","image_list":"Liste d\'images","image_border":"Bordure","image_src":"URL de l\'image","image_title":"Ins\u00e9rer / \u00e9diter une image","charmap_title":"Choisir le caract\u00e8re \u00e0 ins\u00e9rer","colorpicker_name":"Nom :","colorpicker_color":"Couleur :","colorpicker_named_title":"Couleurs nomm\u00e9es","colorpicker_named_tab":"Noms","colorpicker_palette_title":"Couleurs de la palette","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Nuancier","colorpicker_picker_tab":"Nuancier","colorpicker_title":"Choisir une couleur","code_wordwrap":"Retour \u00e0 la ligne","code_title":"\u00c9diteur de source HTML","anchor_name":"Nom de l\'ancre","anchor_title":"Ins\u00e9rer / \u00e9diter une ancre","about_loaded":"Plugins charg\u00e9s","about_version":"Version","about_author":"Auteur","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"Licence","about_help":"Aide","about_general":"\u00c0 propos","about_title":"\u00c0 propos de TinyMCE","anchor_invalid":"Veuillez sp\u00e9cifier un nom d\'ancre valide.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/hu.js b/webcit/tiny_mce/themes/advanced/langs/hu.js
new file mode 100644 (file)
index 0000000..609e0d6
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.advanced',{"underline_desc":"Al\u00e1h\u00fazott (Ctrl+U)","italic_desc":"D\u0151lt (Ctrl+I)","bold_desc":"F\u00e9lk\u00f6v\u00e9r (Ctrl+B)",dd:"Defin\u00edci\u00f3 a defin\u00edci\u00f3s list\u00e1ban",dt:"Defini\u00e1lt kifejez\u00e9s a defin\u00edci\u00f3s list\u00e1ban",samp:"K\u00f3d minta",code:"K\u00f3d",blockquote:"Id\u00e9zet",h6:"C\u00edmsor 6",h5:"C\u00edmsor 5",h4:"C\u00edmsor 4",h3:"C\u00edmsor 3",h2:"C\u00edmsor 2",h1:"C\u00edmsor 1",pre:"El\u0151form\u00e1zott",address:"C\u00edm",div:"Div",paragraph:"Bekezd\u00e9s",block:"Form\u00e1tum",fontdefault:"Bet\u0171t\u00edpus","font_size":"Bet\u0171m\u00e9ret","style_select":"St\u00edlusok","image_delta_height":"","image_delta_width":"","more_colors":"Tov\u00e1bbi sz\u00ednek","toolbar_focus":"Eszk\u00f6zgombokra ugr\u00e1s - Alt+Q, Szerkeszt\u0151h\u00f6z ugr\u00e1s - Alt-Z, Elem\u00fatvonalhoz ugr\u00e1s - Alt-X",newdocument:"Biztosan t\u00f6rli az eddigi tartalmat?",path:"\u00datvonal","clipboard_msg":"A M\u00e1sol\u00e1s/Kiv\u00e1g\u00e1s/Besz\u00far\u00e1s funkci\u00f3k nem \u00e9rhet\u0151ek el Mozilla \u00e9s Firefox alatt. Szeretne t\u00f6bbet megtudni err\u0151l?","blockquote_desc":"Id\u00e9zet","help_desc":"Seg\u00edts\u00e9g","newdocument_desc":"\u00daj dokumentum","image_props_desc":"K\u00e9p tulajdons\u00e1gai","paste_desc":"Besz\u00far\u00e1s","copy_desc":"M\u00e1sol\u00e1s","cut_desc":"Kiv\u00e1g\u00e1s","anchor_desc":"Horgony besz\u00far\u00e1sa/szerkeszt\u00e9se","visualaid_desc":"Vezet\u0151vonalak/nem l\u00e1that\u00f3 elemek ki-/bekapcsol\u00e1sa","charmap_desc":"Speci\u00e1lis karakter besz\u00far\u00e1sa","backcolor_desc":"H\u00e1tt\u00e9rsz\u00edn v\u00e1laszt\u00e1sa","forecolor_desc":"Sz\u00f6vegsz\u00edn v\u00e1laszt\u00e1sa","custom1_desc":"Az \u00f6n egyedi le\u00edr\u00e1sa","removeformat_desc":"Form\u00e1z\u00e1s elt\u00e1vol\u00edt\u00e1sa","hr_desc":"V\u00edzszintes elv\u00e1laszt\u00f3 vonal besz\u00far\u00e1sa","sup_desc":"Fels\u0151 index","sub_desc":"Als\u00f3 index","code_desc":"HTML forr\u00e1s szerkeszt\u00e9se","cleanup_desc":"Minden form\u00e1z\u00e1s elt\u00e1vol\u00edt\u00e1sa","image_desc":"K\u00e9p besz\u00far\u00e1sa/szerkeszt\u00e9se","unlink_desc":"Link elt\u00e1vol\u00edt\u00e1sa","link_desc":"Link besz\u00far\u00e1sa/szerkeszt\u00e9se","redo_desc":"M\u00e9gis v\u00e9grehajt (Ctrl+Y)","undo_desc":"Visszavon\u00e1s (Ctrl+Z)","indent_desc":"Beh\u00faz\u00e1s n\u00f6vel\u00e9se","outdent_desc":"Beh\u00faz\u00e1s cs\u00f6kkent\u00e9se","numlist_desc":"Rendezett lista","bullist_desc":"Rendezetlen lista","justifyfull_desc":"Sorkiz\u00e1rt","justifyright_desc":"Jobbra z\u00e1rt","justifycenter_desc":"K\u00f6z\u00e9pre z\u00e1rt","justifyleft_desc":"Balra z\u00e1rt","striketrough_desc":"\u00c1th\u00fazott","help_shortcut":"Ugr\u00e1s az eszk\u00f6zt\u00e1rhoz: ALT-F10. Seg\u00edts\u00e9g: ALT-0.",toolbar:"Eszk\u00f6zt\u00e1r","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","rich_text_area":"Rich Text Area","shortcuts_desc":"Accessability Help"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/hu_dlg.js b/webcit/tiny_mce/themes/advanced/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..3856d60
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.advanced_dlg',{"link_list":"Link lista","link_is_external":"A be\u00edrt internet c\u00edm k\u00fcls\u0151 hivatkoz\u00e1snak t\u0171nik, k\u00edv\u00e1nja a sz\u00fcks\u00e9ges http://-vel kieg\u00e9sz\u00edteni?","link_is_email":"A be\u00edrt internet c\u00edm e-mail c\u00edmnek t\u0171nik, k\u00edv\u00e1nja a sz\u00fcks\u00e9ges mailto:-val kieg\u00e9sz\u00edteni?","link_titlefield":"C\u00edm","link_target_blank":"\u00faj ablakba","link_target_same":"azonos ablakba","link_target":"Megnyit\u00e1s","link_url":"Internet c\u00edm","link_title":"Link besz\u00far\u00e1sa/szerkeszt\u00e9se","image_align_right":"Jobbra","image_align_left":"Balra","image_align_textbottom":"Sz\u00f6veg alj\u00e1hoz","image_align_texttop":"Sz\u00f6veg tetej\u00e9hez","image_align_bottom":"Lentre","image_align_middle":"K\u00f6z\u00e9pre","image_align_top":"Fentre","image_align_baseline":"Alapvonalhoz","image_align":"Igaz\u00edt\u00e1s","image_hspace":"V\u00edzszintes t\u00e1v","image_vspace":"F\u00fcgg\u0151leges t\u00e1v","image_dimensions":"M\u00e9retek","image_alt":"K\u00e9p le\u00edr\u00e1s","image_list":"K\u00e9p lista","image_border":"Keret","image_src":"K\u00e9p URL","image_title":"K\u00e9p besz\u00far\u00e1sa/szerkeszt\u00e9se","charmap_title":"Egyedi karakter v\u00e1laszt\u00e1sa","colorpicker_name":"N\u00e9v:","colorpicker_color":"Sz\u00edn:","colorpicker_named_title":"Elnevezett sz\u00ednek","colorpicker_named_tab":"Elnevezettek","colorpicker_palette_title":"Paletta sz\u00ednek","colorpicker_palette_tab":"Paletta","colorpicker_picker_title":"Sz\u00ednv\u00e1laszt\u00f3","colorpicker_picker_tab":"V\u00e1laszt\u00f3","colorpicker_title":"Sz\u00ednv\u00e1laszt\u00e1s","code_wordwrap":"Sz\u00f6veg t\u00f6rdel\u00e9se","code_title":"HTML forr\u00e1s szerkeszt\u00e9se","anchor_name":"Horgonyn\u00e9v","anchor_title":"Horgony besz\u00far\u00e1sa/szerkeszt\u00e9se","about_loaded":"Bet\u00f6lt\u00f6tt pluginok","about_version":"Verzi\u00f3","about_author":"Szerz\u0151","about_plugin":"Plugin","about_plugins":"Pluginok","about_license":"Licenc","about_help":"Seg\u00edts\u00e9g","about_general":"R\u00f3lunk","about_title":"A TinyMCE-r\u0151l","anchor_invalid":"Adjon meg egy helyes horgony nevet.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/it.js b/webcit/tiny_mce/themes/advanced/langs/it.js
new file mode 100644 (file)
index 0000000..af84c79
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.advanced',{"underline_desc":"Sottolineato (Ctrl+U)","italic_desc":"Corsivo (Ctrl+I)","bold_desc":"Grassetto (Ctrl+B)",dd:"Descrizione definizione",dt:"Termine definizione",samp:"Esempio codice",code:"Codice",blockquote:"Testo quotato",h6:"Intestazione 6",h5:"Intestazione 5",h4:"Intestazione 4",h3:"Intestazione 3",h2:"Intestazione 2",h1:"Intestazione 1",pre:"Preformattato",address:"Indirizzo",div:"Div",paragraph:"Paragrafo",block:"Formato",fontdefault:"Famiglia carattere","font_size":"Grandezza carattere","style_select":"Stili","anchor_delta_height":"anchor_delta_height","anchor_delta_width":"anchor_delta_width","charmap_delta_height":"charmap_delta_height","charmap_delta_width":"charmap_delta_width","colorpicker_delta_height":"colorpicker_delta_height","colorpicker_delta_width":"colorpicker_delta_width","link_delta_height":"link_delta_height","link_delta_width":"link_delta_width","image_delta_height":"image_delta_height","image_delta_width":"image_delta_width","more_colors":"Colori aggiuntivi","toolbar_focus":"Vai ai pulsanti strumento - Alt+Q, Vai all\'editor - Alt-Z, Vai al percorso dell\'elemento - Alt-X",newdocument:"Sei sicuro di voler cancellare tutti i contenuti?",path:"Percorso","clipboard_msg":"Copia/Taglia/Incolla non \u00e8 disponibile in Mozilla e Firefox..\nSi desidera avere maggiori informazioni su questo problema?","blockquote_desc":"Testo quotato","help_desc":"Aiuto","newdocument_desc":"Nuovo documento","image_props_desc":"Propriet\u00e0 immagine","paste_desc":"Incolla","copy_desc":"Copia","cut_desc":"Taglia","anchor_desc":"Inserisci/modifica ancora","visualaid_desc":"Mostra/nascondi linee guida/elementi invisibili","charmap_desc":"Inserisci carattere speciale","backcolor_desc":"Seleziona colore sfondo","forecolor_desc":"Seleziona colore testo","custom1_desc":"La tua descrizione personalizzata qui","removeformat_desc":"Rimuovi formattazione","hr_desc":"Inserisci riga orizzontale","sup_desc":"Apice","sub_desc":"Pedice","code_desc":"Modifica sorgente HTML","cleanup_desc":"Pulisci codice disordinato","image_desc":"Inserisci/modifica immagine","unlink_desc":"Togli collegamento","link_desc":"Inserisci/modifica collegamento","redo_desc":"Ripristina (Ctrl+Y)","undo_desc":"Annulla (Ctrl+Z)","indent_desc":"Sposta verso interno","outdent_desc":"Sposta verso esterno","numlist_desc":"Lista ordinata","bullist_desc":"Lista non ordinata","justifyfull_desc":"Giustifica","justifyright_desc":"Allinea a destra","justifycenter_desc":"Centra","justifyleft_desc":"Allinea a sinistra","striketrough_desc":"Barrato","help_shortcut":"Premi ALT-F10 Per la barra degli strumenti. Premi ALT-0 per l\'aiuto","rich_text_area":"Rich Text Area","shortcuts_desc":"Aiuto accessibilit\u00e0",toolbar:"Barra degli strumenti"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/it_dlg.js b/webcit/tiny_mce/themes/advanced/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..10918c2
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.advanced_dlg',{"link_list":"Lista link","link_is_external":"L\'URL inserito sembra essere un link esterno. Aggiungere il necessario prefisso http:// ?","link_is_email":"L\'URL inserito sembra essere un indirizzo email. Aggiungere il necessario prefisso mailto: ?","link_titlefield":"Titolo","link_target_blank":"Apri link in una nuova finestra","link_target_same":"Apri link nella stessa finestra","link_target":"Target","link_url":"URL link","link_title":"Inserisci/modifica collegamento","image_align_right":"A destra","image_align_left":"A sinistra","image_align_textbottom":"In basso al testo","image_align_texttop":"In alto al testo","image_align_bottom":"In basso","image_align_middle":"In mezzo","image_align_top":"In alto","image_align_baseline":"Alla base","image_align":"Allineamentot","image_hspace":"Spaziatura orizz.","image_vspace":"Spaziatura vert.","image_dimensions":"Dimensioni","image_alt":"Descrizione","image_list":"Lista immagini","image_border":"Bordo","image_src":"URL immagine","image_title":"Inserisci/modifica immagine","charmap_title":"Seleziona carattere speciale","colorpicker_name":"Nome:","colorpicker_color":"Colore:","colorpicker_named_title":"Colori per nome","colorpicker_named_tab":"Per nome","colorpicker_palette_title":"Tavolozza dei colori","colorpicker_palette_tab":"Tavolozza","colorpicker_picker_title":"Selettore colori","colorpicker_picker_tab":"Selettore","colorpicker_title":"Seleziona un colore","code_wordwrap":"A capo automatico","code_title":"Editor sorgente HTML","anchor_name":"Nome ancora","anchor_title":"Inserisci/modifica ancora","about_loaded":"Plugin caricati","about_version":"Versione","about_author":"Autore","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"Licenza","about_help":"Aiuto","about_general":"Informazioni","about_title":"Informazioni su TinyMCE","anchor_invalid":"Specificare un nome di ancora valido.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/zh-cn.js b/webcit/tiny_mce/themes/advanced/langs/zh-cn.js
new file mode 100644 (file)
index 0000000..cef3df2
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.advanced',{"underline_desc":"\u4e0b\u5212\u7ebf(Ctrl U)","italic_desc":"\u659c\u4f53(Ctrl I)","bold_desc":"\u7c97\u4f53(Ctrl B)",dd:"\u5b9a\u4e49\u8bf4\u660e",dt:"\u672f\u8bed\u5b9a\u4e49",samp:"\u4ee3\u7801\u793a\u4f8b",code:"\u4ee3\u7801",blockquote:"\u5f15\u7528",h6:"\u6807\u98986",h5:"\u6807\u98985",h4:"\u6807\u98984",h3:"\u6807\u98983",h2:"\u6807\u98982",h1:"\u6807\u98981",pre:"\u9884\u683c\u5f0f\u6587\u672c",address:"\u5730\u5740",div:"Div\u533a\u5757",paragraph:"\u6bb5\u843d",block:"\u683c\u5f0f\u5316",fontdefault:"\u5b57\u4f53","font_size":"\u5b57\u4f53\u5927\u5c0f","style_select":"\u6837\u5f0f","more_colors":"\u66f4\u591a\u989c\u8272","toolbar_focus":"\u8f6c\u5230\u5de5\u5177\u6309\u94ae - Alt-Q\uff0c\u8f6c\u5230\u7f16\u8f91\u5668 - Alt-Z\uff0c\u8f6c\u5230\u5143\u7d20\u8def\u5f84 - Alt-X\u3002",newdocument:"\u60a8\u771f\u7684\u8981\u6e05\u9664\u6240\u6709\u5185\u5bb9\u5417\uff1f",path:"\u8def\u5f84","clipboard_msg":"\u5728Mozilla\u548cFirefox\u4e2d\u4e0d\u80fd\u4f7f\u7528\u590d\u5236/\u7c98\u8d34/\u526a\u5207\u3002n\u60a8\u8981\u67e5\u770b\u8be5\u95ee\u9898\u66f4\u591a\u7684\u4fe1\u606f\u5417\uff1f","blockquote_desc":"\u5f15\u7528","help_desc":"\u5e2e\u52a9","newdocument_desc":"\u65b0\u5efa","image_props_desc":"\u56fe\u7247\u5c5e\u6027","paste_desc":"\u7c98\u8d34","copy_desc":"\u590d\u5236","cut_desc":"\u526a\u5207","anchor_desc":"\u63d2\u5165/\u7f16\u8f91 \u951a","visualaid_desc":"\u663e\u793a/\u9690\u85cf \u5143\u7d20","charmap_desc":"\u63d2\u5165\u81ea\u5b9a\u4e49\u7b26\u53f7","backcolor_desc":"\u9009\u62e9\u80cc\u666f\u989c\u8272","forecolor_desc":"\u9009\u62e9\u6587\u672c\u989c\u8272","custom1_desc":"\u8fd9\u91cc\u662f\u60a8\u81ea\u5b9a\u4e49\u7684\u63cf\u8ff0","removeformat_desc":"\u6e05\u9664\u683c\u5f0f","hr_desc":"\u63d2\u5165\u6c34\u5e73\u7ebf","sup_desc":"\u4e0a\u6807","sub_desc":"\u4e0b\u6807","code_desc":"\u7f16\u8f91HTML\u6e90\u4ee3\u7801","cleanup_desc":"\u6e05\u9664\u65e0\u7528\u4ee3\u7801","image_desc":"\u63d2\u5165/\u7f16\u8f91 \u56fe\u7247","unlink_desc":"\u53d6\u6d88\u8d85\u94fe\u63a5","link_desc":"\u63d2\u5165/\u7f16\u8f91 \u8d85\u94fe\u63a5","redo_desc":"\u6062\u590d (Ctrl Y)","undo_desc":"\u64a4\u9500 (Ctrl Z)","indent_desc":"\u589e\u52a0\u7f29\u8fdb","outdent_desc":"\u51cf\u5c11\u7f29\u8fdb","numlist_desc":"\u7f16\u53f7\u5217\u8868","bullist_desc":"\u9879\u76ee\u5217\u8868","justifyfull_desc":"\u4e24\u7aef\u5bf9\u9f50","justifyright_desc":"\u53f3\u5bf9\u9f50","justifycenter_desc":"\u5c45\u4e2d","justifyleft_desc":"\u5de6\u5bf9\u9f50","striketrough_desc":"\u5220\u9664\u7ebf","help_shortcut":"\u6309 ALT-F10 \u5b9a\u4f4d\u5230\u5de5\u5177\u680f.\u6309 ALT-0 \u83b7\u53d6\u5e2e\u52a9\u3002","rich_text_area":"\u5bcc\u6587\u672c\u533a","shortcuts_desc":"\u8f85\u52a9\u8bf4\u660e",toolbar:"\u5de5\u5177\u680f","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/langs/zh-cn_dlg.js b/webcit/tiny_mce/themes/advanced/langs/zh-cn_dlg.js
new file mode 100644 (file)
index 0000000..5d03875
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.advanced_dlg',{"link_list":"\u94fe\u63a5\u5217\u8868","link_is_external":"\u60a8\u8f93\u5165\u7684URL\u662f\u4e00\u4e2a\u5916\u90e8\u94fe\u63a5\uff0c\u662f\u5426\u8981\u52a0\u4e0a\"http://\"\u524d\u7f00\uff1f","link_is_email":"\u8f93\u5165URL\u662f\u7535\u5b50\u90ae\u4ef6\u5730\u5740\uff0c\u662f\u5426\u9700\u8981\u52a0\"mailto:\"\u524d\u7f00\uff1f","link_titlefield":"\u6807\u9898","link_target_blank":"\u5728\u65b0\u7a97\u53e3\u6253\u5f00","link_target_same":"\u5728\u5f53\u524d\u7a97\u53e3\u6253\u5f00","link_target":"\u6253\u5f00\u65b9\u5f0f","link_url":"\u8d85\u94fe\u63a5URL","link_title":"\u63d2\u5165/\u7f16\u8f91 \u8d85\u94fe\u63a5","image_align_right":"\u53f3\u5bf9\u9f50","image_align_left":"\u5de6\u5bf9\u9f50","image_align_textbottom":"\u6587\u5b57\u4e0b\u65b9","image_align_texttop":"\u6587\u5b57\u4e0a\u65b9","image_align_bottom":"\u5e95\u7aef\u5bf9\u9f50","image_align_middle":"\u5c45\u4e2d\u5bf9\u9f50","image_align_top":"\u9876\u7aef\u5bf9\u9f50","image_align_baseline":"\u5e95\u7ebf","image_align":"\u5bf9\u9f50","image_hspace":"\u6c34\u5e73\u8ddd\u79bb","image_vspace":"\u5782\u76f4\u8ddd\u79bb","image_dimensions":"\u5c3a\u5bf8","image_alt":"\u56fe\u7247\u63cf\u8ff0","image_list":"\u56fe\u7247\u5217\u8868","image_border":"\u8fb9\u6846","image_src":"\u56fe\u7247\u94fe\u63a5","image_title":"\u63d2\u5165/\u7f16\u8f91 \u56fe\u7247","charmap_title":"\u9009\u62e9\u81ea\u5b9a\u4e49\u7b26\u53f7","colorpicker_name":"\u540d\u79f0\uff1a","colorpicker_color":"\u989c\u8272\uff1a","colorpicker_named_title":"\u547d\u540d\u989c\u8272","colorpicker_named_tab":"\u547d\u540d\u989c\u8272","colorpicker_palette_title":"\u8c03\u8272\u677f\u989c\u8272","colorpicker_palette_tab":"\u8c03\u8272\u677f","colorpicker_picker_title":"\u989c\u8272\u62fe\u53d6","colorpicker_picker_tab":"\u62fe\u53d6","colorpicker_title":"\u9009\u62e9\u989c\u8272","code_wordwrap":"\u81ea\u52a8\u6362\u884c","code_title":"HTML\u4ee3\u7801\u7f16\u8f91\u5668","anchor_name":"\u951a\u540d\u79f0","anchor_title":"\u63d2\u5165/\u7f16\u8f91 \u951a","about_loaded":"\u5df2\u8f7d\u5165\u7684\u63d2\u4ef6","about_version":"\u7248\u672c","about_author":"\u4f5c\u8005","about_plugin":"\u63d2\u4ef6","about_plugins":"\u63d2\u4ef6","about_license":"\u8bb8\u53ef\u534f\u8bae","about_help":"\u5e2e\u52a9","about_general":"\u5173\u4e8e","about_title":"\u5173\u4e8eTinyMCE","anchor_invalid":"\u8bf7\u6307\u5b9a\u4e00\u4e2a\u6709\u6548\u7684\u951a\u540d\u79f0\u3002","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/link.htm b/webcit/tiny_mce/themes/advanced/link.htm
new file mode 100644 (file)
index 0000000..5d9dea9
--- /dev/null
@@ -0,0 +1,57 @@
+<!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.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
+</head>\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;">{#advanced_dlg.link_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 class="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" 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
+                               <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 class="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
+               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/shortcuts.htm b/webcit/tiny_mce/themes/advanced/shortcuts.htm
new file mode 100644 (file)
index 0000000..20ec2f5
--- /dev/null
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+       <head>\r
+               <title>{#advanced_dlg.accessibility_help}</title>\r
+               <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+               <script type="text/javascript">tinyMCEPopup.requireLangPack();</script>\r
+       </head>\r
+       <body id="content">\r
+               <h1>{#advanced_dlg.accessibility_usage_title}</h1>\r
+               <h2>Toolbars</h2>\r
+               <p>Press ALT-F10 to move focus to the toolbars. Navigate through the buttons using the arrow keys.\r
+               Press enter to activate a button and return focus to the editor.\r
+               Press escape to return focus to the editor without performing any actions.</p>\r
+               \r
+               <h2>Status Bar</h2>\r
+               <p>To access the editor status bar, press ALT-F11. Use the left and right arrow keys to navigate between elements in the path.\r
+               Press enter or space to select an element. Press escape to return focus to the editor without changing the selection.</p>\r
+               \r
+               <h2>Context Menu</h2>\r
+               <p>Press shift-F10 to activate the context menu. Use the up and down arrow keys to move between menu items. To open sub-menus press the right arrow key.\r
+               To close submenus press the left arrow key.  Press escape to close the context menu.</p>\r
+               \r
+               <h1>Keyboard Shortcuts</h1>\r
+               <table>\r
+                       <thead>\r
+                               <tr>\r
+                                       <th>Keystroke</th>\r
+                                       <th>Function</th>\r
+                               </tr>\r
+                       </thead>\r
+                       <tbody>\r
+                               <tr>\r
+                                       <td>Control-B</td><td>Bold</td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td>Control-I</td><td>Italic</td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td>Control-Z</td><td>Undo</td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td>Control-Y</td><td>Redo</td>\r
+                               </tr>\r
+                       </tbody>\r
+               </table>\r
+       </body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/skins/default/content.css b/webcit/tiny_mce/themes/advanced/skins/default/content.css
new file mode 100644 (file)
index 0000000..8de9ddb
--- /dev/null
@@ -0,0 +1,49 @@
+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
+body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;}\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 {display:inline-block; -webkit-user-select:all; -webkit-user-modify:read-only; -moz-user-select:all; -moz-user-modify:read-only; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat center center}\r
+span.mceItemNbsp {background: #DDD}\r
+td.mceSelected, th.mceSelected {background-color:#3399ff !important}\r
+img {border:0;}\r
+table {cursor:default}\r
+table td, table th {cursor:text}\r
+ins {border-bottom:1px solid green; text-decoration: none; color:green}\r
+del {color:red; text-decoration:line-through}\r
+cite {border-bottom:1px dashed blue}\r
+acronym {border-bottom:1px dotted #CCC; cursor:help}\r
+abbr {border-bottom:1px dashed #CCC; cursor:help}\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
+\r
+img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px}\r
+font[face=mceinline] {font-family:inherit !important}\r
+*[contentEditable]:focus {outline:0}\r
+\r
+.mceItemMedia {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
+.mceItemVideo {background-image:url(../../img/video.gif)}\r
+.mceItemAudio {background-image:url(../../img/video.gif)}\r
+.mceItemIframe {background-image:url(../../img/iframe.gif)}\r
+.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;}\r
diff --git a/webcit/tiny_mce/themes/advanced/skins/default/dialog.css b/webcit/tiny_mce/themes/advanced/skins/default/dialog.css
new file mode 100644 (file)
index 0000000..f012226
--- /dev/null
@@ -0,0 +1,117 @@
+/* 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
+.nowrap {white-space: nowrap}\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
+float:left;\r
+}\r
+\r
+#insert {background:url(img/buttons.png) 0 -52px}\r
+#cancel {background:url(img/buttons.png) 0 0; float:right}\r
+\r
+/* Browse */\r
+a.pickcolor, a.browse {text-decoration:none}\r
+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; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter: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;}\r
diff --git a/webcit/tiny_mce/themes/advanced/skins/default/img/buttons.png b/webcit/tiny_mce/themes/advanced/skins/default/img/buttons.png
new file mode 100644 (file)
index 0000000..1e53560
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/skins/default/img/buttons.png differ
diff --git a/webcit/tiny_mce/themes/advanced/skins/default/img/items.gif b/webcit/tiny_mce/themes/advanced/skins/default/img/items.gif
new file mode 100644 (file)
index 0000000..d2f9367
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/skins/default/img/items.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif b/webcit/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif
new file mode 100644 (file)
index 0000000..85e31df
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/skins/default/img/menu_check.gif b/webcit/tiny_mce/themes/advanced/skins/default/img/menu_check.gif
new file mode 100644 (file)
index 0000000..adfdddc
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/skins/default/img/menu_check.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/skins/default/img/progress.gif b/webcit/tiny_mce/themes/advanced/skins/default/img/progress.gif
new file mode 100644 (file)
index 0000000..5bb90fd
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/skins/default/img/progress.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/skins/default/img/tabs.gif b/webcit/tiny_mce/themes/advanced/skins/default/img/tabs.gif
new file mode 100644 (file)
index 0000000..06812cb
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/skins/default/img/tabs.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/skins/default/ui.css b/webcit/tiny_mce/themes/advanced/skins/default/ui.css
new file mode 100644 (file)
index 0000000..2b7c2a5
--- /dev/null
@@ -0,0 +1,214 @@
+/* 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 {direction:ltr;background:transparent}\r
+.defaultSkin iframe {display:block;}\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 {background:#F0F0EE; padding-top:1px; vertical-align:top}\r
+.defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC}\r
+.defaultSkin .mceStatusbar {background:#F0F0EE; 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; outline:0}\r
+.defaultSkin .mceStatusbar a:hover {text-decoration:underline}\r
+.defaultSkin table.mceToolbar {margin-left:3px}\r
+.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px}\r
+.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; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}\r
+.defaultSkin .mceButtonLabeled {width:auto}\r
+.defaultSkin .mceButtonLabeled span.mceIcon {float:left}\r
+.defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica}\r
+.defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888}\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, .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-image:url(../../img/icons.gif);}\r
+.defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;}\r
+.defaultSkin .mceSplitButton span.mceOpen {display:none}\r
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0}\r
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;}\r
+.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; 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
+.defaultSkin .mceMenuItem td, .defaultSkin .mceMenuItem th {line-height: normal}\r
+\r
+/* Progress,Resize */\r
+.defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF}\r
+.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}\r
+\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 span.mce_forecolorpicker {background-position:-720px 0}\r
+.defaultSkin span.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 span.mce_restoredraft {background-position:-20px -40px}\r
+.defaultSkin span.mce_spellchecker {background-position:-540px -20px}\r
diff --git a/webcit/tiny_mce/themes/advanced/skins/highcontrast/content.css b/webcit/tiny_mce/themes/advanced/skins/highcontrast/content.css
new file mode 100644 (file)
index 0000000..7da6239
--- /dev/null
@@ -0,0 +1,24 @@
+body, td, pre { margin:8px;}\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 {display:inline-block; width:11px !important; height:11px  !important; background:url(../default/img/items.gif) no-repeat 0 0;}\r
+span.mceItemNbsp {background: #DDD}\r
+td.mceSelected, th.mceSelected {background-color:#3399ff !important}\r
+img {border:0;}\r
+table {cursor:default}\r
+table td, table th {cursor:text}\r
+ins {border-bottom:1px solid green; text-decoration: none; color:green}\r
+del {color:red; text-decoration:line-through}\r
+cite {border-bottom:1px dashed blue}\r
+acronym {border-bottom:1px dotted #CCC; cursor:help}\r
+abbr {border-bottom:1px dashed #CCC; cursor:help}\r
+\r
+img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px}\r
+font[face=mceinline] {font-family:inherit !important}\r
+*[contentEditable]:focus {outline:0}\r
diff --git a/webcit/tiny_mce/themes/advanced/skins/highcontrast/dialog.css b/webcit/tiny_mce/themes/advanced/skins/highcontrast/dialog.css
new file mode 100644 (file)
index 0000000..b2ed097
--- /dev/null
@@ -0,0 +1,105 @@
+/* Generic */\r
+body {\r
+font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;\r
+background:#F0F0EE;
+color: black;\r
+padding:0;\r
+margin:8px 8px 0 8px;\r
+}\r
+\r
+html {background:#F0F0EE; color:#000;}\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;background-color:transparent;}\r
+a:hover {color:#2B6FB6;background-color:transparent;}\r
+.nowrap {white-space: nowrap}\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;background-color:transparent;}\r
+input.invalid {border:1px solid #EE0000;background-color:transparent;}\r
+input {background:#FFF; border:1px solid #CCC;color:black;}\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
+font-weight:bold;\r
+width:94px; height:23px;\r
+cursor:pointer;\r
+padding-bottom:2px;\r
+float:left;\r
+}\r
+\r
+#cancel {float:right}\r
+\r
+/* Browse */\r
+a.pickcolor, a.browse {text-decoration:none}\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; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter: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;}\r
+.tabs ul {margin:0; padding:0; list-style:none;}\r
+.tabs li {float:left; border: 1px solid black; border-bottom:0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block; cursor:pointer;}\r
+.tabs li.current {font-weight: bold; margin-right:2px;}\r
+.tabs span {float:left; display:block; padding:0px 10px 0 0;}\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; 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/webcit/tiny_mce/themes/advanced/skins/highcontrast/ui.css b/webcit/tiny_mce/themes/advanced/skins/highcontrast/ui.css
new file mode 100644 (file)
index 0000000..a2cfcc3
--- /dev/null
@@ -0,0 +1,102 @@
+/* Reset */\r
+.highcontrastSkin table, .highcontrastSkin tbody, .highcontrastSkin a, .highcontrastSkin img, .highcontrastSkin tr, .highcontrastSkin div, .highcontrastSkin td, .highcontrastSkin iframe, .highcontrastSkin span, .highcontrastSkin *, .highcontrastSkin .mceText {border:0; margin:0; padding:0; vertical-align:baseline; border-collapse:separate;}\r
+.highcontrastSkin a:hover, .highcontrastSkin a:link, .highcontrastSkin a:visited, .highcontrastSkin a:active {text-decoration:none; font-weight:normal; cursor:default;}\r
+.highcontrastSkin table td {vertical-align:middle}\r
+\r
+.highcontrastSkin .mceIconOnly {display: block !important;}\r
+\r
+/* External */\r
+.highcontrastSkin .mceExternalToolbar {position:absolute; border:1px solid; border-bottom:0; display:none; background-color: white;}\r
+.highcontrastSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;}\r
+.highcontrastSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px;}\r
+\r
+/* Layout */\r
+.highcontrastSkin table.mceLayout {border: 1px solid;}\r
+.highcontrastSkin .mceIframeContainer {border-top:1px solid; border-bottom:1px solid}\r
+.highcontrastSkin .mceStatusbar a:hover {text-decoration:underline}\r
+.highcontrastSkin .mceStatusbar {display:block; line-height:1.5em; overflow:visible;}\r
+.highcontrastSkin .mceStatusbar div {float:left}\r
+.highcontrastSkin .mceStatusbar a.mceResize {display:block; float:right; width:20px; height:20px; cursor:se-resize; outline:0}\r
+\r
+.highcontrastSkin .mceToolbar td { display: inline-block; float: left;}\r
+.highcontrastSkin .mceToolbar tr { display: block;}\r
+.highcontrastSkin .mceToolbar table { display: block; }\r
+\r
+/* Button */\r
+\r
+.highcontrastSkin .mceButton { display:block; margin: 2px; padding: 5px 10px;border: 1px solid; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; -ms-border-radius: 3px; height: 2em;}\r
+.highcontrastSkin .mceButton .mceVoiceLabel { height: 100%; vertical-align: center; line-height: 2em}\r
+.highcontrastSkin .mceButtonDisabled .mceVoiceLabel { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);}\r
+.highcontrastSkin .mceButtonActive, .highcontrastSkin .mceButton:focus, .highcontrastSkin .mceButton:active { border: 5px solid; padding: 1px 6px;-webkit-focus-ring-color:none;outline:none;}\r
+\r
+/* Separator */\r
+.highcontrastSkin .mceSeparator {display:block; width:16px; height:26px;}\r
+\r
+/* ListBox */\r
+.highcontrastSkin .mceListBox { display: block; margin:2px;-webkit-focus-ring-color:none;outline:none;}\r
+.highcontrastSkin .mceListBox .mceText {padding: 5px 6px;  line-height: 2em; width: 15ex; overflow: hidden;}\r
+.highcontrastSkin .mceListBoxDisabled .mceText { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);}\r
+.highcontrastSkin .mceListBox a.mceText { padding: 5px 10px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;}\r
+.highcontrastSkin .mceListBox a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-left: 0; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;}\r
+.highcontrastSkin .mceListBox:focus a.mceText, .highcontrastSkin .mceListBox:active a.mceText { border-width: 5px; padding: 1px 10px 1px 6px;}\r
+.highcontrastSkin .mceListBox:focus a.mceOpen, .highcontrastSkin .mceListBox:active a.mceOpen { border-width: 5px; padding: 1px 0px 1px 4px;}\r
+\r
+.highcontrastSkin .mceListBoxMenu {overflow-y:auto}\r
+\r
+/* SplitButton */\r
+.highcontrastSkin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}\r
+\r
+.highcontrastSkin .mceSplitButton { border-collapse: collapse; margin: 2px; height: 2em; line-height: 2em;-webkit-focus-ring-color:none;outline:none;}\r
+.highcontrastSkin .mceSplitButton td { display: table-cell; float: none; margin: 0; padding: 0; height: 2em;}\r
+.highcontrastSkin .mceSplitButton tr { display: table-row; }\r
+.highcontrastSkin table.mceSplitButton  { display: table; }\r
+.highcontrastSkin .mceSplitButton a.mceAction { padding: 5px 10px; display: block; height: 2em; line-height: 2em; overflow: hidden; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;}\r
+.highcontrastSkin .mceSplitButton a.mceOpen { padding: 5px 4px;  display: block; height: 2em; line-height: 2em; border: 1px solid; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;}\r
+.highcontrastSkin .mceSplitButton .mceVoiceLabel { height: 2em; vertical-align: center; line-height: 2em; } \r
+.highcontrastSkin .mceSplitButton:focus a.mceAction, .highcontrastSkin .mceSplitButton:active a.mceAction { border-width: 5px; border-right-width: 1px; padding: 1px 10px 1px 6px;-webkit-focus-ring-color:none;outline:none;}\r
+.highcontrastSkin .mceSplitButton:focus a.mceOpen, .highcontrastSkin .mceSplitButton:active a.mceOpen { border-width: 5px; border-left-width: 1px; padding: 1px 0px 1px 4px;-webkit-focus-ring-color:none;outline:none;}\r
+\r
+/* Menu */\r
+.highcontrastSkin .mceNoIcons span.mceIcon {width:0;}\r
+.highcontrastSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid; }\r
+.highcontrastSkin .mceMenu table {background:white; color: black}\r
+.highcontrastSkin .mceNoIcons a .mceText {padding-left:10px}\r
+.highcontrastSkin .mceMenu a, .highcontrastSkin .mceMenu span, .highcontrastSkin .mceMenu {display:block;background:white; color: black}\r
+.highcontrastSkin .mceMenu td {height:2em}\r
+.highcontrastSkin .mceMenu a {position:relative;padding:3px 0 4px 0; display: block;}\r
+.highcontrastSkin .mceMenu .mceText {position:relative; display:block; cursor:default; margin:0; padding:0 25px 0 25px;}\r
+.highcontrastSkin .mceMenu pre.mceText {font-family:Monospace}\r
+.highcontrastSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:26px;}\r
+.highcontrastSkin td.mceMenuItemSeparator {border-top:1px solid; height:1px}\r
+.highcontrastSkin .mceMenuItemTitle a {border:0; border-bottom:1px solid}\r
+.highcontrastSkin .mceMenuItemTitle span.mceText {font-weight:bold; padding-left:4px}\r
+.highcontrastSkin .mceNoIcons .mceMenuItemSelected span.mceText:before {content: "\2713\A0";}\r
+.highcontrastSkin .mceMenu span.mceMenuLine {display:none}\r
+.highcontrastSkin .mceMenuItemSub a .mceText:after {content: "\A0\25B8"}\r
+.highcontrastSkin .mceMenuItem td, .highcontrastSkin .mceMenuItem th {line-height: normal}\r
+\r
+/* ColorSplitButton */\r
+.highcontrastSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid; color: #000}\r
+.highcontrastSkin .mceColorSplitMenu td {padding:2px}\r
+.highcontrastSkin .mceColorSplitMenu a {display:block; width:16px; height:16px; overflow:hidden; color:#000; margin: 0; padding: 0;}\r
+.highcontrastSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}\r
+.highcontrastSkin .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
+.highcontrastSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid; background-color:#B6BDD2}\r
+.highcontrastSkin a.mceMoreColors:hover {border:1px solid #0A246A; color: #000;}\r
+.highcontrastSkin .mceColorPreview {display:none;}\r
+.highcontrastSkin .mce_forecolor span.mceAction, .highcontrastSkin .mce_backcolor span.mceAction {height:17px;overflow:hidden}\r
+\r
+/* Progress,Resize */\r
+.highcontrastSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF}\r
+.highcontrastSkin .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
+\r
+/* Formats */\r
+.highcontrastSkin .mce_p span.mceText {}\r
+.highcontrastSkin .mce_address span.mceText {font-style:italic}\r
+.highcontrastSkin .mce_pre span.mceText {font-family:monospace}\r
+.highcontrastSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}\r
+.highcontrastSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}\r
+.highcontrastSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}\r
+.highcontrastSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}\r
+.highcontrastSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}\r
+.highcontrastSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}\r
diff --git a/webcit/tiny_mce/themes/advanced/skins/o2k7/content.css b/webcit/tiny_mce/themes/advanced/skins/o2k7/content.css
new file mode 100644 (file)
index 0000000..7f65419
--- /dev/null
@@ -0,0 +1,48 @@
+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 {display:inline-block; width:11px !important; height:11px  !important; background:url(../default/img/items.gif) no-repeat 0 0;}\r
+span.mceItemNbsp {background: #DDD}\r
+td.mceSelected, th.mceSelected {background-color:#3399ff !important}\r
+img {border:0;}\r
+table {cursor:default}\r
+table td, table th {cursor:text}\r
+ins {border-bottom:1px solid green; text-decoration: none; color:green}\r
+del {color:red; text-decoration:line-through}\r
+cite {border-bottom:1px dashed blue}\r
+acronym {border-bottom:1px dotted #CCC; cursor:help}\r
+abbr {border-bottom:1px dashed #CCC; cursor:help}\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
+\r
+img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px}\r
+font[face=mceinline] {font-family:inherit !important}\r
+*[contentEditable]:focus {outline:0}\r
+\r
+.mceItemMedia {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
+.mceItemVideo {background-image:url(../../img/video.gif)}\r
+.mceItemAudio {background-image:url(../../img/video.gif)}\r
+.mceItemIframe {background-image:url(../../img/iframe.gif)}\r
+.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;}\r
diff --git a/webcit/tiny_mce/themes/advanced/skins/o2k7/dialog.css b/webcit/tiny_mce/themes/advanced/skins/o2k7/dialog.css
new file mode 100644 (file)
index 0000000..ec08772
--- /dev/null
@@ -0,0 +1,117 @@
+/* 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
+.nowrap {white-space: nowrap}\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
+float:left;\r
+}\r
+\r
+#insert {background:url(../default/img/buttons.png) 0 -52px}\r
+#cancel {background:url(../default/img/buttons.png) 0 0; float:right}\r
+\r
+/* Browse */\r
+a.pickcolor, a.browse {text-decoration:none}\r
+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; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter: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
+#colorpicker #picker_panel fieldset {margin:auto;width:325px;}\r
diff --git a/webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png b/webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png
new file mode 100644 (file)
index 0000000..13a5cb0
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png differ
diff --git a/webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png b/webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png
new file mode 100644 (file)
index 0000000..7fc57f2
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png differ
diff --git a/webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png b/webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png
new file mode 100644 (file)
index 0000000..c0dcc6c
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png differ
diff --git a/webcit/tiny_mce/themes/advanced/skins/o2k7/ui.css b/webcit/tiny_mce/themes/advanced/skins/o2k7/ui.css
new file mode 100644 (file)
index 0000000..0916c34
--- /dev/null
@@ -0,0 +1,217 @@
+/* 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:transparent}\r
+.o2k7Skin iframe {display:block;}\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 td.mceToolbar{background:#E5EFFD}\r
+.o2k7Skin .mceStatusbar {background:#E5EFFD; 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; outline:0}\r
+.o2k7Skin .mceStatusbar a:hover {text-decoration:underline}\r
+.o2k7Skin table.mceToolbar {margin-left:3px}\r
+.o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;}\r
+.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; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}\r
+.o2k7Skin .mceButtonLabeled {width:auto}\r
+.o2k7Skin .mceButtonLabeled span.mceIcon {float:left}\r
+.o2k7Skin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica}\r
+.o2k7Skin .mceButtonDisabled .mceButtonLabel {color:#888}\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  {padding-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; margin-left:3px}\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; direction:ltr}\r
+.o2k7Skin .mceSplitButton {background:url(img/button_bg.png)}\r
+.o2k7Skin .mceSplitButton a.mceAction {width:22px}\r
+.o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)}\r
+.o2k7Skin .mceSplitButton a.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0}\r
+.o2k7Skin .mceSplitButton span.mceOpen {display:none}\r
+.o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px}\r
+.o2k7Skin table.mceSplitButtonEnabled:hover a.mceOpen, .o2k7Skin .mceSplitButtonHover a.mceOpen, .o2k7Skin .mceSplitButtonSelected a.mceOpen {background-position:-44px -44px}\r
+.o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; 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;overflow:hidden}\r
+.o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px;overflow:hidden}\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
+.o2k7Skin .mceMenuItem td, .o2k7Skin .mceMenuItem th {line-height: normal}\r
+\r
+/* Progress,Resize */\r
+.o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF}\r
+.o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}\r
+\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 span.mce_forecolorpicker {background-position:-720px 0}\r
+.o2k7Skin span.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 span.mce_restoredraft {background-position:-20px -40px}\r
+.o2k7Skin span.mce_spellchecker {background-position:-540px -20px}\r
diff --git a/webcit/tiny_mce/themes/advanced/skins/o2k7/ui_black.css b/webcit/tiny_mce/themes/advanced/skins/o2k7/ui_black.css
new file mode 100644 (file)
index 0000000..50c9b76
--- /dev/null
@@ -0,0 +1,8 @@
+/* Black */\r
+.o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton a.mceOpen, .o2k7SkinBlack .mceListBox a.mceOpen {background-image:url(img/button_bg_black.png)}\r
+.o2k7SkinBlack td.mceToolbar, .o2k7SkinBlack td.mceStatusbar, .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, .o2k7SkinBlack .mceListBoxHover .mceText, .o2k7SkinBlack .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, .o2k7SkinBlack .mceSplitButtonHover a.mceAction, .o2k7SkinBlack .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)}\r
+.o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7SkinBlack .mceMenu .mceMenuItemActive {background-color:#FFE7A1}
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css b/webcit/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css
new file mode 100644 (file)
index 0000000..960a8e4
--- /dev/null
@@ -0,0 +1,5 @@
+/* Silver */\r
+.o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton a.mceOpen, .o2k7SkinSilver .mceListBox a.mceOpen {background-image:url(img/button_bg_silver.png)}\r
+.o2k7SkinSilver td.mceToolbar, .o2k7SkinSilver td.mceStatusbar, .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
diff --git a/webcit/tiny_mce/themes/advanced/source_editor.htm b/webcit/tiny_mce/themes/advanced/source_editor.htm
new file mode 100644 (file)
index 0000000..3c6d658
--- /dev/null
@@ -0,0 +1,25 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\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
+</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"><label for="htmlSource">{#advanced_dlg.code_title}</label></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">{#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" class="mceFocus"></textarea>\r
+\r
+               <div class="mceActionPanel">\r
+                       <input type="submit" role="button" name="insert" value="{#update}" id="insert" />\r
+                       <input type="button" role="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/simple/editor_template.js b/webcit/tiny_mce/themes/simple/editor_template.js
new file mode 100644 (file)
index 0000000..4b3209c
--- /dev/null
@@ -0,0 +1 @@
+(function(){var a=tinymce.DOM;tinymce.ThemeManager.requireLangPack("simple");tinymce.create("tinymce.themes.SimpleTheme",{init:function(c,d){var e=this,b=["Bold","Italic","Underline","Strikethrough","InsertUnorderedList","InsertOrderedList"],f=c.settings;e.editor=c;c.contentCSS.push(d+"/skins/"+f.skin+"/content.css");c.onInit.add(function(){c.onNodeChange.add(function(h,g){tinymce.each(b,function(i){g.get(i.toLowerCase()).setActive(h.queryCommandState(i))})})});a.loadCSS((f.editor_css?c.documentBaseURI.toAbsolute(f.editor_css):"")||d+"/skins/"+f.skin+"/ui.css")},renderUI:function(h){var e=this,i=h.targetNode,b,c,d=e.editor,f=d.controlManager,g;i=a.insertAfter(a.create("span",{id:d.id+"_container","class":"mceEditor "+d.settings.skin+"SimpleSkin"}),i);i=g=a.add(i,"table",{cellPadding:0,cellSpacing:0,"class":"mceLayout"});i=c=a.add(i,"tbody");i=a.add(c,"tr");i=b=a.add(a.add(i,"td"),"div",{"class":"mceIframeContainer"});i=a.add(a.add(c,"tr",{"class":"last"}),"td",{"class":"mceToolbar mceLast",align:"center"});c=e.toolbar=f.createToolbar("tools1");c.add(f.createButton("bold",{title:"simple.bold_desc",cmd:"Bold"}));c.add(f.createButton("italic",{title:"simple.italic_desc",cmd:"Italic"}));c.add(f.createButton("underline",{title:"simple.underline_desc",cmd:"Underline"}));c.add(f.createButton("strikethrough",{title:"simple.striketrough_desc",cmd:"Strikethrough"}));c.add(f.createSeparator());c.add(f.createButton("undo",{title:"simple.undo_desc",cmd:"Undo"}));c.add(f.createButton("redo",{title:"simple.redo_desc",cmd:"Redo"}));c.add(f.createSeparator());c.add(f.createButton("cleanup",{title:"simple.cleanup_desc",cmd:"mceCleanup"}));c.add(f.createSeparator());c.add(f.createButton("insertunorderedlist",{title:"simple.bullist_desc",cmd:"InsertUnorderedList"}));c.add(f.createButton("insertorderedlist",{title:"simple.numlist_desc",cmd:"InsertOrderedList"}));c.renderTo(i);return{iframeContainer:b,editorContainer:d.id+"_container",sizeContainer:g,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/webcit/tiny_mce/themes/simple/editor_template_src.js b/webcit/tiny_mce/themes/simple/editor_template_src.js
new file mode 100644 (file)
index 0000000..01ce87c
--- /dev/null
@@ -0,0 +1,84 @@
+/**\r
+ * editor_template_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM;\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
+                       ed.contentCSS.push(url + "/skins/" + s.skin + "/content.css");\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
+\r
+                       DOM.loadCSS((s.editor_css ? ed.documentBaseURI.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/webcit/tiny_mce/themes/simple/img/icons.gif b/webcit/tiny_mce/themes/simple/img/icons.gif
new file mode 100644 (file)
index 0000000..6fcbcb5
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/img/icons.gif differ
diff --git a/webcit/tiny_mce/themes/simple/langs/bg.js b/webcit/tiny_mce/themes/simple/langs/bg.js
new file mode 100644 (file)
index 0000000..6aca15a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('bg.simple',{"cleanup_desc":"\u0418\u0437\u0447\u0438\u0441\u0442\u0438 \u043a\u043e\u0434\u0430","redo_desc":"\u0412\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 (Ctrl+Y)","undo_desc":"\u041e\u0442\u043c\u044f\u043d\u0430 (Ctrl+Z)","numlist_desc":"\u041d\u043e\u043c\u0435\u0440\u0430","bullist_desc":"\u0412\u043e\u0434\u0430\u0447\u0438","striketrough_desc":"\u0417\u0430\u0447\u0435\u0440\u0442\u0430\u043d","underline_desc":"\u041f\u043e\u0434\u0447\u0435\u0440\u0442\u0430\u043d (Ctrl+U)","italic_desc":"\u041a\u0443\u0440\u0441\u0438\u0432 (Ctrl+I)","bold_desc":"\u041f\u043e\u043b\u0443\u0447\u0435\u0440 (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/cs.js b/webcit/tiny_mce/themes/simple/langs/cs.js
new file mode 100644 (file)
index 0000000..1be2fd6
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('cs.simple',{"cleanup_desc":"Vy\u010distit k\u00f3d","redo_desc":"Znovu (Ctrl+Y)","undo_desc":"Zp\u011bt (Ctrl+Z)","numlist_desc":"\u010c\u00edslovan\u00fd seznam","bullist_desc":"Seznam s odr\u00e1\u017ekami","striketrough_desc":"P\u0159e\u0161krtnut\u00e9","underline_desc":"Podtr\u017een\u00e9 (Ctrl+U)","italic_desc":"Kurz\u00edva (Ctrl+I)","bold_desc":"Tu\u010dn\u00e9 (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/da.js b/webcit/tiny_mce/themes/simple/langs/da.js
new file mode 100644 (file)
index 0000000..92de7a7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('da.simple',{"cleanup_desc":"Ryd op i uordentlig kode","redo_desc":"Gendan (Ctrl+Y)","undo_desc":"Fortryd (Ctrl+Z)","numlist_desc":"Nummereret punktopstilling","bullist_desc":"Unummereret punktopstilling","striketrough_desc":"Gennemstreget","underline_desc":"Understreget (Ctrl+U)","italic_desc":"Kursiv (Ctrl+I)","bold_desc":"Fed (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/de.js b/webcit/tiny_mce/themes/simple/langs/de.js
new file mode 100644 (file)
index 0000000..59bf788
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('de.simple',{"cleanup_desc":"Quellcode aufr\u00e4umen","redo_desc":"Wiederholen (Strg+Y)","undo_desc":"R\u00fcckg\u00e4ngig (Strg+Z)","numlist_desc":"Nummerierung","bullist_desc":"Aufz\u00e4hlung","striketrough_desc":"Durchgestrichen","underline_desc":"Unterstrichen (Strg+U)","italic_desc":"Kursiv (Strg+I)","bold_desc":"Fett (Strg+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/el.js b/webcit/tiny_mce/themes/simple/langs/el.js
new file mode 100644 (file)
index 0000000..c7554b8
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('el.simple',{"cleanup_desc":"\u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03bc\u03c0\u03b5\u03c1\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03c5 \u03ba\u03ce\u03b4\u03b9\u03ba\u03b1","redo_desc":"\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7 (Ctrl+Y)","undo_desc":"\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 (Ctrl+Z)","numlist_desc":"\u039b\u03af\u03c3\u03c4\u03b1 \u03bc\u03b5 \u03c3\u03b5\u03b9\u03c1\u03ac","bullist_desc":"\u039b\u03af\u03c3\u03c4\u03b1 \u03c7\u03c9\u03c1\u03af\u03c2 \u03c3\u03b5\u03b9\u03c1\u03ac","striketrough_desc":"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03bc\u03bc\u03b9\u03c3\u03bc\u03ad\u03bd\u03b1","underline_desc":"\u03a5\u03c0\u03bf\u03b3\u03c1\u03b1\u03bc\u03bc\u03b9\u03c3\u03bc\u03ad\u03bd\u03b1 (Ctrl+U)","italic_desc":"\u03a0\u03bb\u03ac\u03b3\u03b9\u03b1 (Ctrl+I)","bold_desc":"\u0388\u03bd\u03c4\u03bf\u03bd\u03b1 (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/en.js b/webcit/tiny_mce/themes/simple/langs/en.js
new file mode 100644 (file)
index 0000000..088ed0f
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.simple',{"cleanup_desc":"Cleanup Messy Code","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","numlist_desc":"Insert/Remove Numbered List","bullist_desc":"Insert/Remove Bulleted List","striketrough_desc":"Strikethrough","underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/es.js b/webcit/tiny_mce/themes/simple/langs/es.js
new file mode 100644 (file)
index 0000000..0fc0311
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('es.simple',{"cleanup_desc":"Limpiar c\u00f3digo basura","redo_desc":"Rehacer (Ctrl+Y)","undo_desc":"Deshacer (Ctrl+Z)","numlist_desc":"Lista ordenada","bullist_desc":"Lista desordenada","striketrough_desc":"Tachado","underline_desc":"Subrayado (Ctrl+U)","italic_desc":"Cursiva (Ctrl+I)","bold_desc":"Negrita (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/et.js b/webcit/tiny_mce/themes/simple/langs/et.js
new file mode 100644 (file)
index 0000000..ec105a5
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('et.simple',{"cleanup_desc":"Puhasta segane kood","redo_desc":"Tee uuesti (Ctrl+Y)","undo_desc":"V\u00f5ta tagasi (Ctrl+Z)","numlist_desc":"Korrap\u00e4rane loetelu","bullist_desc":"Ebakorrap\u00e4rane loetelu","striketrough_desc":"L\u00e4bijoonitud","underline_desc":"Allajoonitud (Ctrl+U)","italic_desc":"Kursiiv (Ctrl+I)","bold_desc":"Rasvane (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/fi.js b/webcit/tiny_mce/themes/simple/langs/fi.js
new file mode 100644 (file)
index 0000000..6ca1d8d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fi.simple',{"cleanup_desc":"Siisti sekainen koodi","redo_desc":"Tee uudestaan (Ctrl+Y)","undo_desc":"Peru (Ctrl+Z)","numlist_desc":"J\u00e4rjestetty lista","bullist_desc":"J\u00e4rjest\u00e4m\u00e4t\u00f6n lista","striketrough_desc":"Yliviivaus","underline_desc":"Alleviivaus (Ctrl+U)","italic_desc":"Kursivointi (Ctrl+I)","bold_desc":"Lihavointi (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/fr.js b/webcit/tiny_mce/themes/simple/langs/fr.js
new file mode 100644 (file)
index 0000000..ebe964e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('fr.simple',{"cleanup_desc":"Nettoyer le code","redo_desc":"R\u00e9tablir (Ctrl+Y)","undo_desc":"Annuler (Ctrl+Z)","numlist_desc":"Liste num\u00e9rot\u00e9e","bullist_desc":"Liste \u00e0 puces","striketrough_desc":"Barr\u00e9","underline_desc":"Soulign\u00e9 (Ctrl+U)","italic_desc":"Italique (Ctrl+I)","bold_desc":"Gras (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/hu.js b/webcit/tiny_mce/themes/simple/langs/hu.js
new file mode 100644 (file)
index 0000000..169722a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('hu.simple',{"cleanup_desc":"Minden form\u00e1z\u00e1s elt\u00e1vol\u00edt\u00e1sa","redo_desc":"M\u00e9gis v\u00e9grehajt (Ctrl+Y)","undo_desc":"Visszavon\u00e1s (Ctrl+Z)","numlist_desc":"Rendezett lista","bullist_desc":"Rendezetlen lista","striketrough_desc":"\u00c1th\u00fazott","underline_desc":"Al\u00e1h\u00fazott (Ctrl+U)","italic_desc":"D\u0151lt (Ctrl+I)","bold_desc":"F\u00e9lk\u00f6v\u00e9r (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/it.js b/webcit/tiny_mce/themes/simple/langs/it.js
new file mode 100644 (file)
index 0000000..e0c45ed
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('it.simple',{"cleanup_desc":"Pulisci codice disordinato","redo_desc":"Ripristina (Ctrl+Y)","undo_desc":"Annulla (Ctrl+Z)","numlist_desc":"Lista ordinata","bullist_desc":"Lista non ordinata","striketrough_desc":"Barrato","underline_desc":"Sottolineato (Ctrl+U)","italic_desc":"Corsivo (Ctrl+I)","bold_desc":"Grassetto (Ctrl+B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/langs/zh-cn.js b/webcit/tiny_mce/themes/simple/langs/zh-cn.js
new file mode 100644 (file)
index 0000000..6e0c695
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.addI18n('zh-cn.simple',{"cleanup_desc":"\u6e05\u9664\u65e0\u7528\u4ee3\u7801","redo_desc":"\u6062\u590d(Ctrl Y)","undo_desc":"\u64a4\u9500(Ctrl Z)","numlist_desc":"\u7f16\u53f7\u5217\u8868","bullist_desc":"\u9879\u76ee\u5217\u8868","striketrough_desc":"\u5220\u9664\u7ebf","underline_desc":"\u4e0b\u5212\u7ebf(Ctrl U)","italic_desc":"\u659c\u4f53(Ctrl I)","bold_desc":"\u7c97\u4f53(Ctrl B)"});
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/skins/default/content.css b/webcit/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/webcit/tiny_mce/themes/simple/skins/default/ui.css b/webcit/tiny_mce/themes/simple/skins/default/ui.css
new file mode 100644 (file)
index 0000000..076fe84
--- /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; -ms-filter:'alpha(opacity=30)'; 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/webcit/tiny_mce/themes/simple/skins/o2k7/content.css b/webcit/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/webcit/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png b/webcit/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png
new file mode 100644 (file)
index 0000000..527e349
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png differ
diff --git a/webcit/tiny_mce/themes/simple/skins/o2k7/ui.css b/webcit/tiny_mce/themes/simple/skins/o2k7/ui.css
new file mode 100644 (file)
index 0000000..cf6c35d
--- /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; -ms-filter:'alpha(opacity=30)'; 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
diff --git a/webcit/tiny_mce/tiny_mce.js b/webcit/tiny_mce/tiny_mce.js
new file mode 100644 (file)
index 0000000..808f9ee
--- /dev/null
@@ -0,0 +1 @@
+(function(d){var a=/^\s*|\s*$/g,e,c="B".replace(/A(.)|B/,"$1")==="$1";var b={majorVersion:"3",minorVersion:"4.5",releaseDate:"2011-09-06",_init:function(){var s=this,q=document,o=navigator,g=o.userAgent,m,f,l,k,j,r;s.isOpera=d.opera&&opera.buildNumber;s.isWebKit=/WebKit/.test(g);s.isIE=!s.isWebKit&&!s.isOpera&&(/MSIE/gi).test(g)&&(/Explorer/gi).test(o.appName);s.isIE6=s.isIE&&/MSIE [56]/.test(g);s.isIE7=s.isIE&&/MSIE [7]/.test(g);s.isIE8=s.isIE&&/MSIE [8]/.test(g);s.isIE9=s.isIE&&/MSIE [9]/.test(g);s.isGecko=!s.isWebKit&&/Gecko/.test(g);s.isMac=g.indexOf("Mac")!=-1;s.isAir=/adobeair/i.test(g);s.isIDevice=/(iPad|iPhone)/.test(g);s.isIOS5=s.isIDevice&&g.match(/AppleWebKit\/(\d*)/)[1]>=534;if(d.tinyMCEPreInit){s.suffix=tinyMCEPreInit.suffix;s.baseURL=tinyMCEPreInit.base;s.query=tinyMCEPreInit.query;return}s.suffix="";f=q.getElementsByTagName("base");for(m=0;m<f.length;m++){if(r=f[m].href){if(/^https?:\/\/[^\/]+$/.test(r)){r+="/"}k=r?r.match(/.*\//)[0]:""}}function h(i){if(i.src&&/tiny_mce(|_gzip|_jquery|_prototype|_full)(_dev|_src)?.js/.test(i.src)){if(/_(src|dev)\.js/g.test(i.src)){s.suffix="_src"}if((j=i.src.indexOf("?"))!=-1){s.query=i.src.substring(j+1)}s.baseURL=i.src.substring(0,i.src.lastIndexOf("/"));if(k&&s.baseURL.indexOf("://")==-1&&s.baseURL.indexOf("/")!==0){s.baseURL=k+s.baseURL}return s.baseURL}return null}f=q.getElementsByTagName("script");for(m=0;m<f.length;m++){if(h(f[m])){return}}l=q.getElementsByTagName("head")[0];if(l){f=l.getElementsByTagName("script");for(m=0;m<f.length;m++){if(h(f[m])){return}}}return},is:function(g,f){if(!f){return g!==e}if(f=="array"&&(g.hasOwnProperty&&g instanceof Array)){return true}return typeof(g)==f},makeMap:function(f,j,h){var g;f=f||[];j=j||",";if(typeof(f)=="string"){f=f.split(j)}h=h||{};g=f.length;while(g--){h[f[g]]={}}return h},each:function(i,f,h){var j,g;if(!i){return 0}h=h||i;if(i.length!==e){for(j=0,g=i.length;j<g;j++){if(f.call(h,i[j],j,i)===false){return 0}}}else{for(j in i){if(i.hasOwnProperty(j)){if(f.call(h,i[j],j,i)===false){return 0}}}}return 1},map:function(g,h){var i=[];b.each(g,function(f){i.push(h(f))});return i},grep:function(g,h){var i=[];b.each(g,function(f){if(!h||h(f)){i.push(f)}});return i},inArray:function(g,h){var j,f;if(g){for(j=0,f=g.length;j<f;j++){if(g[j]===h){return j}}}return -1},extend:function(k,j){var h,g,f=arguments;for(h=1,g=f.length;h<g;h++){j=f[h];b.each(j,function(i,l){if(i!==e){k[l]=i}})}return k},trim:function(f){return(f?""+f:"").replace(a,"")},create:function(o,f,j){var n=this,g,i,k,l,h,m=0;o=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(o);k=o[3].match(/(^|\.)(\w+)$/i)[2];i=n.createNS(o[3].replace(/\.\w+$/,""),j);if(i[k]){return}if(o[2]=="static"){i[k]=f;if(this.onCreate){this.onCreate(o[2],o[3],i[k])}return}if(!f[k]){f[k]=function(){};m=1}i[k]=f[k];n.extend(i[k].prototype,f);if(o[5]){g=n.resolve(o[5]).prototype;l=o[5].match(/\.(\w+)$/i)[1];h=i[k];if(m){i[k]=function(){return g[l].apply(this,arguments)}}else{i[k]=function(){this.parent=g[l];return h.apply(this,arguments)}}i[k].prototype[k]=i[k];n.each(g,function(p,q){i[k].prototype[q]=g[q]});n.each(f,function(p,q){if(g[q]){i[k].prototype[q]=function(){this.parent=g[q];return p.apply(this,arguments)}}else{if(q!=k){i[k].prototype[q]=p}}})}n.each(f["static"],function(p,q){i[k][q]=p});if(this.onCreate){this.onCreate(o[2],o[3],i[k].prototype)}},walk:function(i,h,j,g){g=g||this;if(i){if(j){i=i[j]}b.each(i,function(k,f){if(h.call(g,k,f,j)===false){return false}b.walk(k,h,j,g)})}},createNS:function(j,h){var g,f;h=h||d;j=j.split(".");for(g=0;g<j.length;g++){f=j[g];if(!h[f]){h[f]={}}h=h[f]}return h},resolve:function(j,h){var g,f;h=h||d;j=j.split(".");for(g=0,f=j.length;g<f;g++){h=h[j[g]];if(!h){break}}return h},addUnload:function(j,i){var h=this;j={func:j,scope:i||this};if(!h.unloads){function g(){var f=h.unloads,l,m;if(f){for(m in f){l=f[m];if(l&&l.func){l.func.call(l.scope,1)}}if(d.detachEvent){d.detachEvent("onbeforeunload",k);d.detachEvent("onunload",g)}else{if(d.removeEventListener){d.removeEventListener("unload",g,false)}}h.unloads=l=f=w=g=0;if(d.CollectGarbage){CollectGarbage()}}}function k(){var l=document;if(l.readyState=="interactive"){function f(){l.detachEvent("onstop",f);if(g){g()}l=0}if(l){l.attachEvent("onstop",f)}d.setTimeout(function(){if(l){l.detachEvent("onstop",f)}},0)}}if(d.attachEvent){d.attachEvent("onunload",g);d.attachEvent("onbeforeunload",k)}else{if(d.addEventListener){d.addEventListener("unload",g,false)}}h.unloads=[j]}else{h.unloads.push(j)}return j},removeUnload:function(i){var g=this.unloads,h=null;b.each(g,function(j,f){if(j&&j.func==i){g.splice(f,1);h=i;return false}});return h},explode:function(f,g){return f?b.map(f.split(g||","),b.trim):f},_addVer:function(g){var f;if(!this.query){return g}f=(g.indexOf("?")==-1?"?":"&")+this.query;if(g.indexOf("#")==-1){return g+f}return g.replace("#",f+"#")},_replace:function(h,f,g){if(c){return g.replace(h,function(){var l=f,j=arguments,k;for(k=0;k<j.length-2;k++){if(j[k]===e){l=l.replace(new RegExp("\\$"+k,"g"),"")}else{l=l.replace(new RegExp("\\$"+k,"g"),j[k])}}return l})}return g.replace(h,f)}};b._init();d.tinymce=d.tinyMCE=b})(window);tinymce.create("tinymce.util.Dispatcher",{scope:null,listeners:null,Dispatcher:function(a){this.scope=a||this;this.listeners=[]},add:function(a,b){this.listeners.push({cb:a,scope:b||this.scope});return a},addToTop:function(a,b){this.listeners.unshift({cb:a,scope:b||this.scope});return a},remove:function(a){var b=this.listeners,c=null;tinymce.each(b,function(e,d){if(a==e.cb){c=a;b.splice(d,1);return false}});return c},dispatch:function(){var f,d=arguments,e,b=this.listeners,g;for(e=0;e<b.length;e++){g=b[e];f=g.cb.apply(g.scope,d);if(f===false){break}}return f}});(function(){var a=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(e,g){var f=this,i,d,c,h;e=tinymce.trim(e);g=f.settings=g||{};if(/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e)){f.source=e;return}if(e.indexOf("/")===0&&e.indexOf("//")!==0){e=(g.base_uri?g.base_uri.protocol||"http":"http")+"://mce_host"+e}if(!/^[\w-]*:?\/\//.test(e)){h=g.base_uri?g.base_uri.path:new tinymce.util.URI(location.href).directory;e=((g.base_uri&&g.base_uri.protocol)||"http")+"://mce_host"+f.toAbsPath(h,e)}e=e.replace(/@@/g,"(mce_at)");e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);a(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,j){var k=e[j];if(k){k=k.replace(/\(mce_at\)/g,"@@")}f[b]=k});if(c=g.base_uri){if(!f.protocol){f.protocol=c.protocol}if(!f.userInfo){f.userInfo=c.userInfo}if(!f.port&&f.host=="mce_host"){f.port=c.port}if(!f.host||f.host=="mce_host"){f.host=c.host}f.source=""}},setPath:function(c){var b=this;c=/^(.*?)\/?(\w+)?$/.exec(c);b.path=c[0];b.directory=c[1];b.file=c[2];b.source="";b.getURI()},toRelative:function(b){var c=this,d;if(b==="./"){return b}b=new tinymce.util.URI(b,{base_uri:c});if((b.host!="mce_host"&&c.host!=b.host&&b.host)||c.port!=b.port||c.protocol!=b.protocol){return b.getURI()}d=c.toRelPath(c.path,b.path);if(b.query){d+="?"+b.query}if(b.anchor){d+="#"+b.anchor}return d},toAbsolute:function(b,c){var b=new tinymce.util.URI(b,{base_uri:this});return b.getURI(this.host==b.host&&this.protocol==b.protocol?c:0)},toRelPath:function(g,h){var c,f=0,d="",e,b;g=g.substring(0,g.lastIndexOf("/"));g=g.split("/");c=h.split("/");if(g.length>=c.length){for(e=0,b=g.length;e<b;e++){if(e>=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length<c.length){for(e=0,b=c.length;e<b;e++){if(e>=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e<b;e++){d+="../"}for(e=f-1,b=c.length;e<b;e++){if(e!=f-1){d+="/"+c[e]}else{d+=c[e]}}return d},toAbsPath:function(e,f){var c,b=0,h=[],d,g;d=/\/$/.test(f)?"/":"";e=e.split("/");f=f.split("/");a(e,function(i){if(i){h.push(i)}});e=h;for(c=f.length-1,h=[];c>=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();(function(){function serialize(o,quote){var i,v,t;quote=quote||'"';if(o==null){return"null"}t=typeof o;if(t=="string"){v="\bb\tt\nn\ff\rr\"\"''\\\\";return quote+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){if(quote==='"'&&a==="'"){return a}i=v.indexOf(b);if(i+1){return"\\"+v.charAt(i+1)}a=b.charCodeAt().toString(16);return"\\u"+"0000".substring(a.length)+a})+quote}if(t=="object"){if(o.hasOwnProperty&&o instanceof Array){for(i=0,v="[";i<o.length;i++){v+=(i>0?",":"")+serialize(o[i],quote)}return v+"]"}v="{";for(i in o){v+=typeof o[i]!="function"?(v.length>1?","+quote:quote)+i+quote+":"+serialize(o[i],quote):""}return v+"}"}return""+o}tinymce.util.JSON={serialize:serialize,parse:function(s){try{return eval("("+s+")")}catch(ex){}}}})();tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){if(e){e.call(f.error_scope||f.scope,h,g)}};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(a){a.VK={DELETE:46,BACKSPACE:8}})(tinymce);(function(d){var f=d.VK,e=f.BACKSPACE,c=f.DELETE;function b(g){var i=g.dom,h=g.selection;g.onKeyDown.add(function(k,o){var j,p,m,n,l;l=o.keyCode==c;if(l||o.keyCode==e){o.preventDefault();j=h.getRng();p=i.getParent(j.startContainer,i.isBlock);if(l){p=i.getNext(p,i.isBlock)}if(p){m=p.firstChild;if(m&&m.nodeName==="SPAN"){n=m.cloneNode(false)}}k.getDoc().execCommand(l?"ForwardDelete":"Delete",false,null);p=i.getParent(j.startContainer,i.isBlock);d.each(i.select("span.Apple-style-span,font.Apple-style-span",p),function(r){var q=i.createRng();q.setStartBefore(r);q.setEndBefore(r);if(n){i.replace(n.cloneNode(false),r,true)}else{i.remove(r,true)}h.setRng(q)})}})}function a(g){g.onKeyUp.add(function(h,j){var i=j.keyCode;if(i==c||i==e){if(h.dom.isEmpty(h.getBody())){h.setContent("",{format:"raw"});h.nodeChanged();return}}})}d.create("tinymce.util.Quirks",{Quirks:function(g){if(d.isWebKit){b(g);a(g)}if(d.isIE){a(g)}}})})(tinymce);(function(j){var a,g,d,k=/[&<>\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,b=/[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=/[<>&\"\']/g,c=/&(#x|#)?([\w]+);/g,i={128:"\u20AC",130:"\u201A",131:"\u0192",132:"\u201E",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02C6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017D",145:"\u2018",146:"\u2019",147:"\u201C",148:"\u201D",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02DC",153:"\u2122",154:"\u0161",155:"\u203A",156:"\u0153",158:"\u017E",159:"\u0178"};g={'"':"&quot;","'":"&#39;","<":"&lt;",">":"&gt;","&":"&amp;"};d={"&lt;":"<","&gt;":">","&amp;":"&","&quot;":'"',"&apos;":"'"};function h(l){var m;m=document.createElement("div");m.innerHTML=l;return m.textContent||m.innerText||l}function e(m,p){var n,o,l,q={};if(m){m=m.split(",");p=p||10;for(n=0;n<m.length;n+=2){o=String.fromCharCode(parseInt(m[n],p));if(!g[o]){l="&"+m[n+1]+";";q[o]=l;q[l]=o}}return q}}a=e("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32);j.html=j.html||{};j.html.Entities={encodeRaw:function(m,l){return m.replace(l?k:b,function(n){return g[n]||n})},encodeAllRaw:function(l){return(""+l).replace(f,function(m){return g[m]||m})},encodeNumeric:function(m,l){return m.replace(l?k:b,function(n){if(n.length>1){return"&#"+(((n.charCodeAt(0)-55296)*1024)+(n.charCodeAt(1)-56320)+65536)+";"}return g[n]||"&#"+n.charCodeAt(0)+";"})},encodeNamed:function(n,l,m){m=m||a;return n.replace(l?k:b,function(o){return g[o]||m[o]||o})},getEncodeFunc:function(l,o){var p=j.html.Entities;o=e(o)||a;function m(r,q){return r.replace(q?k:b,function(s){return g[s]||o[s]||"&#"+s.charCodeAt(0)+";"||s})}function n(r,q){return p.encodeNamed(r,q,o)}l=j.makeMap(l.replace(/\+/g,","));if(l.named&&l.numeric){return m}if(l.named){if(o){return n}return p.encodeNamed}if(l.numeric){return p.encodeNumeric}return p.encodeRaw},decode:function(l){return l.replace(c,function(n,m,o){if(m){o=parseInt(o,m.length===2?16:10);if(o>65535){o-=65536;return String.fromCharCode(55296+(o>>10),56320+(o&1023))}else{return i[o]||String.fromCharCode(o)}}return d[n]||a[n]||h(n)})}}})(tinymce);tinymce.html.Styles=function(d,f){var k=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,h=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,b=/\s*([^:]+):\s*([^;]+);?/g,l=/\s+$/,m=/rgb/,e,g,a={},j;d=d||{};j="\\\" \\' \\; \\: ; : \uFEFF".split(" ");for(g=0;g<j.length;g++){a[j[g]]="\uFEFF"+g;a["\uFEFF"+g]=j[g]}function c(n,q,p,i){function o(r){r=parseInt(r).toString(16);return r.length>1?r:"0"+r}return"#"+o(q)+o(p)+o(i)}return{toHex:function(i){return i.replace(k,c)},parse:function(r){var y={},p,n,v,q,u=d.url_converter,x=d.url_converter_scope||this;function o(C,F){var E,B,A,D;E=y[C+"-top"+F];if(!E){return}B=y[C+"-right"+F];if(E!=B){return}A=y[C+"-bottom"+F];if(B!=A){return}D=y[C+"-left"+F];if(A!=D){return}y[C+F]=D;delete y[C+"-top"+F];delete y[C+"-right"+F];delete y[C+"-bottom"+F];delete y[C+"-left"+F]}function t(B){var C=y[B],A;if(!C||C.indexOf(" ")<0){return}C=C.split(" ");A=C.length;while(A--){if(C[A]!==C[0]){return false}}y[B]=C[0];return true}function z(C,B,A,D){if(!t(B)){return}if(!t(A)){return}if(!t(D)){return}y[C]=y[B]+" "+y[A]+" "+y[D];delete y[B];delete y[A];delete y[D]}function s(A){q=true;return a[A]}function i(B,A){if(q){B=B.replace(/\uFEFF[0-9]/g,function(C){return a[C]})}if(!A){B=B.replace(/\\([\'\";:])/g,"$1")}return B}if(r){r=r.replace(/\\[\"\';:\uFEFF]/g,s).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(A){return A.replace(/[;:]/g,s)});while(p=b.exec(r)){n=p[1].replace(l,"").toLowerCase();v=p[2].replace(l,"");if(n&&v.length>0){if(n==="font-weight"&&v==="700"){v="bold"}else{if(n==="color"||n==="background-color"){v=v.toLowerCase()}}v=v.replace(k,c);v=v.replace(h,function(B,A,E,D,F,C){F=F||C;if(F){F=i(F);return"'"+F.replace(/\'/g,"\\'")+"'"}A=i(A||E||D);if(u){A=u.call(x,A,"style")}return"url('"+A.replace(/\'/g,"\\'")+"')"});y[n]=q?i(v,true):v}b.lastIndex=p.index+p[0].length}o("border","");o("border","-width");o("border","-color");o("border","-style");o("padding","");o("margin","");z("border","border-width","border-style","border-color");if(y.border==="medium none"){delete y.border}}return y},serialize:function(p,r){var o="",n,q;function i(t){var x,u,s,v;x=f.styles[t];if(x){for(u=0,s=x.length;u<s;u++){t=x[u];v=p[t];if(v!==e&&v.length>0){o+=(o.length>0?" ":"")+t+": "+v+";"}}}}if(r&&f&&f.styles){i("*");i(r)}else{for(n in p){q=p[n];if(q!==e&&q.length>0){o+=(o.length>0?" ":"")+n+": "+q+";"}}}return o}}};(function(m){var h={},j,l,g,f,c={},b,e,d=m.makeMap,k=m.each;function i(o,n){return o.split(n||",")}function a(r,q){var o,p={};function n(s){return s.replace(/[A-Z]+/g,function(t){return n(r[t])})}for(o in r){if(r.hasOwnProperty(o)){r[o]=n(r[o])}}n(q).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g,function(v,t,s,u){s=i(s,"|");p[t]={attributes:d(s),attributesOrder:s,children:d(u,"|",{"#comment":{}})}});return p}l="h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,noscript,menu,isindex,samp,header,footer,article,section,hgroup";l=d(l,",",d(l.toUpperCase()));h=a({Z:"H|K|N|O|P",Y:"X|form|R|Q",ZG:"E|span|width|align|char|charoff|valign",X:"p|T|div|U|W|isindex|fieldset|table",ZF:"E|align|char|charoff|valign",W:"pre|hr|blockquote|address|center|noframes",ZE:"abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height",ZD:"[E][S]",U:"ul|ol|dl|menu|dir",ZC:"p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"X|S|Q",S:"R|P",ZA:"a|G|J|M|O|P",R:"a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe",E:"A|B|C",D:"accesskey|tabindex|onfocus|onblur",C:"onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"lang|xml:lang|dir",A:"id|class|style|title"},"script[id|charset|type|language|src|defer|xml:space][]style[B|id|type|media|title|xml:space][]object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]param[id|name|value|valuetype|type][]p[E|align][#|S]a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]br[A|clear][]span[E][#|S]bdo[A|C|B][#|S]applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]h1[E|align][#|S]img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]map[B|C|A|name][X|form|Q|area]h2[E|align][#|S]iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]h3[E|align][#|S]tt[E][#|S]i[E][#|S]b[E][#|S]u[E][#|S]s[E][#|S]strike[E][#|S]big[E][#|S]small[E][#|S]font[A|B|size|color|face][#|S]basefont[id|size|color|face][]em[E][#|S]strong[E][#|S]dfn[E][#|S]code[E][#|S]q[E|cite][#|S]samp[E][#|S]kbd[E][#|S]var[E][#|S]cite[E][#|S]abbr[E][#|S]acronym[E][#|S]sub[E][#|S]sup[E][#|S]input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]optgroup[E|disabled|label][option]option[E|selected|disabled|label|value][]textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]label[E|for|accesskey|onfocus|onblur][#|S]button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[E|align][#|S]ins[E|cite|datetime][#|Y]h5[E|align][#|S]del[E|cite|datetime][#|Y]h6[E|align][#|S]div[E|align][#|Y]ul[E|type|compact][li]li[E|type|value][#|Y]ol[E|type|compact|start][li]dl[E|compact][dt|dd]dt[E][#|S]dd[E][#|Y]menu[E|compact][li]dir[E|compact][li]pre[E|width|xml:space][#|ZA]hr[E|align|noshade|size|width][]blockquote[E|cite][#|Y]address[E][#|S|p]center[E][#|Y]noframes[E][#|Y]isindex[A|B|prompt][]fieldset[E][#|legend|Y]legend[E|accesskey|align][#|S]table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]caption[E|align][#|S]col[ZG][]colgroup[ZG][col]thead[ZF][tr]tr[ZF|bgcolor][th|td]th[E|ZE][#|Y]form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]noscript[E][#|Y]td[E|ZE][#|Y]tfoot[ZF][tr]tbody[ZF][tr]area[E|D|shape|coords|href|nohref|alt|target][]base[id|href|target][]body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]");j=d("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,autoplay,loop,controls");g=d("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source");f=m.extend(d("td,th,iframe,video,audio,object"),g);b=d("pre,script,style,textarea");e=d("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");m.html.Schema=function(r){var A=this,n={},o={},y=[],q,p;r=r||{};if(r.verify_html===false){r.valid_elements="*[*]"}if(r.valid_styles){q={};k(r.valid_styles,function(C,B){q[B]=m.explode(C)})}p=r.whitespace_elements?d(r.whitespace_elements):b;function z(B){return new RegExp("^"+B.replace(/([?+*])/g,".$1")+"$")}function t(I){var H,D,W,S,X,C,F,R,U,N,V,Z,L,G,T,B,P,E,Y,aa,M,Q,K=/^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/,O=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,J=/[*?+]/;if(I){I=i(I);if(n["@"]){P=n["@"].attributes;E=n["@"].attributesOrder}for(H=0,D=I.length;H<D;H++){C=K.exec(I[H]);if(C){T=C[1];N=C[2];B=C[3];U=C[4];L={};G=[];F={attributes:L,attributesOrder:G};if(T==="#"){F.paddEmpty=true}if(T==="-"){F.removeEmpty=true}if(P){for(aa in P){L[aa]=P[aa]}G.push.apply(G,E)}if(U){U=i(U,"|");for(W=0,S=U.length;W<S;W++){C=O.exec(U[W]);if(C){R={};Z=C[1];V=C[2].replace(/::/g,":");T=C[3];Q=C[4];if(Z==="!"){F.attributesRequired=F.attributesRequired||[];F.attributesRequired.push(V);R.required=true}if(Z==="-"){delete L[V];G.splice(m.inArray(G,V),1);continue}if(T){if(T==="="){F.attributesDefault=F.attributesDefault||[];F.attributesDefault.push({name:V,value:Q});R.defaultValue=Q}if(T===":"){F.attributesForced=F.attributesForced||[];F.attributesForced.push({name:V,value:Q});R.forcedValue=Q}if(T==="<"){R.validValues=d(Q,"?")}}if(J.test(V)){F.attributePatterns=F.attributePatterns||[];R.pattern=z(V);F.attributePatterns.push(R)}else{if(!L[V]){G.push(V)}L[V]=R}}}}if(!P&&N=="@"){P=L;E=G}if(B){F.outputName=N;n[B]=F}if(J.test(N)){F.pattern=z(N);y.push(F)}else{n[N]=F}}}}}function v(B){n={};y=[];t(B);k(h,function(D,C){o[C]=D.children})}function s(C){var B=/^(~)?(.+)$/;if(C){k(i(C),function(G){var E=B.exec(G),F=E[1]==="~",H=F?"span":"div",D=E[2];o[D]=o[H];c[D]=H;if(!F){l[D]={}}k(o,function(I,J){if(I[H]){I[D]=I[H]}})})}}function u(C){var B=/^([+\-]?)(\w+)\[([^\]]+)\]$/;if(C){k(i(C),function(G){var F=B.exec(G),D,E;if(F){E=F[1];if(E){D=o[F[2]]}else{D=o[F[2]]={"#comment":{}}}D=o[F[2]];k(i(F[3],"|"),function(H){if(E==="-"){delete D[H]}else{D[H]={}}})}})}}function x(B){var D=n[B],C;if(D){return D}C=y.length;while(C--){D=y[C];if(D.pattern.test(B)){return D}}}if(!r.valid_elements){k(h,function(C,B){n[B]={attributes:C.attributes,attributesOrder:C.attributesOrder};o[B]=C.children});k(i("strong/b,em/i"),function(B){B=i(B,"/");n[B[1]].outputName=B[0]});n.img.attributesDefault=[{name:"alt",value:""}];k(i("ol,ul,sub,sup,blockquote,span,font,a,table,tbody,tr"),function(B){n[B].removeEmpty=true});k(i("p,h1,h2,h3,h4,h5,h6,th,td,pre,div,address,caption"),function(B){n[B].paddEmpty=true})}else{v(r.valid_elements)}s(r.custom_elements);u(r.valid_children);t(r.extended_valid_elements);u("+ol[ul|ol],+ul[ul|ol]");if(!x("span")){t("span[!data-mce-type|*]")}if(r.invalid_elements){m.each(m.explode(r.invalid_elements),function(B){if(n[B]){delete n[B]}})}A.children=o;A.styles=q;A.getBoolAttrs=function(){return j};A.getBlockElements=function(){return l};A.getShortEndedElements=function(){return g};A.getSelfClosingElements=function(){return e};A.getNonEmptyElements=function(){return f};A.getWhiteSpaceElements=function(){return p};A.isValidChild=function(B,D){var C=o[B];return !!(C&&C[D])};A.getElementRule=x;A.getCustomElements=function(){return c};A.addValidElements=t;A.setValidElements=v;A.addCustomElements=s;A.addValidChildren=u};m.html.Schema.boolAttrMap=j;m.html.Schema.blockElementsMap=l})(tinymce);(function(a){a.html.SaxParser=function(c,e){var b=this,d=function(){};c=c||{};b.schema=e=e||new a.html.Schema();if(c.fix_self_closing!==false){c.fix_self_closing=true}a.each("comment cdata text start end pi doctype".split(" "),function(f){if(f){b[f]=c[f]||d}});b.parse=function(D){var n=this,g,F=0,H,A,z=[],M,P,B,q,y,r,L,G,N,u,m,k,s,Q,o,O,E,R,K,f,I,l,C,J,h,v=0,j=a.html.Entities.decode,x,p;function t(S){var U,T;U=z.length;while(U--){if(z[U].name===S){break}}if(U>=0){for(T=z.length-1;T>=U;T--){S=z[T];if(S.valid){n.end(S.name)}}z.length=U}}l=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([^\\s\\/<>]+)\\s*((?:[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*)>))","g");C=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g;J={script:/<\/script[^>]*>/gi,style:/<\/style[^>]*>/gi,noscript:/<\/noscript[^>]*>/gi};L=e.getShortEndedElements();I=e.getSelfClosingElements();G=e.getBoolAttrs();u=c.validate;r=c.remove_internals;x=c.fix_self_closing;p=a.isIE;o=/^:/;while(g=l.exec(D)){if(F<g.index){n.text(j(D.substr(F,g.index-F)))}if(H=g[6]){H=H.toLowerCase();if(p&&o.test(H)){H=H.substr(1)}t(H)}else{if(H=g[7]){H=H.toLowerCase();if(p&&o.test(H)){H=H.substr(1)}N=H in L;if(x&&I[H]&&z.length>0&&z[z.length-1].name===H){t(H)}if(!u||(m=e.getElementRule(H))){k=true;if(u){O=m.attributes;E=m.attributePatterns}if(Q=g[8]){y=Q.indexOf("data-mce-type")!==-1;if(y&&r){k=false}M=[];M.map={};Q.replace(C,function(T,S,X,W,V){var Y,U;S=S.toLowerCase();X=S in G?S:j(X||W||V||"");if(u&&!y&&S.indexOf("data-")!==0){Y=O[S];if(!Y&&E){U=E.length;while(U--){Y=E[U];if(Y.pattern.test(S)){break}}if(U===-1){Y=null}}if(!Y){return}if(Y.validValues&&!(X in Y.validValues)){return}}M.map[S]=X;M.push({name:S,value:X})})}else{M=[];M.map={}}if(u&&!y){R=m.attributesRequired;K=m.attributesDefault;f=m.attributesForced;if(f){P=f.length;while(P--){s=f[P];q=s.name;h=s.value;if(h==="{$uid}"){h="mce_"+v++}M.map[q]=h;M.push({name:q,value:h})}}if(K){P=K.length;while(P--){s=K[P];q=s.name;if(!(q in M.map)){h=s.value;if(h==="{$uid}"){h="mce_"+v++}M.map[q]=h;M.push({name:q,value:h})}}}if(R){P=R.length;while(P--){if(R[P] in M.map){break}}if(P===-1){k=false}}if(M.map["data-mce-bogus"]){k=false}}if(k){n.start(H,M,N)}}else{k=false}if(A=J[H]){A.lastIndex=F=g.index+g[0].length;if(g=A.exec(D)){if(k){B=D.substr(F,g.index-F)}F=g.index+g[0].length}else{B=D.substr(F);F=D.length}if(k&&B.length>0){n.text(B,true)}if(k){n.end(H)}l.lastIndex=F;continue}if(!N){if(!Q||Q.indexOf("/")!=Q.length-1){z.push({name:H,valid:k})}else{if(k){n.end(H)}}}}else{if(H=g[1]){n.comment(H)}else{if(H=g[2]){n.cdata(H)}else{if(H=g[3]){n.doctype(H)}else{if(H=g[4]){n.pi(H,g[5])}}}}}}F=g.index+g[0].length}if(F<D.length){n.text(j(D.substr(F)))}for(P=z.length-1;P>=0;P--){H=z[P];if(H.valid){n.end(H.name)}}}}})(tinymce);(function(d){var c=/^[ \t\r\n]*$/,e={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};function a(k,l,j){var i,h,f=j?"lastChild":"firstChild",g=j?"prev":"next";if(k[f]){return k[f]}if(k!==l){i=k[g];if(i){return i}for(h=k.parent;h&&h!==l;h=h.parent){i=h[g];if(i){return i}}}}function b(f,g){this.name=f;this.type=g;if(g===1){this.attributes=[];this.attributes.map={}}}d.extend(b.prototype,{replace:function(g){var f=this;if(g.parent){g.remove()}f.insert(g,f);f.remove();return f},attr:function(h,l){var f=this,g,j,k;if(typeof h!=="string"){for(j in h){f.attr(j,h[j])}return f}if(g=f.attributes){if(l!==k){if(l===null){if(h in g.map){delete g.map[h];j=g.length;while(j--){if(g[j].name===h){g=g.splice(j,1);return f}}}return f}if(h in g.map){j=g.length;while(j--){if(g[j].name===h){g[j].value=l;break}}}else{g.push({name:h,value:l})}g.map[h]=l;return f}else{return g.map[h]}}},clone:function(){var g=this,n=new b(g.name,g.type),h,f,m,j,k;if(m=g.attributes){k=[];k.map={};for(h=0,f=m.length;h<f;h++){j=m[h];if(j.name!=="id"){k[k.length]={name:j.name,value:j.value};k.map[j.name]=j.value}}n.attributes=k}n.value=g.value;n.shortEnded=g.shortEnded;return n},wrap:function(g){var f=this;f.parent.insert(g,f);g.append(f);return f},unwrap:function(){var f=this,h,g;for(h=f.firstChild;h;){g=h.next;f.insert(h,f,true);h=g}f.remove()},remove:function(){var f=this,h=f.parent,g=f.next,i=f.prev;if(h){if(h.firstChild===f){h.firstChild=g;if(g){g.prev=null}}else{i.next=g}if(h.lastChild===f){h.lastChild=i;if(i){i.next=null}}else{g.prev=i}f.parent=f.next=f.prev=null}return f},append:function(h){var f=this,g;if(h.parent){h.remove()}g=f.lastChild;if(g){g.next=h;h.prev=g;f.lastChild=h}else{f.lastChild=f.firstChild=h}h.parent=f;return h},insert:function(h,f,i){var g;if(h.parent){h.remove()}g=f.parent||this;if(i){if(f===g.firstChild){g.firstChild=h}else{f.prev.next=h}h.prev=f.prev;h.next=f;f.prev=h}else{if(f===g.lastChild){g.lastChild=h}else{f.next.prev=h}h.next=f.next;h.prev=f;f.next=h}h.parent=g;return h},getAll:function(g){var f=this,h,i=[];for(h=f.firstChild;h;h=a(h,f)){if(h.name===g){i.push(h)}}return i},empty:function(){var g=this,f,h,j;if(g.firstChild){f=[];for(j=g.firstChild;j;j=a(j,g)){f.push(j)}h=f.length;while(h--){j=f[h];j.parent=j.firstChild=j.lastChild=j.next=j.prev=null}}g.firstChild=g.lastChild=null;return g},isEmpty:function(k){var f=this,j=f.firstChild,h,g;if(j){do{if(j.type===1){if(j.attributes.map["data-mce-bogus"]){continue}if(k[j.name]){return false}h=j.attributes.length;while(h--){g=j.attributes[h].name;if(g==="name"||g.indexOf("data-")===0){return false}}}if((j.type===3&&!c.test(j.value))){return false}}while(j=a(j,f))}return true},walk:function(f){return a(this,null,f)}});d.extend(b,{create:function(g,f){var i,h;i=new b(g,e[g]||1);if(f){for(h in f){i.attr(h,f[h])}}return i}});d.html.Node=b})(tinymce);(function(b){var a=b.html.Node;b.html.DomParser=function(g,h){var f=this,e={},d=[],i={},c={};g=g||{};g.validate="validate" in g?g.validate:true;g.root_name=g.root_name||"body";f.schema=h=h||new b.html.Schema();function j(m){var o,p,x,v,z,n,q,l,t,u,k,s,y,r;s=b.makeMap("tr,td,th,tbody,thead,tfoot,table");k=h.getNonEmptyElements();for(o=0;o<m.length;o++){p=m[o];if(!p.parent){continue}v=[p];for(x=p.parent;x&&!h.isValidChild(x.name,p.name)&&!s[x.name];x=x.parent){v.push(x)}if(x&&v.length>1){v.reverse();z=n=f.filterNode(v[0].clone());for(t=0;t<v.length-1;t++){if(h.isValidChild(n.name,v[t].name)){q=f.filterNode(v[t].clone());n.append(q)}else{q=n}for(l=v[t].firstChild;l&&l!=v[t+1];){r=l.next;q.append(l);l=r}n=q}if(!z.isEmpty(k)){x.insert(z,v[0],true);x.insert(p,z)}else{x.insert(p,v[0],true)}x=v[0];if(x.isEmpty(k)||x.firstChild===x.lastChild&&x.firstChild.name==="br"){x.empty().remove()}}else{if(p.parent){if(p.name==="li"){y=p.prev;if(y&&(y.name==="ul"||y.name==="ul")){y.append(p);continue}y=p.next;if(y&&(y.name==="ul"||y.name==="ul")){y.insert(p,y.firstChild,true);continue}p.wrap(f.filterNode(new a("ul",1)));continue}if(h.isValidChild(p.parent.name,"div")&&h.isValidChild("div",p.name)){p.wrap(f.filterNode(new a("div",1)))}else{if(p.name==="style"||p.name==="script"){p.empty().remove()}else{p.unwrap()}}}}}}f.filterNode=function(m){var l,k,n;if(k in e){n=i[k];if(n){n.push(m)}else{i[k]=[m]}}l=d.length;while(l--){k=d[l].name;if(k in m.attributes.map){n=c[k];if(n){n.push(m)}else{c[k]=[m]}}}return m};f.addNodeFilter=function(k,l){b.each(b.explode(k),function(m){var n=e[m];if(!n){e[m]=n=[]}n.push(l)})};f.addAttributeFilter=function(k,l){b.each(b.explode(k),function(m){var n;for(n=0;n<d.length;n++){if(d[n].name===m){d[n].callbacks.push(l);return}}d.push({name:m,callbacks:[l]})})};f.parse=function(v,m){var n,H,A,z,C,B,x,r,E,K,y,o,D,J=[],t,k,s,p,u,q;m=m||{};i={};c={};o=b.extend(b.makeMap("script,style,head,html,body,title,meta,param"),h.getBlockElements());u=h.getNonEmptyElements();p=h.children;y=g.validate;q="forced_root_block" in m?m.forced_root_block:g.forced_root_block;s=h.getWhiteSpaceElements();D=/^[ \t\r\n]+/;t=/[ \t\r\n]+$/;k=/[ \t\r\n]+/g;function F(){var L=H.firstChild,l,M;while(L){l=L.next;if(L.type==3||(L.type==1&&L.name!=="p"&&!o[L.name]&&!L.attr("data-mce-type"))){if(!M){M=I(q,1);H.insert(M,L);M.append(L)}else{M.append(L)}}else{M=null}L=l}}function I(l,L){var M=new a(l,L),N;if(l in e){N=i[l];if(N){N.push(M)}else{i[l]=[M]}}return M}function G(M){var N,l,L;for(N=M.prev;N&&N.type===3;){l=N.value.replace(t,"");if(l.length>0){N.value=l;N=N.prev}else{L=N.prev;N.remove();N=L}}}n=new b.html.SaxParser({validate:y,fix_self_closing:!y,cdata:function(l){A.append(I("#cdata",4)).value=l},text:function(M,l){var L;if(!s[A.name]){M=M.replace(k," ");if(A.lastChild&&o[A.lastChild.name]){M=M.replace(D,"")}}if(M.length!==0){L=I("#text",3);L.raw=!!l;A.append(L).value=M}},comment:function(l){A.append(I("#comment",8)).value=l},pi:function(l,L){A.append(I(l,7)).value=L;G(A)},doctype:function(L){var l;l=A.append(I("#doctype",10));l.value=L;G(A)},start:function(l,T,M){var R,O,N,L,P,U,S,Q;N=y?h.getElementRule(l):{};if(N){R=I(N.outputName||l,1);R.attributes=T;R.shortEnded=M;A.append(R);Q=p[A.name];if(Q&&p[R.name]&&!Q[R.name]){J.push(R)}O=d.length;while(O--){P=d[O].name;if(P in T.map){E=c[P];if(E){E.push(R)}else{c[P]=[R]}}}if(o[l]){G(R)}if(!M){A=R}}},end:function(l){var P,M,O,L,N;M=y?h.getElementRule(l):{};if(M){if(o[l]){if(!s[A.name]){for(P=A.firstChild;P&&P.type===3;){O=P.value.replace(D,"");if(O.length>0){P.value=O;P=P.next}else{L=P.next;P.remove();P=L}}for(P=A.lastChild;P&&P.type===3;){O=P.value.replace(t,"");if(O.length>0){P.value=O;P=P.prev}else{L=P.prev;P.remove();P=L}}}P=A.prev;if(P&&P.type===3){O=P.value.replace(D,"");if(O.length>0){P.value=O}else{P.remove()}}}if(M.removeEmpty||M.paddEmpty){if(A.isEmpty(u)){if(M.paddEmpty){A.empty().append(new a("#text","3")).value="\u00a0"}else{if(!A.attributes.map.name){N=A.parent;A.empty().remove();A=N;return}}}}A=A.parent}}},h);H=A=new a(m.context||g.root_name,11);n.parse(v);if(y&&J.length){if(!m.context){j(J)}else{m.invalid=true}}if(q&&H.name=="body"){F()}if(!m.invalid){for(K in i){E=e[K];z=i[K];x=z.length;while(x--){if(!z[x].parent){z.splice(x,1)}}for(C=0,B=E.length;C<B;C++){E[C](z,K,m)}}for(C=0,B=d.length;C<B;C++){E=d[C];if(E.name in c){z=c[E.name];x=z.length;while(x--){if(!z[x].parent){z.splice(x,1)}}for(x=0,r=E.callbacks.length;x<r;x++){E.callbacks[x](z,E.name,m)}}}}return H};if(g.remove_trailing_brs){f.addNodeFilter("br",function(n,m){var r,q=n.length,o,u=h.getBlockElements(),k=h.getNonEmptyElements(),s,p,t;u.body=1;for(r=0;r<q;r++){o=n[r];s=o.parent;if(u[o.parent.name]&&o===s.lastChild){p=o.prev;while(p){t=p.name;if(t!=="span"||p.attr("data-mce-type")!=="bookmark"){if(t!=="br"){break}if(t==="br"){o=null;break}}p=p.prev}if(o){o.remove();if(s.isEmpty(k)){elementRule=h.getElementRule(s.name);if(elementRule){if(elementRule.removeEmpty){s.remove()}else{if(elementRule.paddEmpty){s.empty().append(new b.html.Node("#text",3)).value="\u00a0"}}}}}}}})}}})(tinymce);tinymce.html.Writer=function(e){var c=[],a,b,d,f,g;e=e||{};a=e.indent;b=tinymce.makeMap(e.indent_before||"");d=tinymce.makeMap(e.indent_after||"");f=tinymce.html.Entities.getEncodeFunc(e.entity_encoding||"raw",e.entities);g=e.element_format=="html";return{start:function(m,k,p){var n,j,h,o;if(a&&b[m]&&c.length>0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}c.push("<",m);if(k){for(n=0,j=k.length;n<j;n++){h=k[n];c.push(" ",h.name,'="',f(h.value,true),'"')}}if(!p||g){c[c.length]=">"}else{c[c.length]=" />"}if(p&&a&&d[m]&&c.length>0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}},end:function(h){var i;c.push("</",h,">");if(a&&d[h]&&c.length>0){i=c[c.length-1];if(i.length>0&&i!=="\n"){c.push("\n")}}},text:function(i,h){if(i.length>0){c[c.length]=h?i:f(i)}},cdata:function(h){c.push("<![CDATA[",h,"]]>")},comment:function(h){c.push("<!--",h,"-->")},pi:function(h,i){if(i){c.push("<?",h," ",i,"?>")}else{c.push("<?",h,"?>")}if(a){c.push("\n")}},doctype:function(h){c.push("<!DOCTYPE",h,">",a?"\n":"")},reset:function(){c.length=0},getContent:function(){return c.join("").replace(/\n$/,"")}}};(function(a){a.html.Serializer=function(c,d){var b=this,e=new a.html.Writer(c);c=c||{};c.validate="validate" in c?c.validate:true;b.schema=d=d||new a.html.Schema();b.writer=e;b.serialize=function(h){var g,i;i=c.validate;g={3:function(k,j){e.text(k.value,k.raw)},8:function(j){e.comment(j.value)},7:function(j){e.pi(j.name,j.value)},10:function(j){e.doctype(j.value)},4:function(j){e.cdata(j.value)},11:function(j){if((j=j.firstChild)){do{f(j)}while(j=j.next)}}};e.reset();function f(k){var t=g[k.type],j,o,s,r,p,u,n,m,q;if(!t){j=k.name;o=k.shortEnded;s=k.attributes;if(i&&s&&s.length>1){u=[];u.map={};q=d.getElementRule(k.name);for(n=0,m=q.attributesOrder.length;n<m;n++){r=q.attributesOrder[n];if(r in s.map){p=s.map[r];u.map[r]=p;u.push({name:r,value:p})}}for(n=0,m=s.length;n<m;n++){r=s[n].name;if(!(r in u.map)){p=s.map[r];u.map[r]=p;u.push({name:r,value:p})}}s=u}e.start(k.name,s,o);if(!o){if((k=k.firstChild)){do{f(k)}while(k=k.next)}e.end(j)}}else{t(k)}}if(h.type==1&&!c.inner){f(h)}else{g[11](h)}return e.getContent()}}})(tinymce);(function(h){var f=h.each,e=h.is,d=h.isWebKit,b=h.isIE,c=h.html.Entities,a=/^([a-z0-9],?)+$/i,g=h.html.Schema.blockElementsMap,i=/^[ \t\r\n]*$/;h.create("tinymce.dom.DOMUtils",{doc:null,root:null,files:null,pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",type:"type"},DOMUtils:function(o,m){var l=this,j,k;l.doc=o;l.win=window;l.files={};l.cssFlicker=false;l.counter=0;l.stdMode=!h.isIE||o.documentMode>=8;l.boxModel=!h.isIE||o.compatMode=="CSS1Compat"||l.stdMode;l.hasOuterHTML="outerHTML" in o.createElement("a");l.settings=m=h.extend({keep_values:false,hex_colors:1},m);l.schema=m.schema;l.styles=new h.html.Styles({url_converter:m.url_converter,url_converter_scope:m.url_converter_scope},m.schema);if(h.isIE6){try{o.execCommand("BackgroundImageCache",false,true)}catch(n){l.cssFlicker=true}}if(b&&m.schema){("abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video").replace(/\w+/g,function(p){o.createElement(p)});for(k in m.schema.getCustomElements()){o.createElement(k)}}h.addUnload(l.destroy,l)},getRoot:function(){var j=this,k=j.settings;return(k&&j.get(k.root_element))||j.doc.body},getViewPort:function(k){var l,j;k=!k?this.win:k;l=k.document;j=this.boxModel?l.documentElement:l.body;return{x:k.pageXOffset||j.scrollLeft,y:k.pageYOffset||j.scrollTop,w:k.innerWidth||j.clientWidth,h:k.innerHeight||j.clientHeight}},getRect:function(m){var l,j=this,k;m=j.get(m);l=j.getPos(m);k=j.getSize(m);return{x:l.x,y:l.y,w:k.w,h:k.h}},getSize:function(m){var k=this,j,l;m=k.get(m);j=k.getStyle(m,"width");l=k.getStyle(m,"height");if(j.indexOf("px")===-1){j=0}if(l.indexOf("px")===-1){l=0}return{w:parseInt(j)||m.offsetWidth||m.clientWidth,h:parseInt(l)||m.offsetHeight||m.clientHeight}},getParent:function(l,k,j){return this.getParents(l,k,j,false)},getParents:function(u,p,l,s){var k=this,j,m=k.settings,q=[];u=k.get(u);s=s===undefined;if(m.strict_root){l=l||k.getRoot()}if(e(p,"string")){j=p;if(p==="*"){p=function(o){return o.nodeType==1}}else{p=function(o){return k.is(o,j)}}}while(u){if(u==l||!u.nodeType||u.nodeType===9){break}if(!p||p(u)){if(s){q.push(u)}else{return u}}u=u.parentNode}return s?q:null},get:function(j){var k;if(j&&this.doc&&typeof(j)=="string"){k=j;j=this.doc.getElementById(j);if(j&&j.id!==k){return this.doc.getElementsByName(k)[1]}}return j},getNext:function(k,j){return this._findSib(k,j,"nextSibling")},getPrev:function(k,j){return this._findSib(k,j,"previousSibling")},select:function(l,k){var j=this;return h.dom.Sizzle(l,j.get(k)||j.get(j.settings.root_element)||j.doc,[])},is:function(l,j){var k;if(l.length===undefined){if(j==="*"){return l.nodeType==1}if(a.test(j)){j=j.toLowerCase().split(/,/);l=l.nodeName.toLowerCase();for(k=j.length-1;k>=0;k--){if(j[k]==l){return true}}return false}}return h.dom.Sizzle.matches(j,l.nodeType?[l]:l).length>0},add:function(m,q,j,l,o){var k=this;return this.run(m,function(s){var r,n;r=e(q,"string")?k.doc.createElement(q):q;k.setAttribs(r,j);if(l){if(l.nodeType){r.appendChild(l)}else{k.setHTML(r,l)}}return !o?s.appendChild(r):r})},create:function(l,j,k){return this.add(this.doc.createElement(l),l,j,k,1)},createHTML:function(r,j,p){var q="",m=this,l;q+="<"+r;for(l in j){if(j.hasOwnProperty(l)){q+=" "+l+'="'+m.encode(j[l])+'"'}}if(typeof(p)!="undefined"){return q+">"+p+"</"+r+">"}return q+" />"},remove:function(j,k){return this.run(j,function(m){var n,l=m.parentNode;if(!l){return null}if(k){while(n=m.firstChild){if(!h.isIE||n.nodeType!==3||n.nodeValue){l.insertBefore(n,m)}else{m.removeChild(n)}}}return l.removeChild(m)})},setStyle:function(m,j,k){var l=this;return l.run(m,function(p){var o,n;o=p.style;j=j.replace(/-(\D)/g,function(r,q){return q.toUpperCase()});if(l.pixelStyles.test(j)&&(h.is(k,"number")||/^[\-0-9\.]+$/.test(k))){k+="px"}switch(j){case"opacity":if(b){o.filter=k===""?"":"alpha(opacity="+(k*100)+")";if(!m.currentStyle||!m.currentStyle.hasLayout){o.display="inline-block"}}o[j]=o["-moz-opacity"]=o["-khtml-opacity"]=k||"";break;case"float":b?o.styleFloat=k:o.cssFloat=k;break;default:o[j]=k||""}if(l.settings.update_styles){l.setAttrib(p,"data-mce-style")}})},getStyle:function(m,j,l){m=this.get(m);if(!m){return}if(this.doc.defaultView&&l){j=j.replace(/[A-Z]/g,function(n){return"-"+n});try{return this.doc.defaultView.getComputedStyle(m,null).getPropertyValue(j)}catch(k){return null}}j=j.replace(/-(\D)/g,function(o,n){return n.toUpperCase()});if(j=="float"){j=b?"styleFloat":"cssFloat"}if(m.currentStyle&&l){return m.currentStyle[j]}return m.style?m.style[j]:undefined},setStyles:function(m,n){var k=this,l=k.settings,j;j=l.update_styles;l.update_styles=0;f(n,function(o,p){k.setStyle(m,p,o)});l.update_styles=j;if(l.update_styles){k.setAttrib(m,l.cssText)}},removeAllAttribs:function(j){return this.run(j,function(m){var l,k=m.attributes;for(l=k.length-1;l>=0;l--){m.removeAttributeNode(k.item(l))}})},setAttrib:function(l,m,j){var k=this;if(!l||!m){return}if(k.settings.strict){m=m.toLowerCase()}return this.run(l,function(o){var n=k.settings;switch(m){case"style":if(!e(j,"string")){f(j,function(p,q){k.setStyle(o,q,p)});return}if(n.keep_values){if(j&&!k._isRes(j)){o.setAttribute("data-mce-style",j,2)}else{o.removeAttribute("data-mce-style",2)}}o.style.cssText=j;break;case"class":o.className=j||"";break;case"src":case"href":if(n.keep_values){if(n.url_converter){j=n.url_converter.call(n.url_converter_scope||k,j,m,o)}k.setAttrib(o,"data-mce-"+m,j,2)}break;case"shape":o.setAttribute("data-mce-style",j);break}if(e(j)&&j!==null&&j.length!==0){o.setAttribute(m,""+j,2)}else{o.removeAttribute(m,2)}})},setAttribs:function(k,l){var j=this;return this.run(k,function(m){f(l,function(o,p){j.setAttrib(m,p,o)})})},getAttrib:function(o,p,l){var j,k=this,m;o=k.get(o);if(!o||o.nodeType!==1){return l===m?false:l}if(!e(l)){l=""}if(/^(src|href|style|coords|shape)$/.test(p)){j=o.getAttribute("data-mce-"+p);if(j){return j}}if(b&&k.props[p]){j=o[k.props[p]];j=j&&j.nodeValue?j.nodeValue:j}if(!j){j=o.getAttribute(p,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(p)){if(o[k.props[p]]===true&&j===""){return p}return j?p:""}if(o.nodeName==="FORM"&&o.getAttributeNode(p)){return o.getAttributeNode(p).nodeValue}if(p==="style"){j=j||o.style.cssText;if(j){j=k.serializeStyle(k.parseStyle(j),o.nodeName);if(k.settings.keep_values&&!k._isRes(j)){o.setAttribute("data-mce-style",j)}}}if(d&&p==="class"&&j){j=j.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(b){switch(p){case"rowspan":case"colspan":if(j===1){j=""}break;case"size":if(j==="+0"||j===20||j===0){j=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(j===0){j=""}break;case"hspace":if(j===-1){j=""}break;case"maxlength":case"tabindex":if(j===32768||j===2147483647||j==="32768"){j=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(j===65535){return p}return l;case"shape":j=j.toLowerCase();break;default:if(p.indexOf("on")===0&&j){j=h._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1",""+j)}}}return(j!==m&&j!==null&&j!=="")?""+j:l},getPos:function(s,m){var k=this,j=0,q=0,o,p=k.doc,l;s=k.get(s);m=m||p.body;if(s){if(s.getBoundingClientRect){s=s.getBoundingClientRect();o=k.boxModel?p.documentElement:p.body;j=s.left+(p.documentElement.scrollLeft||p.body.scrollLeft)-o.clientTop;q=s.top+(p.documentElement.scrollTop||p.body.scrollTop)-o.clientLeft;return{x:j,y:q}}l=s;while(l&&l!=m&&l.nodeType){j+=l.offsetLeft||0;q+=l.offsetTop||0;l=l.offsetParent}l=s.parentNode;while(l&&l!=m&&l.nodeType){j-=l.scrollLeft||0;q-=l.scrollTop||0;l=l.parentNode}}return{x:j,y:q}},parseStyle:function(j){return this.styles.parse(j)},serializeStyle:function(k,j){return this.styles.serialize(k,j)},loadCSS:function(j){var l=this,m=l.doc,k;if(!j){j=""}k=l.select("head")[0];f(j.split(","),function(n){var o;if(l.files[n]){return}l.files[n]=true;o=l.create("link",{rel:"stylesheet",href:h._addVer(n)});if(b&&m.documentMode&&m.recalc){o.onload=function(){if(m.recalc){m.recalc()}o.onload=null}}k.appendChild(o)})},addClass:function(j,k){return this.run(j,function(l){var m;if(!k){return 0}if(this.hasClass(l,k)){return l.className}m=this.removeClass(l,k);return l.className=(m!=""?(m+" "):"")+k})},removeClass:function(l,m){var j=this,k;return j.run(l,function(o){var n;if(j.hasClass(o,m)){if(!k){k=new RegExp("(^|\\s+)"+m+"(\\s+|$)","g")}n=o.className.replace(k," ");n=h.trim(n!=" "?n:"");o.className=n;if(!n){o.removeAttribute("class");o.removeAttribute("className")}return n}return o.className})},hasClass:function(k,j){k=this.get(k);if(!k||!j){return false}return(" "+k.className+" ").indexOf(" "+j+" ")!==-1},show:function(j){return this.setStyle(j,"display","block")},hide:function(j){return this.setStyle(j,"display","none")},isHidden:function(j){j=this.get(j);return !j||j.style.display=="none"||this.getStyle(j,"display")=="none"},uniqueId:function(j){return(!j?"mce_":j)+(this.counter++)},setHTML:function(l,k){var j=this;return j.run(l,function(n){if(b){while(n.firstChild){n.removeChild(n.firstChild)}try{n.innerHTML="<br />"+k;n.removeChild(n.firstChild)}catch(m){n=j.create("div");n.innerHTML="<br />"+k;f(n.childNodes,function(p,o){if(o){n.appendChild(p)}})}}else{n.innerHTML=k}return k})},getOuterHTML:function(l){var k,j=this;l=j.get(l);if(!l){return null}if(l.nodeType===1&&j.hasOuterHTML){return l.outerHTML}k=(l.ownerDocument||j.doc).createElement("body");k.appendChild(l.cloneNode(true));return k.innerHTML},setOuterHTML:function(m,k,n){var j=this;function l(p,o,r){var s,q;q=r.createElement("body");q.innerHTML=o;s=q.lastChild;while(s){j.insertAfter(s.cloneNode(true),p);s=s.previousSibling}j.remove(p)}return this.run(m,function(p){p=j.get(p);if(p.nodeType==1){n=n||p.ownerDocument||j.doc;if(b){try{if(b&&p.nodeType==1){p.outerHTML=k}else{l(p,k,n)}}catch(o){l(p,k,n)}}else{l(p,k,n)}}})},decode:c.decode,encode:c.encodeAllRaw,insertAfter:function(j,k){k=this.get(k);return this.run(j,function(m){var l,n;l=k.parentNode;n=k.nextSibling;if(n){l.insertBefore(m,n)}else{l.appendChild(m)}return m})},isBlock:function(k){var j=k.nodeType;if(j){return !!(j===1&&g[k.nodeName])}return !!g[k]},replace:function(p,m,j){var l=this;if(e(m,"array")){p=p.cloneNode(true)}return l.run(m,function(k){if(j){f(h.grep(k.childNodes),function(n){p.appendChild(n)})}return k.parentNode.replaceChild(p,k)})},rename:function(m,j){var l=this,k;if(m.nodeName!=j.toUpperCase()){k=l.create(j);f(l.getAttribs(m),function(n){l.setAttrib(k,n.nodeName,l.getAttrib(m,n.nodeName))});l.replace(k,m,1)}return k||m},findCommonAncestor:function(l,j){var m=l,k;while(m){k=j;while(k&&m!=k){k=k.parentNode}if(m==k){break}m=m.parentNode}if(!m&&l.ownerDocument){return l.ownerDocument.documentElement}return m},toHex:function(j){var l=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(j);function k(m){m=parseInt(m).toString(16);return m.length>1?m:"0"+m}if(l){j="#"+k(l[1])+k(l[2])+k(l[3]);return j}return j},getClasses:function(){var n=this,j=[],m,o={},p=n.settings.class_filter,l;if(n.classes){return n.classes}function q(r){f(r.imports,function(s){q(s)});f(r.cssRules||r.rules,function(s){switch(s.type||1){case 1:if(s.selectorText){f(s.selectorText.split(","),function(t){t=t.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(t)||!/\.[\w\-]+$/.test(t)){return}l=t;t=h._replace(/.*\.([a-z0-9_\-]+).*/i,"$1",t);if(p&&!(t=p(t,l))){return}if(!o[t]){j.push({"class":t});o[t]=1}})}break;case 3:q(s.styleSheet);break}})}try{f(n.doc.styleSheets,q)}catch(k){}if(j.length>0){n.classes=j}return j},run:function(m,l,k){var j=this,n;if(j.doc&&typeof(m)==="string"){m=j.get(m)}if(!m){return false}k=k||this;if(!m.nodeType&&(m.length||m.length===0)){n=[];f(m,function(p,o){if(p){if(typeof(p)=="string"){p=j.doc.getElementById(p)}n.push(l.call(k,p,o))}});return n}return l.call(k,m)},getAttribs:function(k){var j;k=this.get(k);if(!k){return[]}if(b){j=[];if(k.nodeName=="OBJECT"){return k.attributes}if(k.nodeName==="OPTION"&&this.getAttrib(k,"selected")){j.push({specified:1,nodeName:"selected"})}k.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(l){j.push({specified:1,nodeName:l})});return j}return k.attributes},isEmpty:function(m,k){var r=this,o,n,q,j,l,p;m=m.firstChild;if(m){j=new h.dom.TreeWalker(m);k=k||r.schema?r.schema.getNonEmptyElements():null;do{q=m.nodeType;if(q===1){if(m.getAttribute("data-mce-bogus")){continue}l=m.nodeName.toLowerCase();if(k&&k[l]){p=m.parentNode;if(l==="br"&&r.isBlock(p)&&p.firstChild===m&&p.lastChild===m){continue}return false}n=r.getAttribs(m);o=m.attributes.length;while(o--){l=m.attributes[o].nodeName;if(l==="name"||l==="data-mce-bookmark"){return false}}}if((q===3&&!i.test(m.nodeValue))){return false}}while(m=j.next())}return true},destroy:function(k){var j=this;if(j.events){j.events.destroy()}j.win=j.doc=j.root=j.events=null;if(!k){h.removeUnload(j.destroy)}},createRng:function(){var j=this.doc;return j.createRange?j.createRange():new h.dom.Range(this)},nodeIndex:function(n,o){var j=0,l,m,k;if(n){for(l=n.nodeType,n=n.previousSibling,m=n;n;n=n.previousSibling){k=n.nodeType;if(o&&k==3){if(k==l||!n.nodeValue.length){continue}}j++;l=k}}return j},split:function(n,m,q){var s=this,j=s.createRng(),o,l,p;function k(v){var t,r=v.childNodes,u=v.nodeType;if(u==1&&v.getAttribute("data-mce-type")=="bookmark"){return}for(t=r.length-1;t>=0;t--){k(r[t])}if(u!=9){if(u==3&&v.nodeValue.length>0){if(!s.isBlock(v.parentNode)||h.trim(v.nodeValue).length>0){return}}else{if(u==1){r=v.childNodes;if(r.length==1&&r[0]&&r[0].nodeType==1&&r[0].getAttribute("data-mce-type")=="bookmark"){v.parentNode.insertBefore(r[0],v)}if(r.length||/^(br|hr|input|img)$/i.test(v.nodeName)){return}}}s.remove(v)}return v}if(n&&m){j.setStart(n.parentNode,s.nodeIndex(n));j.setEnd(m.parentNode,s.nodeIndex(m));o=j.extractContents();j=s.createRng();j.setStart(m.parentNode,s.nodeIndex(m)+1);j.setEnd(n.parentNode,s.nodeIndex(n)+1);l=j.extractContents();p=n.parentNode;p.insertBefore(k(o),n);if(q){p.replaceChild(q,m)}else{p.insertBefore(m,n)}p.insertBefore(k(l),n);s.remove(n);return q||m}},bind:function(n,j,m,l){var k=this;if(!k.events){k.events=new h.dom.EventUtils()}return k.events.add(n,j,m,l||this)},unbind:function(m,j,l){var k=this;if(!k.events){k.events=new h.dom.EventUtils()}return k.events.remove(m,j,l)},_findSib:function(m,j,k){var l=this,n=j;if(m){if(e(n,"string")){n=function(o){return l.is(o,j)}}for(m=m[k];m;m=m[k]){if(n(m)){return m}}}return null},_isRes:function(j){return/^(top|left|bottom|right|width|height)/i.test(j)||/;\s*(top|left|bottom|right|width|height)/i.test(j)}});h.DOM=new h.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var N=this,e=c.doc,S=0,E=1,j=2,D=true,R=false,U="startOffset",h="startContainer",P="endContainer",z="endOffset",k=tinymce.extend,n=c.nodeIndex;k(N,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:D,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:I,setEndBefore:J,setEndAfter:u,collapse:A,selectNode:x,selectNodeContents:F,compareBoundaryPoints:v,deleteContents:p,extractContents:H,cloneContents:d,insertNode:C,surroundContents:M,cloneRange:K});function q(V,t){B(D,V,t)}function s(V,t){B(R,V,t)}function g(t){q(t.parentNode,n(t))}function I(t){q(t.parentNode,n(t)+1)}function J(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function A(t){if(t){N[P]=N[h];N[z]=N[U]}else{N[h]=N[P];N[U]=N[z]}N.collapsed=D}function x(t){g(t);u(t)}function F(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(Y,t){var ab=N[h],W=N[U],aa=N[P],V=N[z],Z=t.startContainer,ad=t.startOffset,X=t.endContainer,ac=t.endOffset;if(Y===0){return G(ab,W,Z,ad)}if(Y===1){return G(aa,V,Z,ad)}if(Y===2){return G(aa,V,X,ac)}if(Y===3){return G(ab,W,X,ac)}}function p(){m(j)}function H(){return m(S)}function d(){return m(E)}function C(Y){var V=this[h],t=this[U],X,W;if((V.nodeType===3||V.nodeType===4)&&V.nodeValue){if(!t){V.parentNode.insertBefore(Y,V)}else{if(t>=V.nodeValue.length){c.insertAfter(Y,V)}else{X=V.splitText(t);V.parentNode.insertBefore(Y,X)}}}else{if(V.childNodes.length>0){W=V.childNodes[t]}if(W){V.insertBefore(Y,W)}else{V.appendChild(Y)}}}function M(V){var t=N.extractContents();N.insertNode(V);V.appendChild(t);N.selectNode(V)}function K(){return k(new b(c),{startContainer:N[h],startOffset:N[U],endContainer:N[P],endOffset:N[z],collapsed:N.collapsed,commonAncestorContainer:N.commonAncestorContainer})}function O(t,V){var W;if(t.nodeType==3){return t}if(V<0){return t}W=t.firstChild;while(W&&V>0){--V;W=W.nextSibling}if(W){return W}return t}function l(){return(N[h]==N[P]&&N[U]==N[z])}function G(X,Z,V,Y){var aa,W,t,ab,ad,ac;if(X==V){if(Z==Y){return 0}if(Z<Y){return -1}return 1}aa=V;while(aa&&aa.parentNode!=X){aa=aa.parentNode}if(aa){W=0;t=X.firstChild;while(t!=aa&&W<Z){W++;t=t.nextSibling}if(Z<=W){return -1}return 1}aa=X;while(aa&&aa.parentNode!=V){aa=aa.parentNode}if(aa){W=0;t=V.firstChild;while(t!=aa&&W<Y){W++;t=t.nextSibling}if(W<Y){return -1}return 1}ab=c.findCommonAncestor(X,V);ad=X;while(ad&&ad.parentNode!=ab){ad=ad.parentNode}if(!ad){ad=ab}ac=V;while(ac&&ac.parentNode!=ab){ac=ac.parentNode}if(!ac){ac=ab}if(ad==ac){return 0}t=ab.firstChild;while(t){if(t==ad){return -1}if(t==ac){return 1}t=t.nextSibling}}function B(V,Y,X){var t,W;if(V){N[h]=Y;N[U]=X}else{N[P]=Y;N[z]=X}t=N[P];while(t.parentNode){t=t.parentNode}W=N[h];while(W.parentNode){W=W.parentNode}if(W==t){if(G(N[h],N[U],N[P],N[z])>0){N.collapse(V)}}else{N.collapse(V)}N.collapsed=l();N.commonAncestorContainer=c.findCommonAncestor(N[h],N[P])}function m(ab){var aa,X=0,ad=0,V,Z,W,Y,t,ac;if(N[h]==N[P]){return f(ab)}for(aa=N[P],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[h]){return r(aa,ab)}++X}for(aa=N[h],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[P]){return T(aa,ab)}++ad}Z=ad-X;W=N[h];while(Z>0){W=W.parentNode;Z--}Y=N[P];while(Z<0){Y=Y.parentNode;Z++}for(t=W.parentNode,ac=Y.parentNode;t!=ac;t=t.parentNode,ac=ac.parentNode){W=t;Y=ac}return o(W,Y,ab)}function f(Z){var ab,Y,X,aa,t,W,V;if(Z!=j){ab=e.createDocumentFragment()}if(N[U]==N[z]){return ab}if(N[h].nodeType==3){Y=N[h].nodeValue;X=Y.substring(N[U],N[z]);if(Z!=E){N[h].deleteData(N[U],N[z]-N[U]);N.collapse(D)}if(Z==j){return}ab.appendChild(e.createTextNode(X));return ab}aa=O(N[h],N[U]);t=N[z]-N[U];while(t>0){W=aa.nextSibling;V=y(aa,Z);if(ab){ab.appendChild(V)}--t;aa=W}if(Z!=E){N.collapse(D)}return ab}function r(ab,Y){var aa,Z,V,t,X,W;if(Y!=j){aa=e.createDocumentFragment()}Z=i(ab,Y);if(aa){aa.appendChild(Z)}V=n(ab);t=V-N[U];if(t<=0){if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}Z=ab.previousSibling;while(t>0){X=Z.previousSibling;W=y(Z,Y);if(aa){aa.insertBefore(W,aa.firstChild)}--t;Z=X}if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}function T(Z,Y){var ab,V,aa,t,X,W;if(Y!=j){ab=e.createDocumentFragment()}aa=Q(Z,Y);if(ab){ab.appendChild(aa)}V=n(Z);++V;t=N[z]-V;aa=Z.nextSibling;while(t>0){X=aa.nextSibling;W=y(aa,Y);if(ab){ab.appendChild(W)}--t;aa=X}if(Y!=E){N.setStartAfter(Z);N.collapse(D)}return ab}function o(Z,t,ac){var W,ae,Y,aa,ab,V,ad,X;if(ac!=j){ae=e.createDocumentFragment()}W=Q(Z,ac);if(ae){ae.appendChild(W)}Y=Z.parentNode;aa=n(Z);ab=n(t);++aa;V=ab-aa;ad=Z.nextSibling;while(V>0){X=ad.nextSibling;W=y(ad,ac);if(ae){ae.appendChild(W)}ad=X;--V}W=i(t,ac);if(ae){ae.appendChild(W)}if(ac!=E){N.setStartAfter(Z);N.collapse(D)}return ae}function i(aa,ab){var W=O(N[P],N[z]-1),ac,Z,Y,t,V,X=W!=N[P];if(W==aa){return L(W,X,R,ab)}ac=W.parentNode;Z=L(ac,R,R,ab);while(ac){while(W){Y=W.previousSibling;t=L(W,X,R,ab);if(ab!=j){Z.insertBefore(t,Z.firstChild)}X=D;W=Y}if(ac==aa){return Z}W=ac.previousSibling;ac=ac.parentNode;V=L(ac,R,R,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function Q(aa,ab){var X=O(N[h],N[U]),Y=X!=N[h],ac,Z,W,t,V;if(X==aa){return L(X,Y,D,ab)}ac=X.parentNode;Z=L(ac,R,D,ab);while(ac){while(X){W=X.nextSibling;t=L(X,Y,D,ab);if(ab!=j){Z.appendChild(t)}Y=D;X=W}if(ac==aa){return Z}X=ac.nextSibling;ac=ac.parentNode;V=L(ac,R,D,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function L(t,Y,ab,ac){var X,W,Z,V,aa;if(Y){return y(t,ac)}if(t.nodeType==3){X=t.nodeValue;if(ab){V=N[U];W=X.substring(V);Z=X.substring(0,V)}else{V=N[z];W=X.substring(0,V);Z=X.substring(V)}if(ac!=E){t.nodeValue=Z}if(ac==j){return}aa=t.cloneNode(R);aa.nodeValue=W;return aa}if(ac==j){return}return t.cloneNode(R)}function y(V,t){if(t!=j){return t==E?V.cloneNode(D):V}V.parentNode.removeChild(V)}}a.Range=b})(tinymce.dom);(function(){function a(d){var b=this,h=d.dom,c=true,f=false;function e(i,j){var k,t=0,q,n,m,l,o,r,p=-1,s;k=i.duplicate();k.collapse(j);s=k.parentElement();if(s.ownerDocument!==d.dom.doc){return}while(s.contentEditable==="false"){s=s.parentNode}if(!s.hasChildNodes()){return{node:s,inside:1}}m=s.children;q=m.length-1;while(t<=q){r=Math.floor((t+q)/2);l=m[r];k.moveToElementText(l);p=k.compareEndPoints(j?"StartToStart":"EndToEnd",i);if(p>0){q=r-1}else{if(p<0){t=r+1}else{return{node:l}}}}if(p<0){if(!l){k.moveToElementText(s);k.collapse(true);l=s;n=true}else{k.collapse(false)}k.setEndPoint(j?"EndToStart":"EndToEnd",i);if(k.compareEndPoints(j?"StartToStart":"StartToEnd",i)>0){k=i.duplicate();k.collapse(j);o=-1;while(s==k.parentElement()){if(k.move("character",-1)==0){break}o++}}o=o||k.text.replace("\r\n"," ").length}else{k.collapse(true);k.setEndPoint(j?"StartToStart":"StartToEnd",i);o=k.text.replace("\r\n"," ").length}return{node:l,position:p,offset:o,inside:n}}function g(){var i=d.getRng(),r=h.createRng(),l,k,p,q,m,j;l=i.item?i.item(0):i.parentElement();if(l.ownerDocument!=h.doc){return r}k=d.isCollapsed();if(i.item){r.setStart(l.parentNode,h.nodeIndex(l));r.setEnd(r.startContainer,r.startOffset+1);return r}function o(A){var u=e(i,A),s,y,z=0,x,v,t;s=u.node;y=u.offset;if(u.inside&&!s.hasChildNodes()){r[A?"setStart":"setEnd"](s,0);return}if(y===v){r[A?"setStartBefore":"setEndAfter"](s);return}if(u.position<0){x=u.inside?s.firstChild:s.nextSibling;if(!x){r[A?"setStartAfter":"setEndAfter"](s);return}if(!y){if(x.nodeType==3){r[A?"setStart":"setEnd"](x,0)}else{r[A?"setStartBefore":"setEndBefore"](x)}return}while(x){t=x.nodeValue;z+=t.length;if(z>=y){s=x;z-=y;z=t.length-z;break}x=x.nextSibling}}else{x=s.previousSibling;if(!x){return r[A?"setStartBefore":"setEndBefore"](s)}if(!y){if(s.nodeType==3){r[A?"setStart":"setEnd"](x,s.nodeValue.length)}else{r[A?"setStartAfter":"setEndAfter"](x)}return}while(x){z+=x.nodeValue.length;if(z>=y){s=x;z-=y;break}x=x.previousSibling}}r[A?"setStart":"setEnd"](s,z)}try{o(true);if(!k){o()}}catch(n){if(n.number==-2147024809){m=b.getBookmark(2);p=i.duplicate();p.collapse(true);l=p.parentElement();if(!k){p=i.duplicate();p.collapse(false);q=p.parentElement();q.innerHTML=q.innerHTML}l.innerHTML=l.innerHTML;b.moveToBookmark(m);i=d.getRng();o(true);if(!k){o()}}else{throw n}}return r}this.getBookmark=function(m){var j=d.getRng(),o,i,l={};function n(u){var u,t,p,s,r,q=[];t=u.parentNode;p=h.getRoot().parentNode;while(t!=p){s=t.children;r=s.length;while(r--){if(u===s[r]){q.push(r);break}}u=t;t=t.parentNode}return q}function k(q){var p;p=e(j,q);if(p){return{position:p.position,offset:p.offset,indexes:n(p.node),inside:p.inside}}}if(m===2){if(!j.item){l.start=k(true);if(!d.isCollapsed()){l.end=k()}}else{l.start={ctrl:true,indexes:n(j.item(0))}}}return l};this.moveToBookmark=function(k){var j,i=h.doc.body;function m(o){var r,q,n,p;r=h.getRoot();for(q=o.length-1;q>=0;q--){p=r.children;n=o[q];if(n<=p.length-1){r=p[n]}}return r}function l(r){var n=k[r?"start":"end"],q,p,o;if(n){q=n.position>0;p=i.createTextRange();p.moveToElementText(m(n.indexes));offset=n.offset;if(offset!==o){p.collapse(n.inside||q);p.moveStart("character",q?-offset:offset)}else{p.collapse(r)}j.setEndPoint(r?"StartToStart":"EndToStart",p);if(r){j.collapse(true)}}}if(k.start){if(k.start.ctrl){j=i.createControlRange();j.addElement(m(k.start.indexes));j.select()}else{j=i.createTextRange();l(true);l();j.select()}}};this.addRange=function(i){var n,l,k,p,s,q,r=d.dom.doc,m=r.body;function j(z){var u,y,t,x,v;t=h.create("a");u=z?k:s;y=z?p:q;x=n.duplicate();if(u==r||u==r.documentElement){u=m;y=0}if(u.nodeType==3){u.parentNode.insertBefore(t,u);x.moveToElementText(t);x.moveStart("character",y);h.remove(t);n.setEndPoint(z?"StartToStart":"EndToEnd",x)}else{v=u.childNodes;if(v.length){if(y>=v.length){h.insertAfter(t,v[v.length-1])}else{u.insertBefore(t,v[y])}x.moveToElementText(t)}else{t=r.createTextNode("\uFEFF");u.appendChild(t);x.moveToElementText(t.parentNode);x.collapse(c)}n.setEndPoint(z?"StartToStart":"EndToEnd",x);h.remove(t)}}k=i.startContainer;p=i.startOffset;s=i.endContainer;q=i.endOffset;n=m.createTextRange();if(k==s&&k.nodeType==1&&p==q-1){if(p==q-1){try{l=m.createControlRange();l.addElement(k.childNodes[p]);l.select();return}catch(o){}}}j(true);j();n.select()};this.getRangeAt=g}tinymce.dom.TridentSelection=a})();(function(){var p=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,j=0,d=Object.prototype.toString,o=false,i=true;[0,0].sort(function(){i=false;return 0});var b=function(v,e,z,A){z=z||[];e=e||document;var C=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!v||typeof v!=="string"){return z}var x=[],s,E,H,r,u=true,t=b.isXML(e),B=v,D,G,F,y;do{p.exec("");s=p.exec(B);if(s){B=s[3];x.push(s[1]);if(s[2]){r=s[3];break}}}while(s);if(x.length>1&&k.exec(v)){if(x.length===2&&f.relative[x[0]]){E=h(x[0]+x[1],e)}else{E=f.relative[x[0]]?[e]:b(x.shift(),e);while(x.length){v=x.shift();if(f.relative[v]){v+=x.shift()}E=h(v,E)}}}else{if(!A&&x.length>1&&e.nodeType===9&&!t&&f.match.ID.test(x[0])&&!f.match.ID.test(x[x.length-1])){D=b.find(x.shift(),e,t);e=D.expr?b.filter(D.expr,D.set)[0]:D.set[0]}if(e){D=A?{expr:x.pop(),set:a(A)}:b.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&e.parentNode?e.parentNode:e,t);E=D.expr?b.filter(D.expr,D.set):D.set;if(x.length>0){H=a(E)}else{u=false}while(x.length){G=x.pop();F=G;if(!f.relative[G]){G=""}else{F=x.pop()}if(F==null){F=e}f.relative[G](H,F,t)}}else{H=x=[]}}if(!H){H=E}if(!H){b.error(G||v)}if(d.call(H)==="[object Array]"){if(!u){z.push.apply(z,H)}else{if(e&&e.nodeType===1){for(y=0;H[y]!=null;y++){if(H[y]&&(H[y]===true||H[y].nodeType===1&&b.contains(e,H[y]))){z.push(E[y])}}}else{for(y=0;H[y]!=null;y++){if(H[y]&&H[y].nodeType===1){z.push(E[y])}}}}}else{a(H,z)}if(r){b(r,C,z,A);b.uniqueSort(z)}return z};b.uniqueSort=function(r){if(c){o=i;r.sort(c);if(o){for(var e=1;e<r.length;e++){if(r[e]===r[e-1]){r.splice(e--,1)}}}}return r};b.matches=function(e,r){return b(e,null,null,r)};b.find=function(y,e,z){var x;if(!y){return[]}for(var t=0,s=f.order.length;t<s;t++){var v=f.order[t],u;if((u=f.leftMatch[v].exec(y))){var r=u[1];u.splice(1,1);if(r.substr(r.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");x=f.find[v](u,e,z);if(x!=null){y=y.replace(f.match[v],"");break}}}}if(!x){x=e.getElementsByTagName("*")}return{set:x,expr:y}};b.filter=function(C,B,F,u){var s=C,H=[],z=B,x,e,y=B&&B[0]&&b.isXML(B[0]);while(C&&B.length){for(var A in f.filter){if((x=f.leftMatch[A].exec(C))!=null&&x[2]){var r=f.filter[A],G,E,t=x[1];e=false;x.splice(1,1);if(t.substr(t.length-1)==="\\"){continue}if(z===H){H=[]}if(f.preFilter[A]){x=f.preFilter[A](x,z,F,H,u,y);if(!x){e=G=true}else{if(x===true){continue}}}if(x){for(var v=0;(E=z[v])!=null;v++){if(E){G=r(E,x,v,z);var D=u^!!G;if(F&&G!=null){if(D){e=true}else{z[v]=false}}else{if(D){H.push(E);e=true}}}}}if(G!==undefined){if(!F){z=H}C=C.replace(f.match[A],"");if(!e){return[]}break}}}if(C===s){if(e==null){b.error(C)}else{break}}s=C}return z};b.error=function(e){throw"Syntax error, unrecognized expression: "+e};var f=b.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")}},relative:{"+":function(x,r){var t=typeof r==="string",v=t&&!/\W/.test(r),y=t&&!v;if(v){r=r.toLowerCase()}for(var s=0,e=x.length,u;s<e;s++){if((u=x[s])){while((u=u.previousSibling)&&u.nodeType!==1){}x[s]=y||u&&u.nodeName.toLowerCase()===r?u||false:u===r}}if(y){b.filter(r,x,true)}},">":function(x,r){var u=typeof r==="string",v,s=0,e=x.length;if(u&&!/\W/.test(r)){r=r.toLowerCase();for(;s<e;s++){v=x[s];if(v){var t=v.parentNode;x[s]=t.nodeName.toLowerCase()===r?t:false}}}else{for(;s<e;s++){v=x[s];if(v){x[s]=u?v.parentNode:v.parentNode===r}}if(u){b.filter(r,x,true)}}},"":function(t,r,v){var s=j++,e=q,u;if(typeof r==="string"&&!/\W/.test(r)){r=r.toLowerCase();u=r;e=n}e("parentNode",r,s,t,u,v)},"~":function(t,r,v){var s=j++,e=q,u;if(typeof r==="string"&&!/\W/.test(r)){r=r.toLowerCase();u=r;e=n}e("previousSibling",r,s,t,u,v)}},find:{ID:function(r,s,t){if(typeof s.getElementById!=="undefined"&&!t){var e=s.getElementById(r[1]);return e?[e]:[]}},NAME:function(s,v){if(typeof v.getElementsByName!=="undefined"){var r=[],u=v.getElementsByName(s[1]);for(var t=0,e=u.length;t<e;t++){if(u[t].getAttribute("name")===s[1]){r.push(u[t])}}return r.length===0?null:r}},TAG:function(e,r){return r.getElementsByTagName(e[1])}},preFilter:{CLASS:function(t,r,s,e,x,y){t=" "+t[1].replace(/\\/g,"")+" ";if(y){return t}for(var u=0,v;(v=r[u])!=null;u++){if(v){if(x^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(t)>=0)){if(!s){e.push(v)}}else{if(s){r[u]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(r,e){return r[1].toLowerCase()},CHILD:function(e){if(e[1]==="nth"){var r=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(r[1]+(r[2]||1))-0;e[3]=r[3]-0}e[0]=j++;return e},ATTR:function(u,r,s,e,v,x){var t=u[1].replace(/\\/g,"");if(!x&&f.attrMap[t]){u[1]=f.attrMap[t]}if(u[2]==="~="){u[4]=" "+u[4]+" "}return u},PSEUDO:function(u,r,s,e,v){if(u[1]==="not"){if((p.exec(u[3])||"").length>1||/^\w/.test(u[3])){u[3]=b(u[3],null,null,r)}else{var t=b.filter(u[3],r,s,true^v);if(!s){e.push.apply(e,t)}return false}}else{if(f.match.POS.test(u[0])||f.match.CHILD.test(u[0])){return true}}return u},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(s,r,e){return !!b(e[3],s).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(r,e){return e===0},last:function(s,r,e,t){return r===t.length-1},even:function(r,e){return e%2===0},odd:function(r,e){return e%2===1},lt:function(s,r,e){return r<e[3]-0},gt:function(s,r,e){return r>e[3]-0},nth:function(s,r,e){return e[3]-0===r},eq:function(s,r,e){return e[3]-0===r}},filter:{PSEUDO:function(s,y,x,z){var e=y[1],r=f.filters[e];if(r){return r(s,x,y,z)}else{if(e==="contains"){return(s.textContent||s.innerText||b.getText([s])||"").indexOf(y[3])>=0}else{if(e==="not"){var t=y[3];for(var v=0,u=t.length;v<u;v++){if(t[v]===s){return false}}return true}else{b.error("Syntax error, unrecognized expression: "+e)}}}},CHILD:function(e,t){var x=t[1],r=e;switch(x){case"only":case"first":while((r=r.previousSibling)){if(r.nodeType===1){return false}}if(x==="first"){return true}r=e;case"last":while((r=r.nextSibling)){if(r.nodeType===1){return false}}return true;case"nth":var s=t[2],A=t[3];if(s===1&&A===0){return true}var v=t[0],z=e.parentNode;if(z&&(z.sizcache!==v||!e.nodeIndex)){var u=0;for(r=z.firstChild;r;r=r.nextSibling){if(r.nodeType===1){r.nodeIndex=++u}}z.sizcache=v}var y=e.nodeIndex-A;if(s===0){return y===0}else{return(y%s===0&&y/s>=0)}}},ID:function(r,e){return r.nodeType===1&&r.getAttribute("id")===e},TAG:function(r,e){return(e==="*"&&r.nodeType===1)||r.nodeName.toLowerCase()===e},CLASS:function(r,e){return(" "+(r.className||r.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(v,t){var s=t[1],e=f.attrHandle[s]?f.attrHandle[s](v):v[s]!=null?v[s]:v.getAttribute(s),x=e+"",u=t[2],r=t[4];return e==null?u==="!=":u==="="?x===r:u==="*="?x.indexOf(r)>=0:u==="~="?(" "+x+" ").indexOf(r)>=0:!r?x&&e!==false:u==="!="?x!==r:u==="^="?x.indexOf(r)===0:u==="$="?x.substr(x.length-r.length)===r:u==="|="?x===r||x.substr(0,r.length+1)===r+"-":false},POS:function(u,r,s,v){var e=r[2],t=f.setFilters[e];if(t){return t(u,s,r,v)}}}};var k=f.match.POS,g=function(r,e){return"\\"+(e-0+1)};for(var m in f.match){f.match[m]=new RegExp(f.match[m].source+(/(?![^\[]*\])(?![^\(]*\))/.source));f.leftMatch[m]=new RegExp(/(^(?:.|\r|\n)*?)/.source+f.match[m].source.replace(/\\(\d+)/g,g))}var a=function(r,e){r=Array.prototype.slice.call(r,0);if(e){e.push.apply(e,r);return e}return r};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(l){a=function(u,t){var r=t||[],s=0;if(d.call(u)==="[object Array]"){Array.prototype.push.apply(r,u)}else{if(typeof u.length==="number"){for(var e=u.length;s<e;s++){r.push(u[s])}}else{for(;u[s];s++){r.push(u[s])}}}return r}}var c;if(document.documentElement.compareDocumentPosition){c=function(r,e){if(!r.compareDocumentPosition||!e.compareDocumentPosition){if(r==e){o=true}return r.compareDocumentPosition?-1:1}var s=r.compareDocumentPosition(e)&4?-1:r===e?0:1;if(s===0){o=true}return s}}else{if("sourceIndex" in document.documentElement){c=function(r,e){if(!r.sourceIndex||!e.sourceIndex){if(r==e){o=true}return r.sourceIndex?-1:1}var s=r.sourceIndex-e.sourceIndex;if(s===0){o=true}return s}}else{if(document.createRange){c=function(t,r){if(!t.ownerDocument||!r.ownerDocument){if(t==r){o=true}return t.ownerDocument?-1:1}var s=t.ownerDocument.createRange(),e=r.ownerDocument.createRange();s.setStart(t,0);s.setEnd(t,0);e.setStart(r,0);e.setEnd(r,0);var u=s.compareBoundaryPoints(Range.START_TO_END,e);if(u===0){o=true}return u}}}}b.getText=function(e){var r="",t;for(var s=0;e[s];s++){t=e[s];if(t.nodeType===3||t.nodeType===4){r+=t.nodeValue}else{if(t.nodeType!==8){r+=b.getText(t.childNodes)}}}return r};(function(){var r=document.createElement("div"),s="script"+(new Date()).getTime();r.innerHTML="<a name='"+s+"'/>";var e=document.documentElement;e.insertBefore(r,e.firstChild);if(document.getElementById(s)){f.find.ID=function(u,v,x){if(typeof v.getElementById!=="undefined"&&!x){var t=v.getElementById(u[1]);return t?t.id===u[1]||typeof t.getAttributeNode!=="undefined"&&t.getAttributeNode("id").nodeValue===u[1]?[t]:undefined:[]}};f.filter.ID=function(v,t){var u=typeof v.getAttributeNode!=="undefined"&&v.getAttributeNode("id");return v.nodeType===1&&u&&u.nodeValue===t}}e.removeChild(r);e=r=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){f.find.TAG=function(r,v){var u=v.getElementsByTagName(r[1]);if(r[1]==="*"){var t=[];for(var s=0;u[s];s++){if(u[s].nodeType===1){t.push(u[s])}}u=t}return u}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){f.attrHandle.href=function(r){return r.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=b,s=document.createElement("div");s.innerHTML="<p class='TEST'></p>";if(s.querySelectorAll&&s.querySelectorAll(".TEST").length===0){return}b=function(x,v,t,u){v=v||document;if(!u&&v.nodeType===9&&!b.isXML(v)){try{return a(v.querySelectorAll(x),t)}catch(y){}}return e(x,v,t,u)};for(var r in e){b[r]=e[r]}s=null})()}(function(){var e=document.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}f.order.splice(1,0,"CLASS");f.find.CLASS=function(r,s,t){if(typeof s.getElementsByClassName!=="undefined"&&!t){return s.getElementsByClassName(r[1])}};e=null})();function n(r,x,v,A,y,z){for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1&&!z){e.sizcache=v;e.sizset=t}if(e.nodeName.toLowerCase()===x){u=e;break}e=e[r]}A[t]=u}}}function q(r,x,v,A,y,z){for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1){if(!z){e.sizcache=v;e.sizset=t}if(typeof x!=="string"){if(e===x){u=true;break}}else{if(b.filter(x,[e]).length>0){u=e;break}}}e=e[r]}A[t]=u}}}b.contains=document.compareDocumentPosition?function(r,e){return !!(r.compareDocumentPosition(e)&16)}:function(r,e){return r!==e&&(r.contains?r.contains(e):true)};b.isXML=function(e){var r=(e?e.ownerDocument||e:0).documentElement;return r?r.nodeName!=="HTML":false};var h=function(e,y){var t=[],u="",v,s=y.nodeType?[y]:y;while((v=f.match.PSEUDO.exec(e))){u+=v[0];e=e.replace(f.match.PSEUDO,"")}e=f.relative[e]?e+"*":e;for(var x=0,r=s.length;x<r;x++){b(e,s[x],t)}return b.filter(u,t)};window.tinymce.dom.Sizzle=b})();(function(d){var f=d.each,c=d.DOM,b=d.isIE,e=d.isWebKit,a;d.create("tinymce.dom.EventUtils",{EventUtils:function(){this.inits=[];this.events=[]},add:function(m,p,l,j){var g,h=this,i=h.events,k;if(p instanceof Array){k=[];f(p,function(o){k.push(h.add(m,o,l,j))});return k}if(m&&m.hasOwnProperty&&m instanceof Array){k=[];f(m,function(n){n=c.get(n);k.push(h.add(n,p,l,j))});return k}m=c.get(m);if(!m){return}g=function(n){if(h.disabled){return}n=n||window.event;if(n&&b){if(!n.target){n.target=n.srcElement}d.extend(n,h._stoppers)}if(!j){return l(n)}return l.call(j,n)};if(p=="unload"){d.unloads.unshift({func:g});return g}if(p=="init"){if(h.domLoaded){g()}else{h.inits.push(g)}return g}i.push({obj:m,name:p,func:l,cfunc:g,scope:j});h._add(m,p,g);return l},remove:function(l,m,k){var h=this,g=h.events,i=false,j;if(l&&l.hasOwnProperty&&l instanceof Array){j=[];f(l,function(n){n=c.get(n);j.push(h.remove(n,m,k))});return j}l=c.get(l);f(g,function(o,n){if(o.obj==l&&o.name==m&&(!k||(o.func==k||o.cfunc==k))){g.splice(n,1);h._remove(l,m,o.cfunc);i=true;return false}});return i},clear:function(l){var j=this,g=j.events,h,k;if(l){l=c.get(l);for(h=g.length-1;h>=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},destroy:function(){var g=this;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(h){var g=this;if(g.domLoaded){return}g.domLoaded=true;f(g.inits,function(i){i()});g.inits=[]},_wait:function(i){var g=this,h=i.document;if(i.tinyMCE_GZ&&tinyMCE_GZ.loaded){g.domLoaded=1;return}if(h.attachEvent){h.attachEvent("onreadystatechange",function(){if(h.readyState==="complete"){h.detachEvent("onreadystatechange",arguments.callee);g._pageInit(i)}});if(h.documentElement.doScroll&&i==i.top){(function(){if(g.domLoaded){return}try{h.documentElement.doScroll("left")}catch(j){setTimeout(arguments.callee,0);return}g._pageInit(i)})()}}else{if(h.addEventListener){g._add(i,"DOMContentLoaded",function(){g._pageInit(i)})}}g._add(i,"load",function(){g._pageInit(i)})},_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});a=d.dom.Event=new d.dom.EventUtils();a._wait(window);d.addUnload(function(){a.destroy()})})(tinymce);(function(a){a.dom.Element=function(f,d){var b=this,e,c;b.settings=d=d||{};b.id=f;b.dom=e=d.dom||a.DOM;if(!a.isIE){c=e.get(b.id)}a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/),function(g){b[g]=function(){var h=[f],j;for(j=0;j<arguments.length;j++){h.push(arguments[j])}h=e[g].apply(e,h);b.update(g);return h}});a.extend(b,{on:function(i,h,g){return a.dom.Event.add(b.id,i,h,g)},getXY:function(){return{x:parseInt(b.getStyle("left")),y:parseInt(b.getStyle("top"))}},getSize:function(){var g=e.get(b.id);return{w:parseInt(b.getStyle("width")||g.clientWidth),h:parseInt(b.getStyle("height")||g.clientHeight)}},moveTo:function(g,h){b.setStyles({left:g,top:h})},moveBy:function(g,i){var h=b.getXY();b.moveTo(h.x+g,h.y+i)},resizeTo:function(g,i){b.setStyles({width:g,height:i})},resizeBy:function(g,j){var i=b.getSize();b.resizeTo(i.w+g,i.h+j)},update:function(h){var g;if(a.isIE6&&d.blocker){h=h||"";if(h.indexOf("get")===0||h.indexOf("has")===0||h.indexOf("is")===0){return}if(h=="remove"){e.remove(b.blocker);return}if(!b.blocker){b.blocker=e.uniqueId();g=e.add(d.container||e.getRoot(),"iframe",{id:b.blocker,style:"position:absolute;",frameBorder:0,src:'javascript:""'});e.setStyle(g,"opacity",0)}else{g=e.get(b.blocker)}e.setStyles(g,{left:b.getStyle("left",1),top:b.getStyle("top",1),width:b.getStyle("width",1),height:b.getStyle("height",1),display:b.getStyle("display",1),zIndex:parseInt(b.getStyle("zIndex",1)||0)-1})}}})}})(tinymce);(function(c){function e(f){return f.replace(/[\n\r]+/g,"")}var b=c.is,a=c.isIE,d=c.each;c.create("tinymce.dom.Selection",{Selection:function(i,h,g){var f=this;f.dom=i;f.win=h;f.serializer=g;d(["onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent"],function(j){f[j]=new c.util.Dispatcher(f)});if(!f.win.getSelection){f.tridentSel=new c.dom.TridentSelection(f)}if(c.isIE&&i.boxModel){this._fixIESelection()}c.addUnload(f.destroy,f)},setCursorLocation:function(h,i){var f=this;var g=f.dom.createRng();g.setStart(h,i);g.setEnd(h,i);f.setRng(g);f.collapse(false)},getContent:function(g){var f=this,h=f.getRng(),l=f.dom.create("body"),j=f.getSel(),i,k,m;g=g||{};i=k="";g.get=true;g.format=g.format||"html";g.forced_root_block="";f.onBeforeGetContent.dispatch(f,g);if(g.format=="text"){return f.isCollapsed()?"":(h.text||(j.toString?j.toString():""))}if(h.cloneContents){m=h.cloneContents();if(m){l.appendChild(m)}}else{if(b(h.item)||b(h.htmlText)){l.innerHTML="<br>"+(h.item?h.item(0).outerHTML:h.htmlText);l.removeChild(l.firstChild)}else{l.innerHTML=h.toString()}}if(/^\s/.test(l.innerHTML)){i=" "}if(/\s+$/.test(l.innerHTML)){k=" "}g.getInner=true;g.content=f.isCollapsed()?"":i+f.serializer.serialize(l,g)+k;f.onGetContent.dispatch(f,g);return g.content},setContent:function(g,i){var n=this,f=n.getRng(),j,k=n.win.document,m,l;i=i||{format:"html"};i.set=true;g=i.content=g;if(!i.no_events){n.onBeforeSetContent.dispatch(n,i)}g=i.content;if(f.insertNode){g+='<span id="__caret">_</span>';if(f.startContainer==k&&f.endContainer==k){k.body.innerHTML=g}else{f.deleteContents();if(k.body.childNodes.length==0){k.body.innerHTML=g}else{if(f.createContextualFragment){f.insertNode(f.createContextualFragment(g))}else{m=k.createDocumentFragment();l=k.createElement("div");m.appendChild(l);l.outerHTML=g;f.insertNode(m)}}}j=n.dom.get("__caret");f=k.createRange();f.setStartBefore(j);f.setEndBefore(j);n.setRng(f);n.dom.remove("__caret");try{n.setRng(f)}catch(h){}}else{if(f.item){k.execCommand("Delete",false,null);f=n.getRng()}if(/^\s+/.test(g)){f.pasteHTML('<span id="__mce_tmp">_</span>'+g);n.dom.remove("__mce_tmp")}else{f.pasteHTML(g)}}if(!i.no_events){n.onSetContent.dispatch(n,i)}},getStart:function(){var g=this.getRng(),h,f,j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}j=g.duplicate();j.collapse(1);h=j.parentElement();f=i=g.parentElement();while(i=i.parentNode){if(i==h){h=f;break}}return h}else{h=g.startContainer;if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[Math.min(h.childNodes.length-1,g.startOffset)]}if(h&&h.nodeType==3){return h.parentNode}return h}},getEnd:function(){var g=this,h=g.getRng(),i,f;if(h.duplicate||h.item){if(h.item){return h.item(0)}h=h.duplicate();h.collapse(0);i=h.parentElement();if(i&&i.nodeName=="BODY"){return i.lastChild||i}return i}else{i=h.endContainer;f=h.endOffset;if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[f>0?f-1:f]}if(i&&i.nodeType==3){return i.parentNode}return i}},getBookmark:function(r,s){var v=this,m=v.dom,g,j,i,n,h,o,p,l="\uFEFF",u;function f(x,y){var t=0;d(m.select(x),function(A,z){if(A==y){t=z}});return t}if(r==2){function k(){var x=v.getRng(true),t=m.getRoot(),y={};function z(C,H){var B=C[H?"startContainer":"endContainer"],G=C[H?"startOffset":"endOffset"],A=[],D,F,E=0;if(B.nodeType==3){if(s){for(D=B.previousSibling;D&&D.nodeType==3;D=D.previousSibling){G+=D.nodeValue.length}}A.push(G)}else{F=B.childNodes;if(G>=F.length&&F.length){E=1;G=Math.max(0,F.length-1)}A.push(v.dom.nodeIndex(F[G],s)+E)}for(;B&&B!=t;B=B.parentNode){A.push(v.dom.nodeIndex(B,s))}return A}y.start=z(x,true);if(!v.isCollapsed()){y.end=z(x)}return y}if(v.tridentSel){return v.tridentSel.getBookmark(r)}return k()}if(r){return{rng:v.getRng()}}g=v.getRng();i=m.uniqueId();n=tinyMCE.activeEditor.selection.isCollapsed();u="overflow:hidden;line-height:0px";if(g.duplicate||g.item){if(!g.item){j=g.duplicate();try{g.collapse();g.pasteHTML('<span data-mce-type="bookmark" id="'+i+'_start" style="'+u+'">'+l+"</span>");if(!n){j.collapse(false);g.moveToElementText(j.parentElement());if(g.compareEndPoints("StartToEnd",j)==0){j.move("character",-1)}j.pasteHTML('<span data-mce-type="bookmark" id="'+i+'_end" style="'+u+'">'+l+"</span>")}}catch(q){return null}}else{o=g.item(0);h=o.nodeName;return{name:h,index:f(h,o)}}}else{o=v.getNode();h=o.nodeName;if(h=="IMG"){return{name:h,index:f(h,o)}}j=g.cloneRange();if(!n){j.collapse(false);j.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_end",style:u},l))}g.collapse(true);g.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_start",style:u},l))}v.moveToBookmark({id:i,keep:1});return{id:i}},moveToBookmark:function(n){var r=this,l=r.dom,i,h,f,q,j,s,o,p;if(n){if(n.start){f=l.createRng();q=l.getRoot();function g(z){var t=n[z?"start":"end"],v,x,y,u;if(t){y=t[0];for(x=q,v=t.length-1;v>=1;v--){u=x.childNodes;if(t[v]>u.length-1){return}x=u[t[v]]}if(x.nodeType===3){y=Math.min(t[0],x.nodeValue.length)}if(x.nodeType===1){y=Math.min(t[0],x.childNodes.length)}if(z){f.setStart(x,y)}else{f.setEnd(x,y)}}return true}if(r.tridentSel){return r.tridentSel.moveToBookmark(n)}if(g(true)&&g()){r.setRng(f)}}else{if(n.id){function k(A){var u=l.get(n.id+"_"+A),z,t,x,y,v=n.keep;if(u){z=u.parentNode;if(A=="start"){if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}j=s=z;o=p=t}else{if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}s=z;p=t}if(!v){y=u.previousSibling;x=u.nextSibling;d(c.grep(u.childNodes),function(B){if(B.nodeType==3){B.nodeValue=B.nodeValue.replace(/\uFEFF/g,"")}});while(u=l.get(n.id+"_"+A)){l.remove(u,1)}if(y&&x&&y.nodeType==x.nodeType&&y.nodeType==3&&!c.isOpera){t=y.nodeValue.length;y.appendData(x.nodeValue);l.remove(x);if(A=="start"){j=s=y;o=p=t}else{s=y;p=t}}}}}function m(t){if(l.isBlock(t)&&!t.innerHTML){t.innerHTML=!a?'<br data-mce-bogus="1" />':" "}return t}k("start");k("end");if(j){f=l.createRng();f.setStart(m(j),o);f.setEnd(m(s),p);r.setRng(f)}}else{if(n.name){r.select(l.select(n.name)[n.index])}else{if(n.rng){r.setRng(n.rng)}}}}}},select:function(k,j){var i=this,l=i.dom,g=l.createRng(),f;if(k){f=l.nodeIndex(k);g.setStart(k.parentNode,f);g.setEnd(k.parentNode,f+1);if(j){function h(m,o){var n=new c.dom.TreeWalker(m,m);do{if(m.nodeType==3&&c.trim(m.nodeValue).length!=0){if(o){g.setStart(m,0)}else{g.setEnd(m,m.nodeValue.length)}return}if(m.nodeName=="BR"){if(o){g.setStartBefore(m)}else{g.setEndBefore(m)}return}}while(m=(o?n.next():n.prev()))}h(k,1);h(k)}i.setRng(g)}return k},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}if(h.compareEndPoints){return h.compareEndPoints("StartToEnd",h)===0}return !g||h.collapsed},collapse:function(f){var h=this,g=h.getRng(),i;if(g.item){i=g.item(0);g=h.win.document.body.createTextRange();g.moveToElementText(i)}g.collapse(!!f);h.setRng(g)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(l){var g=this,h,i,k,j=g.win.document;if(l&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():j.createRange())}}catch(f){}if(c.isIE&&i&&i.setStart&&j.selection.createRange().item){k=j.selection.createRange().item(0);i=j.createRange();i.setStartBefore(k);i.setEndAfter(k)}if(!i){i=j.createRange?j.createRange():j.body.createTextRange()}if(g.selectedRange&&g.explicitRange){if(i.compareBoundaryPoints(i.START_TO_START,g.selectedRange)===0&&i.compareBoundaryPoints(i.END_TO_END,g.selectedRange)===0){i=g.explicitRange}else{g.selectedRange=null;g.explicitRange=null}}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){g.explicitRange=i;try{h.removeAllRanges()}catch(f){}h.addRange(i);g.selectedRange=h.getRangeAt(0)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var h=this,g=h.getRng(),i=h.getSel(),l,k=g.startContainer,f=g.endContainer;if(!g){return h.dom.getRoot()}if(g.setStart){l=g.commonAncestorContainer;if(!g.collapsed){if(g.startContainer==g.endContainer){if(g.endOffset-g.startOffset<2){if(g.startContainer.hasChildNodes()){l=g.startContainer.childNodes[g.startOffset]}}}if(k.nodeType===3&&f.nodeType===3){function j(p,m){var o=p;while(p&&p.nodeType===3&&p.length===0){p=m?p.nextSibling:p.previousSibling}return p||o}if(k.length===g.startOffset){k=j(k.nextSibling,true)}else{k=k.parentNode}if(g.endOffset===0){f=j(f.previousSibling,false)}else{f=f.parentNode}if(k&&k===f){return k}}}if(l&&l.nodeType==3){return l.parentNode}return l}return g.item?g.item(0):g.parentElement()},getSelectedBlocks:function(g,f){var i=this,j=i.dom,m,h,l,k=[];m=j.getParent(g||i.getStart(),j.isBlock);h=j.getParent(f||i.getEnd(),j.isBlock);if(m){k.push(m)}if(m&&h&&m!=h){l=m;while((l=l.nextSibling)&&l!=h){if(j.isBlock(l)){k.push(l)}}}if(h&&m!=h){k.push(h)}return k},normalize:function(){var g=this,f,i;if(c.isIE){return}function h(p){var k,o,n,m=g.dom,j=m.getRoot(),l;k=f[(p?"start":"end")+"Container"];o=f[(p?"start":"end")+"Offset"];if(k.nodeType===9){k=k.body;o=0}if(k===j){if(k.hasChildNodes()){k=k.childNodes[Math.min(!p&&o>0?o-1:o,k.childNodes.length-1)];o=0;if(k.hasChildNodes()){l=k;n=new c.dom.TreeWalker(k,j);do{if(l.nodeType===3){o=p?0:l.nodeValue.length-1;k=l;break}if(l.nodeName==="BR"){o=m.nodeIndex(l);k=l.parentNode;break}}while(l=(p?n.next():n.prev()));i=true}}}if(i){f["set"+(p?"Start":"End")](k,o)}}f=g.getRng();h(true);if(f.collapsed){h()}if(i){g.setRng(f)}},destroy:function(g){var f=this;f.win=null;if(!g){c.removeUnload(f.destroy)}},_fixIESelection:function(){var g=this.dom,m=g.doc,h=m.body,j,n,f;m.documentElement.unselectable=true;function i(o,r){var p=h.createTextRange();try{p.moveToPoint(o,r)}catch(q){p=null}return p}function l(p){var o;if(p.button){o=i(p.x,p.y);if(o){if(o.compareEndPoints("StartToStart",n)>0){o.setEndPoint("StartToStart",n)}else{o.setEndPoint("EndToEnd",n)}o.select()}}else{k()}}function k(){var o=m.selection.createRange();if(n&&!o.item&&o.compareEndPoints("StartToEnd",o)===0){n.select()}g.unbind(m,"mouseup",k);g.unbind(m,"mousemove",l);n=j=0}g.bind(m,["mousedown","contextmenu"],function(o){if(o.target.nodeName==="HTML"){if(j){k()}f=m.documentElement;if(f.scrollHeight>f.clientHeight){return}j=1;n=i(o.x,o.y);if(n){g.bind(m,"mouseup",k);g.bind(m,"mousemove",l);g.win.focus();n.select()}}})}})})(tinymce);(function(a){a.dom.Serializer=function(e,i,f){var h,b,d=a.isIE,g=a.each,c;if(!e.apply_source_formatting){e.indent=false}e.remove_trailing_brs=true;i=i||a.DOM;f=f||new a.html.Schema(e);e.entity_encoding=e.entity_encoding||"named";h=new a.util.Dispatcher(self);b=new a.util.Dispatcher(self);c=new a.html.DomParser(e,f);c.addAttributeFilter("src,href,style",function(k,j){var o=k.length,l,q,n="data-mce-"+j,p=e.url_converter,r=e.url_converter_scope,m;while(o--){l=k[o];q=l.attributes.map[n];if(q!==m){l.attr(j,q.length>0?q:null);l.attr(n,null)}else{q=l.attributes.map[j];if(j==="style"){q=i.serializeStyle(i.parseStyle(q),l.name)}else{if(p){q=p.call(r,q,j,l.name)}}l.attr(j,q.length>0?q:null)}}});c.addAttributeFilter("class",function(j,k){var l=j.length,m,n;while(l--){m=j[l];n=m.attr("class").replace(/\s*mce(Item\w+|Selected)\s*/g,"");m.attr("class",n.length>0?n:null)}});c.addAttributeFilter("data-mce-type",function(j,l,k){var m=j.length,n;while(m--){n=j[m];if(n.attributes.map["data-mce-type"]==="bookmark"&&!k.cleanup){n.remove()}}});c.addNodeFilter("script,style",function(k,l){var m=k.length,n,o;function j(p){return p.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g,"").replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g,"")}while(m--){n=k[m];o=n.firstChild?n.firstChild.value:"";if(l==="script"){n.attr("type",(n.attr("type")||"text/javascript").replace(/^mce\-/,""));if(o.length>0){n.firstChild.value="// <![CDATA[\n"+j(o)+"\n// ]]>"}}else{if(o.length>0){n.firstChild.value="<!--\n"+j(o)+"\n-->"}}}});c.addNodeFilter("#comment",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.value.indexOf("[CDATA[")===0){m.name="#cdata";m.type=4;m.value=m.value.replace(/^\[CDATA\[|\]\]$/g,"")}else{if(m.value.indexOf("mce:protected ")===0){m.name="#text";m.type=3;m.raw=true;m.value=unescape(m.value).substr(14)}}}});c.addNodeFilter("xml:namespace,input",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.type===7){m.remove()}else{if(m.type===1){if(k==="input"&&!("type" in m.attributes.map)){m.attr("type","text")}}}}});if(e.fix_list_elements){c.addNodeFilter("ul,ol",function(k,l){var m=k.length,n,j;while(m--){n=k[m];j=n.parent;if(j.name==="ul"||j.name==="ol"){if(n.prev&&n.prev.name==="li"){n.prev.append(n)}}}})}c.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",function(j,k){var l=j.length;while(l--){j[l].attr(k,null)}});return{schema:f,addNodeFilter:c.addNodeFilter,addAttributeFilter:c.addAttributeFilter,onPreProcess:h,onPostProcess:b,serialize:function(o,m){var l,p,k,j,n;if(d&&i.select("script,style,select,map").length>0){n=o.innerHTML;o=o.cloneNode(false);i.setHTML(o,n)}else{o=o.cloneNode(true)}l=o.ownerDocument.implementation;if(l.createHTMLDocument){p=l.createHTMLDocument("");g(o.nodeName=="BODY"?o.childNodes:[o],function(q){p.body.appendChild(p.importNode(q,true))});if(o.nodeName!="BODY"){o=p.body.firstChild}else{o=p.body}k=i.doc;i.doc=p}m=m||{};m.format=m.format||"html";if(!m.no_events){m.node=o;h.dispatch(self,m)}j=new a.html.Serializer(e,f);m.content=j.serialize(c.parse(m.getInner?o.innerHTML:a.trim(i.getOuterHTML(o),m),m));if(!m.cleanup){m.content=m.content.replace(/\uFEFF/g,"")}if(!m.no_events){b.dispatch(self,m)}if(k){i.doc=k}m.node=null;return m.content},addRules:function(j){f.addValidElements(j)},setRules:function(j){f.setValidElements(j)}}}})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],f={},d=[],g=0,e;function b(m,v){var x=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}v()}function u(){if(typeof(console)!=="undefined"&&console.log){console.log("Failed to load: "+m)}}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol&&o.protocol.toLowerCase()!="file"){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(y){var t=q.create("script",{type:"text/javascript"});t.text=y;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()},error:u});return}}s=q.create("script",{id:n,type:"text/javascript",src:a._addVer(m)});if(!a.isIE){s.onload=p}s.onerror=u;if(!a.isOpera){s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}}}(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==e){j.push(m);l[m]=c}if(q){if(!f[m]){f[m]=[]}f[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(f[r],function(s){s.func.call(s.scope)});f[r]=e}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);tinymce.dom.TreeWalker=function(a,c){var b=a;function d(i,f,e,j){var h,g;if(i){if(!j&&i[f]){return i[f]}if(i!=c){h=i[e];if(h){return h}for(g=i.parentNode;g&&g!=c;g=g.parentNode){h=g[e];if(h){return h}}}}}this.current=function(){return b};this.next=function(e){return(b=d(b,"firstChild","nextSibling",e))};this.prev=function(e){return(b=d(b,"lastChild","previousSibling",e))}};(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,r){var h=d.startContainer,k=d.startOffset,s=d.endContainer,l=d.endOffset,i,f,n,g,q,p,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(t){r([t])});return}function o(v,u,t){var x=[];for(;v&&v!=t;v=v[u]){x.push(v)}return x}function m(u,t){do{if(u.parentNode==t){return u}u=u.parentNode}while(u)}function j(v,u,x){var t=x?"nextSibling":"previousSibling";for(g=v,q=g.parentNode;g&&g!=u;g=q){q=g.parentNode;p=o(g==v?g:g[t],t);if(p.length){if(!x){p.reverse()}r(p)}}}if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[k]}if(s.nodeType==1&&s.hasChildNodes()){s=s.childNodes[Math.min(l-1,s.childNodes.length-1)]}i=c.findCommonAncestor(h,s);if(h==s){return r([h])}for(g=h;g;g=g.parentNode){if(g==s){return j(h,i,true)}if(g==i){break}}for(g=s;g;g=g.parentNode){if(g==h){return j(s,i)}if(g==i){break}}f=m(h,i)||h;n=m(s,i)||s;j(h,f,true);p=o(f==h?f:f.nextSibling,"nextSibling",n==s?n.nextSibling:n);if(p.length){r(p)}j(s,n)}};a.dom.RangeUtils.compareRanges=function(c,b){if(c&&b){if(c.item||c.duplicate){if(c.item&&b.item&&c.item(0)===b.item(0)){return true}if(c.isEqual&&b.isEqual&&b.isEqual(c)){return true}}else{return c.startContainer==b.startContainer&&c.startOffset==b.startOffset}}return false}})(tinymce);(function(b){var a=b.dom.Event,c=b.each;b.create("tinymce.ui.KeyboardNavigation",{KeyboardNavigation:function(e,f){var p=this,m=e.root,l=e.items,n=e.enableUpDown,i=e.enableLeftRight||!e.enableUpDown,k=e.excludeFromTabOrder,j,h,o,d,g;f=f||b.DOM;j=function(q){g=q.target.id};h=function(q){f.setAttrib(q.target.id,"tabindex","-1")};d=function(q){var r=f.get(g);f.setAttrib(r,"tabindex","0");r.focus()};p.focus=function(){f.get(g).focus()};p.destroy=function(){c(l,function(q){f.unbind(f.get(q.id),"focus",j);f.unbind(f.get(q.id),"blur",h)});f.unbind(f.get(m),"focus",d);f.unbind(f.get(m),"keydown",o);l=f=m=p.focus=j=h=o=d=null;p.destroy=function(){}};p.moveFocus=function(u,r){var q=-1,t=p.controls,s;if(!g){return}c(l,function(x,v){if(x.id===g){q=v;return false}});q+=u;if(q<0){q=l.length-1}else{if(q>=l.length){q=0}}s=l[q];f.setAttrib(g,"tabindex","-1");f.setAttrib(s.id,"tabindex","0");f.get(s.id).focus();if(e.actOnFocus){e.onAction(s.id)}if(r){a.cancel(r)}};o=function(y){var u=37,t=39,x=38,z=40,q=27,s=14,r=13,v=32;switch(y.keyCode){case u:if(i){p.moveFocus(-1)}break;case t:if(i){p.moveFocus(1)}break;case x:if(n){p.moveFocus(-1)}break;case z:if(n){p.moveFocus(1)}break;case q:if(e.onCancel){e.onCancel();a.cancel(y)}break;case s:case r:case v:if(e.onAction){e.onAction(g);a.cancel(y)}break}};c(l,function(s,q){var r;if(!s.id){s.id=f.uniqueId("_mce_item_")}if(k){f.bind(s.id,"blur",h);r="-1"}else{r=(q===0?"0":"-1")}f.setAttrib(s.id,"tabindex",r);f.bind(f.get(s.id),"focus",j)});if(l[0]){g=l[0].id}f.setAttrib(m,"tabindex","-1");f.bind(f.get(m),"focus",d);f.bind(f.get(m),"keydown",o)}})})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(f,e,d){this.id=f;this.settings=e=e||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=e.scope||this;this.disabled=0;this.active=0;this.editor=d},setAriaProperty:function(f,e){var d=b.get(this.id+"_aria")||b.get(this.id);if(d){b.setAttrib(d,"aria-"+f,!!e)}},focus:function(){b.get(this.id).focus()},setDisabled:function(d){if(d!=this.disabled){this.setAriaProperty("disabled",d);this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d;this.setAriaProperty("pressed",d)}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(c,b,a){this.parent(c,b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator";this.setDisabled(true)},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix,role:"separator","aria-orientation":"vertical",tabindex:"-1"})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.setAriaProperty("checked",!!f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;j.keyboard_focus=i.keyboard_focus;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},focus:function(){var g=this;if(g.keyboardNav){g.keyboardNav.focus()}},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.clientWidth,j.max_width):g.clientWidth;k=j.max_height?Math.min(g.clientHeight,j.max_height):g.clientHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeight<j.max_height){c.setStyle(l,"overflow","hidden")}}},showMenu:function(p,n,r){var z=this,A=z.settings,o,g=c.getViewPort(),u,l,v,q,i=2,k,j,m=z.classPrefix;z.collapse(1);if(z.isMenuVisible){return}if(!z.rendered){o=c.add(z.settings.container,z.renderNode());f(z.items,function(h){h.postRender()});z.element=new b("menu_"+z.id,{blocker:1,container:A.container})}else{o=c.get("menu_"+z.id)}if(!e.isOpera){c.setStyles(o,{left:-65535,top:-65535})}c.show(o);z.update();p+=A.offset_x||0;n+=A.offset_y||0;g.w-=4;g.h-=4;if(A.constrain){u=o.clientWidth-i;l=o.clientHeight-i;v=g.x+g.w;q=g.y+g.h;if((p+A.vp_offset_x+u)>v){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return a.cancel(s)}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}a.add(o,"keydown",z._keyHandler,z);z.onShowMenu.dispatch(z);if(A.keyboard_focus){z._setupKeyboardNav()}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(h,"mouseover",g.mouseOverFunc);a.remove(c.select("a",h),"focus",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);a.remove(h,"keydown",g._keyHandler);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{role:"listbox",id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000;outline:0"});if(i.settings.parent){c.setAttrib(g,"aria-parent","menu_"+i.settings.parent.id)}k=c.add(g,"div",{role:"presentation",id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{role:"presentation",id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_setupKeyboardNav:function(){var i,h,g=this;i=c.select("#menu_"+g.id)[0];h=c.select("a[role=option]","menu_"+g.id);h.splice(0,0,i);g.keyboardNav=new e.ui.KeyboardNavigation({root:"menu_"+g.id,items:h,onCancel:function(){g.hideMenu()},enableUpDown:true});i.focus()},_keyHandler:function(g){var h=this,i;switch(g.keyCode){case 37:if(h.settings.parent){h.hideMenu();h.settings.parent.focus();a.cancel(g)}break;case 39:if(h.mouseOverFunc){h.mouseOverFunc(g)}break}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,q.titleItem?"th":"td");i=p=c.add(i,"a",{id:h.id+"_aria",role:q.titleItem?"presentation":"option",href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});if(q.parent){c.setAttrib(p,"aria-haspopup","true");c.setAttrib(p,"aria-owns","menu_"+h.id)}c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(e,d,c){this.parent(e,d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='<a role="button" id="'+this.id+'" href="javascript:;" class="'+f+" "+f+"Enabled "+e["class"]+(c?" "+f+"Labeled":"")+'" onmousedown="return false;" onclick="return false;" aria-labelledby="'+this.id+'_voice" title="'+a.encode(e.title)+'">';if(e.image&&!(this.editor&&this.editor.forcedHighContrastMode)){d+='<img class="mceIcon" src="'+e.image+'" alt="'+a.encode(e.title)+'" />'+c}else{d+='<span class="mceIcon '+e["class"]+'"></span>'+(c?'<span class="'+f+'Label">'+c+"</span>":"")}d+='<span class="mceVoiceLabel mceIconOnly" style="display: none;" id="'+this.id+'_voice">'+e.title+"</span>";d+="</a>";return d},postRender:function(){var c=this,d=c.settings;b.dom.Event.add(c.id,"click",function(f){if(!c.isDisabled()){return d.onclick.call(d.scope,f)}})}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(i,h,f){var g=this;g.parent(i,h,f);g.items=[];g.onChange=new a(g);g.onPostRender=new a(g);g.onAdd=new a(g);g.onRenderMenu=new d.util.Dispatcher(this);g.classPrefix="mceListBox"},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){var g=this,h,i;if(f!=g.selectedIndex){h=c.get(g.id+"_text");i=g.items[f];if(i){g.selectedValue=i.value;g.selectedIndex=f;c.setHTML(h,c.encode(i.title));c.removeClass(h,"mceTitle");c.setAttrib(g.id,"aria-valuenow",i.title)}else{c.setHTML(h,c.encode(g.settings.title));c.addClass(h,"mceTitle");g.selectedValue=g.selectedIndex=null;c.setAttrib(g.id,"aria-valuenow",g.settings.title)}h=0}},add:function(i,f,h){var g=this;h=h||{};h=d.extend(h,{title:i,value:f});g.items.push(h);g.onAdd.dispatch(g,h)},getLength:function(){return this.items.length},renderHTML:function(){var i="",f=this,g=f.settings,j=f.classPrefix;i='<span role="button" aria-haspopup="true" aria-labelledby="'+f.id+'_text" aria-describedby="'+f.id+'_voiceDesc"><table role="presentation" tabindex="0" id="'+f.id+'" cellpadding="0" cellspacing="0" class="'+j+" "+j+"Enabled"+(g["class"]?(" "+g["class"]):"")+'"><tbody><tr>';i+="<td>"+c.createHTML("span",{id:f.id+"_voiceDesc","class":"voiceLabel",style:"display:none;"},f.settings.title);i+=c.createHTML("a",{id:f.id+"_text",tabindex:-1,href:"javascript:;","class":"mceText",onclick:"return false;",onmousedown:"return false;"},c.encode(f.settings.title))+"</td>";i+="<td>"+c.createHTML("a",{id:f.id+"_open",tabindex:-1,href:"javascript:;","class":"mceOpen",onclick:"return false;",onmousedown:"return false;"},'<span><span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span></span>')+"</td>";i+="</tr></tbody></table></span>";return i},showMenu:function(){var g=this,i,h=c.get(this.id),f;if(g.isDisabled()||g.items.length==0){return}if(g.menu&&g.menu.isMenuVisible){return g.hideMenu()}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}i=c.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.keyboard_focus=!d.isOpera;if(g.oldID){f.items[g.oldID].setSelected(0)}e(g.items,function(j){if(j.value===g.selectedValue){f.items[j.id].setSelected(1);g.oldID=j.id}});f.showMenu(0,h.clientHeight);b.add(c.doc,"mousedown",g.hideMenu,g);c.addClass(g.id,g.classPrefix+"Selected")},hideMenu:function(g){var f=this;if(f.menu&&f.menu.isMenuVisible){c.removeClass(f.id,f.classPrefix+"Selected");if(g&&g.type=="mousedown"&&(g.target.id==f.id+"_text"||g.target.id==f.id+"_open")){return}if(!g||!c.getParent(g.target,".mceMenu")){c.removeClass(f.id,f.classPrefix+"Selected");b.remove(c.doc,"mousedown",f.hideMenu,f);f.menu.hideMenu()}}},renderMenu:function(){var g=this,f;f=g.settings.control_manager.createDropMenu(g.id+"_menu",{menu_line:1,"class":g.classPrefix+"Menu mceNoIcons",max_width:150,max_height:150});f.onHideMenu.add(function(){g.hideMenu();g.focus()});f.add({title:g.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}});e(g.items,function(h){if(h.value===undefined){f.add({title:h.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}})}else{h.id=c.uniqueId();h.onclick=function(){if(g.settings.onselect(h.value)!==false){g.select(h.value)}};f.add(h)}});g.onRenderMenu.dispatch(g,f);g.menu=f},postRender:function(){var f=this,g=f.classPrefix;b.add(f.id,"click",f.showMenu,f);b.add(f.id,"keydown",function(h){if(h.keyCode==32){f.showMenu(h);b.cancel(h)}});b.add(f.id,"focus",function(){if(!f._focused){f.keyDownHandler=b.add(f.id,"keydown",function(h){if(h.keyCode==40){f.showMenu();b.cancel(h)}});f.keyPressHandler=b.add(f.id,"keypress",function(i){var h;if(i.keyCode==13){h=f.selectedValue;f.selectedValue=null;b.cancel(i);f.settings.onselect(h)}})}f._focused=1});b.add(f.id,"blur",function(){b.remove(f.id,"keydown",f.keyDownHandler);b.remove(f.id,"keypress",f.keyPressHandler);f._focused=0});if(d.isIE6||!c.boxModel){b.add(f.id,"mouseover",function(){if(!c.hasClass(f.id,g+"Disabled")){c.addClass(f.id,g+"Hover")}});b.add(f.id,"mouseout",function(){if(!c.hasClass(f.id,g+"Disabled")){c.removeClass(f.id,g+"Hover")}})}f.onPostRender.dispatch(f,c.get(f.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(g,f){this.parent(g,f);this.classPrefix="mceNativeListBox"},setDisabled:function(f){c.get(this.id).disabled=f;this.setAriaProperty("disabled",f)},isDisabled:function(){return c.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){c.get(this.id).selectedIndex=f+1;this.selectedValue=this.items[f]?this.items[f].value:null},add:function(j,g,f){var i,h=this;f=f||{};f.value=g;if(h.isRendered()){c.add(c.get(this.id),"option",f,j)}i={title:j,value:g,attribs:f};h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var g,f=this;g=c.createHTML("option",{value:""},"-- "+f.settings.title+" --");e(f.items,function(h){g+=c.createHTML("option",{value:h.value},h.title)});g=c.createHTML("select",{id:f.id,"class":"mceNativeListBox","aria-labelledby":f.id+"_aria"},g);g+=c.createHTML("span",{id:f.id+"_aria",style:"display: none"},f.settings.title);return g},postRender:function(){var g=this,h,i=true;g.rendered=true;function f(k){var j=g.items[k.target.selectedIndex-1];if(j&&(j=j.value)){g.onChange.dispatch(g,j);if(g.settings.onselect){g.settings.onselect(j)}}}b.add(g.id,"change",f);b.add(g.id,"keydown",function(k){var j;b.remove(g.id,"change",h);i=false;j=b.add(g.id,"blur",function(){if(i){return}i=true;b.add(g.id,"change",f);b.remove(g.id,"blur",j)});if(d.isWebKit&&(k.keyCode==37||k.keyCode==39)){return b.prevent(k)}if(k.keyCode==13||k.keyCode==32){f(k);return b.cancel(k)}});g.onPostRender.dispatch(g,c.get(g.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(g,f,e){this.parent(g,f,e);this.onRenderMenu=new c.util.Dispatcher(this);f.menu_container=f.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(function(){f.hideMenu();f.focus()});f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(g,f,e){this.parent(g,f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="<tbody><tr>";if(g.image){e=b.createHTML("img ",{src:g.image,role:"presentation","class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}e+=b.createHTML("span",{"class":"mceVoiceLabel mceIconOnly",id:f.id+"_voice",style:"display:none;"},g.title);i+="<td >"+b.createHTML("a",{role:"button",id:f.id+"_action",tabindex:"-1",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";e=b.createHTML("span",{"class":"mceOpen "+g["class"]},'<span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span>');i+="<td >"+b.createHTML("a",{role:"button",id:f.id+"_open",tabindex:"-1",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";i+="</tr></tbody>";i=b.createHTML("table",{id:f.id,role:"presentation",tabindex:"0","class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",title:g.title},i);return b.createHTML("span",{role:"button","aria-labelledby":f.id+"_voice","aria-haspopup":"true"},i)},postRender:function(){var e=this,g=e.settings,f;if(g.onclick){f=function(h){if(!e.isDisabled()){g.onclick(e.value);a.cancel(h)}};a.add(e.id+"_action","click",f);a.add(e.id,["click","keydown"],function(h){var k=32,m=14,i=13,j=38,l=40;if((h.keyCode===32||h.keyCode===13||h.keyCode===14)&&!h.altKey&&!h.ctrlKey&&!h.metaKey){f();a.cancel(h)}else{if(h.type==="click"||h.keyCode===l){e.showMenu();a.cancel(h)}}})}a.add(e.id+"_open","click",function(h){e.showMenu();a.cancel(h)});a.add([e.id,e.id+"_open"],"focus",function(){e._focused=1});a.add([e.id,e.id+"_open"],"blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open");a.clear(this.id)}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(i,h,f){var g=this;g.parent(i,h,f);g.settings=h=d.extend({colors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",grid_width:8,default_color:"#888888"},g.settings);g.onShowMenu=new d.util.Dispatcher(g);g.onHideMenu=new d.util.Dispatcher(g);g.value=h.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.isMenuVisible=1},hideMenu:function(g){var f=this;if(f.isMenuVisible){if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.isMenuVisible=0;f.onHideMenu.dispatch()}},renderMenu:function(){var p=this,h,k=0,q=p.settings,g,j,l,o,f;o=c.add(q.menu_container,"div",{role:"listbox",id:p.id+"_menu","class":q.menu_class+" "+q["class"],style:"position:absolute;left:0;top:-1000px;"});h=c.add(o,"div",{"class":q["class"]+" mceSplitButtonMenu"});c.add(h,"span",{"class":"mceMenuLine"});g=c.add(h,"table",{role:"presentation","class":"mceColorSplitMenu"});j=c.add(g,"tbody");k=0;e(b(q.colors,"array")?q.colors:q.colors.split(","),function(i){i=i.replace(/^#/,"");if(!k--){l=c.add(j,"tr");k=q.grid_width-1}g=c.add(l,"td");g=c.add(g,"a",{role:"option",href:"javascript:;",style:{backgroundColor:"#"+i},title:p.editor.getLang("colors."+i,i),"data-mce-color":"#"+i});if(p.editor.forcedHighContrastMode){g=c.add(g,"canvas",{width:16,height:16,"aria-hidden":"true"});if(g.getContext&&(f=g.getContext("2d"))){f.fillStyle="#"+i;f.fillRect(0,0,16,16)}else{c.remove(g)}}});if(q.more_colors_func){g=c.add(j,"tr");g=c.add(g,"td",{colspan:q.grid_width,"class":"mceMoreColors"});g=c.add(g,"a",{role:"option",id:p.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},q.more_colors_title);a.add(g,"click",function(i){q.more_colors_func.call(q.more_colors_scope||this);return a.cancel(i)})}c.addClass(h,"mceColorSplitMenu");new d.ui.KeyboardNavigation({root:p.id+"_menu",items:c.select("a",p.id+"_menu"),onCancel:function(){p.hideMenu();p.focus()}});a.add(p.id+"_menu","mousedown",function(i){return a.cancel(i)});a.add(p.id+"_menu","click",function(i){var m;i=c.getParent(i.target,"a",j);if(i&&i.nodeName.toLowerCase()=="a"&&(m=i.getAttribute("data-mce-color"))){p.setColor(m)}return a.cancel(i)});return o},setColor:function(f){this.displayColor(f);this.hideMenu();this.settings.onselect(f)},displayColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){this.parent();a.clear(this.id+"_menu");a.clear(this.id+"_more");c.remove(this.id+"_menu")}})})(tinymce);(function(b){var d=b.DOM,c=b.each,a=b.dom.Event;b.create("tinymce.ui.ToolbarGroup:tinymce.ui.Container",{renderHTML:function(){var f=this,i=[],e=f.controls,j=b.each,g=f.settings;i.push('<div id="'+f.id+'" role="group" aria-labelledby="'+f.id+'_voice">');i.push("<span role='application'>");i.push('<span id="'+f.id+'_voice" class="mceVoiceLabel" style="display:none;">'+d.encode(g.name)+"</span>");j(e,function(h){i.push(h.renderHTML())});i.push("</span>");i.push("</div>");return i.join("")},focus:function(){this.keyNav.focus()},postRender:function(){var f=this,e=[];c(f.controls,function(g){c(g.controls,function(h){if(h.id){e.push(h)}})});f.keyNav=new b.ui.KeyboardNavigation({root:f.id,items:e,onCancel:function(){f.editor.focus()},excludeFromTabOrder:!f.settings.tab_focus_toolbar})},destroy:function(){var e=this;e.parent();e.keyNav.destroy();a.clear(e.id)}})})(tinymce);(function(a){var c=a.DOM,b=a.each;a.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var m=this,f="",j,k,n=m.settings,e,d,g,l;l=m.controls;for(e=0;e<l.length;e++){k=l[e];d=l[e-1];g=l[e+1];if(e===0){j="mceToolbarStart";if(k.Button){j+=" mceToolbarStartButton"}else{if(k.SplitButton){j+=" mceToolbarStartSplitButton"}else{if(k.ListBox){j+=" mceToolbarStartListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,"<!-- IE -->"))}if(d&&k.ListBox){if(d.Button||d.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarEnd"},c.createHTML("span",null,"<!-- IE -->"))}}if(c.stdMode){f+='<td style="position: relative">'+k.renderHTML()+"</td>"}else{f+="<td>"+k.renderHTML()+"</td>"}if(g&&k.ListBox){if(g.Button||g.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarStart"},c.createHTML("span",null,"<!-- IE -->"))}}}j="mceToolbarEnd";if(k.Button){j+=" mceToolbarEndButton"}else{if(k.SplitButton){j+=" mceToolbarEndSplitButton"}else{if(k.ListBox){j+=" mceToolbarEndListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,"<!-- IE -->"));return c.createHTML("table",{id:m.id,"class":"mceToolbar"+(n["class"]?" "+n["class"]:""),cellpadding:"0",cellspacing:"0",align:m.settings.align||"",role:"presentation",tabindex:"-1"},"<tbody><tr>"+f+"</tr></tbody>")}})})(tinymce);(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{AddOnManager:function(){var d=this;d.items=[];d.urls={};d.lookup={};d.onAdd=new a(d)},get:function(d){if(this.lookup[d]){return this.lookup[d].instance}else{return undefined}},dependencies:function(e){var d;if(this.lookup[e]){d=this.lookup[e].dependencies}return d||[]},requireLangPack:function(e){var d=b.settings;if(d&&d.language&&d.language_load!==false){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(f,e,d){this.items.push(e);this.lookup[f]={instance:e,dependencies:d};this.onAdd.dispatch(this,f,e);return e},createUrl:function(d,e){if(typeof e==="object"){return e}else{return{prefix:d.prefix,resource:e,suffix:d.suffix}}},addComponents:function(f,d){var e=this.urls[f];b.each(d,function(g){b.ScriptLoader.add(e+"/"+g)})},load:function(j,f,d,h){var g=this,e=f;function i(){var k=g.dependencies(j);b.each(k,function(m){var l=g.createUrl(f,m);g.load(l.resource,l,undefined,undefined)});if(d){if(h){d.call(h)}else{d.call(b.ScriptLoader)}}}if(g.urls[j]){return}if(typeof f==="object"){e=f.prefix+f.resource+f.suffix}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}g.urls[j]=e.substring(0,e.lastIndexOf("/"));if(g.lookup[j]){i()}else{b.ScriptLoader.add(e,i,h)}}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(q){var n=this,p,l=j.ScriptLoader,u,o=[],m;function r(x,y,t){var v=x[y];if(!v){return}if(j.is(v,"string")){t=v.replace(/\.\w+$/,"");t=t?j.resolve(t):0;v=j.resolve(v)}return v.apply(t||this,Array.prototype.slice.call(arguments,2))}q=d({theme:"simple",language:"en"},q);n.settings=q;i.add(document,"init",function(){var s,v;r(q,"onpageload");switch(q.mode){case"exact":s=q.elements||"";if(s.length>0){g(e(s),function(x){if(k.get(x)){m=new j.Editor(x,q);o.push(m);m.render(1)}else{g(document.forms,function(y){g(y.elements,function(z){if(z.name===x){x="mce_editor_"+c++;k.setAttrib(z,"id",x);m=new j.Editor(x,q);o.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function t(y,x){return x.constructor===RegExp?x.test(y.className):k.hasClass(y,x)}g(k.select("textarea"),function(x){if(q.editor_deselector&&t(x,q.editor_deselector)){return}if(!q.editor_selector||t(x,q.editor_selector)){u=k.get(x.name);if(!x.id&&!u){x.id=x.name}if(!x.id||n.get(x.id)){x.id=k.uniqueId()}m=new j.Editor(x.id,q);o.push(m);m.render(1)}});break}if(q.oninit){s=v=0;g(o,function(x){v++;if(!x.initialized){x.onInit.add(function(){s++;if(s==v){r(q,"oninit")}})}else{s++}if(s==v){r(q,"oninit")}})}})},get:function(l){if(l===a){return this.editors}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l<o.length;l++){if(o[l]==n){o.splice(l,1);break}}if(m.activeEditor==n){m._setActive(o[0])}n.destroy();m.onRemoveEditor.dispatch(m,n);return n},execCommand:function(r,p,o){var q=this,n=q.get(o),l;switch(r){case"mceFocus":n.focus();return true;case"mceAddEditor":case"mceAddControl":if(!q.get(o)){new j.Editor(o,q.settings).render()}return true;case"mceAddFrameControl":l=o.window;l.tinyMCE=tinyMCE;l.tinymce=j;j.DOM.doc=l.document;j.DOM.win=l;n=new j.Editor(o.element_id,o);n.render();if(j.isIE){function m(){n.destroy();l.detachEvent("onunload",m);l=l.tinyMCE=l.tinymce=null}l.attachEvent("onunload",m)}o.page_window=null;return true;case"mceRemoveEditor":case"mceRemoveControl":if(n){n.remove()}return true;case"mceToggleEditor":if(!n){q.execCommand("mceAddControl",0,o);return true}if(n.isHidden()){n.show()}else{n.hide()}return true}if(q.activeEditor){return q.activeEditor.execCommand(r,p,o)}return false},execInstanceCommand:function(p,o,n,m){var l=this.get(p);if(l){return l.execCommand(o,n,m)}return false},triggerSave:function(){g(this.editors,function(l){l.save()})},addI18n:function(n,q){var l,m=this.i18n;if(!j.is(n,"string")){g(n,function(r,p){g(r,function(t,s){g(t,function(v,u){if(s==="common"){m[p+"."+u]=v}else{m[p+"."+s+"."+u]=v}})})})}else{g(q,function(r,p){m[n+"."+p]=r})}},_setActive:function(l){this.selectedInstance=this.activeEditor=l}})})(tinymce);(function(m){var n=m.DOM,j=m.dom.Event,f=m.extend,k=m.util.Dispatcher,i=m.each,a=m.isGecko,b=m.isIE,e=m.isWebKit,d=m.is,h=m.ThemeManager,c=m.PluginManager,o=m.inArray,l=m.grep,g=m.explode;m.create("tinymce.Editor",{Editor:function(r,q){var p=this;p.id=p.editorId=r;p.execCommands={};p.queryStateCommands={};p.queryValueCommands={};p.isNotDirty=false;p.plugins={};i(["onPreInit","onBeforeRenderUI","onPostRender","onInit","onRemove","onActivate","onDeactivate","onClick","onEvent","onMouseUp","onMouseDown","onDblClick","onKeyDown","onKeyUp","onKeyPress","onContextMenu","onSubmit","onReset","onPaste","onPreProcess","onPostProcess","onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent","onLoadContent","onSaveContent","onNodeChange","onChange","onBeforeExecCommand","onExecCommand","onUndo","onRedo","onVisualAid","onSetProgressState"],function(s){p[s]=new k(p)});p.settings=q=f({id:r,language:"en",docs_language:"en",theme:"simple",skin:"default",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:m.documentBaseURL,add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:m.isIE6?'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">':"<!DOCTYPE>",visual_table_class:"mceItemTable",visual:1,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",apply_source_formatting:1,directionality:"ltr",forced_root_block:"p",hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:"30px",keep_styles:1,fix_table_elements:1,inline_styles:1,convert_fonts_to_spans:true,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",validate:true,entity_encoding:"named",url_converter:p.convertURL,url_converter_scope:p,ie7_compat:true},q);p.documentBaseURI=new m.util.URI(q.document_base_url||m.documentBaseURL,{base_uri:tinyMCE.baseURI});p.baseURI=m.baseURI;p.contentCSS=[];p.execCallback("setup",p)},render:function(r){var u=this,v=u.settings,x=u.id,p=m.ScriptLoader;if(!j.domLoaded){j.add(document,"init",function(){u.render()});return}tinyMCE.settings=v;if(!u.getElement()){return}if(m.isIDevice&&!m.isIOS5){return}if(!/TEXTAREA|INPUT/i.test(u.getElement().nodeName)&&v.hidden_input&&n.getParent(x,"form")){n.insertAfter(n.create("input",{type:"hidden",name:x}),x)}if(m.WindowManager){u.windowManager=new m.WindowManager(u)}if(v.encoding=="xml"){u.onGetContent.add(function(s,t){if(t.save){t.content=n.encode(t.content)}})}if(v.add_form_submit_trigger){u.onSubmit.addToTop(function(){if(u.initialized){u.save();u.isNotDirty=1}})}if(v.add_unload_trigger){u._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(u.initialized&&!u.destroyed&&!u.isHidden()){u.save({format:"raw",no_events:true})}})}m.addUnload(u.destroy,u);if(v.submit_patch){u.onBeforeRenderUI.add(function(){var s=u.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){u.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){m.triggerSave();u.isNotDirty=1;return u.formElement._mceOldSubmit(u.formElement)}}s=null})}function q(){if(v.language&&v.language_load!==false){p.add(m.baseURL+"/langs/"+v.language+".js")}if(v.theme&&v.theme.charAt(0)!="-"&&!h.urls[v.theme]){h.load(v.theme,"themes/"+v.theme+"/editor_template"+m.suffix+".js")}i(g(v.plugins),function(t){if(t&&!c.urls[t]){if(t.charAt(0)=="-"){t=t.substr(1,t.length);var s=c.dependencies(t);i(s,function(z){var y={prefix:"plugins/",resource:z,suffix:"/editor_plugin"+m.suffix+".js"};var z=c.createUrl(y,z);c.load(z.resource,z)})}else{if(t=="safari"){return}c.load(t,{prefix:"plugins/",resource:t,suffix:"/editor_plugin"+m.suffix+".js"})}}});p.loadQueue(function(){if(!u.removed){u.init()}})}q()},init:function(){var r,H=this,I=H.settings,E,A,D=H.getElement(),q,p,F,y,C,G,z,v=[];m.add(H);I.aria_label=I.aria_label||n.getAttrib(D,"aria-label",H.getLang("aria.rich_text_area"));if(I.theme){I.theme=I.theme.replace(/-/,"");q=h.get(I.theme);H.theme=new q();if(H.theme.init&&I.init_theme){H.theme.init(H,h.urls[I.theme]||m.documentBaseURL.replace(/\/$/,""))}}function B(J){var K=c.get(J),t=c.urls[J]||m.documentBaseURL.replace(/\/$/,""),s;if(K&&m.inArray(v,J)===-1){i(c.dependencies(J),function(u){B(u)});s=new K(H,t);H.plugins[J]=s;if(s.init){s.init(H,t);v.push(J)}}}i(g(I.plugins.replace(/\-/g,"")),B);if(I.popup_css!==false){if(I.popup_css){I.popup_css=H.documentBaseURI.toAbsolute(I.popup_css)}else{I.popup_css=H.baseURI.toAbsolute("themes/"+I.theme+"/skins/"+I.skin+"/dialog.css")}}if(I.popup_css_add){I.popup_css+=","+H.documentBaseURI.toAbsolute(I.popup_css_add)}H.controlManager=new m.ControlManager(H);if(I.custom_undo_redo){H.onBeforeExecCommand.add(function(t,J,u,K,s){if(J!="Undo"&&J!="Redo"&&J!="mceRepaint"&&(!s||!s.skip_undo)){H.undoManager.beforeChange()}});H.onExecCommand.add(function(t,J,u,K,s){if(J!="Undo"&&J!="Redo"&&J!="mceRepaint"&&(!s||!s.skip_undo)){H.undoManager.add()}})}H.onExecCommand.add(function(s,t){if(!/^(FontName|FontSize)$/.test(t)){H.nodeChanged()}});if(a){function x(s,t){if(!t||!t.initial){H.execCommand("mceRepaint")}}H.onUndo.add(x);H.onRedo.add(x);H.onSetContent.add(x)}H.onBeforeRenderUI.dispatch(H,H.controlManager);if(I.render_ui){E=I.width||D.style.width||D.offsetWidth;A=I.height||D.style.height||D.offsetHeight;H.orgDisplay=D.style.display;G=/^[0-9\.]+(|px)$/i;if(G.test(""+E)){E=Math.max(parseInt(E)+(q.deltaWidth||0),100)}if(G.test(""+A)){A=Math.max(parseInt(A)+(q.deltaHeight||0),100)}q=H.theme.renderUI({targetNode:D,width:E,height:A,deltaWidth:I.delta_width,deltaHeight:I.delta_height});H.editorContainer=q.editorContainer}if(document.domain&&location.hostname!=document.domain){m.relaxedDomain=document.domain}n.setStyles(q.sizeContainer||q.editorContainer,{width:E,height:A});if(I.content_css){m.each(g(I.content_css),function(s){H.contentCSS.push(H.documentBaseURI.toAbsolute(s))})}A=(q.iframeHeight||A)+(typeof(A)=="number"?(q.deltaHeight||0):"");if(A<100){A=100}H.iframeHTML=I.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml">';if(I.document_base_url!=m.documentBaseURL){H.iframeHTML+='<base href="'+H.documentBaseURI.getURI()+'" />'}if(I.ie7_compat){H.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=7" />'}else{H.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=edge" />'}H.iframeHTML+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';y=I.body_id||"tinymce";if(y.indexOf("=")!=-1){y=H.getParam("body_id","","hash");y=y[H.id]||y}C=I.body_class||"";if(C.indexOf("=")!=-1){C=H.getParam("body_class","","hash");C=C[H.id]||""}H.iframeHTML+='</head><body id="'+y+'" class="mceContentBody '+C+'"><br></body></html>';if(m.relaxedDomain&&(b||(m.isOpera&&parseFloat(opera.version())<11))){F='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+H.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'}r=n.add(q.iframeContainer,"iframe",{id:H.id+"_ifr",src:F||'javascript:""',frameBorder:"0",allowTransparency:"true",title:I.aria_label,style:{width:"100%",height:A,display:"block"}});H.contentAreaContainer=q.iframeContainer;n.get(q.editorContainer).style.display=H.orgDisplay;n.get(H.id).style.display="none";n.setAttrib(H.id,"aria-hidden",true);if(!m.relaxedDomain||!F){H.setupIframe()}D=r=q=null},setupIframe:function(){var q=this,v=q.settings,x=n.get(q.id),y=q.getDoc(),u,p;if(!b||!m.relaxedDomain){if(a&&!Range.prototype.getClientRects){q.onMouseDown.add(function(t,z){if(z.target.nodeName==="HTML"){var s=q.getBody();s.blur();setTimeout(function(){s.focus()},0)}})}y.open();y.write(q.iframeHTML);y.close();if(m.relaxedDomain){y.domain=m.relaxedDomain}}p=q.getBody();p.disabled=true;if(!v.readonly){p.contentEditable=true}p.disabled=false;q.schema=new m.html.Schema(v);q.dom=new m.dom.DOMUtils(q.getDoc(),{keep_values:true,url_converter:q.convertURL,url_converter_scope:q,hex_colors:v.force_hex_style_colors,class_filter:v.class_filter,update_styles:1,fix_ie_paragraphs:1,schema:q.schema});q.parser=new m.html.DomParser(v,q.schema);if(!q.settings.allow_html_in_named_anchor){q.parser.addAttributeFilter("name",function(s,t){var A=s.length,C,z,B,D;while(A--){D=s[A];if(D.name==="a"&&D.firstChild){B=D.parent;C=D.lastChild;do{z=C.prev;B.insert(C,D);C=z}while(C)}}})}q.parser.addAttributeFilter("src,href,style",function(s,t){var z=s.length,B,D=q.dom,C,A;while(z--){B=s[z];C=B.attr(t);A="data-mce-"+t;if(!B.attributes.map[A]){if(t==="style"){B.attr(A,D.serializeStyle(D.parseStyle(C),B.name))}else{B.attr(A,q.convertURL(C,t,B.name))}}}});q.parser.addNodeFilter("script",function(s,t){var z=s.length;while(z--){s[z].attr("type","mce-text/javascript")}});q.parser.addNodeFilter("#cdata",function(s,t){var z=s.length,A;while(z--){A=s[z];A.type=8;A.name="#comment";A.value="[CDATA["+A.value+"]]"}});q.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(t,z){var A=t.length,B,s=q.schema.getNonEmptyElements();while(A--){B=t[A];if(B.isEmpty(s)){B.empty().append(new m.html.Node("br",1)).shortEnded=true}}});q.serializer=new m.dom.Serializer(v,q.dom,q.schema);q.selection=new m.dom.Selection(q.dom,q.getWin(),q.serializer);q.formatter=new m.Formatter(this);q.formatter.register({alignleft:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"left"}},{selector:"img,table",collapsed:false,styles:{"float":"left"}}],aligncenter:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"center"}},{selector:"img",collapsed:false,styles:{display:"block",marginLeft:"auto",marginRight:"auto"}},{selector:"table",collapsed:false,styles:{marginLeft:"auto",marginRight:"auto"}}],alignright:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"right"}},{selector:"img,table",collapsed:false,styles:{"float":"right"}}],alignfull:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"justify"}}],bold:[{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all"}],italic:[{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:true},{inline:"u",remove:"all"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:true},{inline:"strike",remove:"all"}],forecolor:{inline:"span",styles:{color:"%value"},wrap_links:false},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},wrap_links:false},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},link:{inline:"a",selector:"a",remove:"all",split:true,deep:true,onmatch:function(s){return true},onformat:function(z,s,t){i(t,function(B,A){q.dom.setAttrib(z,A,B)})}},removeformat:[{selector:"b,strong,em,i,font,u,strike",remove:"all",split:true,expand:false,block_expand:true,deep:true},{selector:"span",attributes:["style","class"],remove:"empty",split:true,expand:false,deep:true},{selector:"*",attributes:["style","class"],split:false,expand:false,deep:true}]});i("p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp".split(/\s/),function(s){q.formatter.register(s,{block:s,remove:"all"})});q.formatter.register(q.settings.formats);q.undoManager=new m.UndoManager(q);q.undoManager.onAdd.add(function(t,s){if(t.hasUndo()){return q.onChange.dispatch(q,s,t)}});q.undoManager.onUndo.add(function(t,s){return q.onUndo.dispatch(q,s,t)});q.undoManager.onRedo.add(function(t,s){return q.onRedo.dispatch(q,s,t)});q.forceBlocks=new m.ForceBlocks(q,{forced_root_block:v.forced_root_block});q.editorCommands=new m.EditorCommands(q);q.serializer.onPreProcess.add(function(s,t){return q.onPreProcess.dispatch(q,t,s)});q.serializer.onPostProcess.add(function(s,t){return q.onPostProcess.dispatch(q,t,s)});q.onPreInit.dispatch(q);if(!v.gecko_spellcheck){q.getBody().spellcheck=0}if(!v.readonly){q._addEvents()}q.controlManager.onPostRender.dispatch(q,q.controlManager);q.onPostRender.dispatch(q);q.quirks=new m.util.Quirks(this);if(v.directionality){q.getBody().dir=v.directionality}if(v.nowrap){q.getBody().style.whiteSpace="nowrap"}if(v.handle_node_change_callback){q.onNodeChange.add(function(t,s,z){q.execCallback("handle_node_change_callback",q.id,z,-1,-1,true,q.selection.isCollapsed())})}if(v.save_callback){q.onSaveContent.add(function(s,z){var t=q.execCallback("save_callback",q.id,z.content,q.getBody());if(t){z.content=t}})}if(v.onchange_callback){q.onChange.add(function(t,s){q.execCallback("onchange_callback",q,s)})}if(v.protect){q.onBeforeSetContent.add(function(s,t){if(v.protect){i(v.protect,function(z){t.content=t.content.replace(z,function(A){return"<!--mce:protected "+escape(A)+"-->"})})}})}if(v.convert_newlines_to_brs){q.onBeforeSetContent.add(function(s,t){if(t.initial){t.content=t.content.replace(/\r?\n/g,"<br />")}})}if(v.preformatted){q.onPostProcess.add(function(s,t){t.content=t.content.replace(/^\s*<pre.*?>/,"");t.content=t.content.replace(/<\/pre>\s*$/,"");if(t.set){t.content='<pre class="mceItemHidden">'+t.content+"</pre>"}})}if(v.verify_css_classes){q.serializer.attribValueFilter=function(B,z){var A,t;if(B=="class"){if(!q.classesRE){t=q.dom.getClasses();if(t.length>0){A="";i(t,function(s){A+=(A?"|":"")+s["class"]});q.classesRE=new RegExp("("+A+")","gi")}}return !q.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(z)||q.classesRE.test(z)?z:""}return z}}if(v.cleanup_callback){q.onBeforeSetContent.add(function(s,t){t.content=q.execCallback("cleanup_callback","insert_to_editor",t.content,t)});q.onPreProcess.add(function(s,t){if(t.set){q.execCallback("cleanup_callback","insert_to_editor_dom",t.node,t)}if(t.get){q.execCallback("cleanup_callback","get_from_editor_dom",t.node,t)}});q.onPostProcess.add(function(s,t){if(t.set){t.content=q.execCallback("cleanup_callback","insert_to_editor",t.content,t)}if(t.get){t.content=q.execCallback("cleanup_callback","get_from_editor",t.content,t)}})}if(v.save_callback){q.onGetContent.add(function(s,t){if(t.save){t.content=q.execCallback("save_callback",q.id,t.content,q.getBody())}})}if(v.handle_event_callback){q.onEvent.add(function(s,t,z){if(q.execCallback("handle_event_callback",t,s,z)===false){j.cancel(t)}})}q.onSetContent.add(function(){q.addVisual(q.getBody())});if(v.padd_empty_editor){q.onPostProcess.add(function(s,t){t.content=t.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,"")})}if(a){function r(s,t){i(s.dom.select("a"),function(A){var z=A.parentNode;if(s.dom.isBlock(z)&&z.lastChild===A){s.dom.add(z,"br",{"data-mce-bogus":1})}})}q.onExecCommand.add(function(s,t){if(t==="CreateLink"){r(s)}});q.onSetContent.add(q.selection.onSetContent.add(r))}q.load({initial:true,format:"html"});q.startContent=q.getContent({format:"raw"});q.undoManager.add();q.initialized=true;q.onInit.dispatch(q);q.execCallback("setupcontent_callback",q.id,q.getBody(),q.getDoc());q.execCallback("init_instance_callback",q);q.focus(true);q.nodeChanged({initial:1});i(q.contentCSS,function(s){q.dom.loadCSS(s)});if(v.auto_focus){setTimeout(function(){var s=m.get(v.auto_focus);s.selection.select(s.getBody(),1);s.selection.collapse(1);s.getBody().focus();s.getWin().focus()},100)}x=null},focus:function(u){var y,q=this,s=q.selection,x=q.settings.content_editable,r,p,v=q.getDoc();if(!u){r=s.getRng();if(r.item){p=r.item(0)}q._refreshContentEditable();s.normalize();if(!x){q.getWin().focus()}if(m.isGecko){q.getBody().focus()}if(p&&p.ownerDocument==v){r=v.body.createControlRange();r.addElement(p);r.select()}}if(m.activeEditor!=q){if((y=m.activeEditor)!=null){y.onDeactivate.dispatch(y,q)}q.onActivate.dispatch(q,y)}m._setActive(q)},execCallback:function(u){var p=this,r=p.settings[u],q;if(!r){return}if(p.callbackLookup&&(q=p.callbackLookup[u])){r=q.func;q=q.scope}if(d(r,"string")){q=r.replace(/\.\w+$/,"");q=q?m.resolve(q):0;r=m.resolve(r);p.callbackLookup=p.callbackLookup||{};p.callbackLookup[u]={func:r,scope:q}}return r.apply(q||p,Array.prototype.slice.call(arguments,1))},translate:function(p){var r=this.settings.language||"en",q=m.i18n;if(!p){return""}return q[r+"."+p]||p.replace(/{\#([^}]+)\}/g,function(t,s){return q[r+"."+s]||"{#"+s+"}"})},getLang:function(q,p){return m.i18n[(this.settings.language||"en")+"."+q]||(d(p)?p:"{#"+q+"}")},getParam:function(u,r,p){var s=m.trim,q=d(this.settings[u])?this.settings[u]:r,t;if(p==="hash"){t={};if(d(q,"string")){i(q.indexOf("=")>0?q.split(/[;,](?![^=;,]*(?:[;,]|$))/):q.split(","),function(x){x=x.split("=");if(x.length>1){t[s(x[0])]=s(x[1])}else{t[s(x[0])]=s(x)}})}else{t=q}return t}return q},nodeChanged:function(r){var p=this,q=p.selection,u=q.getStart()||p.getBody();if(p.initialized){r=r||{};u=b&&u.ownerDocument!=p.getDoc()?p.getBody():u;r.parents=[];p.dom.getParent(u,function(s){if(s.nodeName=="BODY"){return true}r.parents.push(s)});p.onNodeChange.dispatch(p,r?r.controlManager||p.controlManager:p.controlManager,u,q.isCollapsed(),r)}},addButton:function(r,q){var p=this;p.buttons=p.buttons||{};p.buttons[r]=q},addCommand:function(p,r,q){this.execCommands[p]={func:r,scope:q||this}},addQueryStateHandler:function(p,r,q){this.queryStateCommands[p]={func:r,scope:q||this}},addQueryValueHandler:function(p,r,q){this.queryValueCommands[p]={func:r,scope:q||this}},addShortcut:function(r,u,p,s){var q=this,v;if(!q.settings.custom_shortcuts){return false}q.shortcuts=q.shortcuts||{};if(d(p,"string")){v=p;p=function(){q.execCommand(v,false,null)}}if(d(p,"object")){v=p;p=function(){q.execCommand(v[0],v[1],v[2])}}i(g(r),function(t){var x={func:p,scope:s||this,desc:u,alt:false,ctrl:false,shift:false};i(g(t,"+"),function(y){switch(y){case"alt":case"ctrl":case"shift":x[y]=true;break;default:x.charCode=y.charCodeAt(0);x.keyCode=y.toUpperCase().charCodeAt(0)}});q.shortcuts[(x.ctrl?"ctrl":"")+","+(x.alt?"alt":"")+","+(x.shift?"shift":"")+","+x.keyCode]=x});return true},execCommand:function(x,v,z,p){var r=this,u=0,y,q;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(x)&&(!p||!p.skip_focus)){r.focus()}y={};r.onBeforeExecCommand.dispatch(r,x,v,z,y);if(y.terminate){return false}if(r.execCallback("execcommand_callback",r.id,r.selection.getNode(),x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(y=r.execCommands[x]){q=y.func.call(y.scope,v,z);if(q!==true){r.onExecCommand.dispatch(r,x,v,z,p);return q}}i(r.plugins,function(s){if(s.execCommand&&s.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);u=1;return false}});if(u){return true}if(r.theme&&r.theme.execCommand&&r.theme.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(r.editorCommands.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}r.getDoc().execCommand(x,v,z);r.onExecCommand.dispatch(r,x,v,z,p)},queryCommandState:function(u){var q=this,v,r;if(q._isHidden()){return}if(v=q.queryStateCommands[u]){r=v.func.call(v.scope);if(r!==true){return r}}v=q.editorCommands.queryCommandState(u);if(v!==-1){return v}try{return this.getDoc().queryCommandState(u)}catch(p){}},queryCommandValue:function(v){var q=this,u,r;if(q._isHidden()){return}if(u=q.queryValueCommands[v]){r=u.func.call(u.scope);if(r!==true){return r}}u=q.editorCommands.queryCommandValue(v);if(d(u)){return u}try{return this.getDoc().queryCommandValue(v)}catch(p){}},show:function(){var p=this;n.show(p.getContainer());n.hide(p.id);p.load()},hide:function(){var p=this,q=p.getDoc();if(b&&q){q.execCommand("SelectAll")}p.save();n.hide(p.getContainer());n.setStyle(p.id,"display",p.orgDisplay)},isHidden:function(){return !n.isHidden(this.id)},setProgressState:function(p,q,r){this.onSetProgressState.dispatch(this,p,q,r);return p},load:function(s){var p=this,r=p.getElement(),q;if(r){s=s||{};s.load=true;q=p.setContent(d(r.value)?r.value:r.innerHTML,s);s.element=r;if(!s.no_events){p.onLoadContent.dispatch(p,s)}s.element=r=null;return q}},save:function(u){var p=this,s=p.getElement(),q,r;if(!s||!p.initialized){return}u=u||{};u.save=true;if(!u.no_events){p.undoManager.typing=false;p.undoManager.add()}u.element=s;q=u.content=p.getContent(u);if(!u.no_events){p.onSaveContent.dispatch(p,u)}q=u.content;if(!/TEXTAREA|INPUT/i.test(s.nodeName)){s.innerHTML=q;if(r=n.getParent(p.id,"form")){i(r.elements,function(t){if(t.name==p.id){t.value=q;return false}})}}else{s.value=q}u.element=s=null;return q},setContent:function(u,s){var r=this,q,p=r.getBody(),t;s=s||{};s.format=s.format||"html";s.set=true;s.content=u;if(!s.no_events){r.onBeforeSetContent.dispatch(r,s)}u=s.content;if(!m.isIE&&(u.length===0||/^\s+$/.test(u))){t=r.settings.forced_root_block;if(t){u="<"+t+'><br data-mce-bogus="1"></'+t+">"}else{u='<br data-mce-bogus="1">'}p.innerHTML=u;r.selection.select(p,true);r.selection.collapse(true);return}if(s.format!=="raw"){u=new m.html.Serializer({},r.schema).serialize(r.parser.parse(u))}s.content=m.trim(u);r.dom.setHTML(p,s.content);if(!s.no_events){r.onSetContent.dispatch(r,s)}r.selection.normalize();return s.content},getContent:function(q){var p=this,r;q=q||{};q.format=q.format||"html";q.get=true;if(!q.no_events){p.onBeforeGetContent.dispatch(p,q)}if(q.format=="raw"){r=p.getBody().innerHTML}else{r=p.serializer.serialize(p.getBody(),q)}q.content=m.trim(r);if(!q.no_events){p.onGetContent.dispatch(p,q)}return q.content},isDirty:function(){var p=this;return m.trim(p.startContent)!=m.trim(p.getContent({format:"raw",no_events:1}))&&!p.isNotDirty},getContainer:function(){var p=this;if(!p.container){p.container=n.get(p.editorContainer||p.id+"_parent")}return p.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return n.get(this.settings.content_element||this.id)},getWin:function(){var p=this,q;if(!p.contentWindow){q=n.get(p.id+"_ifr");if(q){p.contentWindow=q.contentWindow}}return p.contentWindow},getDoc:function(){var q=this,p;if(!q.contentDocument){p=q.getWin();if(p){q.contentDocument=p.document}}return q.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(p,x,v){var q=this,r=q.settings;if(r.urlconverter_callback){return q.execCallback("urlconverter_callback",p,v,true,x)}if(!r.convert_urls||(v&&v.nodeName=="LINK")||p.indexOf("file:")===0){return p}if(r.relative_urls){return q.documentBaseURI.toRelative(p)}p=q.documentBaseURI.toAbsolute(p,r.remove_script_host);return p},addVisual:function(r){var p=this,q=p.settings;r=r||p.getBody();if(!d(p.hasVisual)){p.hasVisual=q.visual}i(p.dom.select("table,a",r),function(t){var s;switch(t.nodeName){case"TABLE":s=p.dom.getAttrib(t,"border");if(!s||s=="0"){if(p.hasVisual){p.dom.addClass(t,q.visual_table_class)}else{p.dom.removeClass(t,q.visual_table_class)}}return;case"A":s=p.dom.getAttrib(t,"name");if(s){if(p.hasVisual){p.dom.addClass(t,"mceItemAnchor")}else{p.dom.removeClass(t,"mceItemAnchor")}}return}});p.onVisualAid.dispatch(p,r,p.hasVisual)},remove:function(){var p=this,q=p.getContainer();p.removed=1;p.hide();p.execCallback("remove_instance_callback",p);p.onRemove.dispatch(p);p.onExecCommand.listeners=[];m.remove(p);n.remove(q)},destroy:function(q){var p=this;if(p.destroyed){return}if(!q){m.removeUnload(p.destroy);tinyMCE.onBeforeUnload.remove(p._beforeUnload);if(p.theme&&p.theme.destroy){p.theme.destroy()}p.controlManager.destroy();p.selection.destroy();p.dom.destroy();if(!p.settings.content_editable){j.clear(p.getWin());j.clear(p.getDoc())}j.clear(p.getBody());j.clear(p.formElement)}if(p.formElement){p.formElement.submit=p.formElement._mceOldSubmit;p.formElement._mceOldSubmit=null}p.contentAreaContainer=p.formElement=p.container=p.settings.content_element=p.bodyElement=p.contentDocument=p.contentWindow=null;if(p.selection){p.selection=p.selection.win=p.selection.dom=p.selection.dom.doc=null}p.destroyed=1},_addEvents:function(){var B=this,r,C=B.settings,q=B.dom,x={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function p(t,D){var s=t.type;if(B.removed){return}if(B.onEvent.dispatch(B,t,D)!==false){B[x[t.fakeType||t.type]].dispatch(B,t,D)}}i(x,function(t,s){switch(s){case"contextmenu":q.bind(B.getDoc(),s,p);break;case"paste":q.bind(B.getBody(),s,function(D){p(D)});break;case"submit":case"reset":q.bind(B.getElement().form||n.getParent(B.id,"form"),s,p);break;default:q.bind(C.content_editable?B.getBody():B.getDoc(),s,p)}});q.bind(C.content_editable?B.getBody():(a?B.getDoc():B.getWin()),"focus",function(s){B.focus(true)});if(m.isGecko){q.bind(B.getDoc(),"DOMNodeInserted",function(t){var s;t=t.target;if(t.nodeType===1&&t.nodeName==="IMG"&&(s=t.getAttribute("data-mce-src"))){t.src=B.documentBaseURI.toAbsolute(s)}})}if(a){function u(){var E=this,G=E.getDoc(),F=E.settings;if(a&&!F.readonly){E._refreshContentEditable();try{G.execCommand("styleWithCSS",0,false)}catch(D){if(!E._isHidden()){try{G.execCommand("useCSS",0,true)}catch(D){}}}if(!F.table_inline_editing){try{G.execCommand("enableInlineTableEditing",false,false)}catch(D){}}if(!F.object_resizing){try{G.execCommand("enableObjectResizing",false,false)}catch(D){}}}}B.onBeforeExecCommand.add(u);B.onMouseDown.add(u)}B.onClick.add(function(s,t){t=t.target;if(m.isWebKit&&t.nodeName=="IMG"){B.selection.getSel().setBaseAndExtent(t,0,t,1)}if(t.nodeName=="A"&&q.hasClass(t,"mceItemAnchor")){B.selection.select(t)}B.nodeChanged()});B.onMouseUp.add(B.nodeChanged);B.onKeyUp.add(function(s,t){var D=t.keyCode;if((D>=33&&D<=36)||(D>=37&&D<=40)||D==13||D==45||D==46||D==8||(m.isMac&&(D==91||D==93))||t.ctrlKey){B.nodeChanged()}});B.onKeyDown.add(function(t,D){if(D.keyCode!=8){return}var F=t.selection.getRng().startContainer;var E=t.selection.getRng().startOffset;while(F&&F.nodeType&&F.nodeType!=1&&F.parentNode){F=F.parentNode}if(F&&F.parentNode&&F.parentNode.tagName==="BLOCKQUOTE"&&F.parentNode.firstChild==F&&E==0){t.formatter.toggle("blockquote",null,F.parentNode);var s=t.selection.getRng();s.setStart(F,0);s.setEnd(F,0);t.selection.setRng(s);t.selection.collapse(false)}});B.onReset.add(function(){B.setContent(B.startContent,{format:"raw"})});if(C.custom_shortcuts){if(C.custom_undo_redo_keyboard_shortcuts){B.addShortcut("ctrl+z",B.getLang("undo_desc"),"Undo");B.addShortcut("ctrl+y",B.getLang("redo_desc"),"Redo")}B.addShortcut("ctrl+b",B.getLang("bold_desc"),"Bold");B.addShortcut("ctrl+i",B.getLang("italic_desc"),"Italic");B.addShortcut("ctrl+u",B.getLang("underline_desc"),"Underline");for(r=1;r<=6;r++){B.addShortcut("ctrl+"+r,"",["FormatBlock",false,"h"+r])}B.addShortcut("ctrl+7","",["FormatBlock",false,"p"]);B.addShortcut("ctrl+8","",["FormatBlock",false,"div"]);B.addShortcut("ctrl+9","",["FormatBlock",false,"address"]);function v(t){var s=null;if(!t.altKey&&!t.ctrlKey&&!t.metaKey){return s}i(B.shortcuts,function(D){if(m.isMac&&D.ctrl!=t.metaKey){return}else{if(!m.isMac&&D.ctrl!=t.ctrlKey){return}}if(D.alt!=t.altKey){return}if(D.shift!=t.shiftKey){return}if(t.keyCode==D.keyCode||(t.charCode&&t.charCode==D.charCode)){s=D;return false}});return s}B.onKeyUp.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyPress.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyDown.add(function(s,t){var D=v(t);if(D){D.func.call(D.scope);return j.cancel(t)}})}if(m.isIE){q.bind(B.getDoc(),"controlselect",function(D){var t=B.resizeInfo,s;D=D.target;if(D.nodeName!=="IMG"){return}if(t){q.unbind(t.node,t.ev,t.cb)}if(!q.hasClass(D,"mceItemNoResize")){ev="resizeend";s=q.bind(D,ev,function(F){var E;F=F.target;if(E=q.getStyle(F,"width")){q.setAttrib(F,"width",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"width","")}if(E=q.getStyle(F,"height")){q.setAttrib(F,"height",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"height","")}})}else{ev="resizestart";s=q.bind(D,"resizestart",j.cancel,j)}t=B.resizeInfo={node:D,ev:ev,cb:s}})}if(m.isOpera){B.onClick.add(function(s,t){j.prevent(t)})}if(C.custom_undo_redo){function y(){B.undoManager.typing=false;B.undoManager.add()}q.bind(B.getDoc(),"focusout",function(s){if(!B.removed&&B.undoManager.typing){y()}});B.dom.bind(B.dom.getRoot(),"dragend",function(s){y()});B.onKeyUp.add(function(s,D){var t=D.keyCode;if((t>=33&&t<=36)||(t>=37&&t<=40)||t==13||t==45||D.ctrlKey){y()}});B.onKeyDown.add(function(s,E){var D=E.keyCode,t;if(D==8){t=B.getDoc().selection;if(t&&t.createRange&&t.createRange().item){B.undoManager.beforeChange();s.dom.remove(t.createRange().item(0));y();return j.cancel(E)}}if((D>=33&&D<=36)||(D>=37&&D<=40)||D==13||D==45){if(m.isIE&&D==13){B.undoManager.beforeChange()}if(B.undoManager.typing){y()}return}if((D<16||D>20)&&D!=224&&D!=91&&!B.undoManager.typing){B.undoManager.beforeChange();B.undoManager.typing=true;B.undoManager.add()}});B.onMouseDown.add(function(){if(B.undoManager.typing){y()}})}if(m.isWebKit){q.bind(B.getDoc(),"selectionchange",function(){if(B.selectionTimer){clearTimeout(B.selectionTimer);B.selectionTimer=0}B.selectionTimer=window.setTimeout(function(){B.nodeChanged()},50)})}if(m.isGecko){function A(){var s=B.dom.getAttribs(B.selection.getStart().cloneNode(false));return function(){var t=B.selection.getStart();if(t!==B.getBody()){B.dom.removeAllAttribs(t);i(s,function(D){t.setAttributeNode(D.cloneNode(true))})}}}function z(){var t=B.selection;return !t.isCollapsed()&&t.getStart()!=t.getEnd()}B.onKeyPress.add(function(s,D){var t;if((D.keyCode==8||D.keyCode==46)&&z()){t=A();B.getDoc().execCommand("delete",false,null);t();return j.cancel(D)}});B.dom.bind(B.getDoc(),"cut",function(t){var s;if(z()){s=A();B.onKeyUp.addToTop(j.cancel,j);setTimeout(function(){s();B.onKeyUp.remove(j.cancel,j)},0)}})}},_refreshContentEditable:function(){var q=this,p,r;if(q._isHidden()){p=q.getBody();r=p.parentNode;r.removeChild(p);r.appendChild(p);p.focus()}},_isHidden:function(){var p;if(!a){return 0}p=this.selection.getSel();return(!p||!p.rangeCount||p.rangeCount==0)}})})(tinymce);(function(c){var d=c.each,e,a=true,b=false;c.EditorCommands=function(n){var m=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,q=n.formatter,o;function r(z,y,x){var v;z=z.toLowerCase();if(v=j.exec[z]){v(z,y,x);return a}return b}function l(x){var v;x=x.toLowerCase();if(v=j.state[x]){return v(x)}return -1}function h(x){var v;x=x.toLowerCase();if(v=j.value[x]){return v(x)}return b}function u(v,x){x=x||"exec";d(v,function(z,y){d(y.toLowerCase().split(","),function(A){j[x][A]=z})})}c.extend(this,{execCommand:r,queryCommandState:l,queryCommandValue:h,addCommands:u});function f(y,x,v){if(x===e){x=b}if(v===e){v=null}return n.getDoc().execCommand(y,x,v)}function t(v){return q.match(v)}function s(v,x){q.toggle(v,x?{value:x}:e)}function i(v){o=p.getBookmark(v)}function g(){p.moveToBookmark(o)}u({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(z){var y=n.getDoc(),v;try{f(z)}catch(x){v=a}if(v||!y.queryCommandSupported(z)){if(c.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(A){if(A){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(v){if(p.isCollapsed()){p.select(p.getNode())}f(v);p.collapse(b)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(v){var x=v.substring(7);d("left,center,right,full".split(","),function(y){if(x!=y){q.remove("align"+y)}});s("align"+x);r("mceRepaint")},"InsertUnorderedList,InsertOrderedList":function(y){var v,x;f(y);v=m.getParent(p.getNode(),"ol,ul");if(v){x=v.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(x.nodeName)){i();m.split(x,v);g()}}},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){s(v)},"ForeColor,HiliteColor,FontName":function(y,x,v){s(y,v)},FontSize:function(z,y,x){var v,A;if(x>=1&&x<=7){A=c.explode(k.font_size_style_values);v=c.explode(k.font_size_classes);if(v){x=v[x-1]||x}else{x=A[x-1]||x}}s(z,x)},RemoveFormat:function(v){q.remove(v)},mceBlockQuote:function(v){s("blockquote")},FormatBlock:function(y,x,v){return s(v||"p")},mceCleanup:function(){var v=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(v)},mceRemoveNode:function(z,y,x){var v=x||p.getNode();if(v!=n.getBody()){i();n.dom.remove(v,a);g()}},mceSelectNodeDepth:function(z,y,x){var v=0;m.getParent(p.getNode(),function(A){if(A.nodeType==1&&v++==x){p.select(A);return b}},n.getBody())},mceSelectNode:function(y,x,v){p.select(v)},mceInsertContent:function(B,I,K){var y,J,E,z,F,G,D,C,L,x,A,M,v,H;y=n.parser;J=new c.html.Serializer({},n.schema);v='<span id="mce_marker" data-mce-type="bookmark">\uFEFF</span>';G={content:K,format:"html"};p.onBeforeSetContent.dispatch(p,G);K=G.content;if(K.indexOf("{$caret}")==-1){K+="{$caret}"}K=K.replace(/\{\$caret\}/,v);if(!p.isCollapsed()){n.getDoc().execCommand("Delete",false,null)}E=p.getNode();G={context:E.nodeName.toLowerCase()};F=y.parse(K,G);A=F.lastChild;if(A.attr("id")=="mce_marker"){D=A;for(A=A.prev;A;A=A.walk(true)){if(A.type==3||!m.isBlock(A.name)){A.parent.insert(D,A,A.name==="br");break}}}if(!G.invalid){K=J.serialize(F);A=E.firstChild;M=E.lastChild;if(!A||(A===M&&A.nodeName==="BR")){m.setHTML(E,K)}else{p.setContent(K)}}else{p.setContent(v);E=n.selection.getNode();z=n.getBody();if(E.nodeType==9){E=A=z}else{A=E}while(A!==z){E=A;A=A.parentNode}K=E==z?z.innerHTML:m.getOuterHTML(E);K=J.serialize(y.parse(K.replace(/<span (id="mce_marker"|id=mce_marker).+?<\/span>/i,function(){return J.serialize(F)})));if(E==z){m.setHTML(z,K)}else{m.setOuterHTML(E,K)}}D=m.get("mce_marker");C=m.getRect(D);L=m.getViewPort(n.getWin());if((C.y+C.h>L.y+L.h||C.y<L.y)||(C.x>L.x+L.w||C.x<L.x)){H=c.isIE?n.getDoc().documentElement:n.getBody();H.scrollLeft=C.x;H.scrollTop=C.y-L.h+25}x=m.createRng();A=D.previousSibling;if(A&&A.nodeType==3){x.setStart(A,A.nodeValue.length)}else{x.setStartBefore(D);x.setEndBefore(D)}m.remove(D);p.setRng(x);p.onSetContent.dispatch(p,G);n.addVisual()},mceInsertRawHTML:function(y,x,v){p.setContent("tiny_mce_marker");n.setContent(n.getContent().replace(/tiny_mce_marker/g,function(){return v}))},mceSetContent:function(y,x,v){n.setContent(v)},"Indent,Outdent":function(z){var x,v,y;x=k.indentation;v=/[a-z%]+$/i.exec(x);x=parseInt(x);if(!l("InsertUnorderedList")&&!l("InsertOrderedList")){d(p.getSelectedBlocks(),function(A){if(z=="outdent"){y=Math.max(0,parseInt(A.style.paddingLeft||0)-x);m.setStyle(A,"paddingLeft",y?y+v:"")}else{m.setStyle(A,"paddingLeft",(parseInt(A.style.paddingLeft||0)+x)+v)}})}else{f(z)}},mceRepaint:function(){var x;if(c.isGecko){try{i(a);if(p.getSel()){p.getSel().selectAllChildren(n.getBody())}p.collapse(a);g()}catch(v){}}},mceToggleFormat:function(y,x,v){q.toggle(v)},InsertHorizontalRule:function(){n.execCommand("mceInsertContent",false,"<hr />")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(y,x,v){n.execCommand("mceInsertContent",false,v.replace(/\{\$selection\}/g,p.getContent({format:"text"})))},mceInsertLink:function(z,y,x){var v;if(typeof(x)=="string"){x={href:x}}v=m.getParent(p.getNode(),"a");x.href=x.href.replace(" ","%20");if(!v||!x.href){q.remove("link")}if(x.href){q.apply("link",x,v)}},selectAll:function(){var x=m.getRoot(),v=m.createRng();v.setStart(x,0);v.setEnd(x,x.childNodes.length);n.selection.setRng(v)}});u({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(v){return t("align"+v.substring(7))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){return t(v)},mceBlockQuote:function(){return t("blockquote")},Outdent:function(){var v;if(k.inline_styles){if((v=m.getParent(p.getStart(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}if((v=m.getParent(p.getEnd(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}}return l("InsertUnorderedList")||l("InsertOrderedList")||(!k.inline_styles&&!!m.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(v){return m.getParent(p.getNode(),v=="insertunorderedlist"?"UL":"OL")}},"state");u({"FontSize,FontName":function(y){var x=0,v;if(v=m.getParent(p.getNode(),"span")){if(y=="fontsize"){x=v.style.fontSize}else{x=v.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return x}},"value");if(k.custom_undo_redo){u({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(f){var d,e=0,h=[],c;function g(){return b.trim(f.getContent({format:"raw",no_events:1}))}return d={typing:false,onAdd:new a(d),onUndo:new a(d),onRedo:new a(d),beforeChange:function(){c=f.selection.getBookmark(2,true)},add:function(m){var j,k=f.settings,l;m=m||{};m.content=g();l=h[e];if(l&&l.content==m.content){return null}if(h[e]){h[e].beforeBookmark=c}if(k.custom_undo_redo_levels){if(h.length>k.custom_undo_redo_levels){for(j=0;j<h.length-1;j++){h[j]=h[j+1]}h.length--;e=h.length}}m.bookmark=f.selection.getBookmark(2,true);if(e<h.length-1){h.length=e+1}h.push(m);e=h.length-1;d.onAdd.dispatch(d,m);f.isNotDirty=0;return m},undo:function(){var k,j;if(d.typing){d.add();d.typing=false}if(e>0){k=h[--e];f.setContent(k.content,{format:"raw"});f.selection.moveToBookmark(k.beforeBookmark);d.onUndo.dispatch(d,k)}return k},redo:function(){var i;if(e<h.length-1){i=h[++e];f.setContent(i.content,{format:"raw"});f.selection.moveToBookmark(i.bookmark);d.onRedo.dispatch(d,i)}return i},clear:function(){h=[];e=0;d.typing=false},hasUndo:function(){return e>0||this.typing},hasRedo:function(){return e<h.length-1&&!this.typing}}}})(tinymce);(function(l){var j=l.dom.Event,c=l.isIE,a=l.isGecko,b=l.isOpera,i=l.each,h=l.extend,d=true,g=false;function k(o){var p,n,m;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(o.nodeName)){if(p){n=o.cloneNode(false);n.appendChild(p);p=n}else{p=m=o.cloneNode(false)}p.removeAttribute("id")}}while(o=o.parentNode);if(p){return{wrapper:p,inner:m}}}function f(n,o){var m=o.ownerDocument.createRange();m.setStart(n.endContainer,n.endOffset);m.setEndAfter(o);return m.cloneContents().textContent.length==0}function e(o,q,m){var n,p;if(q.isEmpty(m)){n=q.getParent(m,"ul,ol");if(!q.getParent(n.parentNode,"ul,ol")){q.split(n,m);p=q.create("p",0,'<br data-mce-bogus="1" />');q.replace(p,m);o.select(p,1)}return g}return d}l.create("tinymce.ForceBlocks",{ForceBlocks:function(m){var n=this,o=m.settings,p;n.editor=m;n.dom=m.dom;p=(o.forced_root_block||"p").toLowerCase();o.element=p.toUpperCase();m.onPreInit.add(n.setup,n)},setup:function(){var n=this,m=n.editor,p=m.settings,u=m.dom,o=m.selection,q=m.schema.getBlockElements();if(p.forced_root_block){function v(){var y=o.getStart(),t=m.getBody(),s,z,D,F,E,x,A,B=-16777215;if(!y||y.nodeType!==1){return}while(y!=t){if(q[y.nodeName]){return}y=y.parentNode}s=o.getRng();if(s.setStart){z=s.startContainer;D=s.startOffset;F=s.endContainer;E=s.endOffset}else{if(s.item){s=m.getDoc().body.createTextRange();s.moveToElementText(s.item(0))}tmpRng=s.duplicate();tmpRng.collapse(true);D=tmpRng.move("character",B)*-1;if(!tmpRng.collapsed){tmpRng=s.duplicate();tmpRng.collapse(false);E=(tmpRng.move("character",B)*-1)-D}}for(y=t.firstChild;y;y){if(y.nodeType===3||(y.nodeType==1&&!q[y.nodeName])){if(!x){x=u.create(p.forced_root_block);y.parentNode.insertBefore(x,y)}A=y;y=y.nextSibling;x.appendChild(A)}else{x=null;y=y.nextSibling}}if(s.setStart){s.setStart(z,D);s.setEnd(F,E);o.setRng(s)}else{try{s=m.getDoc().body.createTextRange();s.moveToElementText(t);s.collapse(true);s.moveStart("character",D);if(E>0){s.moveEnd("character",E)}s.select()}catch(C){}}m.nodeChanged()}m.onKeyUp.add(v);m.onClick.add(v)}if(p.force_br_newlines){if(c){m.onKeyPress.add(function(s,t){var x;if(t.keyCode==13&&o.getNode().nodeName!="LI"){o.setContent('<br id="__" /> ',{format:"raw"});x=u.get("__");x.removeAttribute("id");o.select(x);o.collapse();return j.cancel(t)}})}}if(p.force_p_newlines){if(!c){m.onKeyPress.add(function(s,t){if(t.keyCode==13&&!t.shiftKey&&!n.insertPara(t)){j.cancel(t)}})}else{l.addUnload(function(){n._previousFormats=0});m.onKeyPress.add(function(s,t){n._previousFormats=0;if(t.keyCode==13&&!t.shiftKey&&s.selection.isCollapsed()&&p.keep_styles){n._previousFormats=k(s.selection.getStart())}});m.onKeyUp.add(function(t,y){if(y.keyCode==13&&!y.shiftKey){var x=t.selection.getStart(),s=n._previousFormats;if(!x.hasChildNodes()&&s){x=u.getParent(x,u.isBlock);if(x&&x.nodeName!="LI"){x.innerHTML="";if(n._previousFormats){x.appendChild(s.wrapper);s.inner.innerHTML="\uFEFF"}else{x.innerHTML="\uFEFF"}o.select(x,1);o.collapse(true);t.getDoc().execCommand("Delete",false,null);n._previousFormats=0}}}})}if(a){m.onKeyDown.add(function(s,t){if((t.keyCode==8||t.keyCode==46)&&!t.shiftKey){n.backspaceDelete(t,t.keyCode==8)}})}}if(l.isWebKit){function r(t){var s=o.getRng(),x,A=u.create("div",null," "),z,y=u.getViewPort(t.getWin()).h;s.insertNode(x=u.create("br"));s.setStartAfter(x);s.setEndAfter(x);o.setRng(s);if(o.getSel().focusNode==x.previousSibling){o.select(u.insertAfter(u.doc.createTextNode("\u00a0"),x));o.collapse(d)}u.insertAfter(A,x);z=u.getPos(A).y;u.remove(A);if(z>y){t.getWin().scrollTo(0,z)}}m.onKeyPress.add(function(s,t){if(t.keyCode==13&&(t.shiftKey||(p.force_br_newlines&&!u.getParent(o.getNode(),"h1,h2,h3,h4,h5,h6,ol,ul")))){r(s);j.cancel(t)}})}if(c){if(p.element!="P"){m.onKeyPress.add(function(s,t){n.lastElm=o.getNode().nodeName});m.onKeyUp.add(function(t,x){var z,y=o.getNode(),s=t.getBody();if(s.childNodes.length===1&&y.nodeName=="P"){y=u.rename(y,p.element);o.select(y);o.collapse();t.nodeChanged()}else{if(x.keyCode==13&&!x.shiftKey&&n.lastElm!="P"){z=u.getParent(y,"p");if(z){u.rename(z,p.element);t.nodeChanged()}}}})}}},getParentBlock:function(o){var m=this.dom;return m.getParent(o,m.isBlock)},insertPara:function(Q){var E=this,v=E.editor,M=v.dom,R=v.getDoc(),V=v.settings,F=v.selection.getSel(),G=F.getRangeAt(0),U=R.body;var J,K,H,O,N,q,o,u,z,m,C,T,p,x,I,L=M.getViewPort(v.getWin()),B,D,A;v.undoManager.beforeChange();J=R.createRange();J.setStart(F.anchorNode,F.anchorOffset);J.collapse(d);K=R.createRange();K.setStart(F.focusNode,F.focusOffset);K.collapse(d);H=J.compareBoundaryPoints(J.START_TO_END,K)<0;O=H?F.anchorNode:F.focusNode;N=H?F.anchorOffset:F.focusOffset;q=H?F.focusNode:F.anchorNode;o=H?F.focusOffset:F.anchorOffset;if(O===q&&/^(TD|TH)$/.test(O.nodeName)){if(O.firstChild.nodeName=="BR"){M.remove(O.firstChild)}if(O.childNodes.length==0){v.dom.add(O,V.element,null,"<br />");T=v.dom.add(O,V.element,null,"<br />")}else{I=O.innerHTML;O.innerHTML="";v.dom.add(O,V.element,null,I);T=v.dom.add(O,V.element,null,"<br />")}G=R.createRange();G.selectNodeContents(T);G.collapse(1);v.selection.setRng(G);return g}if(O==U&&q==U&&U.firstChild&&v.dom.isBlock(U.firstChild)){O=q=O.firstChild;N=o=0;J=R.createRange();J.setStart(O,0);K=R.createRange();K.setStart(q,0)}if(!R.body.hasChildNodes()){R.body.appendChild(M.create("br"))}O=O.nodeName=="HTML"?R.body:O;O=O.nodeName=="BODY"?O.firstChild:O;q=q.nodeName=="HTML"?R.body:q;q=q.nodeName=="BODY"?q.firstChild:q;u=E.getParentBlock(O);z=E.getParentBlock(q);m=u?u.nodeName:V.element;if(I=E.dom.getParent(u,"li,pre")){if(I.nodeName=="LI"){return e(v.selection,E.dom,I)}return d}if(u&&(u.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(M.getStyle(u,"position",1)))){m=V.element;u=null}if(z&&(z.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(M.getStyle(u,"position",1)))){m=V.element;z=null}if(/(TD|TABLE|TH|CAPTION)/.test(m)||(u&&m=="DIV"&&/left|right/gi.test(M.getStyle(u,"float",1)))){m=V.element;u=z=null}C=(u&&u.nodeName==m)?u.cloneNode(0):v.dom.create(m);T=(z&&z.nodeName==m)?z.cloneNode(0):v.dom.create(m);T.removeAttribute("id");if(/^(H[1-6])$/.test(m)&&f(G,u)){T=v.dom.create(V.element)}I=p=O;do{if(I==U||I.nodeType==9||E.dom.isBlock(I)||/(TD|TABLE|TH|CAPTION)/.test(I.nodeName)){break}p=I}while((I=I.previousSibling?I.previousSibling:I.parentNode));I=x=q;do{if(I==U||I.nodeType==9||E.dom.isBlock(I)||/(TD|TABLE|TH|CAPTION)/.test(I.nodeName)){break}x=I}while((I=I.nextSibling?I.nextSibling:I.parentNode));if(p.nodeName==m){J.setStart(p,0)}else{J.setStartBefore(p)}J.setEnd(O,N);C.appendChild(J.cloneContents()||R.createTextNode(""));try{K.setEndAfter(x)}catch(P){}K.setStart(q,o);T.appendChild(K.cloneContents()||R.createTextNode(""));G=R.createRange();if(!p.previousSibling&&p.parentNode.nodeName==m){G.setStartBefore(p.parentNode)}else{if(J.startContainer.nodeName==m&&J.startOffset==0){G.setStartBefore(J.startContainer)}else{G.setStart(J.startContainer,J.startOffset)}}if(!x.nextSibling&&x.parentNode.nodeName==m){G.setEndAfter(x.parentNode)}else{G.setEnd(K.endContainer,K.endOffset)}G.deleteContents();if(b){v.getWin().scrollTo(0,L.y)}if(C.firstChild&&C.firstChild.nodeName==m){C.innerHTML=C.firstChild.innerHTML}if(T.firstChild&&T.firstChild.nodeName==m){T.innerHTML=T.firstChild.innerHTML}function S(y,s){var r=[],X,W,t;y.innerHTML="";if(V.keep_styles){W=s;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(W.nodeName)){X=W.cloneNode(g);M.setAttrib(X,"id","");r.push(X)}}while(W=W.parentNode)}if(r.length>0){for(t=r.length-1,X=y;t>=0;t--){X=X.appendChild(r[t])}r[0].innerHTML=b?"\u00a0":"<br />";return r[0]}else{y.innerHTML=b?"\u00a0":"<br />"}}if(M.isEmpty(C)){S(C,O)}if(M.isEmpty(T)){A=S(T,q)}if(b&&parseFloat(opera.version())<9.5){G.insertNode(C);G.insertNode(T)}else{G.insertNode(T);G.insertNode(C)}T.normalize();C.normalize();v.selection.select(T,true);v.selection.collapse(true);B=v.dom.getPos(T).y;if(B<L.y||B+25>L.y+L.h){v.getWin().scrollTo(0,B<L.y?B:B-L.h+25)}v.undoManager.add();return g},backspaceDelete:function(u,B){var C=this,s=C.editor,y=s.getBody(),q=s.dom,p,v=s.selection,o=v.getRng(),x=o.startContainer,p,z,A,m;if(!B&&o.collapsed&&x.nodeType==1&&o.startOffset==x.childNodes.length){m=new l.dom.TreeWalker(x.lastChild,x);for(p=x.lastChild;p;p=m.prev()){if(p.nodeType==3){o.setStart(p,p.nodeValue.length);o.collapse(true);v.setRng(o);return}}}if(x&&s.dom.isBlock(x)&&!/^(TD|TH)$/.test(x.nodeName)&&B){if(x.childNodes.length==0||(x.childNodes.length==1&&x.firstChild.nodeName=="BR")){p=x;while((p=p.previousSibling)&&!s.dom.isBlock(p)){}if(p){if(x!=y.firstChild){z=s.dom.doc.createTreeWalker(p,NodeFilter.SHOW_TEXT,null,g);while(A=z.nextNode()){p=A}o=s.getDoc().createRange();o.setStart(p,p.nodeValue?p.nodeValue.length:0);o.setEnd(p,p.nodeValue?p.nodeValue.length:0);v.setRng(o);s.dom.remove(x)}return j.cancel(u)}}}}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each,e=c.extend;c.create("tinymce.ControlManager",{ControlManager:function(f,j){var h=this,g;j=j||{};h.editor=f;h.controls={};h.onAdd=new c.util.Dispatcher(h);h.onPostRender=new c.util.Dispatcher(h);h.prefix=j.prefix||f.id+"_";h._cls={};h.onPostRender.add(function(){d(h.controls,function(i){i.postRender()})})},get:function(f){return this.controls[this.prefix+f]||this.controls[f]},setActive:function(h,f){var g=null;if(g=this.get(h)){g.setActive(f)}return g},setDisabled:function(h,f){var g=null;if(g=this.get(h)){g.setDisabled(f)}return g},add:function(g){var f=this;if(g){f.controls[g.id]=g;f.onAdd.dispatch(g,f)}return g},createControl:function(i){var h,g=this,f=g.editor;d(f.plugins,function(j){if(j.createControl){h=j.createControl(i,g);if(h){return false}}});switch(i){case"|":case"separator":return g.createSeparator()}if(!h&&f.buttons&&(h=f.buttons[i])){return g.createButton(i,h)}return g.add(h)},createDropMenu:function(f,n,h){var m=this,i=m.editor,j,g,k,l;n=e({"class":"mceDropDown",constrain:i.settings.constrain_menus},n);n["class"]=n["class"]+" "+i.getParam("skin")+"Skin";if(k=i.getParam("skin_variant")){n["class"]+=" "+i.getParam("skin")+"Skin"+k.substring(0,1).toUpperCase()+k.substring(1)}f=m.prefix+f;l=h||m._cls.dropmenu||c.ui.DropMenu;j=m.controls[f]=new l(f,n);j.onAddItem.add(function(r,q){var p=q.settings;p.title=i.getLang(p.title,p.title);if(!p.onclick){p.onclick=function(o){if(p.cmd){i.execCommand(p.cmd,p.ui||false,p.value)}}}});i.onRemove.add(function(){j.destroy()});if(c.isIE){j.onShowMenu.add(function(){i.focus();g=i.selection.getBookmark(1)});j.onHideMenu.add(function(){if(g){i.selection.moveToBookmark(g);g=0}})}return m.add(j)},createListBox:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;if(g.settings.use_native_selects){k=new c.ui.NativeListBox(m,i)}else{f=l||h._cls.listbox||c.ui.ListBox;k=new f(m,i,g)}h.controls[m]=k;if(c.isWebKit){k.onPostRender.add(function(p,o){a.add(o,"mousedown",function(){g.bookmark=g.selection.getBookmark(1)});a.add(o,"focus",function(){g.selection.moveToBookmark(g.bookmark);g.bookmark=null})})}if(k.hideMenu){g.onMouseDown.add(k.hideMenu,k)}return h.add(k)},createButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.label=g.translate(i.label);i.scope=i.scope||g;if(!i.onclick&&!i.menu_button){i.onclick=function(){g.execCommand(i.cmd,i.ui||false,i.value)}}i=e({title:i.title,"class":"mce_"+m,unavailable_prefix:g.getLang("unavailable",""),scope:i.scope,control_manager:h},i);m=h.prefix+m;if(i.menu_button){f=l||h._cls.menubutton||c.ui.MenuButton;k=new f(m,i,g);g.onMouseDown.add(k.hideMenu,k)}else{f=h._cls.button||c.ui.Button;k=new f(m,i,g)}return h.add(k)},createMenuButton:function(h,f,g){f=f||{};f.menu_button=1;return this.createButton(h,f,g)},createSplitButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onclick){i.onclick=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;f=l||h._cls.splitbutton||c.ui.SplitButton;k=h.add(new f(m,i,g));g.onMouseDown.add(k.hideMenu,k);return k},createColorSplitButton:function(f,n,h){var l=this,j=l.editor,i,k,m,g;if(l.get(f)){return null}n.title=j.translate(n.title);n.scope=n.scope||j;if(!n.onclick){n.onclick=function(o){if(c.isIE){g=j.selection.getBookmark(1)}j.execCommand(n.cmd,n.ui||false,o||n.value)}}if(!n.onselect){n.onselect=function(o){j.execCommand(n.cmd,n.ui||false,o||n.value)}}n=e({title:n.title,"class":"mce_"+f,menu_class:j.getParam("skin")+"Skin",scope:n.scope,more_colors_title:j.getLang("more_colors")},n);f=l.prefix+f;m=h||l._cls.colorsplitbutton||c.ui.ColorSplitButton;k=new m(f,n,j);j.onMouseDown.add(k.hideMenu,k);j.onRemove.add(function(){k.destroy()});if(c.isIE){k.onShowMenu.add(function(){j.focus();g=j.selection.getBookmark(1)});k.onHideMenu.add(function(){if(g){j.selection.moveToBookmark(g);g=0}})}return l.add(k)},createToolbar:function(k,h,j){var i,g=this,f;k=g.prefix+k;f=j||g._cls.toolbar||c.ui.Toolbar;i=new f(k,h,g.editor);if(g.get(k)){return null}return g.add(i)},createToolbarGroup:function(k,h,j){var i,g=this,f;k=g.prefix+k;f=j||this._cls.toolbarGroup||c.ui.ToolbarGroup;i=new f(k,h,g.editor);if(g.get(k)){return null}return g.add(i)},createSeparator:function(g){var f=g||this._cls.separator||c.ui.Separator;return new f()},setControlType:function(g,f){return this._cls[g.toLowerCase()]=f},destroy:function(){d(this.controls,function(f){f.destroy()});this.controls=null}})})(tinymce);(function(d){var a=d.util.Dispatcher,e=d.each,c=d.isIE,b=d.isOpera;d.create("tinymce.WindowManager",{WindowManager:function(f){var g=this;g.editor=f;g.onOpen=new a(g);g.onClose=new a(g);g.params={};g.features={}},open:function(z,h){var v=this,k="",n,m,i=v.editor.settings.dialog_type=="modal",q,o,j,g=d.DOM.getViewPort(),r;z=z||{};h=h||{};o=b?g.w:screen.width;j=b?g.h:screen.height;z.name=z.name||"mc_"+new Date().getTime();z.width=parseInt(z.width||320);z.height=parseInt(z.height||240);z.resizable=true;z.left=z.left||parseInt(o/2)-(z.width/2);z.top=z.top||parseInt(j/2)-(z.height/2);h.inline=false;h.mce_width=z.width;h.mce_height=z.height;h.mce_auto_focus=z.auto_focus;if(i){if(c){z.center=true;z.help=false;z.dialogWidth=z.width+"px";z.dialogHeight=z.height+"px";z.scroll=z.scrollbars||false}}e(z,function(p,f){if(d.is(p,"boolean")){p=p?"yes":"no"}if(!/^(name|url)$/.test(f)){if(c&&i){k+=(k?";":"")+f+":"+p}else{k+=(k?",":"")+f+"="+p}}});v.features=z;v.params=h;v.onOpen.dispatch(v,z,h);r=z.url||z.file;r=d._addVer(r);try{if(c&&i){q=1;window.showModalDialog(r,window,k)}else{q=window.open(r,z.name,k)}}catch(l){}if(!q){alert(v.editor.getLang("popup_blocked"))}},close:function(f){f.close();this.onClose.dispatch(this)},createInstance:function(i,h,g,m,l,k){var j=d.resolve(i);return new j(h,g,m,l,k)},confirm:function(h,f,i,g){g=g||window;f.call(i||this,g.confirm(this._decode(this.editor.getLang(h,h))))},alert:function(h,f,j,g){var i=this;g=g||window;g.alert(i._decode(i.editor.getLang(h,h)));if(f){f.call(j||i)}},resizeBy:function(f,g,h){h.resizeBy(f,g)},_decode:function(f){return d.DOM.decode(f).replace(/\\n/g,"\n")}})}(tinymce));(function(a){a.Formatter=function(V){var M={},O=a.each,c=V.dom,q=V.selection,t=a.dom.TreeWalker,K=new a.dom.RangeUtils(c),d=V.schema.isValidChild,F=c.isBlock,l=V.settings.forced_root_block,s=c.nodeIndex,E="\uFEFF",e=/^(src|href|style)$/,S=false,B=true,p,P={apply:[],remove:[]};function z(W){return W instanceof Array}function m(X,W){return c.getParents(X,W,c.getRoot())}function b(W){return W.nodeType===1&&(W.face==="mceinline"||W.style.fontFamily==="mceinline")}function R(W){return W?M[W]:M}function k(W,X){if(W){if(typeof(W)!=="string"){O(W,function(Z,Y){k(Y,Z)})}else{X=X.length?X:[X];O(X,function(Y){if(Y.deep===p){Y.deep=!Y.selector}if(Y.split===p){Y.split=!Y.selector||Y.inline}if(Y.remove===p&&Y.selector&&!Y.inline){Y.remove="none"}if(Y.selector&&Y.inline){Y.mixed=true;Y.block_expand=true}if(typeof(Y.classes)==="string"){Y.classes=Y.classes.split(/\s+/)}});M[W]=X}}}var i=function(X){var W;V.dom.getParent(X,function(Y){W=V.dom.getStyle(Y,"text-decoration");return W&&W!=="none"});return W};var I=function(W){var X;if(W.nodeType===1&&W.parentNode&&W.parentNode.nodeType===1){X=i(W.parentNode);if(V.dom.getStyle(W,"color")&&X){V.dom.setStyle(W,"text-decoration",X)}else{if(V.dom.getStyle(W,"textdecoration")===X){V.dom.setStyle(W,"text-decoration",null)}}}};function T(Z,ah,ac){var ad=R(Z),ai=ad[0],ag,X,af,ae=q.isCollapsed();function aa(am){var al=am.startContainer,ap=am.startOffset,ao,an;if(al.nodeType==1||al.nodeValue===""){al=al.nodeType==1?al.childNodes[ap]:al;if(al){ao=new t(al,al.parentNode);for(an=ao.current();an;an=ao.next()){if(an.nodeType==3&&!f(an)){am.setStart(an,0);break}}}}return am}function W(am,al){al=al||ai;if(am){if(al.onformat){al.onformat(am,al,ah,ac)}O(al.styles,function(ao,an){c.setStyle(am,an,r(ao,ah))});O(al.attributes,function(ao,an){c.setAttrib(am,an,r(ao,ah))});O(al.classes,function(an){an=r(an,ah);if(!c.hasClass(am,an)){c.addClass(am,an)}})}}function ab(){function an(au,ar){var at=new t(ar);for(ac=at.current();ac;ac=at.prev()){if(ac.childNodes.length>1||ac==au){return ac}}}var am=V.selection.getRng();var aq=am.startContainer;var al=am.endContainer;if(aq!=al&&am.endOffset==0){var ap=an(aq,al);var ao=ap.nodeType==3?ap.length:ap.childNodes.length;am.setEnd(ap,ao)}return am}function Y(ao,au,ar,aq,am){var al=[],an=-1,at,aw=-1,ap=-1,av;O(ao.childNodes,function(ay,ax){if(ay.nodeName==="UL"||ay.nodeName==="OL"){an=ax;at=ay;return false}});O(ao.childNodes,function(ay,ax){if(ay.nodeName==="SPAN"&&c.getAttrib(ay,"data-mce-type")=="bookmark"){if(ay.id==au.id+"_start"){aw=ax}else{if(ay.id==au.id+"_end"){ap=ax}}}});if(an<=0||(aw<an&&ap>an)){O(a.grep(ao.childNodes),am);return 0}else{av=ar.cloneNode(S);O(a.grep(ao.childNodes),function(ay,ax){if((aw<an&&ax<an)||(aw>an&&ax>an)){al.push(ay);ay.parentNode.removeChild(ay)}});if(aw<an){ao.insertBefore(av,at)}else{if(aw>an){ao.insertBefore(av,at.nextSibling)}}aq.push(av);O(al,function(ax){av.appendChild(ax)});return av}}function aj(am,ao){var al=[],ap,an;ap=ai.inline||ai.block;an=c.create(ap);W(an);K.walk(am,function(aq){var ar;function at(au){var ax=au.nodeName.toLowerCase(),aw=au.parentNode.nodeName.toLowerCase(),av;if(g(ax,"br")){ar=0;if(ai.block){c.remove(au)}return}if(ai.wrapper&&x(au,Z,ah)){ar=0;return}if(ai.block&&!ai.wrapper&&G(ax)){au=c.rename(au,ap);W(au);al.push(au);ar=0;return}if(ai.selector){O(ad,function(ay){if("collapsed" in ay&&ay.collapsed!==ae){return}if(c.is(au,ay.selector)&&!b(au)){W(au,ay);av=true}});if(!ai.inline||av){ar=0;return}}if(d(ap,ax)&&d(aw,ap)&&!(au.nodeType===3&&au.nodeValue.length===1&&au.nodeValue.charCodeAt(0)===65279)){if(!ar){ar=an.cloneNode(S);au.parentNode.insertBefore(ar,au);al.push(ar)}ar.appendChild(au)}else{if(ax=="li"&&ao){ar=Y(au,ao,an,al,at)}else{ar=0;O(a.grep(au.childNodes),at);ar=0}}}O(aq,at)});if(ai.wrap_links===false){O(al,function(aq){function ar(aw){var av,au,at;if(aw.nodeName==="A"){au=an.cloneNode(S);al.push(au);at=a.grep(aw.childNodes);for(av=0;av<at.length;av++){au.appendChild(at[av])}aw.appendChild(au)}O(a.grep(aw.childNodes),ar)}ar(aq)})}O(al,function(at){var aq;function au(aw){var av=0;O(aw.childNodes,function(ax){if(!f(ax)&&!H(ax)){av++}});return av}function ar(av){var ax,aw;O(av.childNodes,function(ay){if(ay.nodeType==1&&!H(ay)&&!b(ay)){ax=ay;return S}});if(ax&&h(ax,ai)){aw=ax.cloneNode(S);W(aw);c.replace(aw,av,B);c.remove(ax,1)}return aw||av}aq=au(at);if((al.length>1||!F(at))&&aq===0){c.remove(at,1);return}if(ai.inline||ai.wrapper){if(!ai.exact&&aq===1){at=ar(at)}O(ad,function(av){O(c.select(av.inline,at),function(ax){var aw;if(av.wrap_links===false){aw=ax.parentNode;do{if(aw.nodeName==="A"){return}}while(aw=aw.parentNode)}U(av,ah,ax,av.exact?ax:null)})});if(x(at.parentNode,Z,ah)){c.remove(at,1);at=0;return B}if(ai.merge_with_parents){c.getParent(at.parentNode,function(av){if(x(av,Z,ah)){c.remove(at,1);at=0;return B}})}if(at&&ai.merge_siblings!==false){at=u(C(at),at);at=u(at,C(at,B))}}})}if(ai){if(ac){X=c.createRng();X.setStartBefore(ac);X.setEndAfter(ac);aj(o(X,ad))}else{if(!ae||!ai.inline||c.select("td.mceSelected,th.mceSelected").length){var ak=V.selection.getNode();V.selection.setRng(ab());ag=q.getBookmark();aj(o(q.getRng(B),ad),ag);if(ai.styles&&(ai.styles.color||ai.styles.textDecoration)){a.walk(ak,I,"childNodes");I(ak)}q.moveToBookmark(ag);q.setRng(aa(q.getRng(B)));V.nodeChanged()}else{Q("apply",Z,ah)}}}}function A(Y,ah,ab){var ac=R(Y),aj=ac[0],ag,af,X;function aa(am){var al=am.startContainer,ar=am.startOffset,aq,ap,an,ao;if(al.nodeType==3&&ar>=al.nodeValue.length-1){al=al.parentNode;ar=s(al)+1}if(al.nodeType==1){an=al.childNodes;al=an[Math.min(ar,an.length-1)];aq=new t(al);if(ar>an.length-1){aq.next()}for(ap=aq.current();ap;ap=aq.next()){if(ap.nodeType==3&&!f(ap)){ao=c.create("a",null,E);ap.parentNode.insertBefore(ao,ap);am.setStart(ap,0);q.setRng(am);c.remove(ao);return}}}}function Z(ao){var an,am,al;an=a.grep(ao.childNodes);for(am=0,al=ac.length;am<al;am++){if(U(ac[am],ah,ao,ao)){break}}if(aj.deep){for(am=0,al=an.length;am<al;am++){Z(an[am])}}}function ad(al){var am;O(m(al.parentNode).reverse(),function(an){var ao;if(!am&&an.id!="_start"&&an.id!="_end"){ao=x(an,Y,ah);if(ao&&ao.split!==false){am=an}}});return am}function W(ao,al,aq,au){var av,at,ar,an,ap,am;if(ao){am=ao.parentNode;for(av=al.parentNode;av&&av!=am;av=av.parentNode){at=av.cloneNode(S);for(ap=0;ap<ac.length;ap++){if(U(ac[ap],ah,at,at)){at=0;break}}if(at){if(ar){at.appendChild(ar)}if(!an){an=at}ar=at}}if(au&&(!aj.mixed||!F(ao))){al=c.split(ao,al)}if(ar){aq.parentNode.insertBefore(ar,aq);an.appendChild(aq)}}return al}function ai(al){return W(ad(al),al,al,true)}function ae(an){var am=c.get(an?"_start":"_end"),al=am[an?"firstChild":"lastChild"];if(H(al)){al=al[an?"firstChild":"lastChild"]}c.remove(am,true);return al}function ak(al){var am,an;al=o(al,ac,B);if(aj.split){am=J(al,B);an=J(al);if(am!=an){am=N(am,"span",{id:"_start","data-mce-type":"bookmark"});an=N(an,"span",{id:"_end","data-mce-type":"bookmark"});ai(am);ai(an);am=ae(B);an=ae()}else{am=an=ai(am)}al.startContainer=am.parentNode;al.startOffset=s(am);al.endContainer=an.parentNode;al.endOffset=s(an)+1}K.walk(al,function(ao){O(ao,function(ap){Z(ap);if(ap.nodeType===1&&V.dom.getStyle(ap,"text-decoration")==="underline"&&ap.parentNode&&i(ap.parentNode)==="underline"){U({deep:false,exact:true,inline:"span",styles:{textDecoration:"underline"}},null,ap)}})})}if(ab){X=c.createRng();X.setStartBefore(ab);X.setEndAfter(ab);ak(X);return}if(!q.isCollapsed()||!aj.inline||c.select("td.mceSelected,th.mceSelected").length){ag=q.getBookmark();ak(q.getRng(B));q.moveToBookmark(ag);if(j(Y,ah,q.getStart())){aa(q.getRng(true))}V.nodeChanged()}else{Q("remove",Y,ah)}}function D(X,Z,Y){var W=R(X);if(j(X,Z,Y)&&(!("toggle" in W[0])||W[0]["toggle"])){A(X,Z,Y)}else{T(X,Z,Y)}}function x(X,W,ac,aa){var Y=R(W),ad,ab,Z;function ae(ai,ak,al){var ah,aj,af=ak[al],ag;if(ak.onmatch){return ak.onmatch(ai,ak,al)}if(af){if(af.length===p){for(ah in af){if(af.hasOwnProperty(ah)){if(al==="attributes"){aj=c.getAttrib(ai,ah)}else{aj=L(ai,ah)}if(aa&&!aj&&!ak.exact){return}if((!aa||ak.exact)&&!g(aj,r(af[ah],ac))){return}}}}else{for(ag=0;ag<af.length;ag++){if(al==="attributes"?c.getAttrib(ai,af[ag]):L(ai,af[ag])){return ak}}}}return ak}if(Y&&X){for(ab=0;ab<Y.length;ab++){ad=Y[ab];if(h(X,ad)&&ae(X,ad,"attributes")&&ae(X,ad,"styles")){if(Z=ad.classes){for(ab=0;ab<Z.length;ab++){if(!c.hasClass(X,Z[ab])){return}}}return ad}}}}function j(Y,ab,aa){var X,Z;function W(ac){ac=c.getParent(ac,function(ad){return !!x(ad,Y,ab,true)});return x(ac,Y,ab)}if(aa){return W(aa)}if(q.isCollapsed()){for(Z=P.apply.length-1;Z>=0;Z--){if(P.apply[Z].name==Y){return true}}for(Z=P.remove.length-1;Z>=0;Z--){if(P.remove[Z].name==Y){return false}}return W(q.getNode())}aa=q.getNode();if(W(aa)){return B}X=q.getStart();if(X!=aa){if(W(X)){return B}}return S}function v(ad,ac){var aa,ab=[],Z={},Y,X,W;if(q.isCollapsed()){for(X=0;X<ad.length;X++){for(Y=P.remove.length-1;Y>=0;Y--){W=ad[X];if(P.remove[Y].name==W){Z[W]=true;break}}}for(Y=P.apply.length-1;Y>=0;Y--){for(X=0;X<ad.length;X++){W=ad[X];if(!Z[W]&&P.apply[Y].name==W){Z[W]=true;ab.push(W)}}}}aa=q.getStart();c.getParent(aa,function(ag){var af,ae;for(af=0;af<ad.length;af++){ae=ad[af];if(!Z[ae]&&x(ag,ae,ac)){Z[ae]=true;ab.push(ae)}}});return ab}function y(aa){var ac=R(aa),Z,Y,ab,X,W;if(ac){Z=q.getStart();Y=m(Z);for(X=ac.length-1;X>=0;X--){W=ac[X].selector;if(!W){return B}for(ab=Y.length-1;ab>=0;ab--){if(c.is(Y[ab],W)){return B}}}}return S}a.extend(this,{get:R,register:k,apply:T,remove:A,toggle:D,match:j,matchAll:v,matchNode:x,canApply:y});function h(W,X){if(g(W,X.inline)){return B}if(g(W,X.block)){return B}if(X.selector){return c.is(W,X.selector)}}function g(X,W){X=X||"";W=W||"";X=""+(X.nodeName||X);W=""+(W.nodeName||W);return X.toLowerCase()==W.toLowerCase()}function L(X,W){var Y=c.getStyle(X,W);if(W=="color"||W=="backgroundColor"){Y=c.toHex(Y)}if(W=="fontWeight"&&Y==700){Y="bold"}return""+Y}function r(W,X){if(typeof(W)!="string"){W=W(X)}else{if(X){W=W.replace(/%(\w+)/g,function(Z,Y){return X[Y]||Z})}}return W}function f(W){return W&&W.nodeType===3&&/^([\s\r\n]+|)$/.test(W.nodeValue)}function N(Y,X,W){var Z=c.create(X,W);Y.parentNode.insertBefore(Z,Y);Z.appendChild(Y);return Z}function o(W,ag,Z){var Y=W.startContainer,ad=W.startOffset,aj=W.endContainer,ae=W.endOffset,ai,af,ac;function ah(am,an,ak,al){var ao,ap;al=al||c.getRoot();for(;;){ao=am.parentNode;if(ao==al||(!ag[0].block_expand&&F(ao))){return am}for(ai=ao[an];ai&&ai!=am;ai=ai[ak]){if(ai.nodeType==1&&!H(ai)){return am}if(ai.nodeType==3&&!f(ai)){return am}}am=am.parentNode}return am}function ab(ak,al){if(al===p){al=ak.nodeType===3?ak.length:ak.childNodes.length}while(ak&&ak.hasChildNodes()){ak=ak.childNodes[al];if(ak){al=ak.nodeType===3?ak.length:ak.childNodes.length}}return{node:ak,offset:al}}if(Y.nodeType==1&&Y.hasChildNodes()){af=Y.childNodes.length-1;Y=Y.childNodes[ad>af?af:ad];if(Y.nodeType==3){ad=0}}if(aj.nodeType==1&&aj.hasChildNodes()){af=aj.childNodes.length-1;aj=aj.childNodes[ae>af?af:ae-1];if(aj.nodeType==3){ae=aj.nodeValue.length}}if(H(Y.parentNode)){Y=Y.parentNode}if(H(Y)){Y=Y.nextSibling||Y}if(H(aj.parentNode)){ae=c.nodeIndex(aj);aj=aj.parentNode}if(H(aj)&&aj.previousSibling){aj=aj.previousSibling;ae=aj.length}if(ag[0].inline){ac=ab(aj,ae);if(ac.node){while(ac.node&&ac.offset===0&&ac.node.previousSibling){ac=ab(ac.node.previousSibling)}if(ac.node&&ac.offset>0&&ac.node.nodeType===3&&ac.node.nodeValue.charAt(ac.offset-1)===" "){if(ac.offset>1){aj=ac.node;aj.splitText(ac.offset-1)}else{if(ac.node.previousSibling){aj=ac.node.previousSibling}}}}}if(ag[0].inline||ag[0].block_expand){Y=ah(Y,"firstChild","nextSibling");aj=ah(aj,"lastChild","previousSibling")}if(ag[0].selector&&ag[0].expand!==S&&!ag[0].inline){function aa(al,ak){var am,an,ap,ao;if(al.nodeType==3&&al.nodeValue.length==0&&al[ak]){al=al[ak]}am=m(al);for(an=0;an<am.length;an++){for(ap=0;ap<ag.length;ap++){ao=ag[ap];if("collapsed" in ao&&ao.collapsed!==W.collapsed){continue}if(c.is(am[an],ao.selector)){return am[an]}}}return al}Y=aa(Y,"previousSibling");aj=aa(aj,"nextSibling")}if(ag[0].block||ag[0].selector){function X(al,ak,an){var am;if(!ag[0].wrapper){am=c.getParent(al,ag[0].block)}if(!am){am=c.getParent(al.nodeType==3?al.parentNode:al,F)}if(am&&ag[0].wrapper){am=m(am,"ul,ol").reverse()[0]||am}if(!am){am=al;while(am[ak]&&!F(am[ak])){am=am[ak];if(g(am,"br")){break}}}return am||al}Y=X(Y,"previousSibling");aj=X(aj,"nextSibling");if(ag[0].block){if(!F(Y)){Y=ah(Y,"firstChild","nextSibling")}if(!F(aj)){aj=ah(aj,"lastChild","previousSibling")}}}if(Y.nodeType==1){ad=s(Y);Y=Y.parentNode}if(aj.nodeType==1){ae=s(aj)+1;aj=aj.parentNode}return{startContainer:Y,startOffset:ad,endContainer:aj,endOffset:ae}}function U(ac,ab,Z,W){var Y,X,aa;if(!h(Z,ac)){return S}if(ac.remove!="all"){O(ac.styles,function(ae,ad){ae=r(ae,ab);if(typeof(ad)==="number"){ad=ae;W=0}if(!W||g(L(W,ad),ae)){c.setStyle(Z,ad,"")}aa=1});if(aa&&c.getAttrib(Z,"style")==""){Z.removeAttribute("style");Z.removeAttribute("data-mce-style")}O(ac.attributes,function(af,ad){var ae;af=r(af,ab);if(typeof(ad)==="number"){ad=af;W=0}if(!W||g(c.getAttrib(W,ad),af)){if(ad=="class"){af=c.getAttrib(Z,ad);if(af){ae="";O(af.split(/\s+/),function(ag){if(/mce\w+/.test(ag)){ae+=(ae?" ":"")+ag}});if(ae){c.setAttrib(Z,ad,ae);return}}}if(ad=="class"){Z.removeAttribute("className")}if(e.test(ad)){Z.removeAttribute("data-mce-"+ad)}Z.removeAttribute(ad)}});O(ac.classes,function(ad){ad=r(ad,ab);if(!W||c.hasClass(W,ad)){c.removeClass(Z,ad)}});X=c.getAttribs(Z);for(Y=0;Y<X.length;Y++){if(X[Y].nodeName.indexOf("_")!==0){return S}}}if(ac.remove!="none"){n(Z,ac);return B}}function n(Y,Z){var W=Y.parentNode,X;if(Z.block){if(!l){function aa(ac,ab,ad){ac=C(ac,ab,ad);return !ac||(ac.nodeName=="BR"||F(ac))}if(F(Y)&&!F(W)){if(!aa(Y,S)&&!aa(Y.firstChild,B,1)){Y.insertBefore(c.create("br"),Y.firstChild)}if(!aa(Y,B)&&!aa(Y.lastChild,S,1)){Y.appendChild(c.create("br"))}}}else{if(W==c.getRoot()){if(!Z.list_block||!g(Y,Z.list_block)){O(a.grep(Y.childNodes),function(ab){if(d(l,ab.nodeName.toLowerCase())){if(!X){X=N(ab,l)}else{X.appendChild(ab)}}else{X=0}})}}}}if(Z.selector&&Z.inline&&!g(Z.inline,Y)){return}c.remove(Y,1)}function C(X,W,Y){if(X){W=W?"nextSibling":"previousSibling";for(X=Y?X:X[W];X;X=X[W]){if(X.nodeType==1||!f(X)){return X}}}}function H(W){return W&&W.nodeType==1&&W.getAttribute("data-mce-type")=="bookmark"}function u(aa,Z){var W,Y,X;function ac(af,ae){if(af.nodeName!=ae.nodeName){return S}function ad(ah){var ai={};O(c.getAttribs(ah),function(aj){var ak=aj.nodeName.toLowerCase();if(ak.indexOf("_")!==0&&ak!=="style"){ai[ak]=c.getAttrib(ah,ak)}});return ai}function ag(ak,aj){var ai,ah;for(ah in ak){if(ak.hasOwnProperty(ah)){ai=aj[ah];if(ai===p){return S}if(ak[ah]!=ai){return S}delete aj[ah]}}for(ah in aj){if(aj.hasOwnProperty(ah)){return S}}return B}if(!ag(ad(af),ad(ae))){return S}if(!ag(c.parseStyle(c.getAttrib(af,"style")),c.parseStyle(c.getAttrib(ae,"style")))){return S}return B}if(aa&&Z){function ab(ae,ad){for(Y=ae;Y;Y=Y[ad]){if(Y.nodeType==3&&Y.nodeValue.length!==0){return ae}if(Y.nodeType==1&&!H(Y)){return Y}}return ae}aa=ab(aa,"previousSibling");Z=ab(Z,"nextSibling");if(ac(aa,Z)){for(Y=aa.nextSibling;Y&&Y!=Z;){X=Y;Y=Y.nextSibling;aa.appendChild(X)}c.remove(Z);O(a.grep(Z.childNodes),function(ad){aa.appendChild(ad)});return aa}}return Z}function G(W){return/^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(W)}function J(X,aa){var W,Z,Y;W=X[aa?"startContainer":"endContainer"];Z=X[aa?"startOffset":"endOffset"];if(W.nodeType==1){Y=W.childNodes.length-1;if(!aa&&Z){Z--}W=W.childNodes[Z>Y?Y:Z]}return W}function Q(ad,Y,ac){var aa,X=P[ad],ae=P[ad=="apply"?"remove":"apply"];function af(){return P.apply.length||P.remove.length}function ab(){P.apply=[];P.remove=[]}function ag(ah){O(P.apply.reverse(),function(ai){T(ai.name,ai.vars,ah);if(ai.name==="forecolor"&&ai.vars.value){I(ah.parentNode)}});O(P.remove.reverse(),function(ai){A(ai.name,ai.vars,ah)});c.remove(ah,1);ab()}for(aa=X.length-1;aa>=0;aa--){if(X[aa].name==Y){return}}X.push({name:Y,vars:ac});for(aa=ae.length-1;aa>=0;aa--){if(ae[aa].name==Y){ae.splice(aa,1)}}if(af()){V.getDoc().execCommand("FontName",false,"mceinline");P.lastRng=q.getRng();O(c.select("font,span"),function(ai){var ah;if(b(ai)){ah=q.getBookmark();ag(ai);q.moveToBookmark(ah);V.nodeChanged()}});if(!P.isListening&&af()){P.isListening=true;function W(ai,aj){var ah=c.createRng();ag(ai);ah.setStart(aj,aj.nodeValue.length);ah.setEnd(aj,aj.nodeValue.length);q.setRng(ah);V.nodeChanged()}var Z=false;O("onKeyDown,onKeyUp,onKeyPress,onMouseUp".split(","),function(ah){V[ah].addToTop(function(ai,al){if(al.keyCode==13&&!al.shiftKey){Z=true;return}if(af()&&!a.dom.RangeUtils.compareRanges(P.lastRng,q.getRng())){var aj=false;O(c.select("font,span"),function(ao){var ap,an;if(b(ao)){aj=true;ap=ao.firstChild;while(ap&&ap.nodeType!=3){ap=ap.firstChild}if(ap){W(ao,ap)}else{c.remove(ao)}}});if(Z&&!aj){var ak=q.getNode();var am=ak;while(am&&am.nodeType!=3){am=am.firstChild}if(am){ak=am.parentNode;while(!F(ak)){ak=ak.parentNode}W(ak,am)}}if(al.type=="keyup"||al.type=="mouseup"){ab();Z=false}}})})}}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;if(c.inline_styles){h=e.explode(c.font_size_style_values);function b(j,i){e.each(i,function(l,k){if(l){g.setStyle(j,k,l)}});g.rename(j,"span")}d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}a.onPreProcess.add(f);a.onSetContent.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}});
\ No newline at end of file
diff --git a/webcit/tiny_mce/tiny_mce_popup.js b/webcit/tiny_mce/tiny_mce_popup.js
new file mode 100644 (file)
index 0000000..f859d24
--- /dev/null
@@ -0,0 +1,5 @@
+
+// Uncomment and change this document.domain value if you are loading the script cross subdomains
+// document.domain = 'moxiecode.com';
+
+var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},10)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false&&b.editor.settings.language_load!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('<script type="text/javascript" src="'+tinymce._addVer(a)+'"><\/script>');tinymce.ScriptLoader.markDone(a)}}},pickColor:function(b,a){this.execCommand("mceColorPicker",true,{color:document.getElementById(a).value,func:function(e){document.getElementById(a).value=e;try{document.getElementById(a).onchange()}catch(d){}}})},openBrowser:function(a,c,b){tinyMCEPopup.restoreSelection();this.editor.execCallback("file_browser_callback",a,document.getElementById(a).value,c,window)},confirm:function(b,a,c){this.editor.windowManager.confirm(b,a,c,window)},alert:function(b,a,c){this.editor.windowManager.alert(b,a,c,window)},close:function(){var a=this;function b(){a.editor.windowManager.close(window);tinymce=tinyMCE=a.editor=a.params=a.dom=a.dom.doc=null}if(tinymce.isOpera){a.getWin().setTimeout(b,0)}else{b()}},_restoreSelection:function(){var a=window.event.srcElement;if(a.nodeName=="INPUT"&&(a.type=="submit"||a.type=="button")){tinyMCEPopup.restoreSelection()}},_onDOMLoaded:function(){var b=tinyMCEPopup,d=document.title,e,c,a;if(b.domLoaded){return}b.domLoaded=1;if(b.features.translate_i18n!==false){c=document.body.innerHTML;if(tinymce.isIE){c=c.replace(/ (value|title|alt)=([^"][^\s>]+)/gi,' $1="$2"')}document.dir=b.editor.getParam("directionality","");if((a=b.editor.translate(c))&&a!=c){document.body.innerHTML=a}if((a=b.editor.translate(d))&&a!=d){document.title=d=a}}if(!b.editor.getParam("browser_preferred_colors",false)||!b.isWindow){b.dom.addClass(document.body,"forceColors")}document.body.style.display="";if(tinymce.isIE){document.attachEvent("onmouseup",tinyMCEPopup._restoreSelection);b.dom.add(b.dom.select("head")[0],"base",{target:"_self"})}b.restoreSelection();b.resizeToInnerSize();if(!b.isWindow){b.editor.windowManager.setTitle(window,d)}else{window.focus()}if(!tinymce.isIE&&!b.isWindow){tinymce.dom.Event._add(document,"focus",function(){b.editor.windowManager.focus(b.id)})}tinymce.each(b.dom.select("select"),function(f){f.onkeydown=tinyMCEPopup._accessHandler});tinymce.each(b.listeners,function(f){f.func.call(f.scope,b.editor)});if(b.getWindowArg("mce_auto_focus",true)){window.focus();tinymce.each(document.forms,function(g){tinymce.each(g.elements,function(f){if(b.dom.hasClass(f,"mceFocus")&&!f.disabled){f.focus();return false}})})}document.onkeyup=tinyMCEPopup._closeWinKeyHandler},_accessHandler:function(a){a=a||window.event;if(a.keyCode==13||a.keyCode==32){a=a.target||a.srcElement;if(a.onchange){a.onchange()}return tinymce.dom.Event.cancel(a)}},_closeWinKeyHandler:function(a){a=a||window.event;if(a.keyCode==27){tinyMCEPopup.close()}},_wait:function(){if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);tinyMCEPopup._onDOMLoaded()}});if(document.documentElement.doScroll&&window==window.top){(function(){if(tinyMCEPopup.domLoaded){return}try{document.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,0);return}tinyMCEPopup._onDOMLoaded()})()}document.attachEvent("onload",tinyMCEPopup._onDOMLoaded)}else{if(document.addEventListener){window.addEventListener("DOMContentLoaded",tinyMCEPopup._onDOMLoaded,false);window.addEventListener("load",tinyMCEPopup._onDOMLoaded,false)}}}};tinyMCEPopup.init();tinyMCEPopup._wait();
\ No newline at end of file
diff --git a/webcit/tiny_mce/tiny_mce_src.js b/webcit/tiny_mce/tiny_mce_src.js
new file mode 100644 (file)
index 0000000..8c665b0
--- /dev/null
@@ -0,0 +1,16440 @@
+(function(win) {\r
+       var whiteSpaceRe = /^\s*|\s*$/g,\r
+               undefined, isRegExpBroken = 'B'.replace(/A(.)|B/, '$1') === '$1';\r
+\r
+       var tinymce = {\r
+               majorVersion : '3',\r
+\r
+               minorVersion : '4.5',\r
+\r
+               releaseDate : '2011-09-06',\r
+\r
+               _init : function() {\r
+                       var t = this, d = document, na = navigator, ua = na.userAgent, i, nl, n, base, p, v;\r
+\r
+                       t.isOpera = win.opera && opera.buildNumber;\r
+\r
+                       t.isWebKit = /WebKit/.test(ua);\r
+\r
+                       t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName);\r
+\r
+                       t.isIE6 = t.isIE && /MSIE [56]/.test(ua);\r
+\r
+                       t.isIE7 = t.isIE && /MSIE [7]/.test(ua);\r
+\r
+                       t.isIE8 = t.isIE && /MSIE [8]/.test(ua);\r
+\r
+                       t.isIE9 = t.isIE && /MSIE [9]/.test(ua);\r
+\r
+                       t.isGecko = !t.isWebKit && /Gecko/.test(ua);\r
+\r
+                       t.isMac = ua.indexOf('Mac') != -1;\r
+\r
+                       t.isAir = /adobeair/i.test(ua);\r
+\r
+                       t.isIDevice = /(iPad|iPhone)/.test(ua);\r
+                       \r
+                       t.isIOS5 = t.isIDevice && ua.match(/AppleWebKit\/(\d*)/)[1]>=534;\r
+\r
+                       // TinyMCE .NET webcontrol might be setting the values for TinyMCE\r
+                       if (win.tinyMCEPreInit) {\r
+                               t.suffix = tinyMCEPreInit.suffix;\r
+                               t.baseURL = tinyMCEPreInit.base;\r
+                               t.query = tinyMCEPreInit.query;\r
+                               return;\r
+                       }\r
+\r
+                       // Get suffix and base\r
+                       t.suffix = '';\r
+\r
+                       // If base element found, add that infront of baseURL\r
+                       nl = d.getElementsByTagName('base');\r
+                       for (i=0; i<nl.length; i++) {\r
+                               if (v = nl[i].href) {\r
+                                       // Host only value like http://site.com or http://site.com:8008\r
+                                       if (/^https?:\/\/[^\/]+$/.test(v))\r
+                                               v += '/';\r
+\r
+                                       base = v ? v.match(/.*\//)[0] : ''; // Get only directory\r
+                               }\r
+                       }\r
+\r
+                       function getBase(n) {\r
+                               if (n.src && /tiny_mce(|_gzip|_jquery|_prototype|_full)(_dev|_src)?.js/.test(n.src)) {\r
+                                       if (/_(src|dev)\.js/g.test(n.src))\r
+                                               t.suffix = '_src';\r
+\r
+                                       if ((p = n.src.indexOf('?')) != -1)\r
+                                               t.query = n.src.substring(p + 1);\r
+\r
+                                       t.baseURL = n.src.substring(0, n.src.lastIndexOf('/'));\r
+\r
+                                       // If path to script is relative and a base href was found add that one infront\r
+                                       // the src property will always be an absolute one on non IE browsers and IE 8\r
+                                       // so this logic will basically only be executed on older IE versions\r
+                                       if (base && t.baseURL.indexOf('://') == -1 && t.baseURL.indexOf('/') !== 0)\r
+                                               t.baseURL = base + t.baseURL;\r
+\r
+                                       return t.baseURL;\r
+                               }\r
+\r
+                               return null;\r
+                       };\r
+\r
+                       // Check document\r
+                       nl = d.getElementsByTagName('script');\r
+                       for (i=0; i<nl.length; i++) {\r
+                               if (getBase(nl[i]))\r
+                                       return;\r
+                       }\r
+\r
+                       // Check head\r
+                       n = d.getElementsByTagName('head')[0];\r
+                       if (n) {\r
+                               nl = n.getElementsByTagName('script');\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       if (getBase(nl[i]))\r
+                                               return;\r
+                               }\r
+                       }\r
+\r
+                       return;\r
+               },\r
+\r
+               is : function(o, t) {\r
+                       if (!t)\r
+                               return o !== undefined;\r
+\r
+                       if (t == 'array' && (o.hasOwnProperty && o instanceof Array))\r
+                               return true;\r
+\r
+                       return typeof(o) == t;\r
+               },\r
+\r
+               makeMap : function(items, delim, map) {\r
+                       var i;\r
+\r
+                       items = items || [];\r
+                       delim = delim || ',';\r
+\r
+                       if (typeof(items) == "string")\r
+                               items = items.split(delim);\r
+\r
+                       map = map || {};\r
+\r
+                       i = items.length;\r
+                       while (i--)\r
+                               map[items[i]] = {};\r
+\r
+                       return map;\r
+               },\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 (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
+\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, l, a = arguments;\r
+\r
+                       for (i = 1, l = a.length; i < l; i++) {\r
+                               e = a[i];\r
+\r
+                               tinymce.each(e, function(v, n) {\r
+                                       if (v !== undefined)\r
+                                               o[n] = v;\r
+                               });\r
+                       }\r
+\r
+                       return o;\r
+               },\r
+\r
+\r
+               trim : function(s) {\r
+                       return (s ? '' + s : '').replace(whiteSpaceRe, '');\r
+               },\r
+\r
+               create : function(s, p, root) {\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+$/, ''), root);\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 || win;\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 || win;\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;\r
+\r
+                       f = {func : f, scope : s || this};\r
+\r
+                       if (!t.unloads) {\r
+                               function unload() {\r
+                                       var li = t.unloads, o, n;\r
+\r
+                                       if (li) {\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 (win.detachEvent) {\r
+                                                       win.detachEvent('onbeforeunload', fakeUnload);\r
+                                                       win.detachEvent('onunload', unload);\r
+                                               } else if (win.removeEventListener)\r
+                                                       win.removeEventListener('unload', unload, false);\r
+\r
+                                               // Destroy references\r
+                                               t.unloads = o = li = w = unload = 0;\r
+\r
+                                               // Run garbarge collector on IE\r
+                                               if (win.CollectGarbage)\r
+                                                       CollectGarbage();\r
+                                       }\r
+                               };\r
+\r
+                               function fakeUnload() {\r
+                                       var d = document;\r
+\r
+                                       // Is there things still loading, then do some magic\r
+                                       if (d.readyState == 'interactive') {\r
+                                               function stop() {\r
+                                                       // Prevent memory leak\r
+                                                       d.detachEvent('onstop', stop);\r
+\r
+                                                       // Call unload handler\r
+                                                       if (unload)\r
+                                                               unload();\r
+\r
+                                                       d = 0;\r
+                                               };\r
+\r
+                                               // Fire unload when the currently loading page is stopped\r
+                                               if (d)\r
+                                                       d.attachEvent('onstop', stop);\r
+\r
+                                               // Remove onstop listener after a while to prevent the unload function\r
+                                               // to execute if the user presses cancel in an onbeforeunload\r
+                                               // confirm dialog and then presses the browser stop button\r
+                                               win.setTimeout(function() {\r
+                                                       if (d)\r
+                                                               d.detachEvent('onstop', stop);\r
+                                               }, 0);\r
+                                       }\r
+                               };\r
+\r
+                               // Attach unload handler\r
+                               if (win.attachEvent) {\r
+                                       win.attachEvent('onunload', unload);\r
+                                       win.attachEvent('onbeforeunload', fakeUnload);\r
+                               } else if (win.addEventListener)\r
+                                       win.addEventListener('unload', unload, false);\r
+\r
+                               // Setup initial unload handler array\r
+                               t.unloads = [f];\r
+                       } else\r
+                               t.unloads.push(f);\r
+\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 s ? tinymce.map(s.split(d || ','), tinymce.trim) : s;\r
+               },\r
+\r
+               _addVer : function(u) {\r
+                       var v;\r
+\r
+                       if (!this.query)\r
+                               return u;\r
+\r
+                       v = (u.indexOf('?') == -1 ? '?' : '&') + this.query;\r
+\r
+                       if (u.indexOf('#') == -1)\r
+                               return u + v;\r
+\r
+                       return u.replace('#', v + '#');\r
+               },\r
+\r
+               // Fix function for IE 9 where regexps isn't working correctly\r
+               // Todo: remove me once MS fixes the bug\r
+               _replace : function(find, replace, str) {\r
+                       // On IE9 we have to fake $x replacement\r
+                       if (isRegExpBroken) {\r
+                               return str.replace(find, function() {\r
+                                       var val = replace, args = arguments, i;\r
+\r
+                                       for (i = 0; i < args.length - 2; i++) {\r
+                                               if (args[i] === undefined) {\r
+                                                       val = val.replace(new RegExp('\\$' + i, 'g'), '');\r
+                                               } else {\r
+                                                       val = val.replace(new RegExp('\\$' + i, 'g'), args[i]);\r
+                                               }\r
+                                       }\r
+\r
+                                       return val;\r
+                               });\r
+                       }\r
+\r
+                       return str.replace(find, replace);\r
+               }\r
+\r
+               };\r
+\r
+       // Initialize the API\r
+       tinymce._init();\r
+\r
+       // Expose tinymce namespace to the global namespace (window)\r
+       win.tinymce = win.tinyMCE = tinymce;\r
+\r
+       // Describe the different namespaces\r
+\r
+       })(window);\r
+\r
+\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
+(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, base_url;\r
+\r
+                       // Trim whitespace\r
+                       u = tinymce.trim(u);\r
+\r
+                       // Default settings\r
+                       s = t.settings = s || {};\r
+\r
+                       // Strange app protocol that isn't http/https or local anchor\r
+                       // For example: mailto,skype,tel etc.\r
+                       if (/^([\w\-]+):([^\/]{2})/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 http:// or protocol relative //path\r
+                       if (!/^[\w-]*:?\/\//.test(u)) {\r
+                               base_url = s.base_uri ? s.base_uri.path : new tinymce.util.URI(location.href).directory;\r
+                               u = ((s.base_uri && s.base_uri.protocol) || 'http') + '://mce_host' + t.toAbsPath(base_url, u);\r
+                       }\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
+                       if (u === "./")\r
+                               return u;\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 && this.protocol == u.protocol ? nh : 0);\r
+               },\r
+\r
+               toRelPath : function(base, path) {\r
+                       var items, bp = 0, out = '', i, l;\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, l = base.length; i < l; 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, l = items.length; i < l; 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, l = base.length - (bp - 1); i < l; i++)\r
+                               out += "../";\r
+\r
+                       for (i = bp - 1, l = items.length; i < l; 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 = [], tr, outPath;\r
+\r
+                       // Split paths\r
+                       tr = /\/$/.test(path) ? '/' : '';\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
+                               outPath = o.reverse().join('/');\r
+                       else\r
+                               outPath = base.slice(0, i).join('/') + '/' + o.reverse().join('/');\r
+\r
+                       // Add front / if it's needed\r
+                       if (outPath.indexOf('/') !== 0)\r
+                               outPath = '/' + outPath;\r
+\r
+                       // Add traling / if it's needed\r
+                       if (tr && outPath.lastIndexOf('/') !== outPath.length - 1)\r
+                               outPath += tr;\r
+\r
+                       return outPath;\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
+(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
+(function() {\r
+       function serialize(o, quote) {\r
+               var i, v, t;\r
+\r
+               quote = quote || '"';\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 quote + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g, function(a, b) {\r
+                               // Make sure single quotes never get encoded inside double quotes for JSON compatibility\r
+                               if (quote === '"' && a === "'")\r
+                                       return a;\r
+\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
+                       }) + quote;\r
+               }\r
+\r
+               if (t == 'object') {\r
+                       if (o.hasOwnProperty && o instanceof Array) {\r
+                                       for (i=0, v = '['; i<o.length; i++)\r
+                                               v += (i > 0 ? ',' : '') + serialize(o[i], quote);\r
+\r
+                                       return v + ']';\r
+                               }\r
+\r
+                               v = '{';\r
+\r
+                               for (i in o)\r
+                                       v += typeof o[i] != 'function' ? (v.length > 1 ? ',' + quote : quote) + i + quote +':' + serialize(o[i], quote) : '';\r
+\r
+                               return v + '}';\r
+               }\r
+\r
+               return '' + o;\r
+       };\r
+\r
+       tinymce.util.JSON = {\r
+               serialize: serialize,\r
+\r
+               parse: function(s) {\r
+                       try {\r
+                               return eval('(' + s + ')');\r
+                       } catch (ex) {\r
+                               // Ignore\r
+                       }\r
+               }\r
+\r
+               };\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.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r
+\r
+                       x.send(o.data);\r
+\r
+                       function ready() {\r
+                               if (!o.async || x.readyState == 4 || c++ > 10000) {\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
+                               } else\r
+                                       w.setTimeout(ready, 10);\r
+                       };\r
+\r
+                       // Syncronous request\r
+                       if (!o.async)\r
+                               return ready();\r
+\r
+                       // Wait for response, onReadyStateChange can not be used since it leaks memory in IE\r
+                       t = w.setTimeout(ready, 10);\r
+               }\r
+       }\r
+});\r
+\r
+(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
+                               if (ecb)\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
+(function(tinymce){\r
+       tinymce.VK = {\r
+               DELETE:46,\r
+               BACKSPACE:8\r
+               \r
+       }\r
+\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var VK = tinymce.VK, BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE;\r
+\r
+       function cleanupStylesWhenDeleting(ed) {\r
+               var dom = ed.dom, selection = ed.selection;\r
+\r
+               ed.onKeyDown.add(function(ed, e) {\r
+                       var rng, blockElm, node, clonedSpan, isDelete;\r
+\r
+                       isDelete = e.keyCode == DELETE;\r
+                       if (isDelete || e.keyCode == BACKSPACE) {\r
+                               e.preventDefault();\r
+                               rng = selection.getRng();\r
+\r
+                               // Find root block\r
+                               blockElm = dom.getParent(rng.startContainer, dom.isBlock);\r
+\r
+                               // On delete clone the root span of the next block element\r
+                               if (isDelete)\r
+                                       blockElm = dom.getNext(blockElm, dom.isBlock);\r
+\r
+                               // Locate root span element and clone it since it would otherwise get merged by the "apple-style-span" on delete/backspace\r
+                               if (blockElm) {\r
+                                       node = blockElm.firstChild;\r
+\r
+                                       if (node && node.nodeName === 'SPAN') {\r
+                                               clonedSpan = node.cloneNode(false);\r
+                                       }\r
+                               }\r
+\r
+                               // Do the backspace/delete actiopn\r
+                               ed.getDoc().execCommand(isDelete ? 'ForwardDelete' : 'Delete', false, null);\r
+\r
+                               // Find all odd apple-style-spans\r
+                               blockElm = dom.getParent(rng.startContainer, dom.isBlock);\r
+                               tinymce.each(dom.select('span.Apple-style-span,font.Apple-style-span', blockElm), function(span) {\r
+                                       var rng = dom.createRng();\r
+\r
+                                       // Set range selection before the span we are about to remove\r
+                                       rng.setStartBefore(span);\r
+                                       rng.setEndBefore(span);\r
+\r
+                                       if (clonedSpan) {\r
+                                               dom.replace(clonedSpan.cloneNode(false), span, true);\r
+                                       } else {\r
+                                               dom.remove(span, true);\r
+                                       }\r
+\r
+                                       // Restore the selection\r
+                                       selection.setRng(rng);\r
+                               });\r
+                       }\r
+               });\r
+       };\r
+\r
+       function emptyEditorWhenDeleting(ed) {\r
+               ed.onKeyUp.add(function(ed, e) {\r
+                       var keyCode = e.keyCode;\r
+\r
+                       if (keyCode == DELETE || keyCode == BACKSPACE) {\r
+                               if (ed.dom.isEmpty(ed.getBody())) {\r
+                                       ed.setContent('', {format : 'raw'});\r
+                                       ed.nodeChanged();\r
+                                       return;\r
+                               }\r
+                       }\r
+               });\r
+       };\r
+       \r
+       tinymce.create('tinymce.util.Quirks', {\r
+               Quirks: function(ed) {\r
+                       // Load WebKit specific fixed\r
+                       if (tinymce.isWebKit) {\r
+                               cleanupStylesWhenDeleting(ed);\r
+                               emptyEditorWhenDeleting(ed);\r
+                       }\r
+\r
+                       // Load IE specific fixes\r
+                       if (tinymce.isIE) {\r
+                               emptyEditorWhenDeleting(ed);\r
+                       }\r
+               }\r
+       });\r
+})(tinymce);\r
+(function(tinymce) {\r
+       var namedEntities, baseEntities, reverseEntities,\r
+               attrsCharsRegExp = /[&<>\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,\r
+               textCharsRegExp = /[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,\r
+               rawCharsRegExp = /[<>&\"\']/g,\r
+               entityRegExp = /&(#x|#)?([\w]+);/g,\r
+               asciiMap = {\r
+                               128 : "\u20AC", 130 : "\u201A", 131 : "\u0192", 132 : "\u201E", 133 : "\u2026", 134 : "\u2020",\r
+                               135 : "\u2021", 136 : "\u02C6", 137 : "\u2030", 138 : "\u0160", 139 : "\u2039", 140 : "\u0152",\r
+                               142 : "\u017D", 145 : "\u2018", 146 : "\u2019", 147 : "\u201C", 148 : "\u201D", 149 : "\u2022",\r
+                               150 : "\u2013", 151 : "\u2014", 152 : "\u02DC", 153 : "\u2122", 154 : "\u0161", 155 : "\u203A",\r
+                               156 : "\u0153", 158 : "\u017E", 159 : "\u0178"\r
+               };\r
+\r
+       // Raw entities\r
+       baseEntities = {\r
+               '\"' : '&quot;', // Needs to be escaped since the YUI compressor would otherwise break the code\r
+               "'" : '&#39;',\r
+               '<' : '&lt;',\r
+               '>' : '&gt;',\r
+               '&' : '&amp;'\r
+       };\r
+\r
+       // Reverse lookup table for raw entities\r
+       reverseEntities = {\r
+               '&lt;' : '<',\r
+               '&gt;' : '>',\r
+               '&amp;' : '&',\r
+               '&quot;' : '"',\r
+               '&apos;' : "'"\r
+       };\r
+\r
+       // Decodes text by using the browser\r
+       function nativeDecode(text) {\r
+               var elm;\r
+\r
+               elm = document.createElement("div");\r
+               elm.innerHTML = text;\r
+\r
+               return elm.textContent || elm.innerText || text;\r
+       };\r
+\r
+       // Build a two way lookup table for the entities\r
+       function buildEntitiesLookup(items, radix) {\r
+               var i, chr, entity, lookup = {};\r
+\r
+               if (items) {\r
+                       items = items.split(',');\r
+                       radix = radix || 10;\r
+\r
+                       // Build entities lookup table\r
+                       for (i = 0; i < items.length; i += 2) {\r
+                               chr = String.fromCharCode(parseInt(items[i], radix));\r
+\r
+                               // Only add non base entities\r
+                               if (!baseEntities[chr]) {\r
+                                       entity = '&' + items[i + 1] + ';';\r
+                                       lookup[chr] = entity;\r
+                                       lookup[entity] = chr;\r
+                               }\r
+                       }\r
+\r
+                       return lookup;\r
+               }\r
+       };\r
+\r
+       // Unpack entities lookup where the numbers are in radix 32 to reduce the size\r
+       namedEntities = buildEntitiesLookup(\r
+               '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' +\r
+               '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' +\r
+               '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' +\r
+               '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' +\r
+               '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' +\r
+               '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' +\r
+               '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' +\r
+               '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' +\r
+               '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' +\r
+               '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' +\r
+               'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' +\r
+               'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' +\r
+               't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' +\r
+               'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' +\r
+               'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' +\r
+               '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' +\r
+               '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' +\r
+               '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' +\r
+               '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' +\r
+               '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' +\r
+               'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' +\r
+               'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' +\r
+               'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' +\r
+               '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' +\r
+               '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro'\r
+       , 32);\r
+\r
+       tinymce.html = tinymce.html || {};\r
+\r
+       tinymce.html.Entities = {\r
+               encodeRaw : function(text, attr) {\r
+                       return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) {\r
+                               return baseEntities[chr] || chr;\r
+                       });\r
+               },\r
+\r
+               encodeAllRaw : function(text) {\r
+                       return ('' + text).replace(rawCharsRegExp, function(chr) {\r
+                               return baseEntities[chr] || chr;\r
+                       });\r
+               },\r
+\r
+               encodeNumeric : function(text, attr) {\r
+                       return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) {\r
+                               // Multi byte sequence convert it to a single entity\r
+                               if (chr.length > 1)\r
+                                       return '&#' + (((chr.charCodeAt(0) - 0xD800) * 0x400) + (chr.charCodeAt(1) - 0xDC00) + 0x10000) + ';';\r
+\r
+                               return baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';';\r
+                       });\r
+               },\r
+\r
+               encodeNamed : function(text, attr, entities) {\r
+                       entities = entities || namedEntities;\r
+\r
+                       return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) {\r
+                               return baseEntities[chr] || entities[chr] || chr;\r
+                       });\r
+               },\r
+\r
+               getEncodeFunc : function(name, entities) {\r
+                       var Entities = tinymce.html.Entities;\r
+\r
+                       entities = buildEntitiesLookup(entities) || namedEntities;\r
+\r
+                       function encodeNamedAndNumeric(text, attr) {\r
+                               return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) {\r
+                                       return baseEntities[chr] || entities[chr] || '&#' + chr.charCodeAt(0) + ';' || chr;\r
+                               });\r
+                       };\r
+\r
+                       function encodeCustomNamed(text, attr) {\r
+                               return Entities.encodeNamed(text, attr, entities);\r
+                       };\r
+\r
+                       // Replace + with , to be compatible with previous TinyMCE versions\r
+                       name = tinymce.makeMap(name.replace(/\+/g, ','));\r
+\r
+                       // Named and numeric encoder\r
+                       if (name.named && name.numeric)\r
+                               return encodeNamedAndNumeric;\r
+\r
+                       // Named encoder\r
+                       if (name.named) {\r
+                               // Custom names\r
+                               if (entities)\r
+                                       return encodeCustomNamed;\r
+\r
+                               return Entities.encodeNamed;\r
+                       }\r
+\r
+                       // Numeric\r
+                       if (name.numeric)\r
+                               return Entities.encodeNumeric;\r
+\r
+                       // Raw encoder\r
+                       return Entities.encodeRaw;\r
+               },\r
+\r
+               decode : function(text) {\r
+                       return text.replace(entityRegExp, function(all, numeric, value) {\r
+                               if (numeric) {\r
+                                       value = parseInt(value, numeric.length === 2 ? 16 : 10);\r
+\r
+                                       // Support upper UTF\r
+                                       if (value > 0xFFFF) {\r
+                                               value -= 0x10000;\r
+\r
+                                               return String.fromCharCode(0xD800 + (value >> 10), 0xDC00 + (value & 0x3FF));\r
+                                       } else\r
+                                               return asciiMap[value] || String.fromCharCode(value);\r
+                               }\r
+\r
+                               return reverseEntities[all] || namedEntities[all] || nativeDecode(all);\r
+                       });\r
+               }\r
+       };\r
+})(tinymce);\r
+\r
+tinymce.html.Styles = function(settings, schema) {\r
+       var rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,\r
+               urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,\r
+               styleRegExp = /\s*([^:]+):\s*([^;]+);?/g,\r
+               trimRightRegExp = /\s+$/,\r
+               urlColorRegExp = /rgb/,\r
+               undef, i, encodingLookup = {}, encodingItems;\r
+\r
+       settings = settings || {};\r
+\r
+       encodingItems = '\\" \\\' \\; \\: ; : \uFEFF'.split(' ');\r
+       for (i = 0; i < encodingItems.length; i++) {\r
+               encodingLookup[encodingItems[i]] = '\uFEFF' + i;\r
+               encodingLookup['\uFEFF' + i] = encodingItems[i];\r
+       }\r
+\r
+       function toHex(match, r, g, b) {\r
+               function hex(val) {\r
+                       val = parseInt(val).toString(16);\r
+\r
+                       return val.length > 1 ? val : '0' + val; // 0 -> 00\r
+               };\r
+\r
+               return '#' + hex(r) + hex(g) + hex(b);\r
+       };\r
+\r
+       return {\r
+               toHex : function(color) {\r
+                       return color.replace(rgbRegExp, toHex);\r
+               },\r
+\r
+               parse : function(css) {\r
+                       var styles = {}, matches, name, value, isEncoded, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope || this;\r
+\r
+                       function compress(prefix, suffix) {\r
+                               var top, right, bottom, left;\r
+\r
+                               // Get values and check it it needs compressing\r
+                               top = styles[prefix + '-top' + suffix];\r
+                               if (!top)\r
+                                       return;\r
+\r
+                               right = styles[prefix + '-right' + suffix];\r
+                               if (top != right)\r
+                                       return;\r
+\r
+                               bottom = styles[prefix + '-bottom' + suffix];\r
+                               if (right != bottom)\r
+                                       return;\r
+\r
+                               left = styles[prefix + '-left' + suffix];\r
+                               if (bottom != left)\r
+                                       return;\r
+\r
+                               // Compress\r
+                               styles[prefix + suffix] = left;\r
+                               delete styles[prefix + '-top' + suffix];\r
+                               delete styles[prefix + '-right' + suffix];\r
+                               delete styles[prefix + '-bottom' + suffix];\r
+                               delete styles[prefix + '-left' + suffix];\r
+                       };\r
+\r
+                       function canCompress(key) {\r
+                               var value = styles[key], i;\r
+\r
+                               if (!value || value.indexOf(' ') < 0)\r
+                                       return;\r
+\r
+                               value = value.split(' ');\r
+                               i = value.length;\r
+                               while (i--) {\r
+                                       if (value[i] !== value[0])\r
+                                               return false;\r
+                               }\r
+\r
+                               styles[key] = value[0];\r
+\r
+                               return true;\r
+                       };\r
+\r
+                       function compress2(target, a, b, c) {\r
+                               if (!canCompress(a))\r
+                                       return;\r
+\r
+                               if (!canCompress(b))\r
+                                       return;\r
+\r
+                               if (!canCompress(c))\r
+                                       return;\r
+\r
+                               // Compress\r
+                               styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c];\r
+                               delete styles[a];\r
+                               delete styles[b];\r
+                               delete styles[c];\r
+                       };\r
+\r
+                       // Encodes the specified string by replacing all \" \' ; : with _<num>\r
+                       function encode(str) {\r
+                               isEncoded = true;\r
+\r
+                               return encodingLookup[str];\r
+                       };\r
+\r
+                       // Decodes the specified string by replacing all _<num> with it's original value \" \' etc\r
+                       // It will also decode the \" \' if keep_slashes is set to fale or omitted\r
+                       function decode(str, keep_slashes) {\r
+                               if (isEncoded) {\r
+                                       str = str.replace(/\uFEFF[0-9]/g, function(str) {\r
+                                               return encodingLookup[str];\r
+                                       });\r
+                               }\r
+\r
+                               if (!keep_slashes)\r
+                                       str = str.replace(/\\([\'\";:])/g, "$1");\r
+\r
+                               return str;\r
+                       }\r
+\r
+                       if (css) {\r
+                               // Encode \" \' % and ; and : inside strings so they don't interfere with the style parsing\r
+                               css = css.replace(/\\[\"\';:\uFEFF]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function(str) {\r
+                                       return str.replace(/[;:]/g, encode);\r
+                               });\r
+\r
+                               // Parse styles\r
+                               while (matches = styleRegExp.exec(css)) {\r
+                                       name = matches[1].replace(trimRightRegExp, '').toLowerCase();\r
+                                       value = matches[2].replace(trimRightRegExp, '');\r
+\r
+                                       if (name && value.length > 0) {\r
+                                               // Opera will produce 700 instead of bold in their style values\r
+                                               if (name === 'font-weight' && value === '700')\r
+                                                       value = 'bold';\r
+                                               else if (name === 'color' || name === 'background-color') // Lowercase colors like RED\r
+                                                       value = value.toLowerCase();            \r
+\r
+                                               // Convert RGB colors to HEX\r
+                                               value = value.replace(rgbRegExp, toHex);\r
+\r
+                                               // Convert URLs and force them into url('value') format\r
+                                               value = value.replace(urlOrStrRegExp, function(match, url, url2, url3, str, str2) {\r
+                                                       str = str || str2;\r
+\r
+                                                       if (str) {\r
+                                                               str = decode(str);\r
+\r
+                                                               // Force strings into single quote format\r
+                                                               return "'" + str.replace(/\'/g, "\\'") + "'";\r
+                                                       }\r
+\r
+                                                       url = decode(url || url2 || url3);\r
+\r
+                                                       // Convert the URL to relative/absolute depending on config\r
+                                                       if (urlConverter)\r
+                                                               url = urlConverter.call(urlConverterScope, url, 'style');\r
+\r
+                                                       // Output new URL format\r
+                                                       return "url('" + url.replace(/\'/g, "\\'") + "')";\r
+                                               });\r
+\r
+                                               styles[name] = isEncoded ? decode(value, true) : value;\r
+                                       }\r
+\r
+                                       styleRegExp.lastIndex = matches.index + matches[0].length;\r
+                               }\r
+\r
+                               // Compress the styles to reduce it's size for example IE will expand styles\r
+                               compress("border", "");\r
+                               compress("border", "-width");\r
+                               compress("border", "-color");\r
+                               compress("border", "-style");\r
+                               compress("padding", "");\r
+                               compress("margin", "");\r
+                               compress2('border', 'border-width', 'border-style', 'border-color');\r
+\r
+                               // Remove pointless border, IE produces these\r
+                               if (styles.border === 'medium none')\r
+                                       delete styles.border;\r
+                       }\r
+\r
+                       return styles;\r
+               },\r
+\r
+               serialize : function(styles, element_name) {\r
+                       var css = '', name, value;\r
+\r
+                       function serializeStyles(name) {\r
+                               var styleList, i, l, value;\r
+\r
+                               styleList = schema.styles[name];\r
+                               if (styleList) {\r
+                                       for (i = 0, l = styleList.length; i < l; i++) {\r
+                                               name = styleList[i];\r
+                                               value = styles[name];\r
+\r
+                                               if (value !== undef && value.length > 0)\r
+                                                       css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       // Serialize styles according to schema\r
+                       if (element_name && schema && schema.styles) {\r
+                               // Serialize global styles and element specific styles\r
+                               serializeStyles('*');\r
+                               serializeStyles(element_name);\r
+                       } else {\r
+                               // Output the styles in the order they are inside the object\r
+                               for (name in styles) {\r
+                                       value = styles[name];\r
+\r
+                                       if (value !== undef && value.length > 0)\r
+                                               css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';\r
+                               }\r
+                       }\r
+\r
+                       return css;\r
+               }\r
+       };\r
+};\r
+\r
+(function(tinymce) {\r
+       var transitional = {}, boolAttrMap, blockElementsMap, shortEndedElementsMap, nonEmptyElementsMap, customElementsMap = {},\r
+               defaultWhiteSpaceElementsMap, selfClosingElementsMap, makeMap = tinymce.makeMap, each = tinymce.each;\r
+\r
+       function split(str, delim) {\r
+               return str.split(delim || ',');\r
+       };\r
+\r
+       function unpack(lookup, data) {\r
+               var key, elements = {};\r
+\r
+               function replace(value) {\r
+                       return value.replace(/[A-Z]+/g, function(key) {\r
+                               return replace(lookup[key]);\r
+                       });\r
+               };\r
+\r
+               // Unpack lookup\r
+               for (key in lookup) {\r
+                       if (lookup.hasOwnProperty(key))\r
+                               lookup[key] = replace(lookup[key]);\r
+               }\r
+\r
+               // Unpack and parse data into object map\r
+               replace(data).replace(/#/g, '#text').replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g, function(str, name, attributes, children) {\r
+                       attributes = split(attributes, '|');\r
+\r
+                       elements[name] = {\r
+                               attributes : makeMap(attributes),\r
+                               attributesOrder : attributes,\r
+                               children : makeMap(children, '|', {'#comment' : {}})\r
+                       }\r
+               });\r
+\r
+               return elements;\r
+       };\r
+\r
+       // Build a lookup table for block elements both lowercase and uppercase\r
+       blockElementsMap = 'h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,' + \r
+                                               'th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,' + \r
+                                               'noscript,menu,isindex,samp,header,footer,article,section,hgroup';\r
+       blockElementsMap = makeMap(blockElementsMap, ',', makeMap(blockElementsMap.toUpperCase()));\r
+\r
+       // This is the XHTML 1.0 transitional elements with it's attributes and children packed to reduce it's size\r
+       transitional = unpack({\r
+               Z : 'H|K|N|O|P',\r
+               Y : 'X|form|R|Q',\r
+               ZG : 'E|span|width|align|char|charoff|valign',\r
+               X : 'p|T|div|U|W|isindex|fieldset|table',\r
+               ZF : 'E|align|char|charoff|valign',\r
+               W : 'pre|hr|blockquote|address|center|noframes',\r
+               ZE : 'abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height',\r
+               ZD : '[E][S]',\r
+               U : 'ul|ol|dl|menu|dir',\r
+               ZC : 'p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q',\r
+               T : 'h1|h2|h3|h4|h5|h6',\r
+               ZB : 'X|S|Q',\r
+               S : 'R|P',\r
+               ZA : 'a|G|J|M|O|P',\r
+               R : 'a|H|K|N|O',\r
+               Q : 'noscript|P',\r
+               P : 'ins|del|script',\r
+               O : 'input|select|textarea|label|button',\r
+               N : 'M|L',\r
+               M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym',\r
+               L : 'sub|sup',\r
+               K : 'J|I',\r
+               J : 'tt|i|b|u|s|strike',\r
+               I : 'big|small|font|basefont',\r
+               H : 'G|F',\r
+               G : 'br|span|bdo',\r
+               F : 'object|applet|img|map|iframe',\r
+               E : 'A|B|C',\r
+               D : 'accesskey|tabindex|onfocus|onblur',\r
+               C : 'onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup',\r
+               B : 'lang|xml:lang|dir',\r
+               A : 'id|class|style|title'\r
+       }, 'script[id|charset|type|language|src|defer|xml:space][]' + \r
+               'style[B|id|type|media|title|xml:space][]' + \r
+               'object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]' + \r
+               'param[id|name|value|valuetype|type][]' + \r
+               'p[E|align][#|S]' + \r
+               'a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]' + \r
+               'br[A|clear][]' + \r
+               'span[E][#|S]' + \r
+               'bdo[A|C|B][#|S]' + \r
+               'applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]' + \r
+               'h1[E|align][#|S]' + \r
+               'img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]' + \r
+               'map[B|C|A|name][X|form|Q|area]' + \r
+               'h2[E|align][#|S]' + \r
+               'iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]' + \r
+               'h3[E|align][#|S]' + \r
+               'tt[E][#|S]' + \r
+               'i[E][#|S]' + \r
+               'b[E][#|S]' + \r
+               'u[E][#|S]' + \r
+               's[E][#|S]' + \r
+               'strike[E][#|S]' + \r
+               'big[E][#|S]' + \r
+               'small[E][#|S]' + \r
+               'font[A|B|size|color|face][#|S]' + \r
+               'basefont[id|size|color|face][]' + \r
+               'em[E][#|S]' + \r
+               'strong[E][#|S]' + \r
+               'dfn[E][#|S]' + \r
+               'code[E][#|S]' + \r
+               'q[E|cite][#|S]' + \r
+               'samp[E][#|S]' + \r
+               'kbd[E][#|S]' + \r
+               'var[E][#|S]' + \r
+               'cite[E][#|S]' + \r
+               'abbr[E][#|S]' + \r
+               'acronym[E][#|S]' + \r
+               'sub[E][#|S]' + \r
+               'sup[E][#|S]' + \r
+               'input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]' + \r
+               'select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]' + \r
+               'optgroup[E|disabled|label][option]' + \r
+               'option[E|selected|disabled|label|value][]' + \r
+               'textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]' + \r
+               'label[E|for|accesskey|onfocus|onblur][#|S]' + \r
+               'button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]' + \r
+               'h4[E|align][#|S]' + \r
+               'ins[E|cite|datetime][#|Y]' + \r
+               'h5[E|align][#|S]' + \r
+               'del[E|cite|datetime][#|Y]' + \r
+               'h6[E|align][#|S]' + \r
+               'div[E|align][#|Y]' + \r
+               'ul[E|type|compact][li]' + \r
+               'li[E|type|value][#|Y]' + \r
+               'ol[E|type|compact|start][li]' + \r
+               'dl[E|compact][dt|dd]' + \r
+               'dt[E][#|S]' + \r
+               'dd[E][#|Y]' + \r
+               'menu[E|compact][li]' + \r
+               'dir[E|compact][li]' + \r
+               'pre[E|width|xml:space][#|ZA]' + \r
+               'hr[E|align|noshade|size|width][]' + \r
+               'blockquote[E|cite][#|Y]' + \r
+               'address[E][#|S|p]' + \r
+               'center[E][#|Y]' + \r
+               'noframes[E][#|Y]' + \r
+               'isindex[A|B|prompt][]' + \r
+               'fieldset[E][#|legend|Y]' + \r
+               'legend[E|accesskey|align][#|S]' + \r
+               'table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]' + \r
+               'caption[E|align][#|S]' + \r
+               'col[ZG][]' + \r
+               'colgroup[ZG][col]' + \r
+               'thead[ZF][tr]' + \r
+               'tr[ZF|bgcolor][th|td]' + \r
+               'th[E|ZE][#|Y]' + \r
+               'form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]' + \r
+               'noscript[E][#|Y]' + \r
+               'td[E|ZE][#|Y]' + \r
+               'tfoot[ZF][tr]' + \r
+               'tbody[ZF][tr]' + \r
+               'area[E|D|shape|coords|href|nohref|alt|target][]' + \r
+               'base[id|href|target][]' + \r
+               'body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]'\r
+       );\r
+\r
+       boolAttrMap = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,autoplay,loop,controls');\r
+       shortEndedElementsMap = makeMap('area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source');\r
+       nonEmptyElementsMap = tinymce.extend(makeMap('td,th,iframe,video,audio,object'), shortEndedElementsMap);\r
+       defaultWhiteSpaceElementsMap = makeMap('pre,script,style,textarea');\r
+       selfClosingElementsMap = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');\r
+\r
+       tinymce.html.Schema = function(settings) {\r
+               var self = this, elements = {}, children = {}, patternElements = [], validStyles, whiteSpaceElementsMap;\r
+\r
+               settings = settings || {};\r
+\r
+               // Allow all elements and attributes if verify_html is set to false\r
+               if (settings.verify_html === false)\r
+                       settings.valid_elements = '*[*]';\r
+\r
+               // Build styles list\r
+               if (settings.valid_styles) {\r
+                       validStyles = {};\r
+\r
+                       // Convert styles into a rule list\r
+                       each(settings.valid_styles, function(value, key) {\r
+                               validStyles[key] = tinymce.explode(value);\r
+                       });\r
+               }\r
+\r
+               whiteSpaceElementsMap = settings.whitespace_elements ? makeMap(settings.whitespace_elements) : defaultWhiteSpaceElementsMap;\r
+\r
+               // Converts a wildcard expression string to a regexp for example *a will become /.*a/.\r
+               function patternToRegExp(str) {\r
+                       return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');\r
+               };\r
+\r
+               // Parses the specified valid_elements string and adds to the current rules\r
+               // This function is a bit hard to read since it's heavily optimized for speed\r
+               function addValidElements(valid_elements) {\r
+                       var ei, el, ai, al, yl, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder,\r
+                               prefix, outputName, globalAttributes, globalAttributesOrder, transElement, key, childKey, value,\r
+                               elementRuleRegExp = /^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/,\r
+                               attrRuleRegExp = /^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,\r
+                               hasPatternsRegExp = /[*?+]/;\r
+\r
+                       if (valid_elements) {\r
+                               // Split valid elements into an array with rules\r
+                               valid_elements = split(valid_elements);\r
+\r
+                               if (elements['@']) {\r
+                                       globalAttributes = elements['@'].attributes;\r
+                                       globalAttributesOrder = elements['@'].attributesOrder;\r
+                               }\r
+\r
+                               // Loop all rules\r
+                               for (ei = 0, el = valid_elements.length; ei < el; ei++) {\r
+                                       // Parse element rule\r
+                                       matches = elementRuleRegExp.exec(valid_elements[ei]);\r
+                                       if (matches) {\r
+                                               // Setup local names for matches\r
+                                               prefix = matches[1];\r
+                                               elementName = matches[2];\r
+                                               outputName = matches[3];\r
+                                               attrData = matches[4];\r
+\r
+                                               // Create new attributes and attributesOrder\r
+                                               attributes = {};\r
+                                               attributesOrder = [];\r
+\r
+                                               // Create the new element\r
+                                               element = {\r
+                                                       attributes : attributes,\r
+                                                       attributesOrder : attributesOrder\r
+                                               };\r
+\r
+                                               // Padd empty elements prefix\r
+                                               if (prefix === '#')\r
+                                                       element.paddEmpty = true;\r
+\r
+                                               // Remove empty elements prefix\r
+                                               if (prefix === '-')\r
+                                                       element.removeEmpty = true;\r
+\r
+                                               // Copy attributes from global rule into current rule\r
+                                               if (globalAttributes) {\r
+                                                       for (key in globalAttributes)\r
+                                                               attributes[key] = globalAttributes[key];\r
+\r
+                                                       attributesOrder.push.apply(attributesOrder, globalAttributesOrder);\r
+                                               }\r
+\r
+                                               // Attributes defined\r
+                                               if (attrData) {\r
+                                                       attrData = split(attrData, '|');\r
+                                                       for (ai = 0, al = attrData.length; ai < al; ai++) {\r
+                                                               matches = attrRuleRegExp.exec(attrData[ai]);\r
+                                                               if (matches) {\r
+                                                                       attr = {};\r
+                                                                       attrType = matches[1];\r
+                                                                       attrName = matches[2].replace(/::/g, ':');\r
+                                                                       prefix = matches[3];\r
+                                                                       value = matches[4];\r
+\r
+                                                                       // Required\r
+                                                                       if (attrType === '!') {\r
+                                                                               element.attributesRequired = element.attributesRequired || [];\r
+                                                                               element.attributesRequired.push(attrName);\r
+                                                                               attr.required = true;\r
+                                                                       }\r
+\r
+                                                                       // Denied from global\r
+                                                                       if (attrType === '-') {\r
+                                                                               delete attributes[attrName];\r
+                                                                               attributesOrder.splice(tinymce.inArray(attributesOrder, attrName), 1);\r
+                                                                               continue;\r
+                                                                       }\r
+\r
+                                                                       // Default value\r
+                                                                       if (prefix) {\r
+                                                                               // Default value\r
+                                                                               if (prefix === '=') {\r
+                                                                                       element.attributesDefault = element.attributesDefault || [];\r
+                                                                                       element.attributesDefault.push({name: attrName, value: value});\r
+                                                                                       attr.defaultValue = value;\r
+                                                                               }\r
+\r
+                                                                               // Forced value\r
+                                                                               if (prefix === ':') {\r
+                                                                                       element.attributesForced = element.attributesForced || [];\r
+                                                                                       element.attributesForced.push({name: attrName, value: value});\r
+                                                                                       attr.forcedValue = value;\r
+                                                                               }\r
+\r
+                                                                               // Required values\r
+                                                                               if (prefix === '<')\r
+                                                                                       attr.validValues = makeMap(value, '?');\r
+                                                                       }\r
+\r
+                                                                       // Check for attribute patterns\r
+                                                                       if (hasPatternsRegExp.test(attrName)) {\r
+                                                                               element.attributePatterns = element.attributePatterns || [];\r
+                                                                               attr.pattern = patternToRegExp(attrName);\r
+                                                                               element.attributePatterns.push(attr);\r
+                                                                       } else {\r
+                                                                               // Add attribute to order list if it doesn't already exist\r
+                                                                               if (!attributes[attrName])\r
+                                                                                       attributesOrder.push(attrName);\r
+\r
+                                                                               attributes[attrName] = attr;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Global rule, store away these for later usage\r
+                                               if (!globalAttributes && elementName == '@') {\r
+                                                       globalAttributes = attributes;\r
+                                                       globalAttributesOrder = attributesOrder;\r
+                                               }\r
+\r
+                                               // Handle substitute elements such as b/strong\r
+                                               if (outputName) {\r
+                                                       element.outputName = elementName;\r
+                                                       elements[outputName] = element;\r
+                                               }\r
+\r
+                                               // Add pattern or exact element\r
+                                               if (hasPatternsRegExp.test(elementName)) {\r
+                                                       element.pattern = patternToRegExp(elementName);\r
+                                                       patternElements.push(element);\r
+                                               } else\r
+                                                       elements[elementName] = element;\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+\r
+               function setValidElements(valid_elements) {\r
+                       elements = {};\r
+                       patternElements = [];\r
+\r
+                       addValidElements(valid_elements);\r
+\r
+                       each(transitional, function(element, name) {\r
+                               children[name] = element.children;\r
+                       });\r
+               };\r
+\r
+               // Adds custom non HTML elements to the schema\r
+               function addCustomElements(custom_elements) {\r
+                       var customElementRegExp = /^(~)?(.+)$/;\r
+\r
+                       if (custom_elements) {\r
+                               each(split(custom_elements), function(rule) {\r
+                                       var matches = customElementRegExp.exec(rule),\r
+                                               inline = matches[1] === '~',\r
+                                               cloneName = inline ? 'span' : 'div',\r
+                                               name = matches[2];\r
+\r
+                                       children[name] = children[cloneName];\r
+                                       customElementsMap[name] = cloneName;\r
+\r
+                                       // If it's not marked as inline then add it to valid block elements\r
+                                       if (!inline)\r
+                                               blockElementsMap[name] = {};\r
+\r
+                                       // Add custom elements at span/div positions\r
+                                       each(children, function(element, child) {\r
+                                               if (element[cloneName])\r
+                                                       element[name] = element[cloneName];\r
+                                       });\r
+                               });\r
+                       }\r
+               };\r
+\r
+               // Adds valid children to the schema object\r
+               function addValidChildren(valid_children) {\r
+                       var childRuleRegExp = /^([+\-]?)(\w+)\[([^\]]+)\]$/;\r
+\r
+                       if (valid_children) {\r
+                               each(split(valid_children), function(rule) {\r
+                                       var matches = childRuleRegExp.exec(rule), parent, prefix;\r
+\r
+                                       if (matches) {\r
+                                               prefix = matches[1];\r
+\r
+                                               // Add/remove items from default\r
+                                               if (prefix)\r
+                                                       parent = children[matches[2]];\r
+                                               else\r
+                                                       parent = children[matches[2]] = {'#comment' : {}};\r
+\r
+                                               parent = children[matches[2]];\r
+\r
+                                               each(split(matches[3], '|'), function(child) {\r
+                                                       if (prefix === '-')\r
+                                                               delete parent[child];\r
+                                                       else\r
+                                                               parent[child] = {};\r
+                                               });\r
+                                       }\r
+                               });\r
+                       }\r
+               };\r
+\r
+               function getElementRule(name) {\r
+                       var element = elements[name], i;\r
+\r
+                       // Exact match found\r
+                       if (element)\r
+                               return element;\r
+\r
+                       // No exact match then try the patterns\r
+                       i = patternElements.length;\r
+                       while (i--) {\r
+                               element = patternElements[i];\r
+\r
+                               if (element.pattern.test(name))\r
+                                       return element;\r
+                       }\r
+               };\r
+\r
+               if (!settings.valid_elements) {\r
+                       // No valid elements defined then clone the elements from the transitional spec\r
+                       each(transitional, function(element, name) {\r
+                               elements[name] = {\r
+                                       attributes : element.attributes,\r
+                                       attributesOrder : element.attributesOrder\r
+                               };\r
+\r
+                               children[name] = element.children;\r
+                       });\r
+\r
+                       // Switch these\r
+                       each(split('strong/b,em/i'), function(item) {\r
+                               item = split(item, '/');\r
+                               elements[item[1]].outputName = item[0];\r
+                       });\r
+\r
+                       // Add default alt attribute for images\r
+                       elements.img.attributesDefault = [{name: 'alt', value: ''}];\r
+\r
+                       // Remove these if they are empty by default\r
+                       each(split('ol,ul,sub,sup,blockquote,span,font,a,table,tbody,tr'), function(name) {\r
+                               elements[name].removeEmpty = true;\r
+                       });\r
+\r
+                       // Padd these by default\r
+                       each(split('p,h1,h2,h3,h4,h5,h6,th,td,pre,div,address,caption'), function(name) {\r
+                               elements[name].paddEmpty = true;\r
+                       });\r
+               } else\r
+                       setValidElements(settings.valid_elements);\r
+\r
+               addCustomElements(settings.custom_elements);\r
+               addValidChildren(settings.valid_children);\r
+               addValidElements(settings.extended_valid_elements);\r
+\r
+               // Todo: Remove this when we fix list handling to be valid\r
+               addValidChildren('+ol[ul|ol],+ul[ul|ol]');\r
+\r
+               // If the user didn't allow span only allow internal spans\r
+               if (!getElementRule('span'))\r
+                       addValidElements('span[!data-mce-type|*]');\r
+\r
+               // Delete invalid elements\r
+               if (settings.invalid_elements) {\r
+                       tinymce.each(tinymce.explode(settings.invalid_elements), function(item) {\r
+                               if (elements[item])\r
+                                       delete elements[item];\r
+                       });\r
+               }\r
+\r
+               self.children = children;\r
+\r
+               self.styles = validStyles;\r
+\r
+               self.getBoolAttrs = function() {\r
+                       return boolAttrMap;\r
+               };\r
+\r
+               self.getBlockElements = function() {\r
+                       return blockElementsMap;\r
+               };\r
+\r
+               self.getShortEndedElements = function() {\r
+                       return shortEndedElementsMap;\r
+               };\r
+\r
+               self.getSelfClosingElements = function() {\r
+                       return selfClosingElementsMap;\r
+               };\r
+\r
+               self.getNonEmptyElements = function() {\r
+                       return nonEmptyElementsMap;\r
+               };\r
+\r
+               self.getWhiteSpaceElements = function() {\r
+                       return whiteSpaceElementsMap;\r
+               };\r
+\r
+               self.isValidChild = function(name, child) {\r
+                       var parent = children[name];\r
+\r
+                       return !!(parent && parent[child]);\r
+               };\r
+\r
+               self.getElementRule = getElementRule;\r
+\r
+               self.getCustomElements = function() {\r
+                       return customElementsMap;\r
+               };\r
+\r
+               self.addValidElements = addValidElements;\r
+\r
+               self.setValidElements = setValidElements;\r
+\r
+               self.addCustomElements = addCustomElements;\r
+\r
+               self.addValidChildren = addValidChildren;\r
+       };\r
+\r
+       // Expose boolMap and blockElementMap as static properties for usage in DOMUtils\r
+       tinymce.html.Schema.boolAttrMap = boolAttrMap;\r
+       tinymce.html.Schema.blockElementsMap = blockElementsMap;\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       tinymce.html.SaxParser = function(settings, schema) {\r
+               var self = this, noop = function() {};\r
+\r
+               settings = settings || {};\r
+               self.schema = schema = schema || new tinymce.html.Schema();\r
+\r
+               if (settings.fix_self_closing !== false)\r
+                       settings.fix_self_closing = true;\r
+\r
+               // Add handler functions from settings and setup default handlers\r
+               tinymce.each('comment cdata text start end pi doctype'.split(' '), function(name) {\r
+                       if (name)\r
+                               self[name] = settings[name] || noop;\r
+               });\r
+\r
+               self.parse = function(html) {\r
+                       var self = this, matches, index = 0, value, endRegExp, stack = [], attrList, i, text, name, isInternalElement, removeInternalElements,\r
+                               shortEndedElements, fillAttrsMap, isShortEnded, validate, elementRule, isValidElement, attr, attribsValue, invalidPrefixRegExp,\r
+                               validAttributesMap, validAttributePatterns, attributesRequired, attributesDefault, attributesForced, selfClosing,\r
+                               tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0, decode = tinymce.html.Entities.decode, fixSelfClosing, isIE;\r
+\r
+                       function processEndTag(name) {\r
+                               var pos, i;\r
+\r
+                               // Find position of parent of the same type\r
+                               pos = stack.length;\r
+                               while (pos--) {\r
+                                       if (stack[pos].name === name)\r
+                                               break;                                          \r
+                               }\r
+\r
+                               // Found parent\r
+                               if (pos >= 0) {\r
+                                       // Close all the open elements\r
+                                       for (i = stack.length - 1; i >= pos; i--) {\r
+                                               name = stack[i];\r
+\r
+                                               if (name.valid)\r
+                                                       self.end(name.name);\r
+                                       }\r
+\r
+                                       // Remove the open elements from the stack\r
+                                       stack.length = pos;\r
+                               }\r
+                       };\r
+\r
+                       // Precompile RegExps and map objects\r
+                       tokenRegExp = new RegExp('<(?:' +\r
+                               '(?:!--([\\w\\W]*?)-->)|' + // Comment\r
+                               '(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|' + // CDATA\r
+                               '(?:!DOCTYPE([\\w\\W]*?)>)|' + // DOCTYPE\r
+                               '(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' + // PI\r
+                               '(?:\\/([^>]+)>)|' + // End element\r
+                               '(?:([^\\s\\/<>]+)\\s*((?:[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*)>)' + // Start element\r
+                       ')', 'g');\r
+\r
+                       attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g;\r
+                       specialElements = {\r
+                               'script' : /<\/script[^>]*>/gi,\r
+                               'style' : /<\/style[^>]*>/gi,\r
+                               'noscript' : /<\/noscript[^>]*>/gi\r
+                       };\r
+\r
+                       // Setup lookup tables for empty elements and boolean attributes\r
+                       shortEndedElements = schema.getShortEndedElements();\r
+                       selfClosing = schema.getSelfClosingElements();\r
+                       fillAttrsMap = schema.getBoolAttrs();\r
+                       validate = settings.validate;\r
+                       removeInternalElements = settings.remove_internals;\r
+                       fixSelfClosing = settings.fix_self_closing;\r
+                       isIE = tinymce.isIE;\r
+                       invalidPrefixRegExp = /^:/;\r
+\r
+                       while (matches = tokenRegExp.exec(html)) {\r
+                               // Text\r
+                               if (index < matches.index)\r
+                                       self.text(decode(html.substr(index, matches.index - index)));\r
+\r
+                               if (value = matches[6]) { // End element\r
+                                       value = value.toLowerCase();\r
+\r
+                                       // IE will add a ":" in front of elements it doesn't understand like custom elements or HTML5 elements\r
+                                       if (isIE && invalidPrefixRegExp.test(value))\r
+                                               value = value.substr(1);\r
+\r
+                                       processEndTag(value);\r
+                               } else if (value = matches[7]) { // Start element\r
+                                       value = value.toLowerCase();\r
+\r
+                                       // IE will add a ":" in front of elements it doesn't understand like custom elements or HTML5 elements\r
+                                       if (isIE && invalidPrefixRegExp.test(value))\r
+                                               value = value.substr(1);\r
+\r
+                                       isShortEnded = value in shortEndedElements;\r
+\r
+                                       // Is self closing tag for example an <li> after an open <li>\r
+                                       if (fixSelfClosing && selfClosing[value] && stack.length > 0 && stack[stack.length - 1].name === value)\r
+                                               processEndTag(value);\r
+\r
+                                       // Validate element\r
+                                       if (!validate || (elementRule = schema.getElementRule(value))) {\r
+                                               isValidElement = true;\r
+\r
+                                               // Grab attributes map and patters when validation is enabled\r
+                                               if (validate) {\r
+                                                       validAttributesMap = elementRule.attributes;\r
+                                                       validAttributePatterns = elementRule.attributePatterns;\r
+                                               }\r
+\r
+                                               // Parse attributes\r
+                                               if (attribsValue = matches[8]) {\r
+                                                       isInternalElement = attribsValue.indexOf('data-mce-type') !== -1; // Check if the element is an internal element\r
+\r
+                                                       // If the element has internal attributes then remove it if we are told to do so\r
+                                                       if (isInternalElement && removeInternalElements)\r
+                                                               isValidElement = false;\r
+\r
+                                                       attrList = [];\r
+                                                       attrList.map = {};\r
+\r
+                                                       attribsValue.replace(attrRegExp, function(match, name, value, val2, val3) {\r
+                                                               var attrRule, i;\r
+\r
+                                                               name = name.toLowerCase();\r
+                                                               value = name in fillAttrsMap ? name : decode(value || val2 || val3 || ''); // Handle boolean attribute than value attribute\r
+\r
+                                                               // Validate name and value\r
+                                                               if (validate && !isInternalElement && name.indexOf('data-') !== 0) {\r
+                                                                       attrRule = validAttributesMap[name];\r
+\r
+                                                                       // Find rule by pattern matching\r
+                                                                       if (!attrRule && validAttributePatterns) {\r
+                                                                               i = validAttributePatterns.length;\r
+                                                                               while (i--) {\r
+                                                                                       attrRule = validAttributePatterns[i];\r
+                                                                                       if (attrRule.pattern.test(name))\r
+                                                                                               break;\r
+                                                                               }\r
+\r
+                                                                               // No rule matched\r
+                                                                               if (i === -1)\r
+                                                                                       attrRule = null;\r
+                                                                       }\r
+\r
+                                                                       // No attribute rule found\r
+                                                                       if (!attrRule)\r
+                                                                               return;\r
+\r
+                                                                       // Validate value\r
+                                                                       if (attrRule.validValues && !(value in attrRule.validValues))\r
+                                                                               return;\r
+                                                               }\r
+\r
+                                                               // Add attribute to list and map\r
+                                                               attrList.map[name] = value;\r
+                                                               attrList.push({\r
+                                                                       name: name,\r
+                                                                       value: value\r
+                                                               });\r
+                                                       });\r
+                                               } else {\r
+                                                       attrList = [];\r
+                                                       attrList.map = {};\r
+                                               }\r
+\r
+                                               // Process attributes if validation is enabled\r
+                                               if (validate && !isInternalElement) {\r
+                                                       attributesRequired = elementRule.attributesRequired;\r
+                                                       attributesDefault = elementRule.attributesDefault;\r
+                                                       attributesForced = elementRule.attributesForced;\r
+\r
+                                                       // Handle forced attributes\r
+                                                       if (attributesForced) {\r
+                                                               i = attributesForced.length;\r
+                                                               while (i--) {\r
+                                                                       attr = attributesForced[i];\r
+                                                                       name = attr.name;\r
+                                                                       attrValue = attr.value;\r
+\r
+                                                                       if (attrValue === '{$uid}')\r
+                                                                               attrValue = 'mce_' + idCount++;\r
+\r
+                                                                       attrList.map[name] = attrValue;\r
+                                                                       attrList.push({name: name, value: attrValue});\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       // Handle default attributes\r
+                                                       if (attributesDefault) {\r
+                                                               i = attributesDefault.length;\r
+                                                               while (i--) {\r
+                                                                       attr = attributesDefault[i];\r
+                                                                       name = attr.name;\r
+\r
+                                                                       if (!(name in attrList.map)) {\r
+                                                                               attrValue = attr.value;\r
+\r
+                                                                               if (attrValue === '{$uid}')\r
+                                                                                       attrValue = 'mce_' + idCount++;\r
+\r
+                                                                               attrList.map[name] = attrValue;\r
+                                                                               attrList.push({name: name, value: attrValue});\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       // Handle required attributes\r
+                                                       if (attributesRequired) {\r
+                                                               i = attributesRequired.length;\r
+                                                               while (i--) {\r
+                                                                       if (attributesRequired[i] in attrList.map)\r
+                                                                               break;\r
+                                                               }\r
+\r
+                                                               // None of the required attributes where found\r
+                                                               if (i === -1)\r
+                                                                       isValidElement = false;\r
+                                                       }\r
+\r
+                                                       // Invalidate element if it's marked as bogus\r
+                                                       if (attrList.map['data-mce-bogus'])\r
+                                                               isValidElement = false;\r
+                                               }\r
+\r
+                                               if (isValidElement)\r
+                                                       self.start(value, attrList, isShortEnded);\r
+                                       } else\r
+                                               isValidElement = false;\r
+\r
+                                       // Treat script, noscript and style a bit different since they may include code that looks like elements\r
+                                       if (endRegExp = specialElements[value]) {\r
+                                               endRegExp.lastIndex = index = matches.index + matches[0].length;\r
+\r
+                                               if (matches = endRegExp.exec(html)) {\r
+                                                       if (isValidElement)\r
+                                                               text = html.substr(index, matches.index - index);\r
+\r
+                                                       index = matches.index + matches[0].length;\r
+                                               } else {\r
+                                                       text = html.substr(index);\r
+                                                       index = html.length;\r
+                                               }\r
+\r
+                                               if (isValidElement && text.length > 0)\r
+                                                       self.text(text, true);\r
+\r
+                                               if (isValidElement)\r
+                                                       self.end(value);\r
+\r
+                                               tokenRegExp.lastIndex = index;\r
+                                               continue;\r
+                                       }\r
+\r
+                                       // Push value on to stack\r
+                                       if (!isShortEnded) {\r
+                                               if (!attribsValue || attribsValue.indexOf('/') != attribsValue.length - 1)\r
+                                                       stack.push({name: value, valid: isValidElement});\r
+                                               else if (isValidElement)\r
+                                                       self.end(value);\r
+                                       }\r
+                               } else if (value = matches[1]) { // Comment\r
+                                       self.comment(value);\r
+                               } else if (value = matches[2]) { // CDATA\r
+                                       self.cdata(value);\r
+                               } else if (value = matches[3]) { // DOCTYPE\r
+                                       self.doctype(value);\r
+                               } else if (value = matches[4]) { // PI\r
+                                       self.pi(value, matches[5]);\r
+                               }\r
+\r
+                               index = matches.index + matches[0].length;\r
+                       }\r
+\r
+                       // Text\r
+                       if (index < html.length)\r
+                               self.text(decode(html.substr(index)));\r
+\r
+                       // Close any open elements\r
+                       for (i = stack.length - 1; i >= 0; i--) {\r
+                               value = stack[i];\r
+\r
+                               if (value.valid)\r
+                                       self.end(value.name);\r
+                       }\r
+               };\r
+       }\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var whiteSpaceRegExp = /^[ \t\r\n]*$/, typeLookup = {\r
+               '#text' : 3,\r
+               '#comment' : 8,\r
+               '#cdata' : 4,\r
+               '#pi' : 7,\r
+               '#doctype' : 10,\r
+               '#document-fragment' : 11\r
+       };\r
+\r
+       // Walks the tree left/right\r
+       function walk(node, root_node, prev) {\r
+               var sibling, parent, startName = prev ? 'lastChild' : 'firstChild', siblingName = prev ? 'prev' : 'next';\r
+\r
+               // Walk into nodes if it has a start\r
+               if (node[startName])\r
+                       return node[startName];\r
+\r
+               // Return the sibling if it has one\r
+               if (node !== root_node) {\r
+                       sibling = node[siblingName];\r
+\r
+                       if (sibling)\r
+                               return sibling;\r
+\r
+                       // Walk up the parents to look for siblings\r
+                       for (parent = node.parent; parent && parent !== root_node; parent = parent.parent) {\r
+                               sibling = parent[siblingName];\r
+\r
+                               if (sibling)\r
+                                       return sibling;\r
+                       }\r
+               }\r
+       };\r
+\r
+       function Node(name, type) {\r
+               this.name = name;\r
+               this.type = type;\r
+\r
+               if (type === 1) {\r
+                       this.attributes = [];\r
+                       this.attributes.map = {};\r
+               }\r
+       }\r
+\r
+       tinymce.extend(Node.prototype, {\r
+               replace : function(node) {\r
+                       var self = this;\r
+\r
+                       if (node.parent)\r
+                               node.remove();\r
+\r
+                       self.insert(node, self);\r
+                       self.remove();\r
+\r
+                       return self;\r
+               },\r
+\r
+               attr : function(name, value) {\r
+                       var self = this, attrs, i, undef;\r
+\r
+                       if (typeof name !== "string") {\r
+                               for (i in name)\r
+                                       self.attr(i, name[i]);\r
+\r
+                               return self;\r
+                       }\r
+\r
+                       if (attrs = self.attributes) {\r
+                               if (value !== undef) {\r
+                                       // Remove attribute\r
+                                       if (value === null) {\r
+                                               if (name in attrs.map) {\r
+                                                       delete attrs.map[name];\r
+\r
+                                                       i = attrs.length;\r
+                                                       while (i--) {\r
+                                                               if (attrs[i].name === name) {\r
+                                                                       attrs = attrs.splice(i, 1);\r
+                                                                       return self;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               return self;\r
+                                       }\r
+\r
+                                       // Set attribute\r
+                                       if (name in attrs.map) {\r
+                                               // Set attribute\r
+                                               i = attrs.length;\r
+                                               while (i--) {\r
+                                                       if (attrs[i].name === name) {\r
+                                                               attrs[i].value = value;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       } else\r
+                                               attrs.push({name: name, value: value});\r
+\r
+                                       attrs.map[name] = value;\r
+\r
+                                       return self;\r
+                               } else {\r
+                                       return attrs.map[name];\r
+                               }\r
+                       }\r
+               },\r
+\r
+               clone : function() {\r
+                       var self = this, clone = new Node(self.name, self.type), i, l, selfAttrs, selfAttr, cloneAttrs;\r
+\r
+                       // Clone element attributes\r
+                       if (selfAttrs = self.attributes) {\r
+                               cloneAttrs = [];\r
+                               cloneAttrs.map = {};\r
+\r
+                               for (i = 0, l = selfAttrs.length; i < l; i++) {\r
+                                       selfAttr = selfAttrs[i];\r
+\r
+                                       // Clone everything except id\r
+                                       if (selfAttr.name !== 'id') {\r
+                                               cloneAttrs[cloneAttrs.length] = {name: selfAttr.name, value: selfAttr.value};\r
+                                               cloneAttrs.map[selfAttr.name] = selfAttr.value;\r
+                                       }\r
+                               }\r
+\r
+                               clone.attributes = cloneAttrs;\r
+                       }\r
+\r
+                       clone.value = self.value;\r
+                       clone.shortEnded = self.shortEnded;\r
+\r
+                       return clone;\r
+               },\r
+\r
+               wrap : function(wrapper) {\r
+                       var self = this;\r
+\r
+                       self.parent.insert(wrapper, self);\r
+                       wrapper.append(self);\r
+\r
+                       return self;\r
+               },\r
+\r
+               unwrap : function() {\r
+                       var self = this, node, next;\r
+\r
+                       for (node = self.firstChild; node; ) {\r
+                               next = node.next;\r
+                               self.insert(node, self, true);\r
+                               node = next;\r
+                       }\r
+\r
+                       self.remove();\r
+               },\r
+\r
+               remove : function() {\r
+                       var self = this, parent = self.parent, next = self.next, prev = self.prev;\r
+\r
+                       if (parent) {\r
+                               if (parent.firstChild === self) {\r
+                                       parent.firstChild = next;\r
+\r
+                                       if (next)\r
+                                               next.prev = null;\r
+                               } else {\r
+                                       prev.next = next;\r
+                               }\r
+\r
+                               if (parent.lastChild === self) {\r
+                                       parent.lastChild = prev;\r
+\r
+                                       if (prev)\r
+                                               prev.next = null;\r
+                               } else {\r
+                                       next.prev = prev;\r
+                               }\r
+\r
+                               self.parent = self.next = self.prev = null;\r
+                       }\r
+\r
+                       return self;\r
+               },\r
+\r
+               append : function(node) {\r
+                       var self = this, last;\r
+\r
+                       if (node.parent)\r
+                               node.remove();\r
+\r
+                       last = self.lastChild;\r
+                       if (last) {\r
+                               last.next = node;\r
+                               node.prev = last;\r
+                               self.lastChild = node;\r
+                       } else\r
+                               self.lastChild = self.firstChild = node;\r
+\r
+                       node.parent = self;\r
+\r
+                       return node;\r
+               },\r
+\r
+               insert : function(node, ref_node, before) {\r
+                       var parent;\r
+\r
+                       if (node.parent)\r
+                               node.remove();\r
+\r
+                       parent = ref_node.parent || this;\r
+\r
+                       if (before) {\r
+                               if (ref_node === parent.firstChild)\r
+                                       parent.firstChild = node;\r
+                               else\r
+                                       ref_node.prev.next = node;\r
+\r
+                               node.prev = ref_node.prev;\r
+                               node.next = ref_node;\r
+                               ref_node.prev = node;\r
+                       } else {\r
+                               if (ref_node === parent.lastChild)\r
+                                       parent.lastChild = node;\r
+                               else\r
+                                       ref_node.next.prev = node;\r
+\r
+                               node.next = ref_node.next;\r
+                               node.prev = ref_node;\r
+                               ref_node.next = node;\r
+                       }\r
+\r
+                       node.parent = parent;\r
+\r
+                       return node;\r
+               },\r
+\r
+               getAll : function(name) {\r
+                       var self = this, node, collection = [];\r
+\r
+                       for (node = self.firstChild; node; node = walk(node, self)) {\r
+                               if (node.name === name)\r
+                                       collection.push(node);\r
+                       }\r
+\r
+                       return collection;\r
+               },\r
+\r
+               empty : function() {\r
+                       var self = this, nodes, i, node;\r
+\r
+                       // Remove all children\r
+                       if (self.firstChild) {\r
+                               nodes = [];\r
+\r
+                               // Collect the children\r
+                               for (node = self.firstChild; node; node = walk(node, self))\r
+                                       nodes.push(node);\r
+\r
+                               // Remove the children\r
+                               i = nodes.length;\r
+                               while (i--) {\r
+                                       node = nodes[i];\r
+                                       node.parent = node.firstChild = node.lastChild = node.next = node.prev = null;\r
+                               }\r
+                       }\r
+\r
+                       self.firstChild = self.lastChild = null;\r
+\r
+                       return self;\r
+               },\r
+\r
+               isEmpty : function(elements) {\r
+                       var self = this, node = self.firstChild, i, name;\r
+\r
+                       if (node) {\r
+                               do {\r
+                                       if (node.type === 1) {\r
+                                               // Ignore bogus elements\r
+                                               if (node.attributes.map['data-mce-bogus'])\r
+                                                       continue;\r
+\r
+                                               // Keep empty elements like <img />\r
+                                               if (elements[node.name])\r
+                                                       return false;\r
+\r
+                                               // Keep elements with data attributes or name attribute like <a name="1"></a>\r
+                                               i = node.attributes.length;\r
+                                               while (i--) {\r
+                                                       name = node.attributes[i].name;\r
+                                                       if (name === "name" || name.indexOf('data-') === 0)\r
+                                                               return false;\r
+                                               }\r
+                                       }\r
+\r
+                                       // Keep non whitespace text nodes\r
+                                       if ((node.type === 3 && !whiteSpaceRegExp.test(node.value)))\r
+                                               return false;\r
+                               } while (node = walk(node, self));\r
+                       }\r
+\r
+                       return true;\r
+               },\r
+\r
+               walk : function(prev) {\r
+                       return walk(this, null, prev);\r
+               }\r
+       });\r
+\r
+       tinymce.extend(Node, {\r
+               create : function(name, attrs) {\r
+                       var node, attrName;\r
+\r
+                       // Create node\r
+                       node = new Node(name, typeLookup[name] || 1);\r
+\r
+                       // Add attributes if needed\r
+                       if (attrs) {\r
+                               for (attrName in attrs)\r
+                                       node.attr(attrName, attrs[attrName]);\r
+                       }\r
+\r
+                       return node;\r
+               }\r
+       });\r
+\r
+       tinymce.html.Node = Node;\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var Node = tinymce.html.Node;\r
+\r
+       tinymce.html.DomParser = function(settings, schema) {\r
+               var self = this, nodeFilters = {}, attributeFilters = [], matchedNodes = {}, matchedAttributes = {};\r
+\r
+               settings = settings || {};\r
+               settings.validate = "validate" in settings ? settings.validate : true;\r
+               settings.root_name = settings.root_name || 'body';\r
+               self.schema = schema = schema || new tinymce.html.Schema();\r
+\r
+               function fixInvalidChildren(nodes) {\r
+                       var ni, node, parent, parents, newParent, currentNode, tempNode, childNode, i,\r
+                               childClone, nonEmptyElements, nonSplitableElements, sibling, nextNode;\r
+\r
+                       nonSplitableElements = tinymce.makeMap('tr,td,th,tbody,thead,tfoot,table');\r
+                       nonEmptyElements = schema.getNonEmptyElements();\r
+\r
+                       for (ni = 0; ni < nodes.length; ni++) {\r
+                               node = nodes[ni];\r
+\r
+                               // Already removed\r
+                               if (!node.parent)\r
+                                       continue;\r
+\r
+                               // Get list of all parent nodes until we find a valid parent to stick the child into\r
+                               parents = [node];\r
+                               for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && !nonSplitableElements[parent.name]; parent = parent.parent)\r
+                                       parents.push(parent);\r
+\r
+                               // Found a suitable parent\r
+                               if (parent && parents.length > 1) {\r
+                                       // Reverse the array since it makes looping easier\r
+                                       parents.reverse();\r
+\r
+                                       // Clone the related parent and insert that after the moved node\r
+                                       newParent = currentNode = self.filterNode(parents[0].clone());\r
+\r
+                                       // Start cloning and moving children on the left side of the target node\r
+                                       for (i = 0; i < parents.length - 1; i++) {\r
+                                               if (schema.isValidChild(currentNode.name, parents[i].name)) {\r
+                                                       tempNode = self.filterNode(parents[i].clone());\r
+                                                       currentNode.append(tempNode);\r
+                                               } else\r
+                                                       tempNode = currentNode;\r
+\r
+                                               for (childNode = parents[i].firstChild; childNode && childNode != parents[i + 1]; ) {\r
+                                                       nextNode = childNode.next;\r
+                                                       tempNode.append(childNode);\r
+                                                       childNode = nextNode;\r
+                                               }\r
+\r
+                                               currentNode = tempNode;\r
+                                       }\r
+\r
+                                       if (!newParent.isEmpty(nonEmptyElements)) {\r
+                                               parent.insert(newParent, parents[0], true);\r
+                                               parent.insert(node, newParent);\r
+                                       } else {\r
+                                               parent.insert(node, parents[0], true);\r
+                                       }\r
+\r
+                                       // Check if the element is empty by looking through it's contents and special treatment for <p><br /></p>\r
+                                       parent = parents[0];\r
+                                       if (parent.isEmpty(nonEmptyElements) || parent.firstChild === parent.lastChild && parent.firstChild.name === 'br') {\r
+                                               parent.empty().remove();\r
+                                       }\r
+                               } else if (node.parent) {\r
+                                       // If it's an LI try to find a UL/OL for it or wrap it\r
+                                       if (node.name === 'li') {\r
+                                               sibling = node.prev;\r
+                                               if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) {\r
+                                                       sibling.append(node);\r
+                                                       continue;\r
+                                               }\r
+\r
+                                               sibling = node.next;\r
+                                               if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) {\r
+                                                       sibling.insert(node, sibling.firstChild, true);\r
+                                                       continue;\r
+                                               }\r
+\r
+                                               node.wrap(self.filterNode(new Node('ul', 1)));\r
+                                               continue;\r
+                                       }\r
+\r
+                                       // Try wrapping the element in a DIV\r
+                                       if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) {\r
+                                               node.wrap(self.filterNode(new Node('div', 1)));\r
+                                       } else {\r
+                                               // We failed wrapping it, then remove or unwrap it\r
+                                               if (node.name === 'style' || node.name === 'script')\r
+                                                       node.empty().remove();\r
+                                               else\r
+                                                       node.unwrap();\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+\r
+               self.filterNode = function(node) {\r
+                       var i, name, list;\r
+\r
+                       // Run element filters\r
+                       if (name in nodeFilters) {\r
+                               list = matchedNodes[name];\r
+\r
+                               if (list)\r
+                                       list.push(node);\r
+                               else\r
+                                       matchedNodes[name] = [node];\r
+                       }\r
+\r
+                       // Run attribute filters\r
+                       i = attributeFilters.length;\r
+                       while (i--) {\r
+                               name = attributeFilters[i].name;\r
+\r
+                               if (name in node.attributes.map) {\r
+                                       list = matchedAttributes[name];\r
+\r
+                                       if (list)\r
+                                               list.push(node);\r
+                                       else\r
+                                               matchedAttributes[name] = [node];\r
+                               }\r
+                       }\r
+\r
+                       return node;\r
+               };\r
+\r
+               self.addNodeFilter = function(name, callback) {\r
+                       tinymce.each(tinymce.explode(name), function(name) {\r
+                               var list = nodeFilters[name];\r
+\r
+                               if (!list)\r
+                                       nodeFilters[name] = list = [];\r
+\r
+                               list.push(callback);\r
+                       });\r
+               };\r
+\r
+               self.addAttributeFilter = function(name, callback) {\r
+                       tinymce.each(tinymce.explode(name), function(name) {\r
+                               var i;\r
+\r
+                               for (i = 0; i < attributeFilters.length; i++) {\r
+                                       if (attributeFilters[i].name === name) {\r
+                                               attributeFilters[i].callbacks.push(callback);\r
+                                               return;\r
+                                       }\r
+                               }\r
+\r
+                               attributeFilters.push({name: name, callbacks: [callback]});\r
+                       });\r
+               };\r
+\r
+               self.parse = function(html, args) {\r
+                       var parser, rootNode, node, nodes, i, l, fi, fl, list, name, validate,\r
+                               blockElements, startWhiteSpaceRegExp, invalidChildren = [],\r
+                               endWhiteSpaceRegExp, allWhiteSpaceRegExp, whiteSpaceElements, children, nonEmptyElements, rootBlockName;\r
+\r
+                       args = args || {};\r
+                       matchedNodes = {};\r
+                       matchedAttributes = {};\r
+                       blockElements = tinymce.extend(tinymce.makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements());\r
+                       nonEmptyElements = schema.getNonEmptyElements();\r
+                       children = schema.children;\r
+                       validate = settings.validate;\r
+                       rootBlockName = "forced_root_block" in args ? args.forced_root_block : settings.forced_root_block;\r
+\r
+                       whiteSpaceElements = schema.getWhiteSpaceElements();\r
+                       startWhiteSpaceRegExp = /^[ \t\r\n]+/;\r
+                       endWhiteSpaceRegExp = /[ \t\r\n]+$/;\r
+                       allWhiteSpaceRegExp = /[ \t\r\n]+/g;\r
+\r
+                       function addRootBlocks() {\r
+                               var node = rootNode.firstChild, next, rootBlockNode;\r
+\r
+                               while (node) {\r
+                                       next = node.next;\r
+\r
+                                       if (node.type == 3 || (node.type == 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr('data-mce-type'))) {\r
+                                               if (!rootBlockNode) {\r
+                                                       // Create a new root block element\r
+                                                       rootBlockNode = createNode(rootBlockName, 1);\r
+                                                       rootNode.insert(rootBlockNode, node);\r
+                                                       rootBlockNode.append(node);\r
+                                               } else\r
+                                                       rootBlockNode.append(node);\r
+                                       } else {\r
+                                               rootBlockNode = null;\r
+                                       }\r
+\r
+                                       node = next;\r
+                               };\r
+                       };\r
+\r
+                       function createNode(name, type) {\r
+                               var node = new Node(name, type), list;\r
+\r
+                               if (name in nodeFilters) {\r
+                                       list = matchedNodes[name];\r
+\r
+                                       if (list)\r
+                                               list.push(node);\r
+                                       else\r
+                                               matchedNodes[name] = [node];\r
+                               }\r
+\r
+                               return node;\r
+                       };\r
+\r
+                       function removeWhitespaceBefore(node) {\r
+                               var textNode, textVal, sibling;\r
+\r
+                               for (textNode = node.prev; textNode && textNode.type === 3; ) {\r
+                                       textVal = textNode.value.replace(endWhiteSpaceRegExp, '');\r
+\r
+                                       if (textVal.length > 0) {\r
+                                               textNode.value = textVal;\r
+                                               textNode = textNode.prev;\r
+                                       } else {\r
+                                               sibling = textNode.prev;\r
+                                               textNode.remove();\r
+                                               textNode = sibling;\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       parser = new tinymce.html.SaxParser({\r
+                               validate : validate,\r
+                               fix_self_closing : !validate, // Let the DOM parser handle <li> in <li> or <p> in <p> for better results\r
+\r
+                               cdata: function(text) {\r
+                                       node.append(createNode('#cdata', 4)).value = text;\r
+                               },\r
+\r
+                               text: function(text, raw) {\r
+                                       var textNode;\r
+\r
+                                       // Trim all redundant whitespace on non white space elements\r
+                                       if (!whiteSpaceElements[node.name]) {\r
+                                               text = text.replace(allWhiteSpaceRegExp, ' ');\r
+\r
+                                               if (node.lastChild && blockElements[node.lastChild.name])\r
+                                                       text = text.replace(startWhiteSpaceRegExp, '');\r
+                                       }\r
+\r
+                                       // Do we need to create the node\r
+                                       if (text.length !== 0) {\r
+                                               textNode = createNode('#text', 3);\r
+                                               textNode.raw = !!raw;\r
+                                               node.append(textNode).value = text;\r
+                                       }\r
+                               },\r
+\r
+                               comment: function(text) {\r
+                                       node.append(createNode('#comment', 8)).value = text;\r
+                               },\r
+\r
+                               pi: function(name, text) {\r
+                                       node.append(createNode(name, 7)).value = text;\r
+                                       removeWhitespaceBefore(node);\r
+                               },\r
+\r
+                               doctype: function(text) {\r
+                                       var newNode;\r
+               \r
+                                       newNode = node.append(createNode('#doctype', 10));\r
+                                       newNode.value = text;\r
+                                       removeWhitespaceBefore(node);\r
+                               },\r
+\r
+                               start: function(name, attrs, empty) {\r
+                                       var newNode, attrFiltersLen, elementRule, textNode, attrName, text, sibling, parent;\r
+\r
+                                       elementRule = validate ? schema.getElementRule(name) : {};\r
+                                       if (elementRule) {\r
+                                               newNode = createNode(elementRule.outputName || name, 1);\r
+                                               newNode.attributes = attrs;\r
+                                               newNode.shortEnded = empty;\r
+\r
+                                               node.append(newNode);\r
+\r
+                                               // Check if node is valid child of the parent node is the child is\r
+                                               // unknown we don't collect it since it's probably a custom element\r
+                                               parent = children[node.name];\r
+                                               if (parent && children[newNode.name] && !parent[newNode.name])\r
+                                                       invalidChildren.push(newNode);\r
+\r
+                                               attrFiltersLen = attributeFilters.length;\r
+                                               while (attrFiltersLen--) {\r
+                                                       attrName = attributeFilters[attrFiltersLen].name;\r
+\r
+                                                       if (attrName in attrs.map) {\r
+                                                               list = matchedAttributes[attrName];\r
+\r
+                                                               if (list)\r
+                                                                       list.push(newNode);\r
+                                                               else\r
+                                                                       matchedAttributes[attrName] = [newNode];\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Trim whitespace before block\r
+                                               if (blockElements[name])\r
+                                                       removeWhitespaceBefore(newNode);\r
+\r
+                                               // Change current node if the element wasn't empty i.e not <br /> or <img />\r
+                                               if (!empty)\r
+                                                       node = newNode;\r
+                                       }\r
+                               },\r
+\r
+                               end: function(name) {\r
+                                       var textNode, elementRule, text, sibling, tempNode;\r
+\r
+                                       elementRule = validate ? schema.getElementRule(name) : {};\r
+                                       if (elementRule) {\r
+                                               if (blockElements[name]) {\r
+                                                       if (!whiteSpaceElements[node.name]) {\r
+                                                               // Trim whitespace at beginning of block\r
+                                                               for (textNode = node.firstChild; textNode && textNode.type === 3; ) {\r
+                                                                       text = textNode.value.replace(startWhiteSpaceRegExp, '');\r
+\r
+                                                                       if (text.length > 0) {\r
+                                                                               textNode.value = text;\r
+                                                                               textNode = textNode.next;\r
+                                                                       } else {\r
+                                                                               sibling = textNode.next;\r
+                                                                               textNode.remove();\r
+                                                                               textNode = sibling;\r
+                                                                       }\r
+                                                               }\r
+\r
+                                                               // Trim whitespace at end of block\r
+                                                               for (textNode = node.lastChild; textNode && textNode.type === 3; ) {\r
+                                                                       text = textNode.value.replace(endWhiteSpaceRegExp, '');\r
+\r
+                                                                       if (text.length > 0) {\r
+                                                                               textNode.value = text;\r
+                                                                               textNode = textNode.prev;\r
+                                                                       } else {\r
+                                                                               sibling = textNode.prev;\r
+                                                                               textNode.remove();\r
+                                                                               textNode = sibling;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       // Trim start white space\r
+                                                       textNode = node.prev;\r
+                                                       if (textNode && textNode.type === 3) {\r
+                                                               text = textNode.value.replace(startWhiteSpaceRegExp, '');\r
+\r
+                                                               if (text.length > 0)\r
+                                                                       textNode.value = text;\r
+                                                               else\r
+                                                                       textNode.remove();\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Handle empty nodes\r
+                                               if (elementRule.removeEmpty || elementRule.paddEmpty) {\r
+                                                       if (node.isEmpty(nonEmptyElements)) {\r
+                                                               if (elementRule.paddEmpty)\r
+                                                                       node.empty().append(new Node('#text', '3')).value = '\u00a0';\r
+                                                               else {\r
+                                                                       // Leave nodes that have a name like <a name="name">\r
+                                                                       if (!node.attributes.map.name) {\r
+                                                                               tempNode = node.parent;\r
+                                                                               node.empty().remove();\r
+                                                                               node = tempNode;\r
+                                                                               return;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               node = node.parent;\r
+                                       }\r
+                               }\r
+                       }, schema);\r
+\r
+                       rootNode = node = new Node(args.context || settings.root_name, 11);\r
+\r
+                       parser.parse(html);\r
+\r
+                       // Fix invalid children or report invalid children in a contextual parsing\r
+                       if (validate && invalidChildren.length) {\r
+                               if (!args.context)\r
+                                       fixInvalidChildren(invalidChildren);\r
+                               else\r
+                                       args.invalid = true;\r
+                       }\r
+\r
+                       // Wrap nodes in the root into block elements if the root is body\r
+                       if (rootBlockName && rootNode.name == 'body')\r
+                               addRootBlocks();\r
+\r
+                       // Run filters only when the contents is valid\r
+                       if (!args.invalid) {\r
+                               // Run node filters\r
+                               for (name in matchedNodes) {\r
+                                       list = nodeFilters[name];\r
+                                       nodes = matchedNodes[name];\r
+\r
+                                       // Remove already removed children\r
+                                       fi = nodes.length;\r
+                                       while (fi--) {\r
+                                               if (!nodes[fi].parent)\r
+                                                       nodes.splice(fi, 1);\r
+                                       }\r
+\r
+                                       for (i = 0, l = list.length; i < l; i++)\r
+                                               list[i](nodes, name, args);\r
+                               }\r
+\r
+                               // Run attribute filters\r
+                               for (i = 0, l = attributeFilters.length; i < l; i++) {\r
+                                       list = attributeFilters[i];\r
+\r
+                                       if (list.name in matchedAttributes) {\r
+                                               nodes = matchedAttributes[list.name];\r
+\r
+                                               // Remove already removed children\r
+                                               fi = nodes.length;\r
+                                               while (fi--) {\r
+                                                       if (!nodes[fi].parent)\r
+                                                               nodes.splice(fi, 1);\r
+                                               }\r
+\r
+                                               for (fi = 0, fl = list.callbacks.length; fi < fl; fi++)\r
+                                                       list.callbacks[fi](nodes, list.name, args);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return rootNode;\r
+               };\r
+\r
+               // Remove <br> at end of block elements Gecko and WebKit injects BR elements to\r
+               // make it possible to place the caret inside empty blocks. This logic tries to remove\r
+               // these elements and keep br elements that where intended to be there intact\r
+               if (settings.remove_trailing_brs) {\r
+                       self.addNodeFilter('br', function(nodes, name) {\r
+                               var i, l = nodes.length, node, blockElements = schema.getBlockElements(),\r
+                                       nonEmptyElements = schema.getNonEmptyElements(), parent, prev, prevName;\r
+\r
+                               // Remove brs from body element as well\r
+                               blockElements.body = 1;\r
+\r
+                               // Must loop forwards since it will otherwise remove all brs in <p>a<br><br><br></p>\r
+                               for (i = 0; i < l; i++) {\r
+                                       node = nodes[i];\r
+                                       parent = node.parent;\r
+\r
+                                       if (blockElements[node.parent.name] && node === parent.lastChild) {\r
+                                               // Loop all nodes to the right of the current node and check for other BR elements\r
+                                               // excluding bookmarks since they are invisible\r
+                                               prev = node.prev;\r
+                                               while (prev) {\r
+                                                       prevName = prev.name;\r
+\r
+                                                       // Ignore bookmarks\r
+                                                       if (prevName !== "span" || prev.attr('data-mce-type') !== 'bookmark') {\r
+                                                               // Found a non BR element\r
+                                                               if (prevName !== "br")\r
+                                                                       break;\r
+       \r
+                                                               // Found another br it's a <br><br> structure then don't remove anything\r
+                                                               if (prevName === 'br') {\r
+                                                                       node = null;\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       prev = prev.prev;\r
+                                               }\r
+\r
+                                               if (node) {\r
+                                                       node.remove();\r
+\r
+                                                       // Is the parent to be considered empty after we removed the BR\r
+                                                       if (parent.isEmpty(nonEmptyElements)) {\r
+                                                               elementRule = schema.getElementRule(parent.name);\r
+\r
+                                                               // Remove or padd the element depending on schema rule\r
+                                                               if (elementRule) {\r
+                                                                 if (elementRule.removeEmpty)\r
+                                                                         parent.remove();\r
+                                                                 else if (elementRule.paddEmpty)\r
+                                                                         parent.empty().append(new tinymce.html.Node('#text', 3)).value = '\u00a0';\r
+                                                         }\r
+              }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+})(tinymce);\r
+\r
+tinymce.html.Writer = function(settings) {\r
+       var html = [], indent, indentBefore, indentAfter, encode, htmlOutput;\r
+\r
+       settings = settings || {};\r
+       indent = settings.indent;\r
+       indentBefore = tinymce.makeMap(settings.indent_before || '');\r
+       indentAfter = tinymce.makeMap(settings.indent_after || '');\r
+       encode = tinymce.html.Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities);\r
+       htmlOutput = settings.element_format == "html";\r
+\r
+       return {\r
+               start: function(name, attrs, empty) {\r
+                       var i, l, attr, value;\r
+\r
+                       if (indent && indentBefore[name] && html.length > 0) {\r
+                               value = html[html.length - 1];\r
+\r
+                               if (value.length > 0 && value !== '\n')\r
+                                       html.push('\n');\r
+                       }\r
+\r
+                       html.push('<', name);\r
+\r
+                       if (attrs) {\r
+                               for (i = 0, l = attrs.length; i < l; i++) {\r
+                                       attr = attrs[i];\r
+                                       html.push(' ', attr.name, '="', encode(attr.value, true), '"');\r
+                               }\r
+                       }\r
+\r
+                       if (!empty || htmlOutput)\r
+                               html[html.length] = '>';\r
+                       else\r
+                               html[html.length] = ' />';\r
+\r
+                       if (empty && indent && indentAfter[name] && html.length > 0) {\r
+                               value = html[html.length - 1];\r
+\r
+                               if (value.length > 0 && value !== '\n')\r
+                                       html.push('\n');\r
+                       }\r
+               },\r
+\r
+               end: function(name) {\r
+                       var value;\r
+\r
+                       /*if (indent && indentBefore[name] && html.length > 0) {\r
+                               value = html[html.length - 1];\r
+\r
+                               if (value.length > 0 && value !== '\n')\r
+                                       html.push('\n');\r
+                       }*/\r
+\r
+                       html.push('</', name, '>');\r
+\r
+                       if (indent && indentAfter[name] && html.length > 0) {\r
+                               value = html[html.length - 1];\r
+\r
+                               if (value.length > 0 && value !== '\n')\r
+                                       html.push('\n');\r
+                       }\r
+               },\r
+\r
+               text: function(text, raw) {\r
+                       if (text.length > 0)\r
+                               html[html.length] = raw ? text : encode(text);\r
+               },\r
+\r
+               cdata: function(text) {\r
+                       html.push('<![CDATA[', text, ']]>');\r
+               },\r
+\r
+               comment: function(text) {\r
+                       html.push('<!--', text, '-->');\r
+               },\r
+\r
+               pi: function(name, text) {\r
+                       if (text)\r
+                               html.push('<?', name, ' ', text, '?>');\r
+                       else\r
+                               html.push('<?', name, '?>');\r
+\r
+                       if (indent)\r
+                               html.push('\n');\r
+               },\r
+\r
+               doctype: function(text) {\r
+                       html.push('<!DOCTYPE', text, '>', indent ? '\n' : '');\r
+               },\r
+\r
+               reset: function() {\r
+                       html.length = 0;\r
+               },\r
+\r
+               getContent: function() {\r
+                       return html.join('').replace(/\n$/, '');\r
+               }\r
+       };\r
+};\r
+\r
+(function(tinymce) {\r
+       tinymce.html.Serializer = function(settings, schema) {\r
+               var self = this, writer = new tinymce.html.Writer(settings);\r
+\r
+               settings = settings || {};\r
+               settings.validate = "validate" in settings ? settings.validate : true;\r
+\r
+               self.schema = schema = schema || new tinymce.html.Schema();\r
+               self.writer = writer;\r
+\r
+               self.serialize = function(node) {\r
+                       var handlers, validate;\r
+\r
+                       validate = settings.validate;\r
+\r
+                       handlers = {\r
+                               // #text\r
+                               3: function(node, raw) {\r
+                                       writer.text(node.value, node.raw);\r
+                               },\r
+\r
+                               // #comment\r
+                               8: function(node) {\r
+                                       writer.comment(node.value);\r
+                               },\r
+\r
+                               // Processing instruction\r
+                               7: function(node) {\r
+                                       writer.pi(node.name, node.value);\r
+                               },\r
+\r
+                               // Doctype\r
+                               10: function(node) {\r
+                                       writer.doctype(node.value);\r
+                               },\r
+\r
+                               // CDATA\r
+                               4: function(node) {\r
+                                       writer.cdata(node.value);\r
+                               },\r
+\r
+                               // Document fragment\r
+                               11: function(node) {\r
+                                       if ((node = node.firstChild)) {\r
+                                               do {\r
+                                                       walk(node);\r
+                                               } while (node = node.next);\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       writer.reset();\r
+\r
+                       function walk(node) {\r
+                               var handler = handlers[node.type], name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule;\r
+\r
+                               if (!handler) {\r
+                                       name = node.name;\r
+                                       isEmpty = node.shortEnded;\r
+                                       attrs = node.attributes;\r
+\r
+                                       // Sort attributes\r
+                                       if (validate && attrs && attrs.length > 1) {\r
+                                               sortedAttrs = [];\r
+                                               sortedAttrs.map = {};\r
+\r
+                                               elementRule = schema.getElementRule(node.name);\r
+                                               for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) {\r
+                                                       attrName = elementRule.attributesOrder[i];\r
+\r
+                                                       if (attrName in attrs.map) {\r
+                                                               attrValue = attrs.map[attrName];\r
+                                                               sortedAttrs.map[attrName] = attrValue;\r
+                                                               sortedAttrs.push({name: attrName, value: attrValue});\r
+                                                       }\r
+                                               }\r
+\r
+                                               for (i = 0, l = attrs.length; i < l; i++) {\r
+                                                       attrName = attrs[i].name;\r
+\r
+                                                       if (!(attrName in sortedAttrs.map)) {\r
+                                                               attrValue = attrs.map[attrName];\r
+                                                               sortedAttrs.map[attrName] = attrValue;\r
+                                                               sortedAttrs.push({name: attrName, value: attrValue});\r
+                                                       }\r
+                                               }\r
+\r
+                                               attrs = sortedAttrs;\r
+                                       }\r
+\r
+                                       writer.start(node.name, attrs, isEmpty);\r
+\r
+                                       if (!isEmpty) {\r
+                                               if ((node = node.firstChild)) {\r
+                                                       do {\r
+                                                               walk(node);\r
+                                                       } while (node = node.next);\r
+                                               }\r
+\r
+                                               writer.end(name);\r
+                                       }\r
+                               } else\r
+                                       handler(node);\r
+                       }\r
+\r
+                       // Serialize element and treat all non elements as fragments\r
+                       if (node.type == 1 && !settings.inner)\r
+                               walk(node);\r
+                       else\r
+                               handlers[11](node);\r
+\r
+                       return writer.getContent();\r
+               };\r
+       }\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       // Shorten names\r
+       var each = tinymce.each,\r
+               is = tinymce.is,\r
+               isWebKit = tinymce.isWebKit,\r
+               isIE = tinymce.isIE,\r
+               Entities = tinymce.html.Entities,\r
+               simpleSelectorRe = /^([a-z0-9],?)+$/i,\r
+               blockElementsMap = tinymce.html.Schema.blockElementsMap,\r
+               whiteSpaceRegExp = /^[ \t\r\n]*$/;\r
+\r
+       tinymce.create('tinymce.dom.DOMUtils', {\r
+               doc : null,\r
+               root : null,\r
+               files : null,\r
+               pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/,\r
+               props : {\r
+                       "for" : "htmlFor",\r
+                       "class" : "className",\r
+                       className : "className",\r
+                       checked : "checked",\r
+                       disabled : "disabled",\r
+                       maxlength : "maxLength",\r
+                       readonly : "readOnly",\r
+                       selected : "selected",\r
+                       value : "value",\r
+                       id : "id",\r
+                       name : "name",\r
+                       type : "type"\r
+               },\r
+\r
+               DOMUtils : function(d, s) {\r
+                       var t = this, globalStyle, name;\r
+\r
+                       t.doc = d;\r
+                       t.win = window;\r
+                       t.files = {};\r
+                       t.cssFlicker = false;\r
+                       t.counter = 0;\r
+                       t.stdMode = !tinymce.isIE || d.documentMode >= 8;\r
+                       t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat" || t.stdMode;\r
+                       t.hasOuterHTML = "outerHTML" in d.createElement("a");\r
+\r
+                       t.settings = s = tinymce.extend({\r
+                               keep_values : false,\r
+                               hex_colors : 1\r
+                       }, s);\r
+                       \r
+                       t.schema = s.schema;\r
+                       t.styles = new tinymce.html.Styles({\r
+                               url_converter : s.url_converter,\r
+                               url_converter_scope : s.url_converter_scope\r
+                       }, s.schema);\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
+                       if (isIE && s.schema) {\r
+                               // Add missing HTML 4/5 elements to IE\r
+                               ('abbr article aside audio canvas ' +\r
+                               'details figcaption figure footer ' +\r
+                               'header hgroup mark menu meter nav ' +\r
+                               'output progress section summary ' +\r
+                               'time video').replace(/\w+/g, function(name) {\r
+                                       d.createElement(name);\r
+                               });\r
+\r
+                               // Create all custom elements\r
+                               for (name in s.schema.getCustomElements()) {\r
+                                       d.createElement(name);\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, sr;\r
+\r
+                       e = t.get(e);\r
+                       p = t.getPos(e);\r
+                       sr = t.getSize(e);\r
+\r
+                       return {\r
+                               x : p.x,\r
+                               y : p.y,\r
+                               w : sr.w,\r
+                               h : sr.h\r
+                       };\r
+               },\r
+\r
+               getSize : function(e) {\r
+                       var t = this, w, h;\r
+\r
+                       e = t.get(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
+                               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
+                       return this.getParents(n, f, r, false);\r
+               },\r
+\r
+               getParents : function(n, f, r, c) {\r
+                       var t = this, na, se = t.settings, o = [];\r
+\r
+                       n = t.get(n);\r
+                       c = c === undefined;\r
+\r
+                       if (se.strict_root)\r
+                               r = r || t.getRoot();\r
+\r
+                       // Wrap node name as func\r
+                       if (is(f, 'string')) {\r
+                               na = f;\r
+\r
+                               if (f === '*') {\r
+                                       f = function(n) {return n.nodeType == 1;};\r
+                               } else {\r
+                                       f = function(n) {\r
+                                               return t.is(n, na);\r
+                                       };\r
+                               }\r
+                       }\r
+\r
+                       while (n) {\r
+                               if (n == r || !n.nodeType || n.nodeType === 9)\r
+                                       break;\r
+\r
+                               if (!f || f(n)) {\r
+                                       if (c)\r
+                                               o.push(n);\r
+                                       else\r
+                                               return n;\r
+                               }\r
+\r
+                               n = n.parentNode;\r
+                       }\r
+\r
+                       return c ? o : null;\r
+               },\r
+\r
+               get : function(e) {\r
+                       var n;\r
+\r
+                       if (e && 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
+               getNext : function(node, selector) {\r
+                       return this._findSib(node, selector, 'nextSibling');\r
+               },\r
+\r
+               getPrev : function(node, selector) {\r
+                       return this._findSib(node, selector, 'previousSibling');\r
+               },\r
+\r
+\r
+               select : function(pa, s) {\r
+                       var t = this;\r
+\r
+                       return tinymce.dom.Sizzle(pa, t.get(s) || t.get(t.settings.root_element) || t.doc, []);\r
+               },\r
+\r
+               is : function(n, selector) {\r
+                       var i;\r
+\r
+                       // If it isn't an array then try to do some simple selectors instead of Sizzle for to boost performance\r
+                       if (n.length === undefined) {\r
+                               // Simple all selector\r
+                               if (selector === '*')\r
+                                       return n.nodeType == 1;\r
+\r
+                               // Simple selector just elements\r
+                               if (simpleSelectorRe.test(selector)) {\r
+                                       selector = selector.toLowerCase().split(/,/);\r
+                                       n = n.nodeName.toLowerCase();\r
+\r
+                                       for (i = selector.length - 1; i >= 0; i--) {\r
+                                               if (selector[i] == n)\r
+                                                       return true;\r
+                                       }\r
+\r
+                                       return false;\r
+                               }\r
+                       }\r
+\r
+                       return tinymce.dom.Sizzle.matches(selector, n.nodeType ? [n] : n).length > 0;\r
+               },\r
+\r
+\r
+               add : function(p, n, a, h, c) {\r
+                       var t = this;\r
+\r
+                       return this.run(p, function(p) {\r
+                               var e, k;\r
+\r
+                               e = is(n, 'string') ? t.doc.createElement(n) : n;\r
+                               t.setAttribs(e, a);\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
+                       // A call to tinymce.is doesn't work for some odd reason on IE9 possible bug inside their JS runtime\r
+                       if (typeof(h) != "undefined")\r
+                               return o + '>' + h + '</' + n + '>';\r
+\r
+                       return o + ' />';\r
+               },\r
+\r
+               remove : function(node, keep_children) {\r
+                       return this.run(node, function(node) {\r
+                               var child, parent = node.parentNode;\r
+\r
+                               if (!parent)\r
+                                       return null;\r
+\r
+                               if (keep_children) {\r
+                                       while (child = node.firstChild) {\r
+                                               // IE 8 will crash if you don't remove completely empty text nodes\r
+                                               if (!tinymce.isIE || child.nodeType !== 3 || child.nodeValue)\r
+                                                       parent.insertBefore(child, node);\r
+                                               else\r
+                                                       node.removeChild(child);\r
+                                       }\r
+                               }\r
+\r
+                               return parent.removeChild(node);\r
+                       });\r
+               },\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, 'data-mce-style');\r
+                       });\r
+               },\r
+\r
+               getStyle : function(n, na, c) {\r
+                       n = this.get(n);\r
+\r
+                       if (!n)\r
+                               return;\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 ? n.style[na] : undefined;\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
+               removeAllAttribs: function(e) {\r
+                       return this.run(e, function(e) {\r
+                               var i, attrs = e.attributes;\r
+                               for (i = attrs.length - 1; i >= 0; i--) {\r
+                                       e.removeAttributeNode(attrs.item(i));\r
+                               }\r
+                       });\r
+               },\r
+\r
+               setAttrib : function(e, n, v) {\r
+                       var t = this;\r
+\r
+                       // Whats the point\r
+                       if (!e || !n)\r
+                               return;\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 (!is(v, 'string')) {\r
+                                                       each(v, function(v, n) {\r
+                                                               t.setStyle(e, n, v);\r
+                                                       });\r
+\r
+                                                       return;\r
+                                               }\r
+\r
+                                               // No mce_style for elements with these since they might get resized by the user\r
+                                               if (s.keep_values) {\r
+                                                       if (v && !t._isRes(v))\r
+                                                               e.setAttribute('data-mce-style', v, 2);\r
+                                                       else\r
+                                                               e.removeAttribute('data-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, 'data-mce-' + n, v, 2);\r
+                                               }\r
+\r
+                                               break;\r
+\r
+                                       case "shape":\r
+                                               e.setAttribute('data-mce-style', v);\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
+               getAttrib : function(e, n, dv) {\r
+                       var v, t = this, undef;\r
+\r
+                       e = t.get(e);\r
+\r
+                       if (!e || e.nodeType !== 1)\r
+                               return dv === undef ? false : dv;\r
+\r
+                       if (!is(dv))\r
+                               dv = '';\r
+\r
+                       // Try the mce variant for these\r
+                       if (/^(src|href|style|coords|shape)$/.test(n)) {\r
+                               v = e.getAttribute("data-mce-" + n);\r
+\r
+                               if (v)\r
+                                       return v;\r
+                       }\r
+\r
+                       if (isIE && t.props[n]) {\r
+                               v = e[t.props[n]];\r
+                               v = v && v.nodeValue ? v.nodeValue : v;\r
+                       }\r
+\r
+                       if (!v)\r
+                               v = e.getAttribute(n, 2);\r
+\r
+                       // Check boolean attribs\r
+                       if (/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(n)) {\r
+                               if (e[t.props[n]] === true && v === '')\r
+                                       return n;\r
+\r
+                               return v ? n : '';\r
+                       }\r
+\r
+                       // Inner input elements will override attributes on form elements\r
+                       if (e.nodeName === "FORM" && e.getAttributeNode(n))\r
+                               return e.getAttributeNode(n).nodeValue;\r
+\r
+                       if (n === 'style') {\r
+                               v = v || e.style.cssText;\r
+\r
+                               if (v) {\r
+                                       v = t.serializeStyle(t.parseStyle(v), e.nodeName);\r
+\r
+                                       if (t.settings.keep_values && !t._isRes(v))\r
+                                               e.setAttribute('data-mce-style', v);\r
+                               }\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' || v === 20 || v === 0)\r
+                                                       v = '';\r
+\r
+                                               break;\r
+\r
+                                       case 'width':\r
+                                       case 'height':\r
+                                       case 'vspace':\r
+                                       case 'checked':\r
+                                       case 'disabled':\r
+                                       case 'readonly':\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 'maxlength':\r
+                                       case 'tabindex':\r
+                                               // IE returns default value\r
+                                               if (v === 32768 || v === 2147483647 || v === '32768')\r
+                                                       v = '';\r
+\r
+                                               break;\r
+\r
+                                       case 'multiple':\r
+                                       case 'compact':\r
+                                       case 'noshade':\r
+                                       case 'nowrap':\r
+                                               if (v === 65535)\r
+                                                       return n;\r
+\r
+                                               return dv;\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 = tinymce._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/, '$1', '' + v);\r
+                               }\r
+                       }\r
+\r
+                       return (v !== undef && v !== null && v !== '') ? '' + v : dv;\r
+               },\r
+\r
+               getPos : function(n, ro) {\r
+                       var t = this, x = 0, y = 0, e, d = t.doc, r;\r
+\r
+                       n = t.get(n);\r
+                       ro = ro || d.body;\r
+\r
+                       if (n) {\r
+                               // Use getBoundingClientRect if it exists since it's faster than looping offset nodes\r
+                               if (n.getBoundingClientRect) {\r
+                                       n = n.getBoundingClientRect();\r
+                                       e = t.boxModel ? d.documentElement : d.body;\r
+\r
+                                       // Add scroll offsets from documentElement or body since IE with the wrong box model will use d.body and so do WebKit\r
+                                       // Also remove the body/documentelement clientTop/clientLeft on IE 6, 7 since they offset the position\r
+                                       x = n.left + (d.documentElement.scrollLeft || d.body.scrollLeft) - e.clientTop;\r
+                                       y = n.top + (d.documentElement.scrollTop || d.body.scrollTop) - e.clientLeft;\r
+\r
+                                       return {x : x, y : y};\r
+                               }\r
+\r
+                               r = n;\r
+                               while (r && r != ro && r.nodeType) {\r
+                                       x += r.offsetLeft || 0;\r
+                                       y += r.offsetTop || 0;\r
+                                       r = r.offsetParent;\r
+                               }\r
+\r
+                               r = n.parentNode;\r
+                               while (r && r != ro && r.nodeType) {\r
+                                       x -= r.scrollLeft || 0;\r
+                                       y -= r.scrollTop || 0;\r
+                                       r = r.parentNode;\r
+                               }\r
+                       }\r
+\r
+                       return {x : x, y : y};\r
+               },\r
+\r
+               parseStyle : function(st) {\r
+                       return this.styles.parse(st);\r
+               },\r
+\r
+               serializeStyle : function(o, name) {\r
+                       return this.styles.serialize(o, name);\r
+               },\r
+\r
+               loadCSS : function(u) {\r
+                       var t = this, d = t.doc, head;\r
+\r
+                       if (!u)\r
+                               u = '';\r
+\r
+                       head = t.select('head')[0];\r
+\r
+                       each(u.split(','), function(u) {\r
+                               var link;\r
+\r
+                               if (t.files[u])\r
+                                       return;\r
+\r
+                               t.files[u] = true;\r
+                               link = t.create('link', {rel : 'stylesheet', href : tinymce._addVer(u)});\r
+\r
+                               // IE 8 has a bug where dynamically loading stylesheets would produce a 1 item remaining bug\r
+                               // This fix seems to resolve that issue by realcing the document ones a stylesheet finishes loading\r
+                               // It's ugly but it seems to work fine.\r
+                               if (isIE && d.documentMode && d.recalc) {\r
+                                       link.onload = function() {\r
+                                               if (d.recalc)\r
+                                                       d.recalc();\r
+\r
+                                               link.onload = null;\r
+                                       };\r
+                               }\r
+\r
+                               head.appendChild(link);\r
+                       });\r
+               },\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
+                                       v = tinymce.trim(v != ' ' ? v : '');\r
+\r
+                                       e.className = v;\r
+\r
+                                       // Empty class attr\r
+                                       if (!v) {\r
+                                               e.removeAttribute('class');\r
+                                               e.removeAttribute('className');\r
+                                       }\r
+\r
+                                       return v;\r
+                               }\r
+\r
+                               return e.className;\r
+                       });\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 || e.style.display == 'none' || this.getStyle(e, 'display') == 'none';\r
+               },\r
+\r
+               uniqueId : function(p) {\r
+                       return (!p ? 'mce_' : p) + (this.counter++);\r
+               },\r
+\r
+               setHTML : function(element, html) {\r
+                       var self = this;\r
+\r
+                       return self.run(element, function(element) {\r
+                               if (isIE) {\r
+                                       // Remove all child nodes, IE keeps empty text nodes in DOM\r
+                                       while (element.firstChild)\r
+                                               element.removeChild(element.firstChild);\r
+\r
+                                       try {\r
+                                               // IE will remove comments from the beginning\r
+                                               // unless you padd the contents with something\r
+                                               element.innerHTML = '<br />' + html;\r
+                                               element.removeChild(element.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
+                                               // Create new div with HTML contents and a BR infront to keep comments\r
+                                               element = self.create('div');\r
+                                               element.innerHTML = '<br />' + html;\r
+\r
+                                               // Add all children from div to target\r
+                                               each (element.childNodes, function(node, i) {\r
+                                                       // Skip br element\r
+                                                       if (i)\r
+                                                               element.appendChild(node);\r
+                                               });\r
+                                       }\r
+                               } else\r
+                                       element.innerHTML = html;\r
+\r
+                               return html;\r
+                       });\r
+               },\r
+\r
+               getOuterHTML : function(elm) {\r
+                       var doc, self = this;\r
+\r
+                       elm = self.get(elm);\r
+\r
+                       if (!elm)\r
+                               return null;\r
+\r
+                       if (elm.nodeType === 1 && self.hasOuterHTML)\r
+                               return elm.outerHTML;\r
+\r
+                       doc = (elm.ownerDocument || self.doc).createElement("body");\r
+                       doc.appendChild(elm.cloneNode(true));\r
+\r
+                       return doc.innerHTML;\r
+               },\r
+\r
+               setOuterHTML : function(e, h, d) {\r
+                       var t = this;\r
+\r
+                       function setHTML(e, h, d) {\r
+                               var n, tp;\r
+\r
+                               tp = d.createElement("body");\r
+                               tp.innerHTML = h;\r
+\r
+                               n = tp.lastChild;\r
+                               while (n) {\r
+                                       t.insertAfter(n.cloneNode(true), e);\r
+                                       n = n.previousSibling;\r
+                               }\r
+\r
+                               t.remove(e);\r
+                       };\r
+\r
+                       return this.run(e, function(e) {\r
+                               e = t.get(e);\r
+\r
+                               // Only set HTML on elements\r
+                               if (e.nodeType == 1) {\r
+                                       d = d || e.ownerDocument || t.doc;\r
+\r
+                                       if (isIE) {\r
+                                               try {\r
+                                                       // Try outerHTML for IE it sometimes produces an unknown runtime error\r
+                                                       if (isIE && e.nodeType == 1)\r
+                                                               e.outerHTML = h;\r
+                                                       else\r
+                                                               setHTML(e, h, d);\r
+                                               } catch (ex) {\r
+                                                       // Fix for unknown runtime error\r
+                                                       setHTML(e, h, d);\r
+                                               }\r
+                                       } else\r
+                                               setHTML(e, h, d);\r
+                               }\r
+                       });\r
+               },\r
+\r
+               decode : Entities.decode,\r
+\r
+               encode : Entities.encodeAllRaw,\r
+\r
+               insertAfter : function(node, reference_node) {\r
+                       reference_node = this.get(reference_node);\r
+\r
+                       return this.run(node, function(node) {\r
+                               var parent, nextSibling;\r
+\r
+                               parent = reference_node.parentNode;\r
+                               nextSibling = reference_node.nextSibling;\r
+\r
+                               if (nextSibling)\r
+                                       parent.insertBefore(node, nextSibling);\r
+                               else\r
+                                       parent.appendChild(node);\r
+\r
+                               return node;\r
+                       });\r
+               },\r
+\r
+               isBlock : function(node) {\r
+                       var type = node.nodeType;\r
+\r
+                       // If it's a node then check the type and use the nodeName\r
+                       if (type)\r
+                               return !!(type === 1 && blockElementsMap[node.nodeName]);\r
+\r
+                       return !!blockElementsMap[node];\r
+               },\r
+\r
+               replace : function(n, o, k) {\r
+                       var t = this;\r
+\r
+                       if (is(o, 'array'))\r
+                               n = n.cloneNode(true);\r
+\r
+                       return t.run(o, function(o) {\r
+                               if (k) {\r
+                                       each(tinymce.grep(o.childNodes), function(c) {\r
+                                               n.appendChild(c);\r
+                                       });\r
+                               }\r
+\r
+                               return o.parentNode.replaceChild(n, o);\r
+                       });\r
+               },\r
+\r
+               rename : function(elm, name) {\r
+                       var t = this, newElm;\r
+\r
+                       if (elm.nodeName != name.toUpperCase()) {\r
+                               // Rename block element\r
+                               newElm = t.create(name);\r
+\r
+                               // Copy attribs to new block\r
+                               each(t.getAttribs(elm), function(attr_node) {\r
+                                       t.setAttrib(newElm, attr_node.nodeName, t.getAttrib(elm, attr_node.nodeName));\r
+                               });\r
+\r
+                               // Replace block\r
+                               t.replace(newElm, elm, 1);\r
+                       }\r
+\r
+                       return newElm || elm;\r
+               },\r
+\r
+               findCommonAncestor : function(a, b) {\r
+                       var ps = a, pe;\r
+\r
+                       while (ps) {\r
+                               pe = b;\r
+\r
+                               while (pe && ps != pe)\r
+                                       pe = pe.parentNode;\r
+\r
+                               if (ps == pe)\r
+                                       break;\r
+\r
+                               ps = ps.parentNode;\r
+                       }\r
+\r
+                       if (!ps && a.ownerDocument)\r
+                               return a.ownerDocument.documentElement;\r
+\r
+                       return ps;\r
+               },\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 = tinymce._replace(/.*\.([a-z0-9_\-]+).*/i, '$1', v);\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.get(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
+                               // IE doesn't keep the selected attribute if you clone option elements\r
+                               if (n.nodeName === 'OPTION' && this.getAttrib(n, 'selected'))\r
+                                       o.push({specified : 1, nodeName : 'selected'});\r
+\r
+                               // It's crazy that this is faster in IE but it's because it returns all attributes all the time\r
+                               n.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi, '').replace(/[\w:\-]+/gi, function(a) {\r
+                                       o.push({specified : 1, nodeName : a});\r
+                               });\r
+\r
+                               return o;\r
+                       }\r
+\r
+                       return n.attributes;\r
+               },\r
+\r
+               isEmpty : function(node, elements) {\r
+                       var self = this, i, attributes, type, walker, name, parentNode;\r
+\r
+                       node = node.firstChild;\r
+                       if (node) {\r
+                               walker = new tinymce.dom.TreeWalker(node);\r
+                               elements = elements || self.schema ? self.schema.getNonEmptyElements() : null;\r
+\r
+                               do {\r
+                                       type = node.nodeType;\r
+\r
+                                       if (type === 1) {\r
+                                               // Ignore bogus elements\r
+                                               if (node.getAttribute('data-mce-bogus'))\r
+                                                       continue;\r
+\r
+                                               // Keep empty elements like <img />\r
+                                               name = node.nodeName.toLowerCase();\r
+                                               if (elements && elements[name]) {\r
+                                                       // Ignore single BR elements in blocks like <p><br /></p>\r
+                                                       parentNode = node.parentNode;\r
+                                                       if (name === 'br' && self.isBlock(parentNode) && parentNode.firstChild === node && parentNode.lastChild === node) {\r
+                                                               continue;\r
+                                                       }\r
+\r
+                                                       return false;\r
+                                               }\r
+\r
+                                               // Keep elements with data-bookmark attributes or name attribute like <a name="1"></a>\r
+                                               attributes = self.getAttribs(node);\r
+                                               i = node.attributes.length;\r
+                                               while (i--) {\r
+                                                       name = node.attributes[i].nodeName;\r
+                                                       if (name === "name" || name === 'data-mce-bookmark')\r
+                                                               return false;\r
+                                               }\r
+                                       }\r
+\r
+                                       // Keep non whitespace text nodes\r
+                                       if ((type === 3 && !whiteSpaceRegExp.test(node.nodeValue)))\r
+                                               return false;\r
+                               } while (node = walker.next());\r
+                       }\r
+\r
+                       return true;\r
+               },\r
+\r
+               destroy : function(s) {\r
+                       var t = this;\r
+\r
+                       if (t.events)\r
+                               t.events.destroy();\r
+\r
+                       t.win = t.doc = t.root = t.events = null;\r
+\r
+                       // Manual destroy then remove unload handler\r
+                       if (!s)\r
+                               tinymce.removeUnload(t.destroy);\r
+               },\r
+\r
+               createRng : function() {\r
+                       var d = this.doc;\r
+\r
+                       return d.createRange ? d.createRange() : new tinymce.dom.Range(this);\r
+               },\r
+\r
+               nodeIndex : function(node, normalized) {\r
+                       var idx = 0, lastNodeType, lastNode, nodeType;\r
+\r
+                       if (node) {\r
+                               for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) {\r
+                                       nodeType = node.nodeType;\r
+\r
+                                       // Normalize text nodes\r
+                                       if (normalized && nodeType == 3) {\r
+                                               if (nodeType == lastNodeType || !node.nodeValue.length)\r
+                                                       continue;\r
+                                       }\r
+                                       idx++;\r
+                                       lastNodeType = nodeType;\r
+                               }\r
+                       }\r
+\r
+                       return idx;\r
+               },\r
+\r
+               split : function(pe, e, re) {\r
+                       var t = this, r = t.createRng(), bef, aft, pa;\r
+\r
+                       // W3C valid browsers tend to leave empty nodes to the left/right side of the contents, this makes sense\r
+                       // but we don't want that in our code since it serves no purpose for the end user\r
+                       // For example if this is chopped:\r
+                       //   <p>text 1<span><b>CHOP</b></span>text 2</p>\r
+                       // would produce:\r
+                       //   <p>text 1<span></span></p><b>CHOP</b><p><span></span>text 2</p>\r
+                       // this function will then trim of empty edges and produce:\r
+                       //   <p>text 1</p><b>CHOP</b><p>text 2</p>\r
+                       function trim(node) {\r
+                               var i, children = node.childNodes, type = node.nodeType;\r
+\r
+                               if (type == 1 && node.getAttribute('data-mce-type') == 'bookmark')\r
+                                       return;\r
+\r
+                               for (i = children.length - 1; i >= 0; i--)\r
+                                       trim(children[i]);\r
+\r
+                               if (type != 9) {\r
+                                       // Keep non whitespace text nodes\r
+                                       if (type == 3 && node.nodeValue.length > 0) {\r
+                                               // If parent element isn't a block or there isn't any useful contents for example "<p>   </p>"\r
+                                               if (!t.isBlock(node.parentNode) || tinymce.trim(node.nodeValue).length > 0)\r
+                                                       return;\r
+                                       } else if (type == 1) {\r
+                                               // If the only child is a bookmark then move it up\r
+                                               children = node.childNodes;\r
+                                               if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('data-mce-type') == 'bookmark')\r
+                                                       node.parentNode.insertBefore(children[0], node);\r
+\r
+                                               // Keep non empty elements or img, hr etc\r
+                                               if (children.length || /^(br|hr|input|img)$/i.test(node.nodeName))\r
+                                                       return;\r
+                                       }\r
+\r
+                                       t.remove(node);\r
+                               }\r
+\r
+                               return node;\r
+                       };\r
+\r
+                       if (pe && e) {\r
+                               // Get before chunk\r
+                               r.setStart(pe.parentNode, t.nodeIndex(pe));\r
+                               r.setEnd(e.parentNode, t.nodeIndex(e));\r
+                               bef = r.extractContents();\r
+\r
+                               // Get after chunk\r
+                               r = t.createRng();\r
+                               r.setStart(e.parentNode, t.nodeIndex(e) + 1);\r
+                               r.setEnd(pe.parentNode, t.nodeIndex(pe) + 1);\r
+                               aft = r.extractContents();\r
+\r
+                               // Insert before chunk\r
+                               pa = pe.parentNode;\r
+                               pa.insertBefore(trim(bef), pe);\r
+\r
+                               // Insert middle chunk\r
+                               if (re)\r
+                                       pa.replaceChild(re, e);\r
+                               else\r
+                                       pa.insertBefore(e, pe);\r
+\r
+                               // Insert after chunk\r
+                               pa.insertBefore(trim(aft), pe);\r
+                               t.remove(pe);\r
+\r
+                               return re || e;\r
+                       }\r
+               },\r
+\r
+               bind : function(target, name, func, scope) {\r
+                       var t = this;\r
+\r
+                       if (!t.events)\r
+                               t.events = new tinymce.dom.EventUtils();\r
+\r
+                       return t.events.add(target, name, func, scope || this);\r
+               },\r
+\r
+               unbind : function(target, name, func) {\r
+                       var t = this;\r
+\r
+                       if (!t.events)\r
+                               t.events = new tinymce.dom.EventUtils();\r
+\r
+                       return t.events.remove(target, name, func);\r
+               },\r
+\r
+\r
+               _findSib : function(node, selector, name) {\r
+                       var t = this, f = selector;\r
+\r
+                       if (node) {\r
+                               // If expression make a function of it using is\r
+                               if (is(f, 'string')) {\r
+                                       f = function(node) {\r
+                                               return t.is(node, selector);\r
+                                       };\r
+                               }\r
+\r
+                               // Loop all siblings\r
+                               for (node = node[name]; node; node = node[name]) {\r
+                                       if (f(node))\r
+                                               return node;\r
+                               }\r
+                       }\r
+\r
+                       return null;\r
+               },\r
+\r
+               _isRes : function(c) {\r
+                       // Is live resizble element\r
+                       return /^(top|left|bottom|right|width|height)/i.test(c) || /;\s*(top|left|bottom|right|width|height)/i.test(c);\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
+       tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0});\r
+})(tinymce);\r
+\r
+(function(ns) {\r
+       // Range constructor\r
+       function Range(dom) {\r
+               var t = this,\r
+                       doc = dom.doc,\r
+                       EXTRACT = 0,\r
+                       CLONE = 1,\r
+                       DELETE = 2,\r
+                       TRUE = true,\r
+                       FALSE = false,\r
+                       START_OFFSET = 'startOffset',\r
+                       START_CONTAINER = 'startContainer',\r
+                       END_CONTAINER = 'endContainer',\r
+                       END_OFFSET = 'endOffset',\r
+                       extend = tinymce.extend,\r
+                       nodeIndex = dom.nodeIndex;\r
+\r
+               extend(t, {\r
+                       // Inital states\r
+                       startContainer : doc,\r
+                       startOffset : 0,\r
+                       endContainer : doc,\r
+                       endOffset : 0,\r
+                       collapsed : TRUE,\r
+                       commonAncestorContainer : doc,\r
+\r
+                       // Range constants\r
+                       START_TO_START : 0,\r
+                       START_TO_END : 1,\r
+                       END_TO_END : 2,\r
+                       END_TO_START : 3,\r
+\r
+                       // Public methods\r
+                       setStart : setStart,\r
+                       setEnd : setEnd,\r
+                       setStartBefore : setStartBefore,\r
+                       setStartAfter : setStartAfter,\r
+                       setEndBefore : setEndBefore,\r
+                       setEndAfter : setEndAfter,\r
+                       collapse : collapse,\r
+                       selectNode : selectNode,\r
+                       selectNodeContents : selectNodeContents,\r
+                       compareBoundaryPoints : compareBoundaryPoints,\r
+                       deleteContents : deleteContents,\r
+                       extractContents : extractContents,\r
+                       cloneContents : cloneContents,\r
+                       insertNode : insertNode,\r
+                       surroundContents : surroundContents,\r
+                       cloneRange : cloneRange\r
+               });\r
+\r
+               function setStart(n, o) {\r
+                       _setEndPoint(TRUE, n, o);\r
+               };\r
+\r
+               function setEnd(n, o) {\r
+                       _setEndPoint(FALSE, n, o);\r
+               };\r
+\r
+               function setStartBefore(n) {\r
+                       setStart(n.parentNode, nodeIndex(n));\r
+               };\r
+\r
+               function setStartAfter(n) {\r
+                       setStart(n.parentNode, nodeIndex(n) + 1);\r
+               };\r
+\r
+               function setEndBefore(n) {\r
+                       setEnd(n.parentNode, nodeIndex(n));\r
+               };\r
+\r
+               function setEndAfter(n) {\r
+                       setEnd(n.parentNode, nodeIndex(n) + 1);\r
+               };\r
+\r
+               function collapse(ts) {\r
+                       if (ts) {\r
+                               t[END_CONTAINER] = t[START_CONTAINER];\r
+                               t[END_OFFSET] = t[START_OFFSET];\r
+                       } else {\r
+                               t[START_CONTAINER] = t[END_CONTAINER];\r
+                               t[START_OFFSET] = t[END_OFFSET];\r
+                       }\r
+\r
+                       t.collapsed = TRUE;\r
+               };\r
+\r
+               function selectNode(n) {\r
+                       setStartBefore(n);\r
+                       setEndAfter(n);\r
+               };\r
+\r
+               function selectNodeContents(n) {\r
+                       setStart(n, 0);\r
+                       setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length);\r
+               };\r
+\r
+               function compareBoundaryPoints(h, r) {\r
+                       var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET],\r
+                       rsc = r.startContainer, rso = r.startOffset, rec = r.endContainer, reo = r.endOffset;\r
+\r
+                       // Check START_TO_START\r
+                       if (h === 0)\r
+                               return _compareBoundaryPoints(sc, so, rsc, rso);\r
+       \r
+                       // Check START_TO_END\r
+                       if (h === 1)\r
+                               return _compareBoundaryPoints(ec, eo, rsc, rso);\r
+       \r
+                       // Check END_TO_END\r
+                       if (h === 2)\r
+                               return _compareBoundaryPoints(ec, eo, rec, reo);\r
+       \r
+                       // Check END_TO_START\r
+                       if (h === 3) \r
+                               return _compareBoundaryPoints(sc, so, rec, reo);\r
+               };\r
+\r
+               function deleteContents() {\r
+                       _traverse(DELETE);\r
+               };\r
+\r
+               function extractContents() {\r
+                       return _traverse(EXTRACT);\r
+               };\r
+\r
+               function cloneContents() {\r
+                       return _traverse(CLONE);\r
+               };\r
+\r
+               function insertNode(n) {\r
+                       var startContainer = this[START_CONTAINER],\r
+                               startOffset = this[START_OFFSET], nn, o;\r
+\r
+                       // Node is TEXT_NODE or CDATA\r
+                       if ((startContainer.nodeType === 3 || startContainer.nodeType === 4) && startContainer.nodeValue) {\r
+                               if (!startOffset) {\r
+                                       // At the start of text\r
+                                       startContainer.parentNode.insertBefore(n, startContainer);\r
+                               } else if (startOffset >= startContainer.nodeValue.length) {\r
+                                       // At the end of text\r
+                                       dom.insertAfter(n, startContainer);\r
+                               } else {\r
+                                       // Middle, need to split\r
+                                       nn = startContainer.splitText(startOffset);\r
+                                       startContainer.parentNode.insertBefore(n, nn);\r
+                               }\r
+                       } else {\r
+                               // Insert element node\r
+                               if (startContainer.childNodes.length > 0)\r
+                                       o = startContainer.childNodes[startOffset];\r
+\r
+                               if (o)\r
+                                       startContainer.insertBefore(n, o);\r
+                               else\r
+                                       startContainer.appendChild(n);\r
+                       }\r
+               };\r
+\r
+               function surroundContents(n) {\r
+                       var f = t.extractContents();\r
+\r
+                       t.insertNode(n);\r
+                       n.appendChild(f);\r
+                       t.selectNode(n);\r
+               };\r
+\r
+               function cloneRange() {\r
+                       return extend(new Range(dom), {\r
+                               startContainer : t[START_CONTAINER],\r
+                               startOffset : t[START_OFFSET],\r
+                               endContainer : t[END_CONTAINER],\r
+                               endOffset : t[END_OFFSET],\r
+                               collapsed : t.collapsed,\r
+                               commonAncestorContainer : t.commonAncestorContainer\r
+                       });\r
+               };\r
+\r
+               // Private methods\r
+\r
+               function _getSelectedNode(container, offset) {\r
+                       var child;\r
+\r
+                       if (container.nodeType == 3 /* TEXT_NODE */)\r
+                               return container;\r
+\r
+                       if (offset < 0)\r
+                               return container;\r
+\r
+                       child = container.firstChild;\r
+                       while (child && offset > 0) {\r
+                               --offset;\r
+                               child = child.nextSibling;\r
+                       }\r
+\r
+                       if (child)\r
+                               return child;\r
+\r
+                       return container;\r
+               };\r
+\r
+               function _isCollapsed() {\r
+                       return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET] == t[END_OFFSET]);\r
+               };\r
+\r
+               function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) {\r
+                       var c, offsetC, n, cmnRoot, childA, childB;\r
+                       \r
+                       // In the first case the boundary-points have the same container. A is before B\r
+                       // if its offset is less than the offset of B, A is equal to B if its offset is\r
+                       // equal to the offset of B, and A is after B if its offset is greater than the\r
+                       // offset of B.\r
+                       if (containerA == containerB) {\r
+                               if (offsetA == offsetB)\r
+                                       return 0; // equal\r
+\r
+                               if (offsetA < offsetB)\r
+                                       return -1; // before\r
+\r
+                               return 1; // after\r
+                       }\r
+\r
+                       // In the second case a child node C of the container of A is an ancestor\r
+                       // container of B. In this case, A is before B if the offset of A is less than or\r
+                       // equal to the index of the child node C and A is after B otherwise.\r
+                       c = containerB;\r
+                       while (c && c.parentNode != containerA)\r
+                               c = c.parentNode;\r
+\r
+                       if (c) {\r
+                               offsetC = 0;\r
+                               n = containerA.firstChild;\r
+\r
+                               while (n != c && offsetC < offsetA) {\r
+                                       offsetC++;\r
+                                       n = n.nextSibling;\r
+                               }\r
+\r
+                               if (offsetA <= offsetC)\r
+                                       return -1; // before\r
+\r
+                               return 1; // after\r
+                       }\r
+\r
+                       // In the third case a child node C of the container of B is an ancestor container\r
+                       // of A. In this case, A is before B if the index of the child node C is less than\r
+                       // the offset of B and A is after B otherwise.\r
+                       c = containerA;\r
+                       while (c && c.parentNode != containerB) {\r
+                               c = c.parentNode;\r
+                       }\r
+\r
+                       if (c) {\r
+                               offsetC = 0;\r
+                               n = containerB.firstChild;\r
+\r
+                               while (n != c && offsetC < offsetB) {\r
+                                       offsetC++;\r
+                                       n = n.nextSibling;\r
+                               }\r
+\r
+                               if (offsetC < offsetB)\r
+                                       return -1; // before\r
+\r
+                               return 1; // after\r
+                       }\r
+\r
+                       // In the fourth case, none of three other cases hold: the containers of A and B\r
+                       // are siblings or descendants of sibling nodes. In this case, A is before B if\r
+                       // the container of A is before the container of B in a pre-order traversal of the\r
+                       // Ranges' context tree and A is after B otherwise.\r
+                       cmnRoot = dom.findCommonAncestor(containerA, containerB);\r
+                       childA = containerA;\r
+\r
+                       while (childA && childA.parentNode != cmnRoot)\r
+                               childA = childA.parentNode;\r
+\r
+                       if (!childA)\r
+                               childA = cmnRoot;\r
+\r
+                       childB = containerB;\r
+                       while (childB && childB.parentNode != cmnRoot)\r
+                               childB = childB.parentNode;\r
+\r
+                       if (!childB)\r
+                               childB = cmnRoot;\r
+\r
+                       if (childA == childB)\r
+                               return 0; // equal\r
+\r
+                       n = cmnRoot.firstChild;\r
+                       while (n) {\r
+                               if (n == childA)\r
+                                       return -1; // before\r
+\r
+                               if (n == childB)\r
+                                       return 1; // after\r
+\r
+                               n = n.nextSibling;\r
+                       }\r
+               };\r
+\r
+               function _setEndPoint(st, n, o) {\r
+                       var ec, sc;\r
+\r
+                       if (st) {\r
+                               t[START_CONTAINER] = n;\r
+                               t[START_OFFSET] = o;\r
+                       } else {\r
+                               t[END_CONTAINER] = n;\r
+                               t[END_OFFSET] = o;\r
+                       }\r
+\r
+                       // If one boundary-point of a Range is set to have a root container\r
+                       // other than the current one for the Range, the Range is collapsed to\r
+                       // the new position. This enforces the restriction that both boundary-\r
+                       // points of a Range must have the same root container.\r
+                       ec = t[END_CONTAINER];\r
+                       while (ec.parentNode)\r
+                               ec = ec.parentNode;\r
+\r
+                       sc = t[START_CONTAINER];\r
+                       while (sc.parentNode)\r
+                               sc = sc.parentNode;\r
+\r
+                       if (sc == ec) {\r
+                               // The start position of a Range is guaranteed to never be after the\r
+                               // end position. To enforce this restriction, if the start is set to\r
+                               // be at a position after the end, the Range is collapsed to that\r
+                               // position.\r
+                               if (_compareBoundaryPoints(t[START_CONTAINER], t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0)\r
+                                       t.collapse(st);\r
+                       } else\r
+                               t.collapse(st);\r
+\r
+                       t.collapsed = _isCollapsed();\r
+                       t.commonAncestorContainer = dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]);\r
+               };\r
+\r
+               function _traverse(how) {\r
+                       var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep;\r
+\r
+                       if (t[START_CONTAINER] == t[END_CONTAINER])\r
+                               return _traverseSameContainer(how);\r
+\r
+                       for (c = t[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {\r
+                               if (p == t[START_CONTAINER])\r
+                                       return _traverseCommonStartContainer(c, how);\r
+\r
+                               ++endContainerDepth;\r
+                       }\r
+\r
+                       for (c = t[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {\r
+                               if (p == t[END_CONTAINER])\r
+                                       return _traverseCommonEndContainer(c, how);\r
+\r
+                               ++startContainerDepth;\r
+                       }\r
+\r
+                       depthDiff = startContainerDepth - endContainerDepth;\r
+\r
+                       startNode = t[START_CONTAINER];\r
+                       while (depthDiff > 0) {\r
+                               startNode = startNode.parentNode;\r
+                               depthDiff--;\r
+                       }\r
+\r
+                       endNode = t[END_CONTAINER];\r
+                       while (depthDiff < 0) {\r
+                               endNode = endNode.parentNode;\r
+                               depthDiff++;\r
+                       }\r
+\r
+                       // ascend the ancestor hierarchy until we have a common parent.\r
+                       for (sp = startNode.parentNode, ep = endNode.parentNode; sp != ep; sp = sp.parentNode, ep = ep.parentNode) {\r
+                               startNode = sp;\r
+                               endNode = ep;\r
+                       }\r
+\r
+                       return _traverseCommonAncestors(startNode, endNode, how);\r
+               };\r
+\r
+                function _traverseSameContainer(how) {\r
+                       var frag, s, sub, n, cnt, sibling, xferNode;\r
+\r
+                       if (how != DELETE)\r
+                               frag = doc.createDocumentFragment();\r
+\r
+                       // If selection is empty, just return the fragment\r
+                       if (t[START_OFFSET] == t[END_OFFSET])\r
+                               return frag;\r
+\r
+                       // Text node needs special case handling\r
+                       if (t[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) {\r
+                               // get the substring\r
+                               s = t[START_CONTAINER].nodeValue;\r
+                               sub = s.substring(t[START_OFFSET], t[END_OFFSET]);\r
+\r
+                               // set the original text node to its new value\r
+                               if (how != CLONE) {\r
+                                       t[START_CONTAINER].deleteData(t[START_OFFSET], t[END_OFFSET] - t[START_OFFSET]);\r
+\r
+                                       // Nothing is partially selected, so collapse to start point\r
+                                       t.collapse(TRUE);\r
+                               }\r
+\r
+                               if (how == DELETE)\r
+                                       return;\r
+\r
+                               frag.appendChild(doc.createTextNode(sub));\r
+                               return frag;\r
+                       }\r
+\r
+                       // Copy nodes between the start/end offsets.\r
+                       n = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]);\r
+                       cnt = t[END_OFFSET] - t[START_OFFSET];\r
+\r
+                       while (cnt > 0) {\r
+                               sibling = n.nextSibling;\r
+                               xferNode = _traverseFullySelected(n, how);\r
+\r
+                               if (frag)\r
+                                       frag.appendChild( xferNode );\r
+\r
+                               --cnt;\r
+                               n = sibling;\r
+                       }\r
+\r
+                       // Nothing is partially selected, so collapse to start point\r
+                       if (how != CLONE)\r
+                               t.collapse(TRUE);\r
+\r
+                       return frag;\r
+               };\r
+\r
+               function _traverseCommonStartContainer(endAncestor, how) {\r
+                       var frag, n, endIdx, cnt, sibling, xferNode;\r
+\r
+                       if (how != DELETE)\r
+                               frag = doc.createDocumentFragment();\r
+\r
+                       n = _traverseRightBoundary(endAncestor, how);\r
+\r
+                       if (frag)\r
+                               frag.appendChild(n);\r
+\r
+                       endIdx = nodeIndex(endAncestor);\r
+                       cnt = endIdx - t[START_OFFSET];\r
+\r
+                       if (cnt <= 0) {\r
+                               // Collapse to just before the endAncestor, which\r
+                               // is partially selected.\r
+                               if (how != CLONE) {\r
+                                       t.setEndBefore(endAncestor);\r
+                                       t.collapse(FALSE);\r
+                               }\r
+\r
+                               return frag;\r
+                       }\r
+\r
+                       n = endAncestor.previousSibling;\r
+                       while (cnt > 0) {\r
+                               sibling = n.previousSibling;\r
+                               xferNode = _traverseFullySelected(n, how);\r
+\r
+                               if (frag)\r
+                                       frag.insertBefore(xferNode, frag.firstChild);\r
+\r
+                               --cnt;\r
+                               n = sibling;\r
+                       }\r
+\r
+                       // Collapse to just before the endAncestor, which\r
+                       // is partially selected.\r
+                       if (how != CLONE) {\r
+                               t.setEndBefore(endAncestor);\r
+                               t.collapse(FALSE);\r
+                       }\r
+\r
+                       return frag;\r
+               };\r
+\r
+               function _traverseCommonEndContainer(startAncestor, how) {\r
+                       var frag, startIdx, n, cnt, sibling, xferNode;\r
+\r
+                       if (how != DELETE)\r
+                               frag = doc.createDocumentFragment();\r
+\r
+                       n = _traverseLeftBoundary(startAncestor, how);\r
+                       if (frag)\r
+                               frag.appendChild(n);\r
+\r
+                       startIdx = nodeIndex(startAncestor);\r
+                       ++startIdx; // Because we already traversed it\r
+\r
+                       cnt = t[END_OFFSET] - startIdx;\r
+                       n = startAncestor.nextSibling;\r
+                       while (cnt > 0) {\r
+                               sibling = n.nextSibling;\r
+                               xferNode = _traverseFullySelected(n, how);\r
+\r
+                               if (frag)\r
+                                       frag.appendChild(xferNode);\r
+\r
+                               --cnt;\r
+                               n = sibling;\r
+                       }\r
+\r
+                       if (how != CLONE) {\r
+                               t.setStartAfter(startAncestor);\r
+                               t.collapse(TRUE);\r
+                       }\r
+\r
+                       return frag;\r
+               };\r
+\r
+               function _traverseCommonAncestors(startAncestor, endAncestor, how) {\r
+                       var n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling;\r
+\r
+                       if (how != DELETE)\r
+                               frag = doc.createDocumentFragment();\r
+\r
+                       n = _traverseLeftBoundary(startAncestor, how);\r
+                       if (frag)\r
+                               frag.appendChild(n);\r
+\r
+                       commonParent = startAncestor.parentNode;\r
+                       startOffset = nodeIndex(startAncestor);\r
+                       endOffset = nodeIndex(endAncestor);\r
+                       ++startOffset;\r
+\r
+                       cnt = endOffset - startOffset;\r
+                       sibling = startAncestor.nextSibling;\r
+\r
+                       while (cnt > 0) {\r
+                               nextSibling = sibling.nextSibling;\r
+                               n = _traverseFullySelected(sibling, how);\r
+\r
+                               if (frag)\r
+                                       frag.appendChild(n);\r
+\r
+                               sibling = nextSibling;\r
+                               --cnt;\r
+                       }\r
+\r
+                       n = _traverseRightBoundary(endAncestor, how);\r
+\r
+                       if (frag)\r
+                               frag.appendChild(n);\r
+\r
+                       if (how != CLONE) {\r
+                               t.setStartAfter(startAncestor);\r
+                               t.collapse(TRUE);\r
+                       }\r
+\r
+                       return frag;\r
+               };\r
+\r
+               function _traverseRightBoundary(root, how) {\r
+                       var next = _getSelectedNode(t[END_CONTAINER], t[END_OFFSET] - 1), parent, clonedParent, prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != t[END_CONTAINER];\r
+\r
+                       if (next == root)\r
+                               return _traverseNode(next, isFullySelected, FALSE, how);\r
+\r
+                       parent = next.parentNode;\r
+                       clonedParent = _traverseNode(parent, FALSE, FALSE, how);\r
+\r
+                       while (parent) {\r
+                               while (next) {\r
+                                       prevSibling = next.previousSibling;\r
+                                       clonedChild = _traverseNode(next, isFullySelected, FALSE, how);\r
+\r
+                                       if (how != DELETE)\r
+                                               clonedParent.insertBefore(clonedChild, clonedParent.firstChild);\r
+\r
+                                       isFullySelected = TRUE;\r
+                                       next = prevSibling;\r
+                               }\r
+\r
+                               if (parent == root)\r
+                                       return clonedParent;\r
+\r
+                               next = parent.previousSibling;\r
+                               parent = parent.parentNode;\r
+\r
+                               clonedGrandParent = _traverseNode(parent, FALSE, FALSE, how);\r
+\r
+                               if (how != DELETE)\r
+                                       clonedGrandParent.appendChild(clonedParent);\r
+\r
+                               clonedParent = clonedGrandParent;\r
+                       }\r
+               };\r
+\r
+               function _traverseLeftBoundary(root, how) {\r
+                       var next = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]), isFullySelected = next != t[START_CONTAINER], parent, clonedParent, nextSibling, clonedChild, clonedGrandParent;\r
+\r
+                       if (next == root)\r
+                               return _traverseNode(next, isFullySelected, TRUE, how);\r
+\r
+                       parent = next.parentNode;\r
+                       clonedParent = _traverseNode(parent, FALSE, TRUE, how);\r
+\r
+                       while (parent) {\r
+                               while (next) {\r
+                                       nextSibling = next.nextSibling;\r
+                                       clonedChild = _traverseNode(next, isFullySelected, TRUE, how);\r
+\r
+                                       if (how != DELETE)\r
+                                               clonedParent.appendChild(clonedChild);\r
+\r
+                                       isFullySelected = TRUE;\r
+                                       next = nextSibling;\r
+                               }\r
+\r
+                               if (parent == root)\r
+                                       return clonedParent;\r
+\r
+                               next = parent.nextSibling;\r
+                               parent = parent.parentNode;\r
+\r
+                               clonedGrandParent = _traverseNode(parent, FALSE, TRUE, how);\r
+\r
+                               if (how != DELETE)\r
+                                       clonedGrandParent.appendChild(clonedParent);\r
+\r
+                               clonedParent = clonedGrandParent;\r
+                       }\r
+               };\r
+\r
+               function _traverseNode(n, isFullySelected, isLeft, how) {\r
+                       var txtValue, newNodeValue, oldNodeValue, offset, newNode;\r
+\r
+                       if (isFullySelected)\r
+                               return _traverseFullySelected(n, how);\r
+\r
+                       if (n.nodeType == 3 /* TEXT_NODE */) {\r
+                               txtValue = n.nodeValue;\r
+\r
+                               if (isLeft) {\r
+                                       offset = t[START_OFFSET];\r
+                                       newNodeValue = txtValue.substring(offset);\r
+                                       oldNodeValue = txtValue.substring(0, offset);\r
+                               } else {\r
+                                       offset = t[END_OFFSET];\r
+                                       newNodeValue = txtValue.substring(0, offset);\r
+                                       oldNodeValue = txtValue.substring(offset);\r
+                               }\r
+\r
+                               if (how != CLONE)\r
+                                       n.nodeValue = oldNodeValue;\r
+\r
+                               if (how == DELETE)\r
+                                       return;\r
+\r
+                               newNode = n.cloneNode(FALSE);\r
+                               newNode.nodeValue = newNodeValue;\r
+\r
+                               return newNode;\r
+                       }\r
+\r
+                       if (how == DELETE)\r
+                               return;\r
+\r
+                       return n.cloneNode(FALSE);\r
+               };\r
+\r
+               function _traverseFullySelected(n, how) {\r
+                       if (how != DELETE)\r
+                               return how == CLONE ? n.cloneNode(TRUE) : n;\r
+\r
+                       n.parentNode.removeChild(n);\r
+               };\r
+       };\r
+\r
+       ns.Range = Range;\r
+})(tinymce.dom);\r
+\r
+(function() {\r
+       function Selection(selection) {\r
+               var self = this, dom = selection.dom, TRUE = true, FALSE = false;\r
+\r
+               function getPosition(rng, start) {\r
+                       var checkRng, startIndex = 0, endIndex, inside,\r
+                               children, child, offset, index, position = -1, parent;\r
+\r
+                       // Setup test range, collapse it and get the parent\r
+                       checkRng = rng.duplicate();\r
+                       checkRng.collapse(start);\r
+                       parent = checkRng.parentElement();\r
+\r
+                       // Check if the selection is within the right document\r
+                       if (parent.ownerDocument !== selection.dom.doc)\r
+                               return;\r
+\r
+                       // IE will report non editable elements as it's parent so look for an editable one\r
+                       while (parent.contentEditable === "false") {\r
+                               parent = parent.parentNode;\r
+                       }\r
+\r
+                       // If parent doesn't have any children then return that we are inside the element\r
+                       if (!parent.hasChildNodes()) {\r
+                               return {node : parent, inside : 1};\r
+                       }\r
+\r
+                       // Setup node list and endIndex\r
+                       children = parent.children;\r
+                       endIndex = children.length - 1;\r
+\r
+                       // Perform a binary search for the position\r
+                       while (startIndex <= endIndex) {\r
+                               index = Math.floor((startIndex + endIndex) / 2);\r
+\r
+                               // Move selection to node and compare the ranges\r
+                               child = children[index];\r
+                               checkRng.moveToElementText(child);\r
+                               position = checkRng.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', rng);\r
+\r
+                               // Before/after or an exact match\r
+                               if (position > 0) {\r
+                                       endIndex = index - 1;\r
+                               } else if (position < 0) {\r
+                                       startIndex = index + 1;\r
+                               } else {\r
+                                       return {node : child};\r
+                               }\r
+                       }\r
+\r
+                       // Check if child position is before or we didn't find a position\r
+                       if (position < 0) {\r
+                               // No element child was found use the parent element and the offset inside that\r
+                               if (!child) {\r
+                                       checkRng.moveToElementText(parent);\r
+                                       checkRng.collapse(true);\r
+                                       child = parent;\r
+                                       inside = true;\r
+                               } else\r
+                                       checkRng.collapse(false);\r
+\r
+                               checkRng.setEndPoint(start ? 'EndToStart' : 'EndToEnd', rng);\r
+\r
+                               // Fix for edge case: <div style="width: 100px; height:100px;"><table>..</table>ab|c</div>\r
+                               if (checkRng.compareEndPoints(start ? 'StartToStart' : 'StartToEnd', rng) > 0) {\r
+                                       checkRng = rng.duplicate();\r
+                                       checkRng.collapse(start);\r
+\r
+                                       offset = -1;\r
+                                       while (parent == checkRng.parentElement()) {\r
+                                               if (checkRng.move('character', -1) == 0)\r
+                                                       break;\r
+\r
+                                               offset++;\r
+                                       }\r
+                               }\r
+\r
+                               offset = offset || checkRng.text.replace('\r\n', ' ').length;\r
+                       } else {\r
+                               // Child position is after the selection endpoint\r
+                               checkRng.collapse(true);\r
+                               checkRng.setEndPoint(start ? 'StartToStart' : 'StartToEnd', rng);\r
+\r
+                               // Get the length of the text to find where the endpoint is relative to it's container\r
+                               offset = checkRng.text.replace('\r\n', ' ').length;\r
+                       }\r
+\r
+                       return {node : child, position : position, offset : offset, inside : inside};\r
+               };\r
+\r
+               // Returns a W3C DOM compatible range object by using the IE Range API\r
+               function getRange() {\r
+                       var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed, tmpRange, element2, bookmark, fail;\r
+\r
+                       // If selection is outside the current document just return an empty range\r
+                       element = ieRange.item ? ieRange.item(0) : ieRange.parentElement();\r
+                       if (element.ownerDocument != dom.doc)\r
+                               return domRange;\r
+\r
+                       collapsed = selection.isCollapsed();\r
+\r
+                       // Handle control selection\r
+                       if (ieRange.item) {\r
+                               domRange.setStart(element.parentNode, dom.nodeIndex(element));\r
+                               domRange.setEnd(domRange.startContainer, domRange.startOffset + 1);\r
+\r
+                               return domRange;\r
+                       }\r
+\r
+                       function findEndPoint(start) {\r
+                               var endPoint = getPosition(ieRange, start), container, offset, textNodeOffset = 0, sibling, undef, nodeValue;\r
+\r
+                               container = endPoint.node;\r
+                               offset = endPoint.offset;\r
+\r
+                               if (endPoint.inside && !container.hasChildNodes()) {\r
+                                       domRange[start ? 'setStart' : 'setEnd'](container, 0);\r
+                                       return;\r
+                               }\r
+\r
+                               if (offset === undef) {\r
+                                       domRange[start ? 'setStartBefore' : 'setEndAfter'](container);\r
+                                       return;\r
+                               }\r
+\r
+                               if (endPoint.position < 0) {\r
+                                       sibling = endPoint.inside ? container.firstChild : container.nextSibling;\r
+\r
+                                       if (!sibling) {\r
+                                               domRange[start ? 'setStartAfter' : 'setEndAfter'](container);\r
+                                               return;\r
+                                       }\r
+\r
+                                       if (!offset) {\r
+                                               if (sibling.nodeType == 3)\r
+                                                       domRange[start ? 'setStart' : 'setEnd'](sibling, 0);\r
+                                               else\r
+                                                       domRange[start ? 'setStartBefore' : 'setEndBefore'](sibling);\r
+\r
+                                               return;\r
+                                       }\r
+\r
+                                       // Find the text node and offset\r
+                                       while (sibling) {\r
+                                               nodeValue = sibling.nodeValue;\r
+                                               textNodeOffset += nodeValue.length;\r
+\r
+                                               // We are at or passed the position we where looking for\r
+                                               if (textNodeOffset >= offset) {\r
+                                                       container = sibling;\r
+                                                       textNodeOffset -= offset;\r
+                                                       textNodeOffset = nodeValue.length - textNodeOffset;\r
+                                                       break;\r
+                                               }\r
+\r
+                                               sibling = sibling.nextSibling;\r
+                                       }\r
+                               } else {\r
+                                       // Find the text node and offset\r
+                                       sibling = container.previousSibling;\r
+\r
+                                       if (!sibling)\r
+                                               return domRange[start ? 'setStartBefore' : 'setEndBefore'](container);\r
+\r
+                                       // If there isn't any text to loop then use the first position\r
+                                       if (!offset) {\r
+                                               if (container.nodeType == 3)\r
+                                                       domRange[start ? 'setStart' : 'setEnd'](sibling, container.nodeValue.length);\r
+                                               else\r
+                                                       domRange[start ? 'setStartAfter' : 'setEndAfter'](sibling);\r
+\r
+                                               return;\r
+                                       }\r
+\r
+                                       while (sibling) {\r
+                                               textNodeOffset += sibling.nodeValue.length;\r
+\r
+                                               // We are at or passed the position we where looking for\r
+                                               if (textNodeOffset >= offset) {\r
+                                                       container = sibling;\r
+                                                       textNodeOffset -= offset;\r
+                                                       break;\r
+                                               }\r
+\r
+                                               sibling = sibling.previousSibling;\r
+                                       }\r
+                               }\r
+\r
+                               domRange[start ? 'setStart' : 'setEnd'](container, textNodeOffset);\r
+                       };\r
+\r
+                       try {\r
+                               // Find start point\r
+                               findEndPoint(true);\r
+\r
+                               // Find end point if needed\r
+                               if (!collapsed)\r
+                                       findEndPoint();\r
+                       } catch (ex) {\r
+                               // IE has a nasty bug where text nodes might throw "invalid argument" when you\r
+                               // access the nodeValue or other properties of text nodes. This seems to happend when\r
+                               // text nodes are split into two nodes by a delete/backspace call. So lets detect it and try to fix it.\r
+                               if (ex.number == -2147024809) {\r
+                                       // Get the current selection\r
+                                       bookmark = self.getBookmark(2);\r
+\r
+                                       // Get start element\r
+                                       tmpRange = ieRange.duplicate();\r
+                                       tmpRange.collapse(true);\r
+                                       element = tmpRange.parentElement();\r
+\r
+                                       // Get end element\r
+                                       if (!collapsed) {\r
+                                               tmpRange = ieRange.duplicate();\r
+                                               tmpRange.collapse(false);\r
+                                               element2 = tmpRange.parentElement();\r
+                                               element2.innerHTML = element2.innerHTML;\r
+                                       }\r
+\r
+                                       // Remove the broken elements\r
+                                       element.innerHTML = element.innerHTML;\r
+\r
+                                       // Restore the selection\r
+                                       self.moveToBookmark(bookmark);\r
+\r
+                                       // Since the range has moved we need to re-get it\r
+                                       ieRange = selection.getRng();\r
+\r
+                                       // Find start point\r
+                                       findEndPoint(true);\r
+\r
+                                       // Find end point if needed\r
+                                       if (!collapsed)\r
+                                               findEndPoint();\r
+                               } else\r
+                                       throw ex; // Throw other errors\r
+                       }\r
+\r
+                       return domRange;\r
+               };\r
+\r
+               this.getBookmark = function(type) {\r
+                       var rng = selection.getRng(), start, end, bookmark = {};\r
+\r
+                       function getIndexes(node) {\r
+                               var node, parent, root, children, i, indexes = [];\r
+\r
+                               parent = node.parentNode;\r
+                               root = dom.getRoot().parentNode;\r
+\r
+                               while (parent != root) {\r
+                                       children = parent.children;\r
+\r
+                                       i = children.length;\r
+                                       while (i--) {\r
+                                               if (node === children[i]) {\r
+                                                       indexes.push(i);\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+\r
+                                       node = parent;\r
+                                       parent = parent.parentNode;\r
+                               }\r
+\r
+                               return indexes;\r
+                       };\r
+\r
+                       function getBookmarkEndPoint(start) {\r
+                               var position;\r
+\r
+                               position = getPosition(rng, start);\r
+                               if (position) {\r
+                                       return {\r
+                                               position : position.position,\r
+                                               offset : position.offset,\r
+                                               indexes : getIndexes(position.node),\r
+                                               inside : position.inside\r
+                                       };\r
+                               }\r
+                       };\r
+\r
+                       // Non ubstructive bookmark\r
+                       if (type === 2) {\r
+                               // Handle text selection\r
+                               if (!rng.item) {\r
+                                       bookmark.start = getBookmarkEndPoint(true);\r
+\r
+                                       if (!selection.isCollapsed())\r
+                                               bookmark.end = getBookmarkEndPoint();\r
+                               } else\r
+                                       bookmark.start = {ctrl : true, indexes : getIndexes(rng.item(0))};\r
+                       }\r
+\r
+                       return bookmark;\r
+               };\r
+\r
+               this.moveToBookmark = function(bookmark) {\r
+                       var rng, body = dom.doc.body;\r
+\r
+                       function resolveIndexes(indexes) {\r
+                               var node, i, idx, children;\r
+\r
+                               node = dom.getRoot();\r
+                               for (i = indexes.length - 1; i >= 0; i--) {\r
+                                       children = node.children;\r
+                                       idx = indexes[i];\r
+\r
+                                       if (idx <= children.length - 1) {\r
+                                               node = children[idx];\r
+                                       }\r
+                               }\r
+\r
+                               return node;\r
+                       };\r
+                       \r
+                       function setBookmarkEndPoint(start) {\r
+                               var endPoint = bookmark[start ? 'start' : 'end'], moveLeft, moveRng, undef;\r
+\r
+                               if (endPoint) {\r
+                                       moveLeft = endPoint.position > 0;\r
+\r
+                                       moveRng = body.createTextRange();\r
+                                       moveRng.moveToElementText(resolveIndexes(endPoint.indexes));\r
+\r
+                                       offset = endPoint.offset;\r
+                                       if (offset !== undef) {\r
+                                               moveRng.collapse(endPoint.inside || moveLeft);\r
+                                               moveRng.moveStart('character', moveLeft ? -offset : offset);\r
+                                       } else\r
+                                               moveRng.collapse(start);\r
+\r
+                                       rng.setEndPoint(start ? 'StartToStart' : 'EndToStart', moveRng);\r
+\r
+                                       if (start)\r
+                                               rng.collapse(true);\r
+                               }\r
+                       };\r
+\r
+                       if (bookmark.start) {\r
+                               if (bookmark.start.ctrl) {\r
+                                       rng = body.createControlRange();\r
+                                       rng.addElement(resolveIndexes(bookmark.start.indexes));\r
+                                       rng.select();\r
+                               } else {\r
+                                       rng = body.createTextRange();\r
+                                       setBookmarkEndPoint(true);\r
+                                       setBookmarkEndPoint();\r
+                                       rng.select();\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.addRange = function(rng) {\r
+                       var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, doc = selection.dom.doc, body = doc.body;\r
+\r
+                       function setEndPoint(start) {\r
+                               var container, offset, marker, tmpRng, nodes;\r
+\r
+                               marker = dom.create('a');\r
+                               container = start ? startContainer : endContainer;\r
+                               offset = start ? startOffset : endOffset;\r
+                               tmpRng = ieRng.duplicate();\r
+\r
+                               if (container == doc || container == doc.documentElement) {\r
+                                       container = body;\r
+                                       offset = 0;\r
+                               }\r
+\r
+                               if (container.nodeType == 3) {\r
+                                       container.parentNode.insertBefore(marker, container);\r
+                                       tmpRng.moveToElementText(marker);\r
+                                       tmpRng.moveStart('character', offset);\r
+                                       dom.remove(marker);\r
+                                       ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng);\r
+                               } else {\r
+                                       nodes = container.childNodes;\r
+\r
+                                       if (nodes.length) {\r
+                                               if (offset >= nodes.length) {\r
+                                                       dom.insertAfter(marker, nodes[nodes.length - 1]);\r
+                                               } else {\r
+                                                       container.insertBefore(marker, nodes[offset]);\r
+                                               }\r
+\r
+                                               tmpRng.moveToElementText(marker);\r
+                                       } else {\r
+                                               // Empty node selection for example <div>|</div>\r
+                                               marker = doc.createTextNode('\uFEFF');\r
+                                               container.appendChild(marker);\r
+                                               tmpRng.moveToElementText(marker.parentNode);\r
+                                               tmpRng.collapse(TRUE);\r
+                                       }\r
+\r
+                                       ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng);\r
+                                       dom.remove(marker);\r
+                               }\r
+                       }\r
+\r
+                       // Setup some shorter versions\r
+                       startContainer = rng.startContainer;\r
+                       startOffset = rng.startOffset;\r
+                       endContainer = rng.endContainer;\r
+                       endOffset = rng.endOffset;\r
+                       ieRng = body.createTextRange();\r
+\r
+                       // If single element selection then try making a control selection out of it\r
+                       if (startContainer == endContainer && startContainer.nodeType == 1 && startOffset == endOffset - 1) {\r
+                               if (startOffset == endOffset - 1) {\r
+                                       try {\r
+                                               ctrlRng = body.createControlRange();\r
+                                               ctrlRng.addElement(startContainer.childNodes[startOffset]);\r
+                                               ctrlRng.select();\r
+                                               return;\r
+                                       } catch (ex) {\r
+                                               // Ignore\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Set start/end point of selection\r
+                       setEndPoint(true);\r
+                       setEndPoint();\r
+\r
+                       // Select the new range and scroll it into view\r
+                       ieRng.select();\r
+               };\r
+\r
+               // Expose range method\r
+               this.getRangeAt = getRange;\r
+       };\r
+\r
+       // Expose the selection object\r
+       tinymce.dom.TridentSelection = Selection;\r
+})();\r
+\r
+\r
+/*\r
+ * Sizzle CSS Selector Engine - v1.0\r
+ *  Copyright 2009, The Dojo Foundation\r
+ *  Released under the MIT, BSD, and GPL Licenses.\r
+ *  More information: http://sizzlejs.com/\r
+ */\r
+(function(){\r
+\r
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,\r
+       done = 0,\r
+       toString = Object.prototype.toString,\r
+       hasDuplicate = false,\r
+       baseHasDuplicate = true;\r
+\r
+// Here we check if the JavaScript engine is using some sort of\r
+// optimization where it does not always call our comparision\r
+// function. If that is the case, discard the hasDuplicate value.\r
+//   Thus far that includes Google Chrome.\r
+[0, 0].sort(function(){\r
+       baseHasDuplicate = false;\r
+       return 0;\r
+});\r
+\r
+var Sizzle = function(selector, context, results, seed) {\r
+       results = results || [];\r
+       context = context || document;\r
+\r
+       var origContext = context;\r
+\r
+       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {\r
+               return [];\r
+       }\r
+       \r
+       if ( !selector || typeof selector !== "string" ) {\r
+               return results;\r
+       }\r
+\r
+       var parts = [], m, set, checkSet, extra, prune = true, contextXML = Sizzle.isXML(context),\r
+               soFar = selector, ret, cur, pop, i;\r
+       \r
+       // Reset the position of the chunker regexp (start from head)\r
+       do {\r
+               chunker.exec("");\r
+               m = chunker.exec(soFar);\r
+\r
+               if ( m ) {\r
+                       soFar = m[3];\r
+               \r
+                       parts.push( m[1] );\r
+               \r
+                       if ( m[2] ) {\r
+                               extra = m[3];\r
+                               break;\r
+                       }\r
+               }\r
+       } while ( m );\r
+\r
+       if ( parts.length > 1 && origPOS.exec( selector ) ) {\r
+               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\r
+                       set = posProcess( parts[0] + parts[1], context );\r
+               } else {\r
+                       set = Expr.relative[ parts[0] ] ?\r
+                               [ context ] :\r
+                               Sizzle( parts.shift(), context );\r
+\r
+                       while ( parts.length ) {\r
+                               selector = parts.shift();\r
+\r
+                               if ( Expr.relative[ selector ] ) {\r
+                                       selector += parts.shift();\r
+                               }\r
+                               \r
+                               set = posProcess( selector, set );\r
+                       }\r
+               }\r
+       } else {\r
+               // Take a shortcut and set the context if the root selector is an ID\r
+               // (but not if it'll be faster if the inner selector is an ID)\r
+               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\r
+                               Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\r
+                       ret = Sizzle.find( parts.shift(), context, contextXML );\r
+                       context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];\r
+               }\r
+\r
+               if ( context ) {\r
+                       ret = seed ?\r
+                               { expr: parts.pop(), set: makeArray(seed) } :\r
+                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );\r
+                       set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;\r
+\r
+                       if ( parts.length > 0 ) {\r
+                               checkSet = makeArray(set);\r
+                       } else {\r
+                               prune = false;\r
+                       }\r
+\r
+                       while ( parts.length ) {\r
+                               cur = parts.pop();\r
+                               pop = cur;\r
+\r
+                               if ( !Expr.relative[ cur ] ) {\r
+                                       cur = "";\r
+                               } else {\r
+                                       pop = parts.pop();\r
+                               }\r
+\r
+                               if ( pop == null ) {\r
+                                       pop = context;\r
+                               }\r
+\r
+                               Expr.relative[ cur ]( checkSet, pop, contextXML );\r
+                       }\r
+               } else {\r
+                       checkSet = parts = [];\r
+               }\r
+       }\r
+\r
+       if ( !checkSet ) {\r
+               checkSet = set;\r
+       }\r
+\r
+       if ( !checkSet ) {\r
+               Sizzle.error( cur || selector );\r
+       }\r
+\r
+       if ( toString.call(checkSet) === "[object Array]" ) {\r
+               if ( !prune ) {\r
+                       results.push.apply( results, checkSet );\r
+               } else if ( context && context.nodeType === 1 ) {\r
+                       for ( i = 0; checkSet[i] != null; i++ ) {\r
+                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\r
+                                       results.push( set[i] );\r
+                               }\r
+                       }\r
+               } else {\r
+                       for ( i = 0; checkSet[i] != null; i++ ) {\r
+                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {\r
+                                       results.push( set[i] );\r
+                               }\r
+                       }\r
+               }\r
+       } else {\r
+               makeArray( checkSet, results );\r
+       }\r
+\r
+       if ( extra ) {\r
+               Sizzle( extra, origContext, results, seed );\r
+               Sizzle.uniqueSort( results );\r
+       }\r
+\r
+       return results;\r
+};\r
+\r
+Sizzle.uniqueSort = function(results){\r
+       if ( sortOrder ) {\r
+               hasDuplicate = baseHasDuplicate;\r
+               results.sort(sortOrder);\r
+\r
+               if ( hasDuplicate ) {\r
+                       for ( var i = 1; i < results.length; i++ ) {\r
+                               if ( results[i] === results[i-1] ) {\r
+                                       results.splice(i--, 1);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return results;\r
+};\r
+\r
+Sizzle.matches = function(expr, set){\r
+       return Sizzle(expr, null, null, set);\r
+};\r
+\r
+Sizzle.find = function(expr, context, isXML){\r
+       var set;\r
+\r
+       if ( !expr ) {\r
+               return [];\r
+       }\r
+\r
+       for ( var i = 0, l = Expr.order.length; i < l; i++ ) {\r
+               var type = Expr.order[i], match;\r
+               \r
+               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\r
+                       var left = match[1];\r
+                       match.splice(1,1);\r
+\r
+                       if ( left.substr( left.length - 1 ) !== "\\" ) {\r
+                               match[1] = (match[1] || "").replace(/\\/g, "");\r
+                               set = Expr.find[ type ]( match, context, isXML );\r
+                               if ( set != null ) {\r
+                                       expr = expr.replace( Expr.match[ type ], "" );\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       if ( !set ) {\r
+               set = context.getElementsByTagName("*");\r
+       }\r
+\r
+       return {set: set, expr: expr};\r
+};\r
+\r
+Sizzle.filter = function(expr, set, inplace, not){\r
+       var old = expr, result = [], curLoop = set, match, anyFound,\r
+               isXMLFilter = set && set[0] && Sizzle.isXML(set[0]);\r
+\r
+       while ( expr && set.length ) {\r
+               for ( var type in Expr.filter ) {\r
+                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\r
+                               var filter = Expr.filter[ type ], found, item, left = match[1];\r
+                               anyFound = false;\r
+\r
+                               match.splice(1,1);\r
+\r
+                               if ( left.substr( left.length - 1 ) === "\\" ) {\r
+                                       continue;\r
+                               }\r
+\r
+                               if ( curLoop === result ) {\r
+                                       result = [];\r
+                               }\r
+\r
+                               if ( Expr.preFilter[ type ] ) {\r
+                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\r
+\r
+                                       if ( !match ) {\r
+                                               anyFound = found = true;\r
+                                       } else if ( match === true ) {\r
+                                               continue;\r
+                                       }\r
+                               }\r
+\r
+                               if ( match ) {\r
+                                       for ( var i = 0; (item = curLoop[i]) != null; i++ ) {\r
+                                               if ( item ) {\r
+                                                       found = filter( item, match, i, curLoop );\r
+                                                       var pass = not ^ !!found;\r
+\r
+                                                       if ( inplace && found != null ) {\r
+                                                               if ( pass ) {\r
+                                                                       anyFound = true;\r
+                                                               } else {\r
+                                                                       curLoop[i] = false;\r
+                                                               }\r
+                                                       } else if ( pass ) {\r
+                                                               result.push( item );\r
+                                                               anyFound = true;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               if ( found !== undefined ) {\r
+                                       if ( !inplace ) {\r
+                                               curLoop = result;\r
+                                       }\r
+\r
+                                       expr = expr.replace( Expr.match[ type ], "" );\r
+\r
+                                       if ( !anyFound ) {\r
+                                               return [];\r
+                                       }\r
+\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // Improper expression\r
+               if ( expr === old ) {\r
+                       if ( anyFound == null ) {\r
+                               Sizzle.error( expr );\r
+                       } else {\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               old = expr;\r
+       }\r
+\r
+       return curLoop;\r
+};\r
+\r
+Sizzle.error = function( msg ) {\r
+       throw "Syntax error, unrecognized expression: " + msg;\r
+};\r
+\r
+var Expr = Sizzle.selectors = {\r
+       order: [ "ID", "NAME", "TAG" ],\r
+       match: {\r
+               ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,\r
+               CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,\r
+               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,\r
+               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,\r
+               TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,\r
+               CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,\r
+               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,\r
+               PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/\r
+       },\r
+       leftMatch: {},\r
+       attrMap: {\r
+               "class": "className",\r
+               "for": "htmlFor"\r
+       },\r
+       attrHandle: {\r
+               href: function(elem){\r
+                       return elem.getAttribute("href");\r
+               }\r
+       },\r
+       relative: {\r
+               "+": function(checkSet, part){\r
+                       var isPartStr = typeof part === "string",\r
+                               isTag = isPartStr && !/\W/.test(part),\r
+                               isPartStrNotTag = isPartStr && !isTag;\r
+\r
+                       if ( isTag ) {\r
+                               part = part.toLowerCase();\r
+                       }\r
+\r
+                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\r
+                               if ( (elem = checkSet[i]) ) {\r
+                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\r
+\r
+                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\r
+                                               elem || false :\r
+                                               elem === part;\r
+                               }\r
+                       }\r
+\r
+                       if ( isPartStrNotTag ) {\r
+                               Sizzle.filter( part, checkSet, true );\r
+                       }\r
+               },\r
+               ">": function(checkSet, part){\r
+                       var isPartStr = typeof part === "string",\r
+                               elem, i = 0, l = checkSet.length;\r
+\r
+                       if ( isPartStr && !/\W/.test(part) ) {\r
+                               part = part.toLowerCase();\r
+\r
+                               for ( ; i < l; i++ ) {\r
+                                       elem = checkSet[i];\r
+                                       if ( elem ) {\r
+                                               var parent = elem.parentNode;\r
+                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\r
+                                       }\r
+                               }\r
+                       } else {\r
+                               for ( ; i < l; i++ ) {\r
+                                       elem = checkSet[i];\r
+                                       if ( elem ) {\r
+                                               checkSet[i] = isPartStr ?\r
+                                                       elem.parentNode :\r
+                                                       elem.parentNode === part;\r
+                                       }\r
+                               }\r
+\r
+                               if ( isPartStr ) {\r
+                                       Sizzle.filter( part, checkSet, true );\r
+                               }\r
+                       }\r
+               },\r
+               "": function(checkSet, part, isXML){\r
+                       var doneName = done++, checkFn = dirCheck, nodeCheck;\r
+\r
+                       if ( typeof part === "string" && !/\W/.test(part) ) {\r
+                               part = part.toLowerCase();\r
+                               nodeCheck = part;\r
+                               checkFn = dirNodeCheck;\r
+                       }\r
+\r
+                       checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);\r
+               },\r
+               "~": function(checkSet, part, isXML){\r
+                       var doneName = done++, checkFn = dirCheck, nodeCheck;\r
+\r
+                       if ( typeof part === "string" && !/\W/.test(part) ) {\r
+                               part = part.toLowerCase();\r
+                               nodeCheck = part;\r
+                               checkFn = dirNodeCheck;\r
+                       }\r
+\r
+                       checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);\r
+               }\r
+       },\r
+       find: {\r
+               ID: function(match, context, isXML){\r
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {\r
+                               var m = context.getElementById(match[1]);\r
+                               return m ? [m] : [];\r
+                       }\r
+               },\r
+               NAME: function(match, context){\r
+                       if ( typeof context.getElementsByName !== "undefined" ) {\r
+                               var ret = [], results = context.getElementsByName(match[1]);\r
+\r
+                               for ( var i = 0, l = results.length; i < l; i++ ) {\r
+                                       if ( results[i].getAttribute("name") === match[1] ) {\r
+                                               ret.push( results[i] );\r
+                                       }\r
+                               }\r
+\r
+                               return ret.length === 0 ? null : ret;\r
+                       }\r
+               },\r
+               TAG: function(match, context){\r
+                       return context.getElementsByTagName(match[1]);\r
+               }\r
+       },\r
+       preFilter: {\r
+               CLASS: function(match, curLoop, inplace, result, not, isXML){\r
+                       match = " " + match[1].replace(/\\/g, "") + " ";\r
+\r
+                       if ( isXML ) {\r
+                               return match;\r
+                       }\r
+\r
+                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\r
+                               if ( elem ) {\r
+                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {\r
+                                               if ( !inplace ) {\r
+                                                       result.push( elem );\r
+                                               }\r
+                                       } else if ( inplace ) {\r
+                                               curLoop[i] = false;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return false;\r
+               },\r
+               ID: function(match){\r
+                       return match[1].replace(/\\/g, "");\r
+               },\r
+               TAG: function(match, curLoop){\r
+                       return match[1].toLowerCase();\r
+               },\r
+               CHILD: function(match){\r
+                       if ( match[1] === "nth" ) {\r
+                               // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\r
+                               var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(\r
+                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||\r
+                                       !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);\r
+\r
+                               // calculate the numbers (first)n+(last) including if they are negative\r
+                               match[2] = (test[1] + (test[2] || 1)) - 0;\r
+                               match[3] = test[3] - 0;\r
+                       }\r
+\r
+                       // TODO: Move to normal caching system\r
+                       match[0] = done++;\r
+\r
+                       return match;\r
+               },\r
+               ATTR: function(match, curLoop, inplace, result, not, isXML){\r
+                       var name = match[1].replace(/\\/g, "");\r
+                       \r
+                       if ( !isXML && Expr.attrMap[name] ) {\r
+                               match[1] = Expr.attrMap[name];\r
+                       }\r
+\r
+                       if ( match[2] === "~=" ) {\r
+                               match[4] = " " + match[4] + " ";\r
+                       }\r
+\r
+                       return match;\r
+               },\r
+               PSEUDO: function(match, curLoop, inplace, result, not){\r
+                       if ( match[1] === "not" ) {\r
+                               // If we're dealing with a complex expression, or a simple one\r
+                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {\r
+                                       match[3] = Sizzle(match[3], null, null, curLoop);\r
+                               } else {\r
+                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\r
+                                       if ( !inplace ) {\r
+                                               result.push.apply( result, ret );\r
+                                       }\r
+                                       return false;\r
+                               }\r
+                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\r
+                               return true;\r
+                       }\r
+                       \r
+                       return match;\r
+               },\r
+               POS: function(match){\r
+                       match.unshift( true );\r
+                       return match;\r
+               }\r
+       },\r
+       filters: {\r
+               enabled: function(elem){\r
+                       return elem.disabled === false && elem.type !== "hidden";\r
+               },\r
+               disabled: function(elem){\r
+                       return elem.disabled === true;\r
+               },\r
+               checked: function(elem){\r
+                       return elem.checked === true;\r
+               },\r
+               selected: function(elem){\r
+                       // Accessing this property makes selected-by-default\r
+                       // options in Safari work properly\r
+                       elem.parentNode.selectedIndex;\r
+                       return elem.selected === true;\r
+               },\r
+               parent: function(elem){\r
+                       return !!elem.firstChild;\r
+               },\r
+               empty: function(elem){\r
+                       return !elem.firstChild;\r
+               },\r
+               has: function(elem, i, match){\r
+                       return !!Sizzle( match[3], elem ).length;\r
+               },\r
+               header: function(elem){\r
+                       return (/h\d/i).test( elem.nodeName );\r
+               },\r
+               text: function(elem){\r
+                       return "text" === elem.type;\r
+               },\r
+               radio: function(elem){\r
+                       return "radio" === elem.type;\r
+               },\r
+               checkbox: function(elem){\r
+                       return "checkbox" === elem.type;\r
+               },\r
+               file: function(elem){\r
+                       return "file" === elem.type;\r
+               },\r
+               password: function(elem){\r
+                       return "password" === elem.type;\r
+               },\r
+               submit: function(elem){\r
+                       return "submit" === elem.type;\r
+               },\r
+               image: function(elem){\r
+                       return "image" === elem.type;\r
+               },\r
+               reset: function(elem){\r
+                       return "reset" === elem.type;\r
+               },\r
+               button: function(elem){\r
+                       return "button" === elem.type || elem.nodeName.toLowerCase() === "button";\r
+               },\r
+               input: function(elem){\r
+                       return (/input|select|textarea|button/i).test(elem.nodeName);\r
+               }\r
+       },\r
+       setFilters: {\r
+               first: function(elem, i){\r
+                       return i === 0;\r
+               },\r
+               last: function(elem, i, match, array){\r
+                       return i === array.length - 1;\r
+               },\r
+               even: function(elem, i){\r
+                       return i % 2 === 0;\r
+               },\r
+               odd: function(elem, i){\r
+                       return i % 2 === 1;\r
+               },\r
+               lt: function(elem, i, match){\r
+                       return i < match[3] - 0;\r
+               },\r
+               gt: function(elem, i, match){\r
+                       return i > match[3] - 0;\r
+               },\r
+               nth: function(elem, i, match){\r
+                       return match[3] - 0 === i;\r
+               },\r
+               eq: function(elem, i, match){\r
+                       return match[3] - 0 === i;\r
+               }\r
+       },\r
+       filter: {\r
+               PSEUDO: function(elem, match, i, array){\r
+                       var name = match[1], filter = Expr.filters[ name ];\r
+\r
+                       if ( filter ) {\r
+                               return filter( elem, i, match, array );\r
+                       } else if ( name === "contains" ) {\r
+                               return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;\r
+                       } else if ( name === "not" ) {\r
+                               var not = match[3];\r
+\r
+                               for ( var j = 0, l = not.length; j < l; j++ ) {\r
+                                       if ( not[j] === elem ) {\r
+                                               return false;\r
+                                       }\r
+                               }\r
+\r
+                               return true;\r
+                       } else {\r
+                               Sizzle.error( "Syntax error, unrecognized expression: " + name );\r
+                       }\r
+               },\r
+               CHILD: function(elem, match){\r
+                       var type = match[1], node = elem;\r
+                       switch (type) {\r
+                               case 'only':\r
+                               case 'first':\r
+                                       while ( (node = node.previousSibling) )  {\r
+                                               if ( node.nodeType === 1 ) { \r
+                                                       return false; \r
+                                               }\r
+                                       }\r
+                                       if ( type === "first" ) { \r
+                                               return true; \r
+                                       }\r
+                                       node = elem;\r
+                               case 'last':\r
+                                       while ( (node = node.nextSibling) )      {\r
+                                               if ( node.nodeType === 1 ) { \r
+                                                       return false; \r
+                                               }\r
+                                       }\r
+                                       return true;\r
+                               case 'nth':\r
+                                       var first = match[2], last = match[3];\r
+\r
+                                       if ( first === 1 && last === 0 ) {\r
+                                               return true;\r
+                                       }\r
+                                       \r
+                                       var doneName = match[0],\r
+                                               parent = elem.parentNode;\r
+       \r
+                                       if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {\r
+                                               var count = 0;\r
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               node.nodeIndex = ++count;\r
+                                                       }\r
+                                               } \r
+                                               parent.sizcache = doneName;\r
+                                       }\r
+                                       \r
+                                       var diff = elem.nodeIndex - last;\r
+                                       if ( first === 0 ) {\r
+                                               return diff === 0;\r
+                                       } else {\r
+                                               return ( diff % first === 0 && diff / first >= 0 );\r
+                                       }\r
+                       }\r
+               },\r
+               ID: function(elem, match){\r
+                       return elem.nodeType === 1 && elem.getAttribute("id") === match;\r
+               },\r
+               TAG: function(elem, match){\r
+                       return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;\r
+               },\r
+               CLASS: function(elem, match){\r
+                       return (" " + (elem.className || elem.getAttribute("class")) + " ")\r
+                               .indexOf( match ) > -1;\r
+               },\r
+               ATTR: function(elem, match){\r
+                       var name = match[1],\r
+                               result = Expr.attrHandle[ name ] ?\r
+                                       Expr.attrHandle[ name ]( elem ) :\r
+                                       elem[ name ] != null ?\r
+                                               elem[ name ] :\r
+                                               elem.getAttribute( name ),\r
+                               value = result + "",\r
+                               type = match[2],\r
+                               check = match[4];\r
+\r
+                       return result == null ?\r
+                               type === "!=" :\r
+                               type === "=" ?\r
+                               value === check :\r
+                               type === "*=" ?\r
+                               value.indexOf(check) >= 0 :\r
+                               type === "~=" ?\r
+                               (" " + value + " ").indexOf(check) >= 0 :\r
+                               !check ?\r
+                               value && result !== false :\r
+                               type === "!=" ?\r
+                               value !== check :\r
+                               type === "^=" ?\r
+                               value.indexOf(check) === 0 :\r
+                               type === "$=" ?\r
+                               value.substr(value.length - check.length) === check :\r
+                               type === "|=" ?\r
+                               value === check || value.substr(0, check.length + 1) === check + "-" :\r
+                               false;\r
+               },\r
+               POS: function(elem, match, i, array){\r
+                       var name = match[2], filter = Expr.setFilters[ name ];\r
+\r
+                       if ( filter ) {\r
+                               return filter( elem, i, match, array );\r
+                       }\r
+               }\r
+       }\r
+};\r
+\r
+var origPOS = Expr.match.POS,\r
+       fescape = function(all, num){\r
+               return "\\" + (num - 0 + 1);\r
+       };\r
+\r
+for ( var type in Expr.match ) {\r
+       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );\r
+       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );\r
+}\r
+\r
+var makeArray = function(array, results) {\r
+       array = Array.prototype.slice.call( array, 0 );\r
+\r
+       if ( results ) {\r
+               results.push.apply( results, array );\r
+               return results;\r
+       }\r
+       \r
+       return array;\r
+};\r
+\r
+// Perform a simple check to determine if the browser is capable of\r
+// converting a NodeList to an array using builtin methods.\r
+// Also verifies that the returned array holds DOM nodes\r
+// (which is not the case in the Blackberry browser)\r
+try {\r
+       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\r
+\r
+// Provide a fallback method if it does not work\r
+} catch(e){\r
+       makeArray = function(array, results) {\r
+               var ret = results || [], i = 0;\r
+\r
+               if ( toString.call(array) === "[object Array]" ) {\r
+                       Array.prototype.push.apply( ret, array );\r
+               } else {\r
+                       if ( typeof array.length === "number" ) {\r
+                               for ( var l = array.length; i < l; i++ ) {\r
+                                       ret.push( array[i] );\r
+                               }\r
+                       } else {\r
+                               for ( ; array[i]; i++ ) {\r
+                                       ret.push( array[i] );\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return ret;\r
+       };\r
+}\r
+\r
+var sortOrder;\r
+\r
+if ( document.documentElement.compareDocumentPosition ) {\r
+       sortOrder = function( a, b ) {\r
+               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\r
+                       if ( a == b ) {\r
+                               hasDuplicate = true;\r
+                       }\r
+                       return a.compareDocumentPosition ? -1 : 1;\r
+               }\r
+\r
+               var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;\r
+               if ( ret === 0 ) {\r
+                       hasDuplicate = true;\r
+               }\r
+               return ret;\r
+       };\r
+} else if ( "sourceIndex" in document.documentElement ) {\r
+       sortOrder = function( a, b ) {\r
+               if ( !a.sourceIndex || !b.sourceIndex ) {\r
+                       if ( a == b ) {\r
+                               hasDuplicate = true;\r
+                       }\r
+                       return a.sourceIndex ? -1 : 1;\r
+               }\r
+\r
+               var ret = a.sourceIndex - b.sourceIndex;\r
+               if ( ret === 0 ) {\r
+                       hasDuplicate = true;\r
+               }\r
+               return ret;\r
+       };\r
+} else if ( document.createRange ) {\r
+       sortOrder = function( a, b ) {\r
+               if ( !a.ownerDocument || !b.ownerDocument ) {\r
+                       if ( a == b ) {\r
+                               hasDuplicate = true;\r
+                       }\r
+                       return a.ownerDocument ? -1 : 1;\r
+               }\r
+\r
+               var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();\r
+               aRange.setStart(a, 0);\r
+               aRange.setEnd(a, 0);\r
+               bRange.setStart(b, 0);\r
+               bRange.setEnd(b, 0);\r
+               var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);\r
+               if ( ret === 0 ) {\r
+                       hasDuplicate = true;\r
+               }\r
+               return ret;\r
+       };\r
+}\r
+\r
+// Utility function for retreiving the text value of an array of DOM nodes\r
+Sizzle.getText = function( elems ) {\r
+       var ret = "", elem;\r
+\r
+       for ( var i = 0; elems[i]; i++ ) {\r
+               elem = elems[i];\r
+\r
+               // Get the text from text nodes and CDATA nodes\r
+               if ( elem.nodeType === 3 || elem.nodeType === 4 ) {\r
+                       ret += elem.nodeValue;\r
+\r
+               // Traverse everything else, except comment nodes\r
+               } else if ( elem.nodeType !== 8 ) {\r
+                       ret += Sizzle.getText( elem.childNodes );\r
+               }\r
+       }\r
+\r
+       return ret;\r
+};\r
+\r
+// Check to see if the browser returns elements by name when\r
+// querying by getElementById (and provide a workaround)\r
+(function(){\r
+       // We're going to inject a fake input element with a specified name\r
+       var form = document.createElement("div"),\r
+               id = "script" + (new Date()).getTime();\r
+       form.innerHTML = "<a name='" + id + "'/>";\r
+\r
+       // Inject it into the root element, check its status, and remove it quickly\r
+       var root = document.documentElement;\r
+       root.insertBefore( form, root.firstChild );\r
+\r
+       // The workaround has to do additional checks after a getElementById\r
+       // Which slows things down for other browsers (hence the branching)\r
+       if ( document.getElementById( id ) ) {\r
+               Expr.find.ID = function(match, context, isXML){\r
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {\r
+                               var m = context.getElementById(match[1]);\r
+                               return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];\r
+                       }\r
+               };\r
+\r
+               Expr.filter.ID = function(elem, match){\r
+                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");\r
+                       return elem.nodeType === 1 && node && node.nodeValue === match;\r
+               };\r
+       }\r
+\r
+       root.removeChild( form );\r
+       root = form = null; // release memory in IE\r
+})();\r
+\r
+(function(){\r
+       // Check to see if the browser returns only elements\r
+       // when doing getElementsByTagName("*")\r
+\r
+       // Create a fake element\r
+       var div = document.createElement("div");\r
+       div.appendChild( document.createComment("") );\r
+\r
+       // Make sure no comments are found\r
+       if ( div.getElementsByTagName("*").length > 0 ) {\r
+               Expr.find.TAG = function(match, context){\r
+                       var results = context.getElementsByTagName(match[1]);\r
+\r
+                       // Filter out possible comments\r
+                       if ( match[1] === "*" ) {\r
+                               var tmp = [];\r
+\r
+                               for ( var i = 0; results[i]; i++ ) {\r
+                                       if ( results[i].nodeType === 1 ) {\r
+                                               tmp.push( results[i] );\r
+                                       }\r
+                               }\r
+\r
+                               results = tmp;\r
+                       }\r
+\r
+                       return results;\r
+               };\r
+       }\r
+\r
+       // Check to see if an attribute returns normalized href attributes\r
+       div.innerHTML = "<a href='#'></a>";\r
+       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&\r
+                       div.firstChild.getAttribute("href") !== "#" ) {\r
+               Expr.attrHandle.href = function(elem){\r
+                       return elem.getAttribute("href", 2);\r
+               };\r
+       }\r
+\r
+       div = null; // release memory in IE\r
+})();\r
+\r
+if ( document.querySelectorAll ) {\r
+       (function(){\r
+               var oldSizzle = Sizzle, div = document.createElement("div");\r
+               div.innerHTML = "<p class='TEST'></p>";\r
+\r
+               // Safari can't handle uppercase or unicode characters when\r
+               // in quirks mode.\r
+               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {\r
+                       return;\r
+               }\r
+       \r
+               Sizzle = function(query, context, extra, seed){\r
+                       context = context || document;\r
+\r
+                       // Only use querySelectorAll on non-XML documents\r
+                       // (ID selectors don't work in non-HTML documents)\r
+                       if ( !seed && context.nodeType === 9 && !Sizzle.isXML(context) ) {\r
+                               try {\r
+                                       return makeArray( context.querySelectorAll(query), extra );\r
+                               } catch(e){}\r
+                       }\r
+               \r
+                       return oldSizzle(query, context, extra, seed);\r
+               };\r
+\r
+               for ( var prop in oldSizzle ) {\r
+                       Sizzle[ prop ] = oldSizzle[ prop ];\r
+               }\r
+\r
+               div = null; // release memory in IE\r
+       })();\r
+}\r
+\r
+(function(){\r
+       var div = document.createElement("div");\r
+\r
+       div.innerHTML = "<div class='test e'></div><div class='test'></div>";\r
+\r
+       // Opera can't find a second classname (in 9.6)\r
+       // Also, make sure that getElementsByClassName actually exists\r
+       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {\r
+               return;\r
+       }\r
+\r
+       // Safari caches class attributes, doesn't catch changes (in 3.2)\r
+       div.lastChild.className = "e";\r
+\r
+       if ( div.getElementsByClassName("e").length === 1 ) {\r
+               return;\r
+       }\r
+       \r
+       Expr.order.splice(1, 0, "CLASS");\r
+       Expr.find.CLASS = function(match, context, isXML) {\r
+               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {\r
+                       return context.getElementsByClassName(match[1]);\r
+               }\r
+       };\r
+\r
+       div = null; // release memory in IE\r
+})();\r
+\r
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\r
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {\r
+               var elem = checkSet[i];\r
+               if ( elem ) {\r
+                       elem = elem[dir];\r
+                       var match = false;\r
+\r
+                       while ( elem ) {\r
+                               if ( elem.sizcache === doneName ) {\r
+                                       match = checkSet[elem.sizset];\r
+                                       break;\r
+                               }\r
+\r
+                               if ( elem.nodeType === 1 && !isXML ){\r
+                                       elem.sizcache = doneName;\r
+                                       elem.sizset = i;\r
+                               }\r
+\r
+                               if ( elem.nodeName.toLowerCase() === cur ) {\r
+                                       match = elem;\r
+                                       break;\r
+                               }\r
+\r
+                               elem = elem[dir];\r
+                       }\r
+\r
+                       checkSet[i] = match;\r
+               }\r
+       }\r
+}\r
+\r
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\r
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {\r
+               var elem = checkSet[i];\r
+               if ( elem ) {\r
+                       elem = elem[dir];\r
+                       var match = false;\r
+\r
+                       while ( elem ) {\r
+                               if ( elem.sizcache === doneName ) {\r
+                                       match = checkSet[elem.sizset];\r
+                                       break;\r
+                               }\r
+\r
+                               if ( elem.nodeType === 1 ) {\r
+                                       if ( !isXML ) {\r
+                                               elem.sizcache = doneName;\r
+                                               elem.sizset = i;\r
+                                       }\r
+                                       if ( typeof cur !== "string" ) {\r
+                                               if ( elem === cur ) {\r
+                                                       match = true;\r
+                                                       break;\r
+                                               }\r
+\r
+                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\r
+                                               match = elem;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               elem = elem[dir];\r
+                       }\r
+\r
+                       checkSet[i] = match;\r
+               }\r
+       }\r
+}\r
+\r
+Sizzle.contains = document.compareDocumentPosition ? function(a, b){\r
+       return !!(a.compareDocumentPosition(b) & 16);\r
+} : function(a, b){\r
+       return a !== b && (a.contains ? a.contains(b) : true);\r
+};\r
+\r
+Sizzle.isXML = function(elem){\r
+       // documentElement is verified for cases where it doesn't yet exist\r
+       // (such as loading iframes in IE - #4833) \r
+       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\r
+       return documentElement ? documentElement.nodeName !== "HTML" : false;\r
+};\r
+\r
+var posProcess = function(selector, context){\r
+       var tmpSet = [], later = "", match,\r
+               root = context.nodeType ? [context] : context;\r
+\r
+       // Position selectors must be done after the filter\r
+       // And so must :not(positional) so we move all PSEUDOs to the end\r
+       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {\r
+               later += match[0];\r
+               selector = selector.replace( Expr.match.PSEUDO, "" );\r
+       }\r
+\r
+       selector = Expr.relative[selector] ? selector + "*" : selector;\r
+\r
+       for ( var i = 0, l = root.length; i < l; i++ ) {\r
+               Sizzle( selector, root[i], tmpSet );\r
+       }\r
+\r
+       return Sizzle.filter( later, tmpSet );\r
+};\r
+\r
+// EXPOSE\r
+\r
+window.tinymce.dom.Sizzle = Sizzle;\r
+\r
+})();\r
+\r
+\r
+(function(tinymce) {\r
+       // Shorten names\r
+       var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event;\r
+\r
+       tinymce.create('tinymce.dom.EventUtils', {\r
+               EventUtils : function() {\r
+                       this.inits = [];\r
+                       this.events = [];\r
+               },\r
+\r
+               add : function(o, n, f, s) {\r
+                       var cb, t = this, el = t.events, r;\r
+\r
+                       if (n instanceof Array) {\r
+                               r = [];\r
+\r
+                               each(n, function(n) {\r
+                                       r.push(t.add(o, n, f, s));\r
+                               });\r
+\r
+                               return r;\r
+                       }\r
+\r
+                       // Handle array\r
+                       if (o && o.hasOwnProperty && o instanceof Array) {\r
+                               r = [];\r
+\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
+                               // Is all events disabled\r
+                               if (t.disabled)\r
+                                       return;\r
+\r
+                               e = e || window.event;\r
+\r
+                               // Patch in target, preventDefault and stopPropagation in IE it's W3C valid\r
+                               if (e && isIE) {\r
+                                       if (!e.target)\r
+                                               e.target = e.srcElement;\r
+\r
+                                       // Patch in preventDefault, stopPropagation methods for W3C compatibility\r
+                                       tinymce.extend(e, t._stoppers);\r
+                               }\r
+\r
+                               if (!s)\r
+                                       return f(e);\r
+\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.hasOwnProperty && 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
+               cancel : function(e) {\r
+                       if (!e)\r
+                               return false;\r
+\r
+                       this.stop(e);\r
+\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
+               destroy : function() {\r
+                       var t = this;\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(win) {\r
+                       var t = this;\r
+\r
+                       // Keep it from running more than once\r
+                       if (t.domLoaded)\r
+                               return;\r
+\r
+                       t.domLoaded = true;\r
+\r
+                       each(t.inits, function(c) {\r
+                               c();\r
+                       });\r
+\r
+                       t.inits = [];\r
+               },\r
+\r
+               _wait : function(win) {\r
+                       var t = this, doc = win.document;\r
+\r
+                       // No need since the document is already loaded\r
+                       if (win.tinyMCE_GZ && tinyMCE_GZ.loaded) {\r
+                               t.domLoaded = 1;\r
+                               return;\r
+                       }\r
+\r
+                       // Use IE method\r
+                       if (doc.attachEvent) {\r
+                               doc.attachEvent("onreadystatechange", function() {\r
+                                       if (doc.readyState === "complete") {\r
+                                               doc.detachEvent("onreadystatechange", arguments.callee);\r
+                                               t._pageInit(win);\r
+                                       }\r
+                               });\r
+\r
+                               if (doc.documentElement.doScroll && win == win.top) {\r
+                                       (function() {\r
+                                               if (t.domLoaded)\r
+                                                       return;\r
+\r
+                                               try {\r
+                                                       // If IE is used, use the trick by Diego Perini licensed under MIT by request to the author.\r
+                                                       // http://javascript.nwbox.com/IEContentLoaded/\r
+                                                       doc.documentElement.doScroll("left");\r
+                                               } catch (ex) {\r
+                                                       setTimeout(arguments.callee, 0);\r
+                                                       return;\r
+                                               }\r
+\r
+                                               t._pageInit(win);\r
+                                       })();\r
+                               }\r
+                       } else if (doc.addEventListener) {\r
+                               t._add(win, 'DOMContentLoaded', function() {\r
+                                       t._pageInit(win);\r
+                               });\r
+                       }\r
+\r
+                       t._add(win, 'load', function() {\r
+                               t._pageInit(win);\r
+                       });\r
+               },\r
+\r
+               _stoppers : {\r
+                       preventDefault : function() {\r
+                               this.returnValue = false;\r
+                       },\r
+\r
+                       stopPropagation : function() {\r
+                               this.cancelBubble = true;\r
+                       }\r
+               }\r
+       });\r
+\r
+       Event = tinymce.dom.Event = new tinymce.dom.EventUtils();\r
+\r
+       // Dispatch DOM content loaded event for IE and Safari\r
+       Event._wait(window);\r
+\r
+       tinymce.addUnload(function() {\r
+               Event.destroy();\r
+       });\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       tinymce.dom.Element = function(id, settings) {\r
+               var t = this, dom, el;\r
+\r
+               t.settings = settings = settings || {};\r
+               t.id = id;\r
+               t.dom = dom = settings.dom || tinymce.DOM;\r
+\r
+               // Only IE leaks DOM references, this is a lot faster\r
+               if (!tinymce.isIE)\r
+                       el = dom.get(t.id);\r
+\r
+               tinymce.each(\r
+                               ('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' + \r
+                               'setAttrib,setAttribs,getAttrib,addClass,removeClass,' + \r
+                               'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' + \r
+                               'isHidden,setHTML,get').split(/,/)\r
+                       , function(k) {\r
+                               t[k] = function() {\r
+                                       var a = [id], i;\r
+\r
+                                       for (i = 0; i < arguments.length; i++)\r
+                                               a.push(arguments[i]);\r
+\r
+                                       a = dom[k].apply(dom, a);\r
+                                       t.update(k);\r
+\r
+                                       return a;\r
+                               };\r
+               });\r
+\r
+               tinymce.extend(t, {\r
+                       on : function(n, f, s) {\r
+                               return tinymce.dom.Event.add(t.id, n, f, s);\r
+                       },\r
+\r
+                       getXY : function() {\r
+                               return {\r
+                                       x : parseInt(t.getStyle('left')),\r
+                                       y : parseInt(t.getStyle('top'))\r
+                               };\r
+                       },\r
+\r
+                       getSize : function() {\r
+                               var n = dom.get(t.id);\r
+\r
+                               return {\r
+                                       w : parseInt(t.getStyle('width') || n.clientWidth),\r
+                                       h : parseInt(t.getStyle('height') || n.clientHeight)\r
+                               };\r
+                       },\r
+\r
+                       moveTo : function(x, y) {\r
+                               t.setStyles({left : x, top : y});\r
+                       },\r
+\r
+                       moveBy : function(x, y) {\r
+                               var p = t.getXY();\r
+\r
+                               t.moveTo(p.x + x, p.y + y);\r
+                       },\r
+\r
+                       resizeTo : function(w, h) {\r
+                               t.setStyles({width : w, height : h});\r
+                       },\r
+\r
+                       resizeBy : function(w, h) {\r
+                               var s = t.getSize();\r
+\r
+                               t.resizeTo(s.w + w, s.h + h);\r
+                       },\r
+\r
+                       update : function(k) {\r
+                               var b;\r
+\r
+                               if (tinymce.isIE6 && 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(settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'});\r
+                                               dom.setStyle(b, 'opacity', 0);\r
+                                       } else\r
+                                               b = dom.get(t.blocker);\r
+\r
+                                       dom.setStyles(b, {\r
+                                               left : t.getStyle('left', 1),\r
+                                               top : t.getStyle('top', 1),\r
+                                               width : t.getStyle('width', 1),\r
+                                               height : t.getStyle('height', 1),\r
+                                               display : t.getStyle('display', 1),\r
+                                               zIndex : parseInt(t.getStyle('zIndex', 1) || 0) - 1\r
+                                       });\r
+                               }\r
+                       }\r
+               });\r
+       };\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       function trimNl(s) {\r
+               return s.replace(/[\n\r]+/g, '');\r
+       };\r
+\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
+                       // Add events\r
+                       each([\r
+                               'onBeforeSetContent',\r
+\r
+                               'onBeforeGetContent',\r
+\r
+                               'onSetContent',\r
+\r
+                               'onGetContent'\r
+                       ], function(e) {\r
+                               t[e] = new tinymce.util.Dispatcher(t);\r
+                       });\r
+\r
+                       // No W3C Range support\r
+                       if (!t.win.getSelection)\r
+                               t.tridentSel = new tinymce.dom.TridentSelection(t);\r
+\r
+                       if (tinymce.isIE && dom.boxModel)\r
+                               this._fixIESelection();\r
+\r
+                       // Prevent leaks\r
+                       tinymce.addUnload(t.destroy, t);\r
+               },\r
+\r
+               setCursorLocation: function(node, offset) {\r
+                       var t = this; var r = t.dom.createRng();\r
+                       r.setStart(node, offset);\r
+                       r.setEnd(node, offset);\r
+                       t.setRng(r);\r
+                       t.collapse(false);\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
+                       s.forced_root_block = '';\r
+                       t.onBeforeGetContent.dispatch(t, s);\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
+                               // IE will produce invalid markup if elements are present that\r
+                               // it doesn't understand like custom elements or HTML5 elements.\r
+                               // Adding a BR in front of the contents and then remoiving it seems to fix it though.\r
+                               e.innerHTML = '<br>' + (r.item ? r.item(0).outerHTML : r.htmlText);\r
+                               e.removeChild(e.firstChild);\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
+                       s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa;\r
+                       t.onGetContent.dispatch(t, s);\r
+\r
+                       return s.content;\r
+               },\r
+\r
+               setContent : function(content, args) {\r
+                       var self = this, rng = self.getRng(), caretNode, doc = self.win.document, frag, temp;\r
+\r
+                       args = args || {format : 'html'};\r
+                       args.set = true;\r
+                       content = args.content = content;\r
+\r
+                       // Dispatch before set content event\r
+                       if (!args.no_events)\r
+                               self.onBeforeSetContent.dispatch(self, args);\r
+\r
+                       content = args.content;\r
+\r
+                       if (rng.insertNode) {\r
+                               // Make caret marker since insertNode places the caret in the beginning of text after insert\r
+                               content += '<span id="__caret">_</span>';\r
+\r
+                               // Delete and insert new node\r
+                               if (rng.startContainer == doc && rng.endContainer == doc) {\r
+                                       // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents\r
+                                       doc.body.innerHTML = content;\r
+                               } else {\r
+                                       rng.deleteContents();\r
+\r
+                                       if (doc.body.childNodes.length == 0) {\r
+                                               doc.body.innerHTML = content;\r
+                                       } else {\r
+                                               // createContextualFragment doesn't exists in IE 9 DOMRanges\r
+                                               if (rng.createContextualFragment) {\r
+                                                       rng.insertNode(rng.createContextualFragment(content));\r
+                                               } else {\r
+                                                       // Fake createContextualFragment call in IE 9\r
+                                                       frag = doc.createDocumentFragment();\r
+                                                       temp = doc.createElement('div');\r
+\r
+                                                       frag.appendChild(temp);\r
+                                                       temp.outerHTML = content;\r
+\r
+                                                       rng.insertNode(frag);\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Move to caret marker\r
+                               caretNode = self.dom.get('__caret');\r
+\r
+                               // Make sure we wrap it compleatly, Opera fails with a simple select call\r
+                               rng = doc.createRange();\r
+                               rng.setStartBefore(caretNode);\r
+                               rng.setEndBefore(caretNode);\r
+                               self.setRng(rng);\r
+\r
+                               // Remove the caret position\r
+                               self.dom.remove('__caret');\r
+\r
+                               try {\r
+                                       self.setRng(rng);\r
+                               } catch (ex) {\r
+                                       // Might fail on Opera for some odd reason\r
+                               }\r
+                       } else {\r
+                               if (rng.item) {\r
+                                       // Delete content and get caret text selection\r
+                                       doc.execCommand('Delete', false, null);\r
+                                       rng = self.getRng();\r
+                               }\r
+\r
+                               // Explorer removes spaces from the beginning of pasted contents\r
+                               if (/^\s+/.test(content)) {\r
+                                       rng.pasteHTML('<span id="__mce_tmp">_</span>' + content);\r
+                                       self.dom.remove('__mce_tmp');\r
+                               } else\r
+                                       rng.pasteHTML(content);\r
+                       }\r
+\r
+                       // Dispatch set content event\r
+                       if (!args.no_events)\r
+                               self.onSetContent.dispatch(self, args);\r
+               },\r
+\r
+               getStart : function() {\r
+                       var rng = this.getRng(), startElement, parentElement, checkRng, node;\r
+\r
+                       if (rng.duplicate || rng.item) {\r
+                               // Control selection, return first item\r
+                               if (rng.item)\r
+                                       return rng.item(0);\r
+\r
+                               // Get start element\r
+                               checkRng = rng.duplicate();\r
+                               checkRng.collapse(1);\r
+                               startElement = checkRng.parentElement();\r
+\r
+                               // Check if range parent is inside the start element, then return the inner parent element\r
+                               // This will fix issues when a single element is selected, IE would otherwise return the wrong start element\r
+                               parentElement = node = rng.parentElement();\r
+                               while (node = node.parentNode) {\r
+                                       if (node == startElement) {\r
+                                               startElement = parentElement;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               return startElement;\r
+                       } else {\r
+                               startElement = rng.startContainer;\r
+\r
+                               if (startElement.nodeType == 1 && startElement.hasChildNodes())\r
+                                       startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)];\r
+\r
+                               if (startElement && startElement.nodeType == 3)\r
+                                       return startElement.parentNode;\r
+\r
+                               return startElement;\r
+                       }\r
+               },\r
+\r
+               getEnd : function() {\r
+                       var t = this, r = t.getRng(), e, eo;\r
+\r
+                       if (r.duplicate || r.item) {\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 && e.nodeName == 'BODY')\r
+                                       return e.lastChild || e;\r
+\r
+                               return e;\r
+                       } else {\r
+                               e = r.endContainer;\r
+                               eo = r.endOffset;\r
+\r
+                               if (e.nodeType == 1 && e.hasChildNodes())\r
+                                       e = e.childNodes[eo > 0 ? eo - 1 : eo];\r
+\r
+                               if (e && e.nodeType == 3)\r
+                                       return e.parentNode;\r
+\r
+                               return e;\r
+                       }\r
+               },\r
+\r
+               getBookmark : function(type, normalized) {\r
+                       var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles;\r
+\r
+                       function findIndex(name, element) {\r
+                               var index = 0;\r
+\r
+                               each(dom.select(name), function(node, i) {\r
+                                       if (node == element)\r
+                                               index = i;\r
+                               });\r
+\r
+                               return index;\r
+                       };\r
+\r
+                       if (type == 2) {\r
+                               function getLocation() {\r
+                                       var rng = t.getRng(true), root = dom.getRoot(), bookmark = {};\r
+\r
+                                       function getPoint(rng, start) {\r
+                                               var container = rng[start ? 'startContainer' : 'endContainer'],\r
+                                                       offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0;\r
+\r
+                                               if (container.nodeType == 3) {\r
+                                                       if (normalized) {\r
+                                                               for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling)\r
+                                                                       offset += node.nodeValue.length;\r
+                                                       }\r
+\r
+                                                       point.push(offset);\r
+                                               } else {\r
+                                                       childNodes = container.childNodes;\r
+\r
+                                                       if (offset >= childNodes.length && childNodes.length) {\r
+                                                               after = 1;\r
+                                                               offset = Math.max(0, childNodes.length - 1);\r
+                                                       }\r
+\r
+                                                       point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after);\r
+                                               }\r
+\r
+                                               for (; container && container != root; container = container.parentNode)\r
+                                                       point.push(t.dom.nodeIndex(container, normalized));\r
+\r
+                                               return point;\r
+                                       };\r
+\r
+                                       bookmark.start = getPoint(rng, true);\r
+\r
+                                       if (!t.isCollapsed())\r
+                                               bookmark.end = getPoint(rng);\r
+\r
+                                       return bookmark;\r
+                               };\r
+\r
+                               if (t.tridentSel)\r
+                                       return t.tridentSel.getBookmark(type);\r
+\r
+                               return getLocation();\r
+                       }\r
+\r
+                       // Handle simple range\r
+                       if (type)\r
+                               return {rng : t.getRng()};\r
+\r
+                       rng = t.getRng();\r
+                       id = dom.uniqueId();\r
+                       collapsed = tinyMCE.activeEditor.selection.isCollapsed();\r
+                       styles = 'overflow:hidden;line-height:0px';\r
+\r
+                       // Explorer method\r
+                       if (rng.duplicate || rng.item) {\r
+                               // Text selection\r
+                               if (!rng.item) {\r
+                                       rng2 = rng.duplicate();\r
+\r
+                                       try {\r
+                                               // Insert start marker\r
+                                               rng.collapse();\r
+                                               rng.pasteHTML('<span data-mce-type="bookmark" id="' + id + '_start" style="' + styles + '">' + chr + '</span>');\r
+\r
+                                               // Insert end marker\r
+                                               if (!collapsed) {\r
+                                                       rng2.collapse(false);\r
+\r
+                                                       // Detect the empty space after block elements in IE and move the end back one character <p></p>] becomes <p>]</p>\r
+                                                       rng.moveToElementText(rng2.parentElement());\r
+                                                       if (rng.compareEndPoints('StartToEnd', rng2) == 0)\r
+                                                               rng2.move('character', -1);\r
+\r
+                                                       rng2.pasteHTML('<span data-mce-type="bookmark" id="' + id + '_end" style="' + styles + '">' + chr + '</span>');\r
+                                               }\r
+                                       } catch (ex) {\r
+                                               // IE might throw unspecified error so lets ignore it\r
+                                               return null;\r
+                                       }\r
+                               } else {\r
+                                       // Control selection\r
+                                       element = rng.item(0);\r
+                                       name = element.nodeName;\r
+\r
+                                       return {name : name, index : findIndex(name, element)};\r
+                               }\r
+                       } else {\r
+                               element = t.getNode();\r
+                               name = element.nodeName;\r
+                               if (name == 'IMG')\r
+                                       return {name : name, index : findIndex(name, element)};\r
+\r
+                               // W3C method\r
+                               rng2 = rng.cloneRange();\r
+\r
+                               // Insert end marker\r
+                               if (!collapsed) {\r
+                                       rng2.collapse(false);\r
+                                       rng2.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_end', style : styles}, chr));\r
+                               }\r
+\r
+                               rng.collapse(true);\r
+                               rng.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_start', style : styles}, chr));\r
+                       }\r
+\r
+                       t.moveToBookmark({id : id, keep : 1});\r
+\r
+                       return {id : id};\r
+               },\r
+\r
+               moveToBookmark : function(bookmark) {\r
+                       var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset;\r
+\r
+                       if (bookmark) {\r
+                               if (bookmark.start) {\r
+                                       rng = dom.createRng();\r
+                                       root = dom.getRoot();\r
+\r
+                                       function setEndPoint(start) {\r
+                                               var point = bookmark[start ? 'start' : 'end'], i, node, offset, children;\r
+\r
+                                               if (point) {\r
+                                                       offset = point[0];\r
+\r
+                                                       // Find container node\r
+                                                       for (node = root, i = point.length - 1; i >= 1; i--) {\r
+                                                               children = node.childNodes;\r
+\r
+                                                               if (point[i] > children.length - 1)\r
+                                                                       return;\r
+\r
+                                                               node = children[point[i]];\r
+                                                       }\r
+\r
+                                                       // Move text offset to best suitable location\r
+                                                       if (node.nodeType === 3)\r
+                                                               offset = Math.min(point[0], node.nodeValue.length);\r
+\r
+                                                       // Move element offset to best suitable location\r
+                                                       if (node.nodeType === 1)\r
+                                                               offset = Math.min(point[0], node.childNodes.length);\r
+\r
+                                                       // Set offset within container node\r
+                                                       if (start)\r
+                                                               rng.setStart(node, offset);\r
+                                                       else\r
+                                                               rng.setEnd(node, offset);\r
+                                               }\r
+\r
+                                               return true;\r
+                                       };\r
+\r
+                                       if (t.tridentSel)\r
+                                               return t.tridentSel.moveToBookmark(bookmark);\r
+\r
+                                       if (setEndPoint(true) && setEndPoint()) {\r
+                                               t.setRng(rng);\r
+                                       }\r
+                               } else if (bookmark.id) {\r
+                                       function restoreEndPoint(suffix) {\r
+                                               var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep;\r
+\r
+                                               if (marker) {\r
+                                                       node = marker.parentNode;\r
+\r
+                                                       if (suffix == 'start') {\r
+                                                               if (!keep) {\r
+                                                                       idx = dom.nodeIndex(marker);\r
+                                                               } else {\r
+                                                                       node = marker.firstChild;\r
+                                                                       idx = 1;\r
+                                                               }\r
+\r
+                                                               startContainer = endContainer = node;\r
+                                                               startOffset = endOffset = idx;\r
+                                                       } else {\r
+                                                               if (!keep) {\r
+                                                                       idx = dom.nodeIndex(marker);\r
+                                                               } else {\r
+                                                                       node = marker.firstChild;\r
+                                                                       idx = 1;\r
+                                                               }\r
+\r
+                                                               endContainer = node;\r
+                                                               endOffset = idx;\r
+                                                       }\r
+\r
+                                                       if (!keep) {\r
+                                                               prev = marker.previousSibling;\r
+                                                               next = marker.nextSibling;\r
+\r
+                                                               // Remove all marker text nodes\r
+                                                               each(tinymce.grep(marker.childNodes), function(node) {\r
+                                                                       if (node.nodeType == 3)\r
+                                                                               node.nodeValue = node.nodeValue.replace(/\uFEFF/g, '');\r
+                                                               });\r
+\r
+                                                               // Remove marker but keep children if for example contents where inserted into the marker\r
+                                                               // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature\r
+                                                               while (marker = dom.get(bookmark.id + '_' + suffix))\r
+                                                                       dom.remove(marker, 1);\r
+\r
+                                                               // If siblings are text nodes then merge them unless it's Opera since it some how removes the node\r
+                                                               // and we are sniffing since adding a lot of detection code for a browser with 3% of the market isn't worth the effort. Sorry, Opera but it's just a fact\r
+                                                               if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3 && !tinymce.isOpera) {\r
+                                                                       idx = prev.nodeValue.length;\r
+                                                                       prev.appendData(next.nodeValue);\r
+                                                                       dom.remove(next);\r
+\r
+                                                                       if (suffix == 'start') {\r
+                                                                               startContainer = endContainer = prev;\r
+                                                                               startOffset = endOffset = idx;\r
+                                                                       } else {\r
+                                                                               endContainer = prev;\r
+                                                                               endOffset = idx;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       };\r
+\r
+                                       function addBogus(node) {\r
+                                               // Adds a bogus BR element for empty block elements or just a space on IE since it renders BR elements incorrectly\r
+                                               if (dom.isBlock(node) && !node.innerHTML)\r
+                                                       node.innerHTML = !isIE ? '<br data-mce-bogus="1" />' : ' ';\r
+\r
+                                               return node;\r
+                                       };\r
+\r
+                                       // Restore start/end points\r
+                                       restoreEndPoint('start');\r
+                                       restoreEndPoint('end');\r
+\r
+                                       if (startContainer) {\r
+                                               rng = dom.createRng();\r
+                                               rng.setStart(addBogus(startContainer), startOffset);\r
+                                               rng.setEnd(addBogus(endContainer), endOffset);\r
+                                               t.setRng(rng);\r
+                                       }\r
+                               } else if (bookmark.name) {\r
+                                       t.select(dom.select(bookmark.name)[bookmark.index]);\r
+                               } else if (bookmark.rng)\r
+                                       t.setRng(bookmark.rng);\r
+                       }\r
+               },\r
+\r
+               select : function(node, content) {\r
+                       var t = this, dom = t.dom, rng = dom.createRng(), idx;\r
+\r
+                       if (node) {\r
+                               idx = dom.nodeIndex(node);\r
+                               rng.setStart(node.parentNode, idx);\r
+                               rng.setEnd(node.parentNode, idx + 1);\r
+\r
+                               // Find first/last text node or BR element\r
+                               if (content) {\r
+                                       function setPoint(node, start) {\r
+                                               var walker = new tinymce.dom.TreeWalker(node, node);\r
+\r
+                                               do {\r
+                                                       // Text node\r
+                                                       if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {\r
+                                                               if (start)\r
+                                                                       rng.setStart(node, 0);\r
+                                                               else\r
+                                                                       rng.setEnd(node, node.nodeValue.length);\r
+\r
+                                                               return;\r
+                                                       }\r
+\r
+                                                       // BR element\r
+                                                       if (node.nodeName == 'BR') {\r
+                                                               if (start)\r
+                                                                       rng.setStartBefore(node);\r
+                                                               else\r
+                                                                       rng.setEndBefore(node);\r
+\r
+                                                               return;\r
+                                                       }\r
+                                               } while (node = (start ? walker.next() : walker.prev()));\r
+                                       };\r
+\r
+                                       setPoint(node, 1);\r
+                                       setPoint(node);\r
+                               }\r
+\r
+                               t.setRng(rng);\r
+                       }\r
+\r
+                       return node;\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
+                       if (r.compareEndPoints)\r
+                               return r.compareEndPoints('StartToEnd', r) === 0;\r
+\r
+                       return !s || r.collapsed;\r
+               },\r
+\r
+               collapse : function(to_start) {\r
+                       var self = this, rng = self.getRng(), node;\r
+\r
+                       // Control range on IE\r
+                       if (rng.item) {\r
+                               node = rng.item(0);\r
+                               rng = self.win.document.body.createTextRange();\r
+                               rng.moveToElementText(node);\r
+                       }\r
+\r
+                       rng.collapse(!!to_start);\r
+                       self.setRng(rng);\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(w3c) {\r
+                       var t = this, s, r, elm, doc = t.win.document;\r
+\r
+                       // Found tridentSel object then we need to use that one\r
+                       if (w3c && t.tridentSel)\r
+                               return t.tridentSel.getRangeAt(0);\r
+\r
+                       try {\r
+                               if (s = t.getSel())\r
+                                       r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : doc.createRange());\r
+                       } catch (ex) {\r
+                               // IE throws unspecified error here if TinyMCE is placed in a frame/iframe\r
+                       }\r
+\r
+                       // We have W3C ranges and it's IE then fake control selection since IE9 doesn't handle that correctly yet\r
+                       if (tinymce.isIE && r && r.setStart && doc.selection.createRange().item) {\r
+                               elm = doc.selection.createRange().item(0);\r
+                               r = doc.createRange();\r
+                               r.setStartBefore(elm);\r
+                               r.setEndAfter(elm);\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 = doc.createRange ? doc.createRange() : doc.body.createTextRange();\r
+\r
+                       if (t.selectedRange && t.explicitRange) {\r
+                               if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) {\r
+                                       // Safari, Opera and Chrome only ever select text which causes the range to change.\r
+                                       // This lets us use the originally set range if the selection hasn't been changed by the user.\r
+                                       r = t.explicitRange;\r
+                               } else {\r
+                                       t.selectedRange = null;\r
+                                       t.explicitRange = null;\r
+                               }\r
+                       }\r
+\r
+                       return r;\r
+               },\r
+\r
+               setRng : function(r) {\r
+                       var s, t = this;\r
+                       \r
+                       if (!t.tridentSel) {\r
+                               s = t.getSel();\r
+\r
+                               if (s) {\r
+                                       t.explicitRange = r;\r
+\r
+                                       try {\r
+                                               s.removeAllRanges();\r
+                                       } catch (ex) {\r
+                                               // IE9 might throw errors here don't know why\r
+                                       }\r
+\r
+                                       s.addRange(r);\r
+                                       t.selectedRange = s.getRangeAt(0);\r
+                               }\r
+                       } else {\r
+                               // Is W3C Range\r
+                               if (r.cloneRange) {\r
+                                       t.tridentSel.addRange(r);\r
+                                       return;\r
+                               }\r
+\r
+                               // Is IE specific range\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, rng = t.getRng(), sel = t.getSel(), elm, start = rng.startContainer, end = rng.endContainer;\r
+\r
+                       // Range maybe lost after the editor is made visible again\r
+                       if (!rng)\r
+                               return t.dom.getRoot();\r
+\r
+                       if (rng.setStart) {\r
+                               elm = rng.commonAncestorContainer;\r
+\r
+                               // Handle selection a image or other control like element such as anchors\r
+                               if (!rng.collapsed) {\r
+                                       if (rng.startContainer == rng.endContainer) {\r
+                                               if (rng.endOffset - rng.startOffset < 2) {\r
+                                                       if (rng.startContainer.hasChildNodes())\r
+                                                               elm = rng.startContainer.childNodes[rng.startOffset];\r
+                                               }\r
+                                       }\r
+\r
+                                       // If the anchor node is a element instead of a text node then return this element\r
+                                       //if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) \r
+                                       //      return sel.anchorNode.childNodes[sel.anchorOffset];\r
+\r
+                                       // Handle cases where the selection is immediately wrapped around a node and return that node instead of it's parent.\r
+                                       // This happens when you double click an underlined word in FireFox.\r
+                                       if (start.nodeType === 3 && end.nodeType === 3) {\r
+                                               function skipEmptyTextNodes(n, forwards) {\r
+                                                       var orig = n;\r
+                                                       while (n && n.nodeType === 3 && n.length === 0) {\r
+                                                               n = forwards ? n.nextSibling : n.previousSibling;\r
+                                                       }\r
+                                                       return n || orig;\r
+                                               }\r
+                                               if (start.length === rng.startOffset) {\r
+                                                       start = skipEmptyTextNodes(start.nextSibling, true);\r
+                                               } else {\r
+                                                       start = start.parentNode;\r
+                                               }\r
+                                               if (rng.endOffset === 0) {\r
+                                                       end = skipEmptyTextNodes(end.previousSibling, false);\r
+                                               } else {\r
+                                                       end = end.parentNode;\r
+                                               }\r
+\r
+                                               if (start && start === end)\r
+                                                       return start;\r
+                                       }\r
+                               }\r
+\r
+                               if (elm && elm.nodeType == 3)\r
+                                       return elm.parentNode;\r
+\r
+                               return elm;\r
+                       }\r
+\r
+                       return rng.item ? rng.item(0) : rng.parentElement();\r
+               },\r
+\r
+               getSelectedBlocks : function(st, en) {\r
+                       var t = this, dom = t.dom, sb, eb, n, bl = [];\r
+\r
+                       sb = dom.getParent(st || t.getStart(), dom.isBlock);\r
+                       eb = dom.getParent(en || t.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
+               normalize : function() {\r
+                       var self = this, rng, normalized;\r
+\r
+                       // Normalize only on non IE browsers for now\r
+                       if (tinymce.isIE)\r
+                               return;\r
+\r
+                       function normalizeEndPoint(start) {\r
+                               var container, offset, walker, dom = self.dom, body = dom.getRoot(), node;\r
+\r
+                               container = rng[(start ? 'start' : 'end') + 'Container'];\r
+                               offset = rng[(start ? 'start' : 'end') + 'Offset'];\r
+\r
+                               // If the container is a document move it to the body element\r
+                               if (container.nodeType === 9) {\r
+                                       container = container.body;\r
+                                       offset = 0;\r
+                               }\r
+\r
+                               // If the container is body try move it into the closest text node or position\r
+                               // TODO: Add more logic here to handle element selection cases\r
+                               if (container === body) {\r
+                                       // Resolve the index\r
+                                       if (container.hasChildNodes()) {\r
+                                               container = container.childNodes[Math.min(!start && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1)];\r
+                                               offset = 0;\r
+\r
+                                               // Don't walk into elements that doesn't have any child nodes like a IMG\r
+                                               if (container.hasChildNodes()) {\r
+                                                       // Walk the DOM to find a text node to place the caret at or a BR\r
+                                                       node = container;\r
+                                                       walker = new tinymce.dom.TreeWalker(container, body);\r
+                                                       do {\r
+                                                               // Found a text node use that position\r
+                                                               if (node.nodeType === 3) {\r
+                                                                       offset = start ? 0 : node.nodeValue.length - 1;\r
+                                                                       container = node;\r
+                                                                       break;\r
+                                                               }\r
+\r
+                                                               // Found a BR element that we can place the caret before\r
+                                                               if (node.nodeName === 'BR') {\r
+                                                                       offset = dom.nodeIndex(node);\r
+                                                                       container = node.parentNode;\r
+                                                                       break;\r
+                                                               }\r
+                                                       } while (node = (start ? walker.next() : walker.prev()));\r
+\r
+                                                       normalized = true;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Set endpoint if it was normalized\r
+                               if (normalized)\r
+                                       rng['set' + (start ? 'Start' : 'End')](container, offset);\r
+                       };\r
+\r
+                       rng = self.getRng();\r
+\r
+                       // Normalize the end points\r
+                       normalizeEndPoint(true);\r
+                       \r
+                       if (rng.collapsed)\r
+                               normalizeEndPoint();\r
+\r
+                       // Set the selection if it was normalized\r
+                       if (normalized) {\r
+                               //console.log(self.dom.dumpRng(rng));\r
+                               self.setRng(rng);\r
+                       }\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
+               // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode\r
+               _fixIESelection : function() {\r
+                       var dom = this.dom, doc = dom.doc, body = doc.body, started, startRng, htmlElm;\r
+\r
+                       // Make HTML element unselectable since we are going to handle selection by hand\r
+                       doc.documentElement.unselectable = true;\r
+\r
+                       // Return range from point or null if it failed\r
+                       function rngFromPoint(x, y) {\r
+                               var rng = body.createTextRange();\r
+\r
+                               try {\r
+                                       rng.moveToPoint(x, y);\r
+                               } catch (ex) {\r
+                                       // IE sometimes throws and exception, so lets just ignore it\r
+                                       rng = null;\r
+                               }\r
+\r
+                               return rng;\r
+                       };\r
+\r
+                       // Fires while the selection is changing\r
+                       function selectionChange(e) {\r
+                               var pointRng;\r
+\r
+                               // Check if the button is down or not\r
+                               if (e.button) {\r
+                                       // Create range from mouse position\r
+                                       pointRng = rngFromPoint(e.x, e.y);\r
+\r
+                                       if (pointRng) {\r
+                                               // Check if pointRange is before/after selection then change the endPoint\r
+                                               if (pointRng.compareEndPoints('StartToStart', startRng) > 0)\r
+                                                       pointRng.setEndPoint('StartToStart', startRng);\r
+                                               else\r
+                                                       pointRng.setEndPoint('EndToEnd', startRng);\r
+\r
+                                               pointRng.select();\r
+                                       }\r
+                               } else\r
+                                       endSelection();\r
+                       }\r
+\r
+                       // Removes listeners\r
+                       function endSelection() {\r
+                               var rng = doc.selection.createRange();\r
+\r
+                               // If the range is collapsed then use the last start range\r
+                               if (startRng && !rng.item && rng.compareEndPoints('StartToEnd', rng) === 0)\r
+                                       startRng.select();\r
+\r
+                               dom.unbind(doc, 'mouseup', endSelection);\r
+                               dom.unbind(doc, 'mousemove', selectionChange);\r
+                               startRng = started = 0;\r
+                       };\r
+\r
+                       // Detect when user selects outside BODY\r
+                       dom.bind(doc, ['mousedown', 'contextmenu'], function(e) {\r
+                               if (e.target.nodeName === 'HTML') {\r
+                                       if (started)\r
+                                               endSelection();\r
+\r
+                                       // Detect vertical scrollbar, since IE will fire a mousedown on the scrollbar and have target set as HTML\r
+                                       htmlElm = doc.documentElement;\r
+                                       if (htmlElm.scrollHeight > htmlElm.clientHeight)\r
+                                               return;\r
+\r
+                                       started = 1;\r
+                                       // Setup start position\r
+                                       startRng = rngFromPoint(e.x, e.y);\r
+                                       if (startRng) {\r
+                                               // Listen for selection change events\r
+                                               dom.bind(doc, 'mouseup', endSelection);\r
+                                               dom.bind(doc, 'mousemove', selectionChange);\r
+\r
+                                               dom.win.focus();\r
+                                               startRng.select();\r
+                                       }\r
+                               }\r
+                       });\r
+               }\r
+       });\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       tinymce.dom.Serializer = function(settings, dom, schema) {\r
+               var onPreProcess, onPostProcess, isIE = tinymce.isIE, each = tinymce.each, htmlParser;\r
+\r
+               // Support the old apply_source_formatting option\r
+               if (!settings.apply_source_formatting)\r
+                       settings.indent = false;\r
+\r
+               settings.remove_trailing_brs = true;\r
+\r
+               // Default DOM and Schema if they are undefined\r
+               dom = dom || tinymce.DOM;\r
+               schema = schema || new tinymce.html.Schema(settings);\r
+               settings.entity_encoding = settings.entity_encoding || 'named';\r
+\r
+               onPreProcess = new tinymce.util.Dispatcher(self);\r
+\r
+               onPostProcess = new tinymce.util.Dispatcher(self);\r
+\r
+               htmlParser = new tinymce.html.DomParser(settings, schema);\r
+\r
+               // Convert move data-mce-src, data-mce-href and data-mce-style into nodes or process them if needed\r
+               htmlParser.addAttributeFilter('src,href,style', function(nodes, name) {\r
+                       var i = nodes.length, node, value, internalName = 'data-mce-' + name, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope, undef;\r
+\r
+                       while (i--) {\r
+                               node = nodes[i];\r
+\r
+                               value = node.attributes.map[internalName];\r
+                               if (value !== undef) {\r
+                                       // Set external name to internal value and remove internal\r
+                                       node.attr(name, value.length > 0 ? value : null);\r
+                                       node.attr(internalName, null);\r
+                               } else {\r
+                                       // No internal attribute found then convert the value we have in the DOM\r
+                                       value = node.attributes.map[name];\r
+\r
+                                       if (name === "style")\r
+                                               value = dom.serializeStyle(dom.parseStyle(value), node.name);\r
+                                       else if (urlConverter)\r
+                                               value = urlConverter.call(urlConverterScope, value, name, node.name);\r
+\r
+                                       node.attr(name, value.length > 0 ? value : null);\r
+                               }\r
+                       }\r
+               });\r
+\r
+               // Remove internal classes mceItem<..>\r
+               htmlParser.addAttributeFilter('class', function(nodes, name) {\r
+                       var i = nodes.length, node, value;\r
+\r
+                       while (i--) {\r
+                               node = nodes[i];\r
+                               value = node.attr('class').replace(/\s*mce(Item\w+|Selected)\s*/g, '');\r
+                               node.attr('class', value.length > 0 ? value : null);\r
+                       }\r
+               });\r
+\r
+               // Remove bookmark elements\r
+               htmlParser.addAttributeFilter('data-mce-type', function(nodes, name, args) {\r
+                       var i = nodes.length, node;\r
+\r
+                       while (i--) {\r
+                               node = nodes[i];\r
+\r
+                               if (node.attributes.map['data-mce-type'] === 'bookmark' && !args.cleanup)\r
+                                       node.remove();\r
+                       }\r
+               });\r
+\r
+               // Force script into CDATA sections and remove the mce- prefix also add comments around styles\r
+               htmlParser.addNodeFilter('script,style', function(nodes, name) {\r
+                       var i = nodes.length, node, value;\r
+\r
+                       function trim(value) {\r
+                               return value.replace(/(<!--\[CDATA\[|\]\]-->)/g, '\n')\r
+                                               .replace(/^[\r\n]*|[\r\n]*$/g, '')\r
+                                               .replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g, '')\r
+                                               .replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g, '');\r
+                       };\r
+\r
+                       while (i--) {\r
+                               node = nodes[i];\r
+                               value = node.firstChild ? node.firstChild.value : '';\r
+\r
+                               if (name === "script") {\r
+                                       // Remove mce- prefix from script elements\r
+                                       node.attr('type', (node.attr('type') || 'text/javascript').replace(/^mce\-/, ''));\r
+\r
+                                       if (value.length > 0)\r
+                                               node.firstChild.value = '// <![CDATA[\n' + trim(value) + '\n// ]]>';\r
+                               } else {\r
+                                       if (value.length > 0)\r
+                                               node.firstChild.value = '<!--\n' + trim(value) + '\n-->';\r
+                               }\r
+                       }\r
+               });\r
+\r
+               // Convert comments to cdata and handle protected comments\r
+               htmlParser.addNodeFilter('#comment', function(nodes, name) {\r
+                       var i = nodes.length, node;\r
+\r
+                       while (i--) {\r
+                               node = nodes[i];\r
+\r
+                               if (node.value.indexOf('[CDATA[') === 0) {\r
+                                       node.name = '#cdata';\r
+                                       node.type = 4;\r
+                                       node.value = node.value.replace(/^\[CDATA\[|\]\]$/g, '');\r
+                               } else if (node.value.indexOf('mce:protected ') === 0) {\r
+                                       node.name = "#text";\r
+                                       node.type = 3;\r
+                                       node.raw = true;\r
+                                       node.value = unescape(node.value).substr(14);\r
+                               }\r
+                       }\r
+               });\r
+\r
+               htmlParser.addNodeFilter('xml:namespace,input', function(nodes, name) {\r
+                       var i = nodes.length, node;\r
+\r
+                       while (i--) {\r
+                               node = nodes[i];\r
+                               if (node.type === 7)\r
+                                       node.remove();\r
+                               else if (node.type === 1) {\r
+                                       if (name === "input" && !("type" in node.attributes.map))\r
+                                               node.attr('type', 'text');\r
+                               }\r
+                       }\r
+               });\r
+\r
+               // Fix list elements, TODO: Replace this later\r
+               if (settings.fix_list_elements) {\r
+                       htmlParser.addNodeFilter('ul,ol', function(nodes, name) {\r
+                               var i = nodes.length, node, parentNode;\r
+\r
+                               while (i--) {\r
+                                       node = nodes[i];\r
+                                       parentNode = node.parent;\r
+\r
+                                       if (parentNode.name === 'ul' || parentNode.name === 'ol') {\r
+                                               if (node.prev && node.prev.name === 'li') {\r
+                                                       node.prev.append(node);\r
+                                               }\r
+                                       }\r
+                               }\r
+                       });\r
+               }\r
+\r
+               // Remove internal data attributes\r
+               htmlParser.addAttributeFilter('data-mce-src,data-mce-href,data-mce-style', function(nodes, name) {\r
+                       var i = nodes.length;\r
+\r
+                       while (i--) {\r
+                               nodes[i].attr(name, null);\r
+                       }\r
+               });\r
+\r
+               // Return public methods\r
+               return {\r
+                       schema : schema,\r
+\r
+                       addNodeFilter : htmlParser.addNodeFilter,\r
+\r
+                       addAttributeFilter : htmlParser.addAttributeFilter,\r
+\r
+                       onPreProcess : onPreProcess,\r
+\r
+                       onPostProcess : onPostProcess,\r
+\r
+                       serialize : function(node, args) {\r
+                               var impl, doc, oldDoc, htmlSerializer, content;\r
+\r
+                               // Explorer won't clone contents of script and style and the\r
+                               // selected index of select elements are cleared on a clone operation.\r
+                               if (isIE && dom.select('script,style,select,map').length > 0) {\r
+                                       content = node.innerHTML;\r
+                                       node = node.cloneNode(false);\r
+                                       dom.setHTML(node, content);\r
+                               } else\r
+                                       node = node.cloneNode(true);\r
+\r
+                               // Nodes needs to be attached to something in WebKit/Opera\r
+                               // Older builds of Opera crashes if you attach the node to an document created dynamically\r
+                               // and since we can't feature detect a crash we need to sniff the acutal build number\r
+                               // This fix will make DOM ranges and make Sizzle happy!\r
+                               impl = node.ownerDocument.implementation;\r
+                               if (impl.createHTMLDocument) {\r
+                                       // Create an empty HTML document\r
+                                       doc = impl.createHTMLDocument("");\r
+\r
+                                       // Add the element or it's children if it's a body element to the new document\r
+                                       each(node.nodeName == 'BODY' ? node.childNodes : [node], function(node) {\r
+                                               doc.body.appendChild(doc.importNode(node, true));\r
+                                       });\r
+\r
+                                       // Grab first child or body element for serialization\r
+                                       if (node.nodeName != 'BODY')\r
+                                               node = doc.body.firstChild;\r
+                                       else\r
+                                               node = doc.body;\r
+\r
+                                       // set the new document in DOMUtils so createElement etc works\r
+                                       oldDoc = dom.doc;\r
+                                       dom.doc = doc;\r
+                               }\r
+\r
+                               args = args || {};\r
+                               args.format = args.format || 'html';\r
+\r
+                               // Pre process\r
+                               if (!args.no_events) {\r
+                                       args.node = node;\r
+                                       onPreProcess.dispatch(self, args);\r
+                               }\r
+\r
+                               // Setup serializer\r
+                               htmlSerializer = new tinymce.html.Serializer(settings, schema);\r
+\r
+                               // Parse and serialize HTML\r
+                               args.content = htmlSerializer.serialize(\r
+                                       htmlParser.parse(args.getInner ? node.innerHTML : tinymce.trim(dom.getOuterHTML(node), args), args)\r
+                               );\r
+\r
+                               // Replace all BOM characters for now until we can find a better solution\r
+                               if (!args.cleanup)\r
+                                       args.content = args.content.replace(/\uFEFF/g, '');\r
+\r
+                               // Post process\r
+                               if (!args.no_events)\r
+                                       onPostProcess.dispatch(self, args);\r
+\r
+                               // Restore the old document if it was changed\r
+                               if (oldDoc)\r
+                                       dom.doc = oldDoc;\r
+\r
+                               args.node = null;\r
+\r
+                               return args.content;\r
+                       },\r
+\r
+                       addRules : function(rules) {\r
+                               schema.addValidElements(rules);\r
+                       },\r
+\r
+                       setRules : function(rules) {\r
+                               schema.setValidElements(rules);\r
+                       }\r
+               };\r
+       };\r
+})(tinymce);\r
+(function(tinymce) {\r
+       tinymce.dom.ScriptLoader = function(settings) {\r
+               var QUEUED = 0,\r
+                       LOADING = 1,\r
+                       LOADED = 2,\r
+                       states = {},\r
+                       queue = [],\r
+                       scriptLoadedCallbacks = {},\r
+                       queueLoadedCallbacks = [],\r
+                       loading = 0,\r
+                       undefined;\r
+\r
+               function loadScript(url, callback) {\r
+                       var t = this, dom = tinymce.DOM, elm, uri, loc, id;\r
+\r
+                       // Execute callback when script is loaded\r
+                       function done() {\r
+                               dom.remove(id);\r
+\r
+                               if (elm)\r
+                                       elm.onreadystatechange = elm.onload = elm = null;\r
+\r
+                               callback();\r
+                       };\r
+                       \r
+                       function error() {\r
+                               // Report the error so it's easier for people to spot loading errors\r
+                               if (typeof(console) !== "undefined" && console.log)\r
+                                       console.log("Failed to load: " + url);\r
+\r
+                               // We can't mark it as done if there is a load error since\r
+                               // A) We don't want to produce 404 errors on the server and\r
+                               // B) the onerror event won't fire on all browsers.\r
+                               // done();\r
+                       };\r
+\r
+                       id = dom.uniqueId();\r
+\r
+                       if (tinymce.isIE6) {\r
+                               uri = new tinymce.util.URI(url);\r
+                               loc = location;\r
+\r
+                               // If script is from same domain and we\r
+                               // use IE 6 then use XHR since it's more reliable\r
+                               if (uri.host == loc.hostname && uri.port == loc.port && (uri.protocol + ':') == loc.protocol && uri.protocol.toLowerCase() != 'file') {\r
+                                       tinymce.util.XHR.send({\r
+                                               url : tinymce._addVer(uri.getURI()),\r
+                                               success : function(content) {\r
+                                                       // Create new temp script element\r
+                                                       var script = dom.create('script', {\r
+                                                               type : 'text/javascript'\r
+                                                       });\r
+\r
+                                                       // Evaluate script in global scope\r
+                                                       script.text = content;\r
+                                                       document.getElementsByTagName('head')[0].appendChild(script);\r
+                                                       dom.remove(script);\r
+\r
+                                                       done();\r
+                                               },\r
+                                               \r
+                                               error : error\r
+                                       });\r
+\r
+                                       return;\r
+                               }\r
+                       }\r
+\r
+                       // Create new script element\r
+                       elm = dom.create('script', {\r
+                               id : id,\r
+                               type : 'text/javascript',\r
+                               src : tinymce._addVer(url)\r
+                       });\r
+\r
+                       // Add onload listener for non IE browsers since IE9\r
+                       // fires onload event before the script is parsed and executed\r
+                       if (!tinymce.isIE)\r
+                               elm.onload = done;\r
+\r
+                       // Add onerror event will get fired on some browsers but not all of them\r
+                       elm.onerror = error;\r
+\r
+                       // Opera 9.60 doesn't seem to fire the onreadystate event at correctly\r
+                       if (!tinymce.isOpera) {\r
+                               elm.onreadystatechange = function() {\r
+                                       var state = elm.readyState;\r
+\r
+                                       // Loaded state is passed on IE 6 however there\r
+                                       // are known issues with this method but we can't use\r
+                                       // XHR in a cross domain loading\r
+                                       if (state == 'complete' || state == 'loaded')\r
+                                               done();\r
+                               };\r
+                       }\r
+\r
+                       // Most browsers support this feature so we report errors\r
+                       // for those at least to help users track their missing plugins etc\r
+                       // todo: Removed since it produced error if the document is unloaded by navigating away, re-add it as an option\r
+                       /*elm.onerror = function() {\r
+                               alert('Failed to load: ' + url);\r
+                       };*/\r
+\r
+                       // Add script to document\r
+                       (document.getElementsByTagName('head')[0] || document.body).appendChild(elm);\r
+               };\r
+\r
+               this.isDone = function(url) {\r
+                       return states[url] == LOADED;\r
+               };\r
+\r
+               this.markDone = function(url) {\r
+                       states[url] = LOADED;\r
+               };\r
+\r
+               this.add = this.load = function(url, callback, scope) {\r
+                       var item, state = states[url];\r
+\r
+                       // Add url to load queue\r
+                       if (state == undefined) {\r
+                               queue.push(url);\r
+                               states[url] = QUEUED;\r
+                       }\r
+\r
+                       if (callback) {\r
+                               // Store away callback for later execution\r
+                               if (!scriptLoadedCallbacks[url])\r
+                                       scriptLoadedCallbacks[url] = [];\r
+\r
+                               scriptLoadedCallbacks[url].push({\r
+                                       func : callback,\r
+                                       scope : scope || this\r
+                               });\r
+                       }\r
+               };\r
+\r
+               this.loadQueue = function(callback, scope) {\r
+                       this.loadScripts(queue, callback, scope);\r
+               };\r
+\r
+               this.loadScripts = function(scripts, callback, scope) {\r
+                       var loadScripts;\r
+\r
+                       function execScriptLoadedCallbacks(url) {\r
+                               // Execute URL callback functions\r
+                               tinymce.each(scriptLoadedCallbacks[url], function(callback) {\r
+                                       callback.func.call(callback.scope);\r
+                               });\r
+\r
+                               scriptLoadedCallbacks[url] = undefined;\r
+                       };\r
+\r
+                       queueLoadedCallbacks.push({\r
+                               func : callback,\r
+                               scope : scope || this\r
+                       });\r
+\r
+                       loadScripts = function() {\r
+                               var loadingScripts = tinymce.grep(scripts);\r
+\r
+                               // Current scripts has been handled\r
+                               scripts.length = 0;\r
+\r
+                               // Load scripts that needs to be loaded\r
+                               tinymce.each(loadingScripts, function(url) {\r
+                                       // Script is already loaded then execute script callbacks directly\r
+                                       if (states[url] == LOADED) {\r
+                                               execScriptLoadedCallbacks(url);\r
+                                               return;\r
+                                       }\r
+\r
+                                       // Is script not loading then start loading it\r
+                                       if (states[url] != LOADING) {\r
+                                               states[url] = LOADING;\r
+                                               loading++;\r
+\r
+                                               loadScript(url, function() {\r
+                                                       states[url] = LOADED;\r
+                                                       loading--;\r
+\r
+                                                       execScriptLoadedCallbacks(url);\r
+\r
+                                                       // Load more scripts if they where added by the recently loaded script\r
+                                                       loadScripts();\r
+                                               });\r
+                                       }\r
+                               });\r
+\r
+                               // No scripts are currently loading then execute all pending queue loaded callbacks\r
+                               if (!loading) {\r
+                                       tinymce.each(queueLoadedCallbacks, function(callback) {\r
+                                               callback.func.call(callback.scope);\r
+                                       });\r
+\r
+                                       queueLoadedCallbacks.length = 0;\r
+                               }\r
+                       };\r
+\r
+                       loadScripts();\r
+               };\r
+       };\r
+\r
+       // Global script loader\r
+       tinymce.ScriptLoader = new tinymce.dom.ScriptLoader();\r
+})(tinymce);\r
+\r
+tinymce.dom.TreeWalker = function(start_node, root_node) {\r
+       var node = start_node;\r
+\r
+       function findSibling(node, start_name, sibling_name, shallow) {\r
+               var sibling, parent;\r
+\r
+               if (node) {\r
+                       // Walk into nodes if it has a start\r
+                       if (!shallow && node[start_name])\r
+                               return node[start_name];\r
+\r
+                       // Return the sibling if it has one\r
+                       if (node != root_node) {\r
+                               sibling = node[sibling_name];\r
+                               if (sibling)\r
+                                       return sibling;\r
+\r
+                               // Walk up the parents to look for siblings\r
+                               for (parent = node.parentNode; parent && parent != root_node; parent = parent.parentNode) {\r
+                                       sibling = parent[sibling_name];\r
+                                       if (sibling)\r
+                                               return sibling;\r
+                               }\r
+                       }\r
+               }\r
+       };\r
+\r
+       this.current = function() {\r
+               return node;\r
+       };\r
+\r
+       this.next = function(shallow) {\r
+               return (node = findSibling(node, 'firstChild', 'nextSibling', shallow));\r
+       };\r
+\r
+       this.prev = function(shallow) {\r
+               return (node = findSibling(node, 'lastChild', 'previousSibling', shallow));\r
+       };\r
+};\r
+\r
+(function(tinymce) {\r
+       tinymce.dom.RangeUtils = function(dom) {\r
+               var INVISIBLE_CHAR = '\uFEFF';\r
+\r
+               this.walk = function(rng, callback) {\r
+                       var startContainer = rng.startContainer,\r
+                               startOffset = rng.startOffset,\r
+                               endContainer = rng.endContainer,\r
+                               endOffset = rng.endOffset,\r
+                               ancestor, startPoint,\r
+                               endPoint, node, parent, siblings, nodes;\r
+\r
+                       // Handle table cell selection the table plugin enables\r
+                       // you to fake select table cells and perform formatting actions on them\r
+                       nodes = dom.select('td.mceSelected,th.mceSelected');\r
+                       if (nodes.length > 0) {\r
+                               tinymce.each(nodes, function(node) {\r
+                                       callback([node]);\r
+                               });\r
+\r
+                               return;\r
+                       }\r
+\r
+                       function collectSiblings(node, name, end_node) {\r
+                               var siblings = [];\r
+\r
+                               for (; node && node != end_node; node = node[name])\r
+                                       siblings.push(node);\r
+\r
+                               return siblings;\r
+                       };\r
+\r
+                       function findEndPoint(node, root) {\r
+                               do {\r
+                                       if (node.parentNode == root)\r
+                                               return node;\r
+\r
+                                       node = node.parentNode;\r
+                               } while(node);\r
+                       };\r
+\r
+                       function walkBoundary(start_node, end_node, next) {\r
+                               var siblingName = next ? 'nextSibling' : 'previousSibling';\r
+\r
+                               for (node = start_node, parent = node.parentNode; node && node != end_node; node = parent) {\r
+                                       parent = node.parentNode;\r
+                                       siblings = collectSiblings(node == start_node ? node : node[siblingName], siblingName);\r
+\r
+                                       if (siblings.length) {\r
+                                               if (!next)\r
+                                                       siblings.reverse();\r
+\r
+                                               callback(siblings);\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       // If index based start position then resolve it\r
+                       if (startContainer.nodeType == 1 && startContainer.hasChildNodes())\r
+                               startContainer = startContainer.childNodes[startOffset];\r
+\r
+                       // If index based end position then resolve it\r
+                       if (endContainer.nodeType == 1 && endContainer.hasChildNodes())\r
+                               endContainer = endContainer.childNodes[Math.min(endOffset - 1, endContainer.childNodes.length - 1)];\r
+\r
+                       // Find common ancestor and end points\r
+                       ancestor = dom.findCommonAncestor(startContainer, endContainer);\r
+\r
+                       // Same container\r
+                       if (startContainer == endContainer)\r
+                               return callback([startContainer]);\r
+\r
+                       // Process left side\r
+                       for (node = startContainer; node; node = node.parentNode) {\r
+                               if (node == endContainer)\r
+                                       return walkBoundary(startContainer, ancestor, true);\r
+\r
+                               if (node == ancestor)\r
+                                       break;\r
+                       }\r
+\r
+                       // Process right side\r
+                       for (node = endContainer; node; node = node.parentNode) {\r
+                               if (node == startContainer)\r
+                                       return walkBoundary(endContainer, ancestor);\r
+\r
+                               if (node == ancestor)\r
+                                       break;\r
+                       }\r
+\r
+                       // Find start/end point\r
+                       startPoint = findEndPoint(startContainer, ancestor) || startContainer;\r
+                       endPoint = findEndPoint(endContainer, ancestor) || endContainer;\r
+\r
+                       // Walk left leaf\r
+                       walkBoundary(startContainer, startPoint, true);\r
+\r
+                       // Walk the middle from start to end point\r
+                       siblings = collectSiblings(\r
+                               startPoint == startContainer ? startPoint : startPoint.nextSibling,\r
+                               'nextSibling',\r
+                               endPoint == endContainer ? endPoint.nextSibling : endPoint\r
+                       );\r
+\r
+                       if (siblings.length)\r
+                               callback(siblings);\r
+\r
+                       // Walk right leaf\r
+                       walkBoundary(endContainer, endPoint);\r
+               };\r
+\r
+               /*              this.split = function(rng) {\r
+                       var startContainer = rng.startContainer,\r
+                               startOffset = rng.startOffset,\r
+                               endContainer = rng.endContainer,\r
+                               endOffset = rng.endOffset;\r
+\r
+                       function splitText(node, offset) {\r
+                               if (offset == node.nodeValue.length)\r
+                                       node.appendData(INVISIBLE_CHAR);\r
+\r
+                               node = node.splitText(offset);\r
+\r
+                               if (node.nodeValue === INVISIBLE_CHAR)\r
+                                       node.nodeValue = '';\r
+\r
+                               return node;\r
+                       };\r
+\r
+                       // Handle single text node\r
+                       if (startContainer == endContainer) {\r
+                               if (startContainer.nodeType == 3) {\r
+                                       if (startOffset != 0)\r
+                                               startContainer = endContainer = splitText(startContainer, startOffset);\r
+\r
+                                       if (endOffset - startOffset != startContainer.nodeValue.length)\r
+                                               splitText(startContainer, endOffset - startOffset);\r
+                               }\r
+                       } else {\r
+                               // Split startContainer text node if needed\r
+                               if (startContainer.nodeType == 3 && startOffset != 0) {\r
+                                       startContainer = splitText(startContainer, startOffset);\r
+                                       startOffset = 0;\r
+                               }\r
+\r
+                               // Split endContainer text node if needed\r
+                               if (endContainer.nodeType == 3 && endOffset != endContainer.nodeValue.length) {\r
+                                       endContainer = splitText(endContainer, endOffset).previousSibling;\r
+                                       endOffset = endContainer.nodeValue.length;\r
+                               }\r
+                       }\r
+\r
+                       return {\r
+                               startContainer : startContainer,\r
+                               startOffset : startOffset,\r
+                               endContainer : endContainer,\r
+                               endOffset : endOffset\r
+                       };\r
+               };\r
+*/\r
+       };\r
+\r
+       tinymce.dom.RangeUtils.compareRanges = function(rng1, rng2) {\r
+               if (rng1 && rng2) {\r
+                       // Compare native IE ranges\r
+                       if (rng1.item || rng1.duplicate) {\r
+                               // Both are control ranges and the selected element matches\r
+                               if (rng1.item && rng2.item && rng1.item(0) === rng2.item(0))\r
+                                       return true;\r
+\r
+                               // Both are text ranges and the range matches\r
+                               if (rng1.isEqual && rng2.isEqual && rng2.isEqual(rng1))\r
+                                       return true;\r
+                       } else {\r
+                               // Compare w3c ranges\r
+                               return rng1.startContainer == rng2.startContainer && rng1.startOffset == rng2.startOffset;\r
+                       }\r
+               }\r
+\r
+               return false;\r
+       };\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var Event = tinymce.dom.Event, each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.ui.KeyboardNavigation', {\r
+               KeyboardNavigation: function(settings, dom) {\r
+                       var t = this, root = settings.root, items = settings.items,\r
+                                       enableUpDown = settings.enableUpDown, enableLeftRight = settings.enableLeftRight || !settings.enableUpDown,\r
+                                       excludeFromTabOrder = settings.excludeFromTabOrder,\r
+                                       itemFocussed, itemBlurred, rootKeydown, rootFocussed, focussedId;\r
+\r
+                       dom = dom || tinymce.DOM;\r
+\r
+                       itemFocussed = function(evt) {\r
+                               focussedId = evt.target.id;\r
+                       };\r
+                       \r
+                       itemBlurred = function(evt) {\r
+                               dom.setAttrib(evt.target.id, 'tabindex', '-1');\r
+                       };\r
+                       \r
+                       rootFocussed = function(evt) {\r
+                               var item = dom.get(focussedId);\r
+                               dom.setAttrib(item, 'tabindex', '0');\r
+                               item.focus();\r
+                       };\r
+                       \r
+                       t.focus = function() {\r
+                               dom.get(focussedId).focus();\r
+                       };\r
+\r
+                       t.destroy = function() {\r
+                               each(items, function(item) {\r
+                                       dom.unbind(dom.get(item.id), 'focus', itemFocussed);\r
+                                       dom.unbind(dom.get(item.id), 'blur', itemBlurred);\r
+                               });\r
+\r
+                               dom.unbind(dom.get(root), 'focus', rootFocussed);\r
+                               dom.unbind(dom.get(root), 'keydown', rootKeydown);\r
+\r
+                               items = dom = root = t.focus = itemFocussed = itemBlurred = rootKeydown = rootFocussed = null;\r
+                               t.destroy = function() {};\r
+                       };\r
+                       \r
+                       t.moveFocus = function(dir, evt) {\r
+                               var idx = -1, controls = t.controls, newFocus;\r
+\r
+                               if (!focussedId)\r
+                                       return;\r
+\r
+                               each(items, function(item, index) {\r
+                                       if (item.id === focussedId) {\r
+                                               idx = index;\r
+                                               return false;\r
+                                       }\r
+                               });\r
+\r
+                               idx += dir;\r
+                               if (idx < 0) {\r
+                                       idx = items.length - 1;\r
+                               } else if (idx >= items.length) {\r
+                                       idx = 0;\r
+                               }\r
+                               \r
+                               newFocus = items[idx];\r
+                               dom.setAttrib(focussedId, 'tabindex', '-1');\r
+                               dom.setAttrib(newFocus.id, 'tabindex', '0');\r
+                               dom.get(newFocus.id).focus();\r
+\r
+                               if (settings.actOnFocus) {\r
+                                       settings.onAction(newFocus.id);\r
+                               }\r
+\r
+                               if (evt)\r
+                                       Event.cancel(evt);\r
+                       };\r
+                       \r
+                       rootKeydown = function(evt) {\r
+                               var DOM_VK_LEFT = 37, DOM_VK_RIGHT = 39, DOM_VK_UP = 38, DOM_VK_DOWN = 40, DOM_VK_ESCAPE = 27, DOM_VK_ENTER = 14, DOM_VK_RETURN = 13, DOM_VK_SPACE = 32;\r
+                               \r
+                               switch (evt.keyCode) {\r
+                                       case DOM_VK_LEFT:\r
+                                               if (enableLeftRight) t.moveFocus(-1);\r
+                                               break;\r
+       \r
+                                       case DOM_VK_RIGHT:\r
+                                               if (enableLeftRight) t.moveFocus(1);\r
+                                               break;\r
+       \r
+                                       case DOM_VK_UP:\r
+                                               if (enableUpDown) t.moveFocus(-1);\r
+                                               break;\r
+\r
+                                       case DOM_VK_DOWN:\r
+                                               if (enableUpDown) t.moveFocus(1);\r
+                                               break;\r
+\r
+                                       case DOM_VK_ESCAPE:\r
+                                               if (settings.onCancel) {\r
+                                                       settings.onCancel();\r
+                                                       Event.cancel(evt);\r
+                                               }\r
+                                               break;\r
+\r
+                                       case DOM_VK_ENTER:\r
+                                       case DOM_VK_RETURN:\r
+                                       case DOM_VK_SPACE:\r
+                                               if (settings.onAction) {\r
+                                                       settings.onAction(focussedId);\r
+                                                       Event.cancel(evt);\r
+                                               }\r
+                                               break;\r
+                               }\r
+                       };\r
+\r
+                       // Set up state and listeners for each item.\r
+                       each(items, function(item, idx) {\r
+                               var tabindex;\r
+\r
+                               if (!item.id) {\r
+                                       item.id = dom.uniqueId('_mce_item_');\r
+                               }\r
+\r
+                               if (excludeFromTabOrder) {\r
+                                       dom.bind(item.id, 'blur', itemBlurred);\r
+                                       tabindex = '-1';\r
+                               } else {\r
+                                       tabindex = (idx === 0 ? '0' : '-1');\r
+                               }\r
+\r
+                               dom.setAttrib(item.id, 'tabindex', tabindex);\r
+                               dom.bind(dom.get(item.id), 'focus', itemFocussed);\r
+                       });\r
+                       \r
+                       // Setup initial state for root element.\r
+                       if (items[0]){\r
+                               focussedId = items[0].id;\r
+                       }\r
+\r
+                       dom.setAttrib(root, 'tabindex', '-1');\r
+                       \r
+                       // Setup listeners for root element.\r
+                       dom.bind(dom.get(root), 'focus', rootFocussed);\r
+                       dom.bind(dom.get(root), 'keydown', rootKeydown);\r
+               }\r
+       });\r
+})(tinymce);\r
+(function(tinymce) {\r
+       // Shorten class names\r
+       var DOM = tinymce.DOM, is = tinymce.is;\r
+\r
+       tinymce.create('tinymce.ui.Control', {\r
+               Control : function(id, s, editor) {\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
+                       this.editor = editor;\r
+               },\r
+               \r
+               setAriaProperty : function(property, value) {\r
+                       var element = DOM.get(this.id + '_aria') || DOM.get(this.id);\r
+                       if (element) {\r
+                               DOM.setAttrib(element, 'aria-' + property, !!value);\r
+                       }\r
+               },\r
+               \r
+               focus : function() {\r
+                       DOM.get(this.id).focus();\r
+               },\r
+\r
+               setDisabled : function(s) {\r
+                       if (s != this.disabled) {\r
+                               this.setAriaProperty('disabled', s);\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
+                               this.setAriaProperty('pressed', 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
+})(tinymce);\r
+tinymce.create('tinymce.ui.Container:tinymce.ui.Control', {\r
+       Container : function(id, s, editor) {\r
+               this.parent(id, s, editor);\r
+\r
+               this.controls = [];\r
+\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
+tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {\r
+       Separator : function(id, s) {\r
+               this.parent(id, s);\r
+               this.classPrefix = 'mceSeparator';\r
+               this.setDisabled(true);\r
+       },\r
+\r
+       renderHTML : function() {\r
+               return tinymce.DOM.createHTML('span', {'class' : this.classPrefix, role : 'separator', 'aria-orientation' : 'vertical', tabindex : '-1'});\r
+       }\r
+});\r
+\r
+(function(tinymce) {\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.setAriaProperty('checked', !!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
+})(tinymce);\r
+\r
+(function(tinymce) {\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
+})(tinymce);\r
+(function(tinymce) {\r
+       var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element;\r
+\r
+       tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', {\r
+               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
+\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
+                       s.keyboard_focus = cs.keyboard_focus;\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
+               focus : function() {\r
+                       var t = this;\r
+                       if (t.keyboardNav) {\r
+                               t.keyboardNav.focus();\r
+                       }\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, '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
+                       Event.add(co, 'keydown', t._keyHandler, t);\r
+\r
+                       t.onShowMenu.dispatch(t);\r
+\r
+                       if (s.keyboard_focus) { \r
+                               t._setupKeyboardNav(); \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
+                       if (t.keyboardNav) t.keyboardNav.destroy();\r
+                       Event.remove(co, 'mouseover', t.mouseOverFunc);\r
+                       Event.remove(co, '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
+                       if (t.keyboardNav) t.keyboardNav.destroy();\r
+                       Event.remove(co, 'mouseover', t.mouseOverFunc);\r
+                       Event.remove(DOM.select('a', co), 'focus', t.mouseOverFunc);\r
+                       Event.remove(co, 'click', t.mouseClickFunc);\r
+                       Event.remove(co, 'keydown', t._keyHandler);\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', {role: 'listbox', id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000;outline:0'});\r
+                       if (t.settings.parent) {\r
+                               DOM.setAttrib(w, 'aria-parent', 'menu_' + t.settings.parent.id);\r
+                       }\r
+                       co = DOM.add(w, 'div', {role: 'presentation', 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', {role: 'presentation', 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
+               _setupKeyboardNav : function(){\r
+                       var contextMenu, menuItems, t=this; \r
+                       contextMenu = DOM.select('#menu_' + t.id)[0];\r
+                       menuItems = DOM.select('a[role=option]', 'menu_' + t.id);\r
+                       menuItems.splice(0,0,contextMenu);\r
+                       t.keyboardNav = new tinymce.ui.KeyboardNavigation({\r
+                               root: 'menu_' + t.id,\r
+                               items: menuItems,\r
+                               onCancel: function() {\r
+                                       t.hideMenu();\r
+                               },\r
+                               enableUpDown: true\r
+                       });\r
+                       contextMenu.focus();\r
+               },\r
+\r
+               _keyHandler : function(evt) {\r
+                       var t = this, e;\r
+                       switch (evt.keyCode) {\r
+                               case 37: // Left\r
+                                       if (t.settings.parent) {\r
+                                               t.hideMenu();\r
+                                               t.settings.parent.focus();\r
+                                               Event.cancel(evt);\r
+                                       }\r
+                                       break;\r
+                               case 39: // Right\r
+                                       if (t.mouseOverFunc)\r
+                                               t.mouseOverFunc(evt);\r
+                                       break;\r
+                       }\r
+               },\r
+\r
+               _add : function(tb, o) {\r
+                       var n, s = o.settings, a, ro, it, cp = this.classPrefix, ic;\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, s.titleItem ? 'th' : 'td');\r
+                       n = a = DOM.add(n, 'a', {id: o.id + '_aria',  role: s.titleItem ? 'presentation' : 'option', href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'});\r
+\r
+                       if (s.parent) {\r
+                               DOM.setAttrib(a, 'aria-haspopup', 'true');\r
+                               DOM.setAttrib(a, 'aria-owns', 'menu_' + o.id);\r
+                       }\r
+\r
+                       DOM.addClass(it, s['class']);\r
+//                     n = DOM.add(n, 'span', {'class' : 'item'});\r
+\r
+                       ic = DOM.add(n, 'span', {'class' : 'mceIcon' + (s.icon ? ' mce_' + s.icon : '')});\r
+\r
+                       if (s.icon_src)\r
+                               DOM.add(ic, 'img', {src : s.icon_src});\r
+\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
+})(tinymce);\r
+(function(tinymce) {\r
+       var DOM = tinymce.DOM;\r
+\r
+       tinymce.create('tinymce.ui.Button:tinymce.ui.Control', {\r
+               Button : function(id, s, ed) {\r
+                       this.parent(id, s, ed);\r
+                       this.classPrefix = 'mceButton';\r
+               },\r
+\r
+               renderHTML : function() {\r
+                       var cp = this.classPrefix, s = this.settings, h, l;\r
+\r
+                       l = DOM.encode(s.label || '');\r
+                       h = '<a role="button" id="' + this.id + '" href="javascript:;" class="' + cp + ' ' + cp + 'Enabled ' + s['class'] + (l ? ' ' + cp + 'Labeled' : '') +'" onmousedown="return false;" onclick="return false;" aria-labelledby="' + this.id + '_voice" title="' + DOM.encode(s.title) + '">';\r
+                       if (s.image && !(this.editor  &&this.editor.forcedHighContrastMode) )\r
+                               h += '<img class="mceIcon" src="' + s.image + '" alt="' + DOM.encode(s.title) + '" />' + l;\r
+                       else\r
+                               h += '<span class="mceIcon ' + s['class'] + '"></span>' + (l ? '<span class="' + cp + 'Label">' + l + '</span>' : '');\r
+\r
+                       h += '<span class="mceVoiceLabel mceIconOnly" style="display: none;" id="' + this.id + '_voice">' + s.title + '</span>'; \r
+                       h += '</a>';\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
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;\r
+\r
+       tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', {\r
+               ListBox : function(id, s, ed) {\r
+                       var t = this;\r
+\r
+                       t.parent(id, s, ed);\r
+\r
+                       t.items = [];\r
+\r
+                       t.onChange = new Dispatcher(t);\r
+\r
+                       t.onPostRender = new Dispatcher(t);\r
+\r
+                       t.onAdd = new Dispatcher(t);\r
+\r
+                       t.onRenderMenu = new tinymce.util.Dispatcher(this);\r
+\r
+                       t.classPrefix = 'mceListBox';\r
+               },\r
+\r
+               select : function(va) {\r
+                       var t = this, fv, f;\r
+\r
+                       if (va == undefined)\r
+                               return t.selectByIndex(-1);\r
+\r
+                       // Is string or number make function selector\r
+                       if (va && va.call)\r
+                               f = va;\r
+                       else {\r
+                               f = function(v) {\r
+                                       return v == va;\r
+                               };\r
+                       }\r
+\r
+                       // Do we need to do something?\r
+                       if (va != t.selectedValue) {\r
+                               // Find item\r
+                               each(t.items, function(o, i) {\r
+                                       if (f(o.value)) {\r
+                                               fv = 1;\r
+                                               t.selectByIndex(i);\r
+                                               return false;\r
+                                       }\r
+                               });\r
+\r
+                               if (!fv)\r
+                                       t.selectByIndex(-1);\r
+                       }\r
+               },\r
+\r
+               selectByIndex : function(idx) {\r
+                       var t = this, e, o;\r
+\r
+                       if (idx != t.selectedIndex) {\r
+                               e = DOM.get(t.id + '_text');\r
+                               o = t.items[idx];\r
+\r
+                               if (o) {\r
+                                       t.selectedValue = o.value;\r
+                                       t.selectedIndex = idx;\r
+                                       DOM.setHTML(e, DOM.encode(o.title));\r
+                                       DOM.removeClass(e, 'mceTitle');\r
+                                       DOM.setAttrib(t.id, 'aria-valuenow', o.title);\r
+                               } else {\r
+                                       DOM.setHTML(e, DOM.encode(t.settings.title));\r
+                                       DOM.addClass(e, 'mceTitle');\r
+                                       t.selectedValue = t.selectedIndex = null;\r
+                                       DOM.setAttrib(t.id, 'aria-valuenow', t.settings.title);\r
+                               }\r
+                               e = 0;\r
+                       }\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 = '<span role="button" aria-haspopup="true" aria-labelledby="' + t.id +'_text" aria-describedby="' + t.id + '_voiceDesc"><table role="presentation" tabindex="0" id="' + t.id + '" cellpadding="0" cellspacing="0" class="' + cp + ' ' + cp + 'Enabled' + (s['class'] ? (' ' + s['class']) : '') + '"><tbody><tr>';\r
+                       h += '<td>' + DOM.createHTML('span', {id: t.id + '_voiceDesc', 'class': 'voiceLabel', style:'display:none;'}, t.settings.title); \r
+                       h += DOM.createHTML('a', {id : t.id + '_text', tabindex : -1, 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 style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span></span>') + '</td>';\r
+                       h += '</tr></tbody></table></span>';\r
+\r
+                       return h;\r
+               },\r
+\r
+               showMenu : function() {\r
+                       var t = this, p2, e = DOM.get(this.id), m;\r
+\r
+                       if (t.isDisabled() || t.items.length == 0)\r
+                               return;\r
+\r
+                       if (t.menu && t.menu.isMenuVisible)\r
+                               return t.hideMenu();\r
+\r
+                       if (!t.isMenuRendered) {\r
+                               t.renderMenu();\r
+                               t.isMenuRendered = true;\r
+                       }\r
+\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 = !tinymce.isOpera; // Opera is buggy when it comes to auto focus\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
+                       //DOM.get(t.id + '_text').focus();\r
+               },\r
+\r
+               hideMenu : function(e) {\r
+                       var t = this;\r
+\r
+                       if (t.menu && t.menu.isMenuVisible) {\r
+                               DOM.removeClass(t.id, t.classPrefix + 'Selected');\r
+\r
+                               // Prevent double toogles by canceling the mouse click event to the button\r
+                               if (e && e.type == "mousedown" && (e.target.id == t.id + '_text' || e.target.id == t.id + '_open'))\r
+                                       return;\r
+\r
+                               if (!e || !DOM.getParent(e.target, '.mceMenu')) {\r
+                                       DOM.removeClass(t.id, t.classPrefix + 'Selected');\r
+                                       Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);\r
+                                       t.menu.hideMenu();\r
+                               }\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(function() {\r
+                               t.hideMenu();\r
+                               t.focus();\r
+                       });\r
+\r
+                       m.add({\r
+                               title : t.settings.title,\r
+                               'class' : 'mceMenuItemTitle',\r
+                               onclick : function() {\r
+                                       if (t.settings.onselect('') !== false)\r
+                                               t.select(''); // Must be runned after\r
+                               }\r
+                       });\r
+\r
+                       each(t.items, function(o) {\r
+                               // No value then treat it as a title\r
+                               if (o.value === undefined) {\r
+                                       m.add({\r
+                                               title : o.title,\r
+                                               'class' : 'mceMenuItemTitle',\r
+                                               onclick : function() {\r
+                                                       if (t.settings.onselect('') !== false)\r
+                                                               t.select(''); // Must be runned after\r
+                                               }\r
+                                       });\r
+                               } else {\r
+                                       o.id = DOM.uniqueId();\r
+                                       o.onclick = function() {\r
+                                               if (t.settings.onselect(o.value) !== false)\r
+                                                       t.select(o.value); // Must be runned after\r
+                                       };\r
+\r
+                                       m.add(o);\r
+                               }\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, 'keydown', function(evt) {\r
+                               if (evt.keyCode == 32) { // Space\r
+                                       t.showMenu(evt);\r
+                                       Event.cancel(evt);\r
+                               }\r
+                       });\r
+                       Event.add(t.id, 'focus', function() {\r
+                               if (!t._focused) {\r
+                                       t.keyDownHandler = Event.add(t.id, 'keydown', function(e) {\r
+                                               if (e.keyCode == 40) {\r
+                                                       t.showMenu();\r
+                                                       Event.cancel(e);\r
+                                               }\r
+                                       });\r
+                                       t.keyPressHandler = Event.add(t.id, 'keypress', function(e) {\r
+                                               var v;\r
+                                               if (e.keyCode == 13) {\r
+                                                       // Fake select on enter\r
+                                                       v = t.selectedValue;\r
+                                                       t.selectedValue = null; // Needs to be null to fake change\r
+                                                       Event.cancel(e);\r
+                                                       t.settings.onselect(v);\r
+                                               }\r
+                                       });\r
+                               }\r
+\r
+                               t._focused = 1;\r
+                       });\r
+                       Event.add(t.id, 'blur', function() {\r
+                               Event.remove(t.id, 'keydown', t.keyDownHandler);\r
+                               Event.remove(t.id, 'keypress', t.keyPressHandler);\r
+                               t._focused = 0;\r
+                       });\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
+                       Event.clear(this.id + '_open');\r
+               }\r
+       });\r
+})(tinymce);\r
+(function(tinymce) {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;\r
+\r
+       tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', {\r
+               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
+                       this.setAriaProperty('disabled', s);\r
+               },\r
+\r
+               isDisabled : function() {\r
+                       return DOM.get(this.id).disabled;\r
+               },\r
+\r
+               select : function(va) {\r
+                       var t = this, fv, f;\r
+\r
+                       if (va == undefined)\r
+                               return t.selectByIndex(-1);\r
+\r
+                       // Is string or number make function selector\r
+                       if (va && va.call)\r
+                               f = va;\r
+                       else {\r
+                               f = function(v) {\r
+                                       return v == va;\r
+                               };\r
+                       }\r
+\r
+                       // Do we need to do something?\r
+                       if (va != t.selectedValue) {\r
+                               // Find item\r
+                               each(t.items, function(o, i) {\r
+                                       if (f(o.value)) {\r
+                                               fv = 1;\r
+                                               t.selectByIndex(i);\r
+                                               return false;\r
+                                       }\r
+                               });\r
+\r
+                               if (!fv)\r
+                                       t.selectByIndex(-1);\r
+                       }\r
+               },\r
+\r
+               selectByIndex : function(idx) {\r
+                       DOM.get(this.id).selectedIndex = idx + 1;\r
+                       this.selectedValue = this.items[idx] ? this.items[idx].value : null;\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 this.items.length;\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', 'aria-labelledby': t.id + '_aria'}, h);\r
+                       h += DOM.createHTML('span', {id : t.id + '_aria', 'style': 'display: none'}, t.settings.title);\r
+                       return h;\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this, ch, changeListenerAdded = true;\r
+\r
+                       t.rendered = true;\r
+\r
+                       function onChange(e) {\r
+                               var v = t.items[e.target.selectedIndex - 1];\r
+\r
+                               if (v && (v = v.value)) {\r
+                                       t.onChange.dispatch(t, v);\r
+\r
+                                       if (t.settings.onselect)\r
+                                               t.settings.onselect(v);\r
+                               }\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
+                               changeListenerAdded = false;\r
+\r
+                               bf = Event.add(t.id, 'blur', function() {\r
+                                       if (changeListenerAdded) return;\r
+                                       changeListenerAdded = true;\r
+                                       Event.add(t.id, 'change', onChange);\r
+                                       Event.remove(t.id, 'blur', bf);\r
+                               });\r
+\r
+                               //prevent default left and right keys on chrome - so that the keyboard navigation is used.\r
+                               if (tinymce.isWebKit && (e.keyCode==37 ||e.keyCode==39)) {\r
+                                       return Event.prevent(e);\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
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', {\r
+               MenuButton : function(id, s, ed) {\r
+                       this.parent(id, s, ed);\r
+\r
+                       this.onRenderMenu = new tinymce.util.Dispatcher(this);\r
+\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
+                       if (t.isMenuVisible)\r
+                               return t.hideMenu();\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
+                       t.isMenuVisible = 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(function() {\r
+                               t.hideMenu();\r
+                               t.focus();\r
+                       });\r
+\r
+                       t.onRenderMenu.dispatch(t, m);\r
+                       t.menu = m;\r
+               },\r
+\r
+               hideMenu : function(e) {\r
+                       var t = this;\r
+\r
+                       // Prevent double toogles by canceling the mouse click event to the button\r
+                       if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id || e.id === t.id + '_open';}))\r
+                               return;\r
+\r
+                       if (!e || !DOM.getParent(e.target, '.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
+                       t.isMenuVisible = 0;\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
+})(tinymce);\r
+\r
+(function(tinymce) {\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, ed) {\r
+                       this.parent(id, s, ed);\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, role: 'presentation', 'class' : 'mceAction ' + s['class']});\r
+                       else\r
+                               h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, '');\r
+\r
+                       h1 += DOM.createHTML('span', {'class': 'mceVoiceLabel mceIconOnly', id: t.id + '_voice', style: 'display:none;'}, s.title);\r
+                       h += '<td >' + DOM.createHTML('a', {role: 'button', id : t.id + '_action', tabindex: '-1', 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']}, '<span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span>');\r
+                       h += '<td >' + DOM.createHTML('a', {role: 'button', id : t.id + '_open', tabindex: '-1', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>';\r
+\r
+                       h += '</tr></tbody>';\r
+                       h = DOM.createHTML('table', {id : t.id, role: 'presentation', tabindex: '0',  'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', title : s.title}, h);\r
+                       return DOM.createHTML('span', {role: 'button', 'aria-labelledby': t.id + '_voice', 'aria-haspopup': 'true'}, h);\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this, s = t.settings, activate;\r
+\r
+                       if (s.onclick) {\r
+                               activate = function(evt) {\r
+                                       if (!t.isDisabled()) {\r
+                                               s.onclick(t.value);\r
+                                               Event.cancel(evt);\r
+                                       }\r
+                               };\r
+                               Event.add(t.id + '_action', 'click', activate);\r
+                               Event.add(t.id, ['click', 'keydown'], function(evt) {\r
+                                       var DOM_VK_SPACE = 32, DOM_VK_ENTER = 14, DOM_VK_RETURN = 13, DOM_VK_UP = 38, DOM_VK_DOWN = 40;\r
+                                       if ((evt.keyCode === 32 || evt.keyCode === 13 || evt.keyCode === 14) && !evt.altKey && !evt.ctrlKey && !evt.metaKey) {\r
+                                               activate();\r
+                                               Event.cancel(evt);\r
+                                       } else if (evt.type === 'click' || evt.keyCode === DOM_VK_DOWN) {\r
+                                               t.showMenu();\r
+                                               Event.cancel(evt);\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       Event.add(t.id + '_open', 'click', function (evt) {\r
+                               t.showMenu();\r
+                               Event.cancel(evt);\r
+                       });\r
+                       Event.add([t.id, t.id + '_open'], 'focus', function() {t._focused = 1;});\r
+                       Event.add([t.id, 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
+                       Event.clear(this.id);\r
+               }\r
+       });\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton', {\r
+               ColorSplitButton : function(id, s, ed) {\r
+                       var t = this;\r
+\r
+                       t.parent(id, s, ed);\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.onShowMenu = new tinymce.util.Dispatcher(t);\r
+\r
+                       t.onHideMenu = new tinymce.util.Dispatcher(t);\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
+                       if (t.isMenuVisible)\r
+                               return t.hideMenu();\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
+                       t.onShowMenu.dispatch(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
+                       t.isMenuVisible = 1;\r
+               },\r
+\r
+               hideMenu : function(e) {\r
+                       var t = this;\r
+\r
+                       if (t.isMenuVisible) {\r
+                               // Prevent double toogles by canceling the mouse click event to the button\r
+                               if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id + '_open';}))\r
+                                       return;\r
+\r
+                               if (!e || !DOM.getParent(e.target, '.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
+                               t.isMenuVisible = 0;\r
+                               t.onHideMenu.dispatch();\r
+                       }\r
+               },\r
+\r
+               renderMenu : function() {\r
+                       var t = this, m, i = 0, s = t.settings, n, tb, tr, w, context;\r
+\r
+                       w = DOM.add(s.menu_container, 'div', {role: 'listbox', 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', {role: 'presentation', '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
+                               n = DOM.add(n, 'a', {\r
+                                       role : 'option',\r
+                                       href : 'javascript:;',\r
+                                       style : {\r
+                                               backgroundColor : '#' + c\r
+                                       },\r
+                                       'title': t.editor.getLang('colors.' + c, c),\r
+                                       'data-mce-color' : '#' + c\r
+                               });\r
+\r
+                               if (t.editor.forcedHighContrastMode) {\r
+                                       n = DOM.add(n, 'canvas', { width: 16, height: 16, 'aria-hidden': 'true' });\r
+                                       if (n.getContext && (context = n.getContext("2d"))) {\r
+                                               context.fillStyle = '#' + c;\r
+                                               context.fillRect(0, 0, 16, 16);\r
+                                       } else {\r
+                                               // No point leaving a canvas element around if it's not supported for drawing on anyway.\r
+                                               DOM.remove(n);\r
+                                       }\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', {role: 'option', 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
+                       new tinymce.ui.KeyboardNavigation({\r
+                               root: t.id + '_menu',\r
+                               items: DOM.select('a', t.id + '_menu'),\r
+                               onCancel: function() {\r
+                                       t.hideMenu();\r
+                                       t.focus();\r
+                               }\r
+                       });\r
+\r
+                       // Prevent IE from scrolling and hindering click to occur #4019\r
+                       Event.add(t.id + '_menu', 'mousedown', function(e) {return Event.cancel(e);});\r
+\r
+                       Event.add(t.id + '_menu', 'click', function(e) {\r
+                               var c;\r
+\r
+                               e = DOM.getParent(e.target, 'a', tb);\r
+\r
+                               if (e && e.nodeName.toLowerCase() == 'a' && (c = e.getAttribute('data-mce-color')))\r
+                                       t.setColor(c);\r
+\r
+                               return Event.cancel(e); // Prevent IE auto save warning\r
+                       });\r
+\r
+                       return w;\r
+               },\r
+\r
+               setColor : function(c) {\r
+                       this.displayColor(c);\r
+                       this.hideMenu();\r
+                       this.settings.onselect(c);\r
+               },\r
+               \r
+               displayColor : function(c) {\r
+                       var t = this;\r
+\r
+                       DOM.setStyle(t.id + '_preview', 'backgroundColor', c);\r
+\r
+                       t.value = 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
+                       DOM.setStyle(t.id + '_preview', 'backgroundColor', t.value);\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
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+// Shorten class names\r
+var dom = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event;\r
+tinymce.create('tinymce.ui.ToolbarGroup:tinymce.ui.Container', {\r
+       renderHTML : function() {\r
+               var t = this, h = [], controls = t.controls, each = tinymce.each, settings = t.settings;\r
+\r
+               h.push('<div id="' + t.id + '" role="group" aria-labelledby="' + t.id + '_voice">');\r
+               //TODO: ACC test this out - adding a role = application for getting the landmarks working well.\r
+               h.push("<span role='application'>");\r
+               h.push('<span id="' + t.id + '_voice" class="mceVoiceLabel" style="display:none;">' + dom.encode(settings.name) + '</span>');\r
+               each(controls, function(toolbar) {\r
+                       h.push(toolbar.renderHTML());\r
+               });\r
+               h.push("</span>");\r
+               h.push('</div>');\r
+\r
+               return h.join('');\r
+       },\r
+       \r
+       focus : function() {\r
+               this.keyNav.focus();\r
+       },\r
+       \r
+       postRender : function() {\r
+               var t = this, items = [];\r
+\r
+               each(t.controls, function(toolbar) {\r
+                       each (toolbar.controls, function(control) {\r
+                               if (control.id) {\r
+                                       items.push(control);\r
+                               }\r
+                       });\r
+               });\r
+\r
+               t.keyNav = new tinymce.ui.KeyboardNavigation({\r
+                       root: t.id,\r
+                       items: items,\r
+                       onCancel: function() {\r
+                               t.editor.focus();\r
+                       },\r
+                       excludeFromTabOrder: !t.settings.tab_focus_toolbar\r
+               });\r
+       },\r
+       \r
+       destroy : function() {\r
+               var self = this;\r
+\r
+               self.parent();\r
+               self.keyNav.destroy();\r
+               Event.clear(self.id);\r
+       }\r
+});\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+// Shorten class names\r
+var dom = tinymce.DOM, each = tinymce.each;\r
+tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {\r
+       renderHTML : function() {\r
+               var t = this, h = '', c, co, 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 || '', role: 'presentation', tabindex: '-1'}, '<tbody><tr>' + h + '</tr></tbody>');\r
+       }\r
+});\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.AddOnManager', {\r
+               AddOnManager : function() {\r
+                       var self = this;\r
+\r
+                       self.items = [];\r
+                       self.urls = {};\r
+                       self.lookup = {};\r
+                       self.onAdd = new Dispatcher(self);\r
+               },\r
+\r
+               get : function(n) {\r
+                       if (this.lookup[n]) {\r
+                               return this.lookup[n].instance;\r
+                       } else {\r
+                               return undefined;\r
+                       }\r
+               },\r
+\r
+               dependencies : function(n) {\r
+                       var result;\r
+                       if (this.lookup[n]) {\r
+                               result = this.lookup[n].dependencies;\r
+                       }\r
+                       return result || [];\r
+               },\r
+\r
+               requireLangPack : function(n) {\r
+                       var s = tinymce.settings;\r
+\r
+                       if (s && s.language && s.language_load !== false)\r
+                               tinymce.ScriptLoader.add(this.urls[n] + '/langs/' + s.language + '.js');\r
+               },\r
+\r
+               add : function(id, o, dependencies) {\r
+                       this.items.push(o);\r
+                       this.lookup[id] = {instance:o, dependencies:dependencies};\r
+                       this.onAdd.dispatch(this, id, o);\r
+\r
+                       return o;\r
+               },\r
+               createUrl: function(baseUrl, dep) {\r
+                       if (typeof dep === "object") {\r
+                               return dep\r
+                       } else {\r
+                               return {prefix: baseUrl.prefix, resource: dep, suffix: baseUrl.suffix};\r
+                       }\r
+               },\r
+\r
+               addComponents: function(pluginName, scripts) {\r
+                       var pluginUrl = this.urls[pluginName];\r
+                       tinymce.each(scripts, function(script){\r
+                               tinymce.ScriptLoader.add(pluginUrl+"/"+script); \r
+                       });\r
+               },\r
+\r
+               load : function(n, u, cb, s) {\r
+                       var t = this, url = u;\r
+\r
+                       function loadDependencies() {\r
+                               var dependencies = t.dependencies(n);\r
+                               tinymce.each(dependencies, function(dep) {\r
+                                       var newUrl = t.createUrl(u, dep);\r
+                                       t.load(newUrl.resource, newUrl, undefined, undefined);\r
+                               });\r
+                               if (cb) {\r
+                                       if (s) {\r
+                                               cb.call(s);\r
+                                       } else {\r
+                                               cb.call(tinymce.ScriptLoader);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       if (t.urls[n])\r
+                               return;\r
+                       if (typeof u === "object")\r
+                               url = u.prefix + u.resource + u.suffix;\r
+\r
+                       if (url.indexOf('/') != 0 && url.indexOf('://') == -1)\r
+                               url = tinymce.baseURL + '/' + url;\r
+\r
+                       t.urls[n] = url.substring(0, url.lastIndexOf('/'));\r
+\r
+                       if (t.lookup[n]) {\r
+                               loadDependencies();\r
+                       } else {\r
+                               tinymce.ScriptLoader.add(url, loadDependencies, s);\r
+                       }\r
+               }\r
+       });\r
+\r
+       // Create plugin and theme managers\r
+       tinymce.PluginManager = new tinymce.AddOnManager();\r
+       tinymce.ThemeManager = new tinymce.AddOnManager();\r
+}(tinymce));\r
+\r
+(function(tinymce) {\r
+       // Shorten names\r
+       var each = tinymce.each, extend = tinymce.extend,\r
+               DOM = tinymce.DOM, Event = tinymce.dom.Event,\r
+               ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager,\r
+               explode = tinymce.explode,\r
+               Dispatcher = tinymce.util.Dispatcher, undefined, instanceCounter = 0;\r
+\r
+       // Setup some URLs where the editor API is located and where the document is\r
+       tinymce.documentBaseURL = window.location.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');\r
+       if (!/[\/\\]$/.test(tinymce.documentBaseURL))\r
+               tinymce.documentBaseURL += '/';\r
+\r
+       tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);\r
+\r
+       tinymce.baseURI = new tinymce.util.URI(tinymce.baseURL);\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
+       tinymce.onBeforeUnload = new Dispatcher(tinymce);\r
+\r
+       // Must be on window or IE will leak if the editor is placed in frame or iframe\r
+       Event.add(window, 'beforeunload', function(e) {\r
+               tinymce.onBeforeUnload.dispatch(tinymce, e);\r
+       });\r
+\r
+       tinymce.onAddEditor = new Dispatcher(tinymce);\r
+\r
+       tinymce.onRemoveEditor = new Dispatcher(tinymce);\r
+\r
+       tinymce.EditorManager = extend(tinymce, {\r
+               editors : [],\r
+\r
+               i18n : {},\r
+\r
+               activeEditor : null,\r
+\r
+               init : function(s) {\r
+                       var t = this, pl, sl = tinymce.ScriptLoader, e, el = [], ed;\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
+                       }, s);\r
+\r
+                       t.settings = s;\r
+\r
+                       // Legacy call\r
+                       Event.add(document, 'init', function() {\r
+                               var l, co;\r
+\r
+                               execCallback(s, 'onpageload');\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
+                                                                       ed = new tinymce.Editor(v, s);\r
+                                                                       el.push(ed);\r
+                                                                       ed.render(1);\r
+                                                               } else {\r
+                                                                       each(document.forms, function(f) {\r
+                                                                               each(f.elements, function(e) {\r
+                                                                                       if (e.name === v) {\r
+                                                                                               v = 'mce_editor_' + instanceCounter++;\r
+                                                                                               DOM.setAttrib(e, 'id', v);\r
+\r
+                                                                                               ed = new tinymce.Editor(v, s);\r
+                                                                                               el.push(ed);\r
+                                                                                               ed.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 c.constructor === RegExp ? c.test(n.className) : DOM.hasClass(n, c);\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
+                                                               // Can we use the name\r
+                                                               e = DOM.get(v.name);\r
+                                                               if (!v.id && !e)\r
+                                                                       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
+                                                               ed = new tinymce.Editor(v.id, s);\r
+                                                               el.push(ed);\r
+                                                               ed.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(el, 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
+                       if (id === undefined)\r
+                               return this.editors;\r
+\r
+                       return this.editors[id];\r
+               },\r
+\r
+               getInstanceById : function(id) {\r
+                       return this.get(id);\r
+               },\r
+\r
+               add : function(editor) {\r
+                       var self = this, editors = self.editors;\r
+\r
+                       // Add named and index editor instance\r
+                       editors[editor.id] = editor;\r
+                       editors.push(editor);\r
+\r
+                       self._setActive(editor);\r
+                       self.onAddEditor.dispatch(self, editor);\r
+\r
+\r
+                       return editor;\r
+               },\r
+\r
+               remove : function(editor) {\r
+                       var t = this, i, editors = t.editors;\r
+\r
+                       // Not in the collection\r
+                       if (!editors[editor.id])\r
+                               return null;\r
+\r
+                       delete editors[editor.id];\r
+\r
+                       for (i = 0; i < editors.length; i++) {\r
+                               if (editors[i] == editor) {\r
+                                       editors.splice(i, 1);\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       // Select another editor since the active one was removed\r
+                       if (t.activeEditor == editor)\r
+                               t._setActive(editors[0]);\r
+\r
+                       editor.destroy();\r
+                       t.onRemoveEditor.dispatch(t, editor);\r
+\r
+                       return editor;\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
+                                       if (!t.get(v))\r
+                                               new tinymce.Editor(v, t.settings).render();\r
+\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
+                                       if (ed)\r
+                                               ed.remove();\r
+\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(editor) {\r
+                       this.selectedInstance = this.activeEditor = editor;\r
+               }\r
+       });\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       // Shorten these names\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend,\r
+               Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isGecko = tinymce.isGecko,\r
+               isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, is = tinymce.is,\r
+               ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager,\r
+               inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode;\r
+\r
+       tinymce.create('tinymce.Editor', {\r
+               Editor : function(id, s) {\r
+                       var t = this;\r
+\r
+                       t.id = t.editorId = id;\r
+\r
+                       t.execCommands = {};\r
+                       t.queryStateCommands = {};\r
+                       t.queryValueCommands = {};\r
+\r
+                       t.isNotDirty = false;\r
+\r
+                       t.plugins = {};\r
+\r
+                       // Add events to the editor\r
+                       each([\r
+                               'onPreInit',\r
+\r
+                               'onBeforeRenderUI',\r
+\r
+                               'onPostRender',\r
+\r
+                               'onInit',\r
+\r
+                               'onRemove',\r
+\r
+                               'onActivate',\r
+\r
+                               'onDeactivate',\r
+\r
+                               'onClick',\r
+\r
+                               'onEvent',\r
+\r
+                               'onMouseUp',\r
+\r
+                               'onMouseDown',\r
+\r
+                               'onDblClick',\r
+\r
+                               'onKeyDown',\r
+\r
+                               'onKeyUp',\r
+\r
+                               'onKeyPress',\r
+\r
+                               'onContextMenu',\r
+\r
+                               'onSubmit',\r
+\r
+                               'onReset',\r
+\r
+                               'onPaste',\r
+\r
+                               'onPreProcess',\r
+\r
+                               'onPostProcess',\r
+\r
+                               'onBeforeSetContent',\r
+\r
+                               'onBeforeGetContent',\r
+\r
+                               'onSetContent',\r
+\r
+                               'onGetContent',\r
+\r
+                               'onLoadContent',\r
+\r
+                               'onSaveContent',\r
+\r
+                               'onNodeChange',\r
+\r
+                               'onChange',\r
+\r
+                               'onBeforeExecCommand',\r
+\r
+                               'onExecCommand',\r
+\r
+                               'onUndo',\r
+\r
+                               'onRedo',\r
+\r
+                               'onVisualAid',\r
+\r
+                               'onSetProgressState'\r
+                       ], function(e) {\r
+                               t[e] = new Dispatcher(t);\r
+                       });\r
+\r
+                       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 : tinymce.isIE6 ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' : '<!DOCTYPE>', // Use old doctype on IE 6 to avoid horizontal scroll\r
+                               visual_table_class : 'mceItemTable',\r
+                               visual : 1,\r
+                               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
+                               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
+                               keep_styles : 1,\r
+                               fix_table_elements : 1,\r
+                               inline_styles : 1,\r
+                               convert_fonts_to_spans : true,\r
+                               indent : 'simple',\r
+                               indent_before : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr',\r
+                               indent_after : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr',\r
+                               validate : true,\r
+                               entity_encoding : 'named',\r
+                               url_converter : t.convertURL,\r
+                               url_converter_scope : t,\r
+                               ie7_compat : true\r
+                       }, s);\r
+\r
+                       t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, {\r
+                               base_uri : tinyMCE.baseURI\r
+                       });\r
+\r
+                       t.baseURI = tinymce.baseURI;\r
+\r
+                       t.contentCSS = [];\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
+                       tinyMCE.settings = s;\r
+\r
+                       // Element not found, then skip initialization\r
+                       if (!t.getElement())\r
+                               return;\r
+\r
+                       // Is a iPad/iPhone and not on iOS5, then skip initialization. We need to sniff \r
+                       // here since the browser says it has contentEditable support but there is no visible\r
+                       // caret We will remove this check ones Apple implements full contentEditable support\r
+                       if (tinymce.isIDevice && !tinymce.isIOS5)\r
+                               return;\r
+\r
+                       // Add hidden input for non input elements inside form elements\r
+                       if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form'))\r
+                               DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id);\r
+\r
+                       if (tinymce.WindowManager)\r
+                               t.windowManager = new tinymce.WindowManager(t);\r
+\r
+                       if (s.encoding == 'xml') {\r
+                               t.onGetContent.add(function(ed, o) {\r
+                                       if (o.save)\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 && !t.isHidden())\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
+                                                       tinymce.triggerSave();\r
+                                                       t.isNotDirty = 1;\r
+\r
+                                                       return t.formElement._mceOldSubmit(t.formElement);\r
+                                               };\r
+                                       }\r
+\r
+                                       n = null;\r
+                               });\r
+                       }\r
+\r
+                       // Load scripts\r
+                       function loadScripts() {\r
+                               if (s.language && s.language_load !== false)\r
+                                       sl.add(tinymce.baseURL + '/langs/' + s.language + '.js');\r
+\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
+                               each(explode(s.plugins), function(p) {\r
+                                       if (p &&!PluginManager.urls[p]) {\r
+                                               if (p.charAt(0) == '-') {\r
+                                                       p = p.substr(1, p.length);\r
+                                                       var dependencies = PluginManager.dependencies(p);\r
+                                                       each(dependencies, function(dep) {\r
+                                                               var defaultSettings = {prefix:'plugins/', resource: dep, suffix:'/editor_plugin' + tinymce.suffix + '.js'};\r
+                                                               var dep = PluginManager.createUrl(defaultSettings, dep);\r
+                                                               PluginManager.load(dep.resource, dep);\r
+                                                               \r
+                                                       });\r
+                                               } else {\r
+                                                       // Skip safari plugin, since it is removed as of 3.3b1\r
+                                                       if (p == 'safari') {\r
+                                                               return;\r
+                                                       }\r
+                                                       PluginManager.load(p, {prefix:'plugins/', resource: p, suffix:'/editor_plugin' + tinymce.suffix + '.js'});\r
+                                               }\r
+                                       }\r
+                               });\r
+\r
+                               // Init when que is loaded\r
+                               sl.loadQueue(function() {\r
+                                       if (!t.removed)\r
+                                               t.init();\r
+                               });\r
+                       };\r
+\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, i, initializedPlugins = [];\r
+\r
+                       tinymce.add(t);\r
+\r
+                       s.aria_label = s.aria_label || DOM.getAttrib(e, 'aria-label', t.getLang('aria.rich_text_area'));\r
+\r
+                       if (s.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
+                       function initPlugin(p) {\r
+                               var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po;\r
+                               if (c && tinymce.inArray(initializedPlugins,p) === -1) {\r
+                                       each(PluginManager.dependencies(p), function(dep){\r
+                                               initPlugin(dep);\r
+                                       });\r
+                                       po = new c(t, u);\r
+\r
+                                       t.plugins[p] = po;\r
+\r
+                                       if (po.init) {\r
+                                               po.init(t, u);\r
+                                               initializedPlugins.push(p);\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       // Create all plugins\r
+                       each(explode(s.plugins.replace(/\-/g, '')), initPlugin);\r
+\r
+                       // Setup popup CSS path(s)\r
+                       if (s.popup_css !== false) {\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
+\r
+                       if (s.popup_css_add)\r
+                               s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add);\r
+\r
+                       t.controlManager = new tinymce.ControlManager(t);\r
+\r
+                       if (s.custom_undo_redo) {\r
+                               t.onBeforeExecCommand.add(function(ed, cmd, ui, val, a) {\r
+                                       if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo))\r
+                                               t.undoManager.beforeChange();\r
+                               });\r
+\r
+                               t.onExecCommand.add(function(ed, cmd, ui, val, a) {\r
+                                       if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo))\r
+                                               t.undoManager.add();\r
+                               });\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.offsetWidth;\r
+                               h = s.height || e.style.height || e.offsetHeight;\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
+                       // User specified a document.domain value\r
+                       if (document.domain && location.hostname != document.domain)\r
+                               tinymce.relaxedDomain = document.domain;\r
+\r
+                       // Resize editor\r
+                       DOM.setStyles(o.sizeContainer || o.editorContainer, {\r
+                               width : w,\r
+                               height : h\r
+                       });\r
+\r
+                       // Load specified content CSS last\r
+                       if (s.content_css) {\r
+                               tinymce.each(explode(s.content_css), function(u) {\r
+                                       t.contentCSS.push(t.documentBaseURI.toAbsolute(u));\r
+                               });\r
+                       }\r
+\r
+                       h = (o.iframeHeight || h) + (typeof(h) == 'number' ? (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">';\r
+\r
+                       // We only need to override paths if we have to\r
+                       // IE has a bug where it remove site absolute urls to relative ones if this is specified\r
+                       if (s.document_base_url != tinymce.documentBaseURL)\r
+                               t.iframeHTML += '<base href="' + t.documentBaseURI.getURI() + '" />';\r
+\r
+                       // IE8 doesn't support carets behind images setting ie7_compat would force IE8+ to run in IE7 compat mode.\r
+                       if (s.ie7_compat)\r
+                               t.iframeHTML += '<meta http-equiv="X-UA-Compatible" content="IE=7" />';\r
+                       else\r
+                               t.iframeHTML += '<meta http-equiv="X-UA-Compatible" content="IE=edge" />';\r
+\r
+                       t.iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';\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 + '"><br></body></html>';\r
+\r
+                       // Domain relaxing enabled, then set document domain\r
+                       if (tinymce.relaxedDomain && (isIE || (tinymce.isOpera && parseFloat(opera.version()) < 11))) {\r
+                               // We need to write the contents here in IE since multiple writes messes up refresh button and back button\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
+                       }\r
+\r
+                       // Create iframe\r
+                       // TODO: ACC add the appropriate description on this.\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
+                               allowTransparency : "true",\r
+                               title : s.aria_label,\r
+                               style : {\r
+                                       width : '100%',\r
+                                       height : h,\r
+                                       display : 'block' // Important for Gecko to render the iframe correctly\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
+                       DOM.setAttrib(t.id, 'aria-hidden', true);\r
+\r
+                       if (!tinymce.relaxedDomain || !u)\r
+                               t.setupIframe();\r
+\r
+                       e = n = o = null; // Cleanup\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
+                               // Fix for a focus bug in FF 3.x where the body element\r
+                               // wouldn't get proper focus if the user clicked on the HTML element\r
+                               if (isGecko && !Range.prototype.getClientRects) { // Detect getClientRects got introduced in FF 4\r
+                                       t.onMouseDown.add(function(ed, e) {\r
+                                               if (e.target.nodeName === "HTML") {\r
+                                                       var body = t.getBody();\r
+\r
+                                                       // Blur the body it's focused but not correctly focused\r
+                                                       body.blur();\r
+\r
+                                                       // Refocus the body after a little while\r
+                                                       setTimeout(function() {\r
+                                                               body.focus();\r
+                                                       }, 0);\r
+                                               }\r
+                                       });\r
+                               }\r
+\r
+                               d.open();\r
+                               d.write(t.iframeHTML);\r
+                               d.close();\r
+\r
+                               if (tinymce.relaxedDomain)\r
+                                       d.domain = tinymce.relaxedDomain;\r
+                       }\r
+\r
+                       // It will not steal focus while setting contentEditable\r
+                       b = t.getBody();\r
+                       b.disabled = true;\r
+\r
+                       if (!s.readonly)\r
+                               b.contentEditable = true;\r
+\r
+                       b.disabled = false;\r
+\r
+                       t.schema = new tinymce.html.Schema(s);\r
+\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
+                               schema : t.schema\r
+                       });\r
+\r
+                       t.parser = new tinymce.html.DomParser(s, t.schema);\r
+\r
+                       // Force anchor names closed, unless the setting "allow_html_in_named_anchor" is explicitly included.\r
+                       if (!t.settings.allow_html_in_named_anchor) {\r
+                               t.parser.addAttributeFilter('name', function(nodes, name) {\r
+                                       var i = nodes.length, sibling, prevSibling, parent, node;\r
+       \r
+                                       while (i--) {\r
+                                               node = nodes[i];\r
+                                               if (node.name === 'a' && node.firstChild) {\r
+                                                       parent = node.parent;\r
+       \r
+                                                       // Move children after current node\r
+                                                       sibling = node.lastChild;\r
+                                                       do {\r
+                                                               prevSibling = sibling.prev;\r
+                                                               parent.insert(sibling, node);\r
+                                                               sibling = prevSibling;\r
+                                                       } while (sibling);\r
+                                               }\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       // Convert src and href into data-mce-src, data-mce-href and data-mce-style\r
+                       t.parser.addAttributeFilter('src,href,style', function(nodes, name) {\r
+                               var i = nodes.length, node, dom = t.dom, value, internalName;\r
+\r
+                               while (i--) {\r
+                                       node = nodes[i];\r
+                                       value = node.attr(name);\r
+                                       internalName = 'data-mce-' + name;\r
+\r
+                                       // Add internal attribute if we need to we don't on a refresh of the document\r
+                                       if (!node.attributes.map[internalName]) {       \r
+                                               if (name === "style")\r
+                                                       node.attr(internalName, dom.serializeStyle(dom.parseStyle(value), node.name));\r
+                                               else\r
+                                                       node.attr(internalName, t.convertURL(value, name, node.name));\r
+                                       }\r
+                               }\r
+                       });\r
+\r
+                       // Keep scripts from executing\r
+                       t.parser.addNodeFilter('script', function(nodes, name) {\r
+                               var i = nodes.length;\r
+\r
+                               while (i--)\r
+                                       nodes[i].attr('type', 'mce-text/javascript');\r
+                       });\r
+\r
+                       t.parser.addNodeFilter('#cdata', function(nodes, name) {\r
+                               var i = nodes.length, node;\r
+\r
+                               while (i--) {\r
+                                       node = nodes[i];\r
+                                       node.type = 8;\r
+                                       node.name = '#comment';\r
+                                       node.value = '[CDATA[' + node.value + ']]';\r
+                               }\r
+                       });\r
+\r
+                       t.parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', function(nodes, name) {\r
+                               var i = nodes.length, node, nonEmptyElements = t.schema.getNonEmptyElements();\r
+\r
+                               while (i--) {\r
+                                       node = nodes[i];\r
+\r
+                                       if (node.isEmpty(nonEmptyElements))\r
+                                               node.empty().append(new tinymce.html.Node('br', 1)).shortEnded = true;\r
+                               }\r
+                       });\r
+\r
+                       t.serializer = new tinymce.dom.Serializer(s, t.dom, t.schema);\r
+\r
+                       t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer);\r
+\r
+                       t.formatter = new tinymce.Formatter(this);\r
+\r
+                       // Register default formats\r
+                       t.formatter.register({\r
+                               alignleft : [\r
+                                       {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}},\r
+                                       {selector : 'img,table', collapsed : false, styles : {'float' : 'left'}}\r
+                               ],\r
+\r
+                               aligncenter : [\r
+                                       {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}},\r
+                                       {selector : 'img', collapsed : false, styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}},\r
+                                       {selector : 'table', collapsed : false, styles : {marginLeft : 'auto', marginRight : 'auto'}}\r
+                               ],\r
+\r
+                               alignright : [\r
+                                       {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}},\r
+                                       {selector : 'img,table', collapsed : false, styles : {'float' : 'right'}}\r
+                               ],\r
+\r
+                               alignfull : [\r
+                                       {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'}}\r
+                               ],\r
+\r
+                               bold : [\r
+                                       {inline : 'strong', remove : 'all'},\r
+                                       {inline : 'span', styles : {fontWeight : 'bold'}},\r
+                                       {inline : 'b', remove : 'all'}\r
+                               ],\r
+\r
+                               italic : [\r
+                                       {inline : 'em', remove : 'all'},\r
+                                       {inline : 'span', styles : {fontStyle : 'italic'}},\r
+                                       {inline : 'i', remove : 'all'}\r
+                               ],\r
+\r
+                               underline : [\r
+                                       {inline : 'span', styles : {textDecoration : 'underline'}, exact : true},\r
+                                       {inline : 'u', remove : 'all'}\r
+                               ],\r
+\r
+                               strikethrough : [\r
+                                       {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true},\r
+                                       {inline : 'strike', remove : 'all'}\r
+                               ],\r
+\r
+                               forecolor : {inline : 'span', styles : {color : '%value'}, wrap_links : false},\r
+                               hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}, wrap_links : false},\r
+                               fontname : {inline : 'span', styles : {fontFamily : '%value'}},\r
+                               fontsize : {inline : 'span', styles : {fontSize : '%value'}},\r
+                               fontsize_class : {inline : 'span', attributes : {'class' : '%value'}},\r
+                               blockquote : {block : 'blockquote', wrapper : 1, remove : 'all'},\r
+                               subscript : {inline : 'sub'},\r
+                               superscript : {inline : 'sup'},\r
+\r
+                               link : {inline : 'a', selector : 'a', remove : 'all', split : true, deep : true,\r
+                                       onmatch : function(node) {\r
+                                               return true;\r
+                                       },\r
+\r
+                                       onformat : function(elm, fmt, vars) {\r
+                                               each(vars, function(value, key) {\r
+                                                       t.dom.setAttrib(elm, key, value);\r
+                                               });\r
+                                       }\r
+                               },\r
+\r
+                               removeformat : [\r
+                                       {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true},\r
+                                       {selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true},\r
+                                       {selector : '*', attributes : ['style', 'class'], split : false, expand : false, deep : true}\r
+                               ]\r
+                       });\r
+\r
+                       // Register default block formats\r
+                       each('p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp'.split(/\s/), function(name) {\r
+                               t.formatter.register(name, {block : name, remove : 'all'});\r
+                       });\r
+\r
+                       // Register user defined formats\r
+                       t.formatter.register(t.settings.formats);\r
+\r
+                       t.undoManager = new tinymce.UndoManager(t);\r
+\r
+                       // Pass through\r
+                       t.undoManager.onAdd.add(function(um, l) {\r
+                               if (um.hasUndo())\r
+                                       return t.onChange.dispatch(t, l, um);\r
+                       });\r
+\r
+                       t.undoManager.onUndo.add(function(um, l) {\r
+                               return t.onUndo.dispatch(t, l, um);\r
+                       });\r
+\r
+                       t.undoManager.onRedo.add(function(um, l) {\r
+                               return t.onRedo.dispatch(t, l, um);\r
+                       });\r
+\r
+                       t.forceBlocks = new tinymce.ForceBlocks(t, {\r
+                               forced_root_block : s.forced_root_block\r
+                       });\r
+\r
+                       t.editorCommands = new tinymce.EditorCommands(t);\r
+\r
+                       // Pass through\r
+                       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
+                       if (!s.readonly)\r
+                               t._addEvents();\r
+\r
+                       t.controlManager.onPostRender.dispatch(t, t.controlManager);\r
+                       t.onPostRender.dispatch(t);\r
+\r
+                       t.quirks = new tinymce.util.Quirks(this);\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.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.protect) {\r
+                               t.onBeforeSetContent.add(function(ed, o) {\r
+                                       if (s.protect) {\r
+                                               each(s.protect, function(pattern) {\r
+                                                       o.content = o.content.replace(pattern, function(str) {\r
+                                                               return '<!--mce:protected ' + escape(str) + '-->';\r
+                                                       });\r
+                                               });\r
+                                       }\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.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.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
+                       // Add visual aids when new contents is added\r
+                       t.onSetContent.add(function() {\r
+                               t.addVisual(t.getBody());\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\n]*|<br \/>[\r\n]*)$/, '');\r
+                               });\r
+                       }\r
+\r
+                       if (isGecko) {\r
+                               // Fix gecko link bug, when a link is placed at the end of block elements there is\r
+                               // no way to move the caret behind the link. This fix adds a bogus br element after the link\r
+                               function fixLinks(ed, o) {\r
+                                       each(ed.dom.select('a'), function(n) {\r
+                                               var pn = n.parentNode;\r
+\r
+                                               if (ed.dom.isBlock(pn) && pn.lastChild === n)\r
+                                                       ed.dom.add(pn, 'br', {'data-mce-bogus' : 1});\r
+                                       });\r
+                               };\r
+\r
+                               t.onExecCommand.add(function(ed, cmd) {\r
+                                       if (cmd === 'CreateLink')\r
+                                               fixLinks(ed);\r
+                               });\r
+\r
+                               t.onSetContent.add(t.selection.onSetContent.add(fixLinks));\r
+                       }\r
+\r
+                       t.load({initial : true, format : 'html'});\r
+                       t.startContent = t.getContent({format : 'raw'});\r
+                       t.undoManager.add();\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
+                       each(t.contentCSS, function(u) {\r
+                               t.dom.loadCSS(u);\r
+                       });\r
+\r
+                       // Handle auto focus\r
+                       if (s.auto_focus) {\r
+                               setTimeout(function () {\r
+                                       var ed = tinymce.get(s.auto_focus);\r
+\r
+                                       ed.selection.select(ed.getBody(), 1);\r
+                                       ed.selection.collapse(1);\r
+                                       ed.getBody().focus();\r
+                                       ed.getWin().focus();\r
+                               }, 100);\r
+                       }\r
+\r
+                       e = null;\r
+               },\r
+\r
+\r
+               focus : function(sf) {\r
+                       var oed, t = this, selection = t.selection, ce = t.settings.content_editable, ieRng, controlElm, doc = t.getDoc();\r
+\r
+                       if (!sf) {\r
+                               // Get selected control element\r
+                               ieRng = selection.getRng();\r
+                               if (ieRng.item) {\r
+                                       controlElm = ieRng.item(0);\r
+                               }\r
+\r
+                               t._refreshContentEditable();\r
+                               selection.normalize();\r
+\r
+                               // Is not content editable\r
+                               if (!ce)\r
+                                       t.getWin().focus();\r
+\r
+                               // Focus the body as well since it's contentEditable\r
+                               if (tinymce.isGecko) {\r
+                                       t.getBody().focus();\r
+                               }\r
+\r
+                               // Restore selected control element\r
+                               // This is needed when for example an image is selected within a\r
+                               // layer a call to focus will then remove the control selection\r
+                               if (controlElm && controlElm.ownerDocument == doc) {\r
+                                       ieRng = doc.body.createControlRange();\r
+                                       ieRng.addElement(controlElm);\r
+                                       ieRng.select();\r
+                               }\r
+\r
+                       }\r
+\r
+                       if (tinymce.activeEditor != t) {\r
+                               if ((oed = tinymce.activeEditor) != null)\r
+                                       oed.onDeactivate.dispatch(oed, t);\r
+\r
+                               t.onActivate.dispatch(t, oed);\r
+                       }\r
+\r
+                       tinymce._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 || 'en', i18n = tinymce.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 tinymce.i18n[(this.settings.language || 'en') + '.' + 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.getStart() || t.getBody();\r
+\r
+                       // Fix for bug #1896577 it seems that this can not be fired while the editor is loading\r
+                       if (t.initialized) {\r
+                               o = o || {};\r
+                               n = isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n; // Fix for IE initial state\r
+\r
+                               // Get parents and add them to object\r
+                               o.parents = [];\r
+                               t.dom.getParent(n, function(node) {\r
+                                       if (node.nodeName == 'BODY')\r
+                                               return true;\r
+\r
+                                       o.parents.push(node);\r
+                               });\r
+\r
+                               t.onNodeChange.dispatch(\r
+                                       t,\r
+                                       o ? o.controlManager || t.controlManager : t.controlManager,\r
+                                       n,\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(name, callback, scope) {\r
+                       this.execCommands[name] = {func : callback, scope : scope || this};\r
+               },\r
+\r
+               addQueryStateHandler : function(name, callback, scope) {\r
+                       this.queryStateCommands[name] = {func : callback, scope : scope || this};\r
+               },\r
+\r
+               addQueryValueHandler : function(name, callback, scope) {\r
+                       this.queryValueCommands[name] = {func : callback, scope : scope || 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, st;\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
+                       // Command 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
+                               st = o.func.call(o.scope, ui, val);\r
+\r
+                               // Fall through on true\r
+                               if (st !== true) {\r
+                                       t.onExecCommand.dispatch(t, cmd, ui, val, a);\r
+                                       return st;\r
+                               }\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 && 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(cmd) {\r
+                       var t = this, o, s;\r
+\r
+                       // Is hidden then return undefined\r
+                       if (t._isHidden())\r
+                               return;\r
+\r
+                       // Registred commands\r
+                       if (o = t.queryStateCommands[cmd]) {\r
+                               s = o.func.call(o.scope);\r
+\r
+                               // Fall though on true\r
+                               if (s !== true)\r
+                                       return s;\r
+                       }\r
+\r
+                       // Registred commands\r
+                       o = t.editorCommands.queryCommandState(cmd);\r
+                       if (o !== -1)\r
+                               return o;\r
+\r
+                       // Browser commands\r
+                       try {\r
+                               return this.getDoc().queryCommandState(cmd);\r
+                       } catch (ex) {\r
+                               // Fails sometimes see bug: 1896577\r
+                       }\r
+               },\r
+\r
+               queryCommandValue : function(c) {\r
+                       var t = this, o, s;\r
+\r
+                       // Is hidden then return undefined\r
+                       if (t._isHidden())\r
+                               return;\r
+\r
+                       // Registred commands\r
+                       if (o = t.queryValueCommands[c]) {\r
+                               s = o.func.call(o.scope);\r
+\r
+                               // Fall though on true\r
+                               if (s !== true)\r
+                                       return s;\r
+                       }\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
+               load : function(o) {\r
+                       var t = this, e = t.getElement(), h;\r
+\r
+                       if (e) {\r
+                               o = o || {};\r
+                               o.load = true;\r
+\r
+                               // Double encode existing entities in the value\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
+\r
+               save : function(o) {\r
+                       var t = this, e = t.getElement(), h, f;\r
+\r
+                       if (!e || !t.initialized)\r
+                               return;\r
+\r
+                       o = o || {};\r
+                       o.save = true;\r
+\r
+                       // Add undo level will trigger onchange event\r
+                       if (!o.no_events) {\r
+                               t.undoManager.typing = false;\r
+                               t.undoManager.add();\r
+                       }\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(content, args) {\r
+                       var self = this, rootNode, body = self.getBody(), forcedRootBlockName;\r
+\r
+                       // Setup args object\r
+                       args = args || {};\r
+                       args.format = args.format || 'html';\r
+                       args.set = true;\r
+                       args.content = content;\r
+\r
+                       // Do preprocessing\r
+                       if (!args.no_events)\r
+                               self.onBeforeSetContent.dispatch(self, args);\r
+\r
+                       content = args.content;\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 && (content.length === 0 || /^\s+$/.test(content))) {\r
+                               forcedRootBlockName = self.settings.forced_root_block;\r
+                               if (forcedRootBlockName)\r
+                                       content = '<' + forcedRootBlockName + '><br data-mce-bogus="1"></' + forcedRootBlockName + '>';\r
+                               else\r
+                                       content = '<br data-mce-bogus="1">';\r
+\r
+                               body.innerHTML = content;\r
+                               self.selection.select(body, true);\r
+                               self.selection.collapse(true);\r
+                               return;\r
+                       }\r
+\r
+                       // Parse and serialize the html\r
+                       if (args.format !== 'raw') {\r
+                               content = new tinymce.html.Serializer({}, self.schema).serialize(\r
+                                       self.parser.parse(content)\r
+                               );\r
+                       }\r
+\r
+                       // Set the new cleaned contents to the editor\r
+                       args.content = tinymce.trim(content);\r
+                       self.dom.setHTML(body, args.content);\r
+\r
+                       // Do post processing\r
+                       if (!args.no_events)\r
+                               self.onSetContent.dispatch(self, args);\r
+\r
+                       self.selection.normalize();\r
+\r
+                       return args.content;\r
+               },\r
+\r
+               getContent : function(args) {\r
+                       var self = this, content;\r
+\r
+                       // Setup args object\r
+                       args = args || {};\r
+                       args.format = args.format || 'html';\r
+                       args.get = true;\r
+\r
+                       // Do preprocessing\r
+                       if (!args.no_events)\r
+                               self.onBeforeGetContent.dispatch(self, args);\r
+\r
+                       // Get raw contents or by default the cleaned contents\r
+                       if (args.format == 'raw')\r
+                               content = self.getBody().innerHTML;\r
+                       else\r
+                               content = self.serializer.serialize(self.getBody(), args);\r
+\r
+                       args.content = tinymce.trim(content);\r
+\r
+                       // Do post processing\r
+                       if (!args.no_events)\r
+                               self.onGetContent.dispatch(self, args);\r
+\r
+                       return args.content;\r
+               },\r
+\r
+               isDirty : function() {\r
+                       var self = this;\r
+\r
+                       return tinymce.trim(self.startContent) != tinymce.trim(self.getContent({format : 'raw', no_events : 1})) && !self.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
+                       tinymce.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 && 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
+\r
+                               // Don't clear the window or document if content editable\r
+                               // is enabled since other instances might still be present\r
+                               if (!t.settings.content_editable) {\r
+                                       Event.clear(t.getWin());\r
+                                       Event.clear(t.getDoc());\r
+                               }\r
+\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, dom = t.dom, 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
+                                               dom.bind(t.getDoc(), k, eventHandler);\r
+                                               break;\r
+\r
+                                       case 'paste':\r
+                                               dom.bind(t.getBody(), k, function(e) {\r
+                                                       eventHandler(e);\r
+                                               });\r
+                                               break;\r
+\r
+                                       case 'submit':\r
+                                       case 'reset':\r
+                                               dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler);\r
+                                               break;\r
+\r
+                                       default:\r
+                                               dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler);\r
+                               }\r
+                       });\r
+\r
+                       dom.bind(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
+                               dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) {\r
+                                       var v;\r
+\r
+                                       e = e.target;\r
+\r
+                                       if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('data-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 && !s.readonly) {\r
+                                               t._refreshContentEditable();\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
+                                                               try {d.execCommand("useCSS", 0, true);} catch (ex) {}\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
+                       t.onClick.add(function(ed, e) {\r
+                               e = e.target;\r
+\r
+                               // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250\r
+                               // WebKit can't even do simple things like selecting an image\r
+                               // Needs tobe the setBaseAndExtend or it will fail to select floated images\r
+                               if (tinymce.isWebKit && e.nodeName == 'IMG')\r
+                                       t.selection.getSel().setBaseAndExtent(e, 0, e, 1);\r
+\r
+                               if (e.nodeName == 'A' && dom.hasClass(e, 'mceItemAnchor'))\r
+                                       t.selection.select(e);\r
+\r
+                               t.nodeChanged();\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
+                               var c = e.keyCode;\r
+\r
+                               if ((c >= 33 && c <= 36) || (c >= 37 && c <= 40) || c == 13 || c == 45 || c == 46 || c == 8 || (tinymce.isMac && (c == 91 || c == 93)) || e.ctrlKey)\r
+                                       t.nodeChanged();\r
+                       });\r
+\r
+\r
+                       // Add block quote deletion handler\r
+                       t.onKeyDown.add(function(ed, e) {\r
+                               // Was the BACKSPACE key pressed?\r
+                               if (e.keyCode != 8)\r
+                                       return;\r
+\r
+                               var n = ed.selection.getRng().startContainer;\r
+                               var offset = ed.selection.getRng().startOffset;\r
+\r
+                               while (n && n.nodeType && n.nodeType != 1 && n.parentNode)\r
+                                       n = n.parentNode;\r
+                                       \r
+                               // Is the cursor at the beginning of a blockquote?\r
+                               if (n && n.parentNode && n.parentNode.tagName === 'BLOCKQUOTE' && n.parentNode.firstChild == n && offset == 0) {\r
+                                       // Remove the blockquote\r
+                                       ed.formatter.toggle('blockquote', null, n.parentNode);\r
+\r
+                                       // Move the caret to the beginning of n\r
+                                       var rng = ed.selection.getRng();\r
+                                       rng.setStart(n, 0);\r
+                                       rng.setEnd(n, 0);\r
+                                       ed.selection.setRng(rng);\r
+                                       ed.selection.collapse(false);\r
+                               }\r
+                       });\r
\r
+\r
+\r
+                       // Add reset handler\r
+                       t.onReset.add(function() {\r
+                               t.setContent(t.startContent, {format : 'raw'});\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
+                               t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold');\r
+                               t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic');\r
+                               t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline');\r
+\r
+                               // BlockFormat shortcuts keys\r
+                               for (i=1; i<=6; i++)\r
+                                       t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]);\r
+\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 (tinymce.isMac && o.ctrl != e.metaKey)\r
+                                                       return;\r
+                                               else if (!tinymce.isMac && o.ctrl != e.ctrlKey)\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
+                               dom.bind(t.getDoc(), 'controlselect', function(e) {\r
+                                       var re = t.resizeInfo, cb;\r
+\r
+                                       e = e.target;\r
+\r
+                                       // Don't do this action for non image elements\r
+                                       if (e.nodeName !== 'IMG')\r
+                                               return;\r
+\r
+                                       if (re)\r
+                                               dom.unbind(re.node, re.ev, re.cb);\r
+\r
+                                       if (!dom.hasClass(e, 'mceItemNoResize')) {\r
+                                               ev = 'resizeend';\r
+                                               cb = dom.bind(e, ev, function(e) {\r
+                                                       var v;\r
+\r
+                                                       e = e.target;\r
+\r
+                                                       if (v = dom.getStyle(e, 'width')) {\r
+                                                               dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, ''));\r
+                                                               dom.setStyle(e, 'width', '');\r
+                                                       }\r
+\r
+                                                       if (v = dom.getStyle(e, 'height')) {\r
+                                                               dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, ''));\r
+                                                               dom.setStyle(e, 'height', '');\r
+                                                       }\r
+                                               });\r
+                                       } else {\r
+                                               ev = 'resizestart';\r
+                                               cb = dom.bind(e, 'resizestart', Event.cancel, Event);\r
+                                       }\r
+\r
+                                       re = t.resizeInfo = {\r
+                                               node : e,\r
+                                               ev : ev,\r
+                                               cb : cb\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 = false;\r
+                                       t.undoManager.add();\r
+                               };\r
+\r
+                               dom.bind(t.getDoc(), 'focusout', function(e) {\r
+                                       if (!t.removed && t.undoManager.typing)\r
+                                               addUndo();\r
+                               });\r
+\r
+                               // Add undo level when contents is drag/dropped within the editor\r
+                               t.dom.bind(t.dom.getRoot(), 'dragend', function(e) {\r
+                                       addUndo();\r
+                               });\r
+\r
+                               t.onKeyUp.add(function(ed, e) {\r
+                                       var keyCode = e.keyCode;\r
+\r
+                                       if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45 || e.ctrlKey)\r
+                                               addUndo();\r
+                               });\r
+\r
+                               t.onKeyDown.add(function(ed, e) {\r
+                                       var keyCode = e.keyCode, sel;\r
+\r
+                                       if (keyCode == 8) {\r
+                                               sel = t.getDoc().selection;\r
+\r
+                                               // Fix IE control + backspace browser bug\r
+                                               if (sel && sel.createRange && sel.createRange().item) {\r
+                                                       t.undoManager.beforeChange();\r
+                                                       ed.dom.remove(sel.createRange().item(0));\r
+                                                       addUndo();\r
+\r
+                                                       return Event.cancel(e);\r
+                                               }\r
+                                       }\r
+\r
+                                       // Is caracter positon keys left,right,up,down,home,end,pgdown,pgup,enter\r
+                                       if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45) {\r
+                                               // Add position before enter key is pressed, used by IE since it still uses the default browser behavior\r
+                                               // Todo: Remove this once we normalize enter behavior on IE\r
+                                               if (tinymce.isIE && keyCode == 13)\r
+                                                       t.undoManager.beforeChange();\r
+\r
+                                               if (t.undoManager.typing)\r
+                                                       addUndo();\r
+\r
+                                               return;\r
+                                       }\r
+\r
+                                       // If key isn't shift,ctrl,alt,capslock,metakey\r
+                                       if ((keyCode < 16 || keyCode > 20) && keyCode != 224 && keyCode != 91 && !t.undoManager.typing) {\r
+                                               t.undoManager.beforeChange();\r
+                                               t.undoManager.typing = true;\r
+                                               t.undoManager.add();\r
+                                       }\r
+                               });\r
+\r
+                               t.onMouseDown.add(function() {\r
+                                       if (t.undoManager.typing)\r
+                                               addUndo();\r
+                               });\r
+                       }\r
+\r
+                       // Fire a nodeChanged when the selection is changed on WebKit this fixes selection issues on iOS5\r
+                       // It only fires the nodeChange event every 50ms since it would other wise update the UI when you type and it hogs the CPU\r
+                       if (tinymce.isWebKit) {\r
+                               dom.bind(t.getDoc(), 'selectionchange', function() {\r
+                                       if (t.selectionTimer) {\r
+                                               clearTimeout(t.selectionTimer);\r
+                                               t.selectionTimer = 0;\r
+                                       }\r
+\r
+                                       t.selectionTimer = window.setTimeout(function() {\r
+                                               t.nodeChanged();\r
+                                       }, 50);\r
+                               });\r
+                       }\r
+\r
+                       // Bug fix for FireFox keeping styles from end of selection instead of start.\r
+                       if (tinymce.isGecko) {\r
+                               function getAttributeApplyFunction() {\r
+                                       var template = t.dom.getAttribs(t.selection.getStart().cloneNode(false));\r
+\r
+                                       return function() {\r
+                                               var target = t.selection.getStart();\r
+\r
+                                               if (target !== t.getBody()) {\r
+                                                       t.dom.removeAllAttribs(target);\r
+\r
+                                                       each(template, function(attr) {\r
+                                                               target.setAttributeNode(attr.cloneNode(true));\r
+                                                       });\r
+                                               }\r
+                                       };\r
+                               }\r
+\r
+                               function isSelectionAcrossElements() {\r
+                                       var s = t.selection;\r
+\r
+                                       return !s.isCollapsed() && s.getStart() != s.getEnd();\r
+                               }\r
+\r
+                               t.onKeyPress.add(function(ed, e) {\r
+                                       var applyAttributes;\r
+\r
+                                       if ((e.keyCode == 8 || e.keyCode == 46) && isSelectionAcrossElements()) {\r
+                                               applyAttributes = getAttributeApplyFunction();\r
+                                               t.getDoc().execCommand('delete', false, null);\r
+                                               applyAttributes();\r
+\r
+                                               return Event.cancel(e);\r
+                                       }\r
+                               });\r
+\r
+                               t.dom.bind(t.getDoc(), 'cut', function(e) {\r
+                                       var applyAttributes;\r
+\r
+                                       if (isSelectionAcrossElements()) {\r
+                                               applyAttributes = getAttributeApplyFunction();\r
+                                               t.onKeyUp.addToTop(Event.cancel, Event);\r
+\r
+                                               setTimeout(function() {\r
+                                                       applyAttributes();\r
+                                                       t.onKeyUp.remove(Event.cancel, Event);\r
+                                               }, 0);\r
+                                       }\r
+                               });\r
+                       }\r
+               },\r
+\r
+               _refreshContentEditable : function() {\r
+                       var self = this, body, parent;\r
+\r
+                       // Check if the editor was hidden and the re-initalize contentEditable mode by removing and adding the body again\r
+                       if (self._isHidden()) {\r
+                               body = self.getBody();\r
+                               parent = body.parentNode;\r
+\r
+                               parent.removeChild(body);\r
+                               parent.appendChild(body);\r
+\r
+                               body.focus();\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
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       // Added for compression purposes\r
+       var each = tinymce.each, undefined, TRUE = true, FALSE = false;\r
+\r
+       tinymce.EditorCommands = function(editor) {\r
+               var dom = editor.dom,\r
+                       selection = editor.selection,\r
+                       commands = {state: {}, exec : {}, value : {}},\r
+                       settings = editor.settings,\r
+                       formatter = editor.formatter,\r
+                       bookmark;\r
+\r
+               function execCommand(command, ui, value) {\r
+                       var func;\r
+\r
+                       command = command.toLowerCase();\r
+                       if (func = commands.exec[command]) {\r
+                               func(command, ui, value);\r
+                               return TRUE;\r
+                       }\r
+\r
+                       return FALSE;\r
+               };\r
+\r
+               function queryCommandState(command) {\r
+                       var func;\r
+\r
+                       command = command.toLowerCase();\r
+                       if (func = commands.state[command])\r
+                               return func(command);\r
+\r
+                       return -1;\r
+               };\r
+\r
+               function queryCommandValue(command) {\r
+                       var func;\r
+\r
+                       command = command.toLowerCase();\r
+                       if (func = commands.value[command])\r
+                               return func(command);\r
+\r
+                       return FALSE;\r
+               };\r
+\r
+               function addCommands(command_list, type) {\r
+                       type = type || 'exec';\r
+\r
+                       each(command_list, function(callback, command) {\r
+                               each(command.toLowerCase().split(','), function(command) {\r
+                                       commands[type][command] = callback;\r
+                               });\r
+                       });\r
+               };\r
+\r
+               // Expose public methods\r
+               tinymce.extend(this, {\r
+                       execCommand : execCommand,\r
+                       queryCommandState : queryCommandState,\r
+                       queryCommandValue : queryCommandValue,\r
+                       addCommands : addCommands\r
+               });\r
+\r
+               // Private methods\r
+\r
+               function execNativeCommand(command, ui, value) {\r
+                       if (ui === undefined)\r
+                               ui = FALSE;\r
+\r
+                       if (value === undefined)\r
+                               value = null;\r
+\r
+                       return editor.getDoc().execCommand(command, ui, value);\r
+               };\r
+\r
+               function isFormatMatch(name) {\r
+                       return formatter.match(name);\r
+               };\r
+\r
+               function toggleFormat(name, value) {\r
+                       formatter.toggle(name, value ? {value : value} : undefined);\r
+               };\r
+\r
+               function storeSelection(type) {\r
+                       bookmark = selection.getBookmark(type);\r
+               };\r
+\r
+               function restoreSelection() {\r
+                       selection.moveToBookmark(bookmark);\r
+               };\r
+\r
+               // Add execCommand overrides\r
+               addCommands({\r
+                       // Ignore these, added for compatibility\r
+                       'mceResetDesignMode,mceBeginUndoLevel' : function() {},\r
+\r
+                       // Add undo manager logic\r
+                       'mceEndUndoLevel,mceAddUndoLevel' : function() {\r
+                               editor.undoManager.add();\r
+                       },\r
+\r
+                       'Cut,Copy,Paste' : function(command) {\r
+                               var doc = editor.getDoc(), failed;\r
+\r
+                               // Try executing the native command\r
+                               try {\r
+                                       execNativeCommand(command);\r
+                               } catch (ex) {\r
+                                       // Command failed\r
+                                       failed = TRUE;\r
+                               }\r
+\r
+                               // Present alert message about clipboard access not being available\r
+                               if (failed || !doc.queryCommandSupported(command)) {\r
+                                       if (tinymce.isGecko) {\r
+                                               editor.windowManager.confirm(editor.getLang('clipboard_msg'), function(state) {\r
+                                                       if (state)\r
+                                                               open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', '_blank');\r
+                                               });\r
+                                       } else\r
+                                               editor.windowManager.alert(editor.getLang('clipboard_no_support'));\r
+                               }\r
+                       },\r
+\r
+                       // Override unlink command\r
+                       unlink : function(command) {\r
+                               if (selection.isCollapsed())\r
+                                       selection.select(selection.getNode());\r
+\r
+                               execNativeCommand(command);\r
+                               selection.collapse(FALSE);\r
+                       },\r
+\r
+                       // Override justify commands to use the text formatter engine\r
+                       'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) {\r
+                               var align = command.substring(7);\r
+\r
+                               // Remove all other alignments first\r
+                               each('left,center,right,full'.split(','), function(name) {\r
+                                       if (align != name)\r
+                                               formatter.remove('align' + name);\r
+                               });\r
+\r
+                               toggleFormat('align' + align);\r
+                               execCommand('mceRepaint');\r
+                       },\r
+\r
+                       // Override list commands to fix WebKit bug\r
+                       'InsertUnorderedList,InsertOrderedList' : function(command) {\r
+                               var listElm, listParent;\r
+\r
+                               execNativeCommand(command);\r
+\r
+                               // WebKit produces lists within block elements so we need to split them\r
+                               // we will replace the native list creation logic to custom logic later on\r
+                               // TODO: Remove this when the list creation logic is removed\r
+                               listElm = dom.getParent(selection.getNode(), 'ol,ul');\r
+                               if (listElm) {\r
+                                       listParent = listElm.parentNode;\r
+\r
+                                       // If list is within a text block then split that block\r
+                                       if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) {\r
+                                               storeSelection();\r
+                                               dom.split(listParent, listElm);\r
+                                               restoreSelection();\r
+                                       }\r
+                               }\r
+                       },\r
+\r
+                       // Override commands to use the text formatter engine\r
+                       'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) {\r
+                               toggleFormat(command);\r
+                       },\r
+\r
+                       // Override commands to use the text formatter engine\r
+                       'ForeColor,HiliteColor,FontName' : function(command, ui, value) {\r
+                               toggleFormat(command, value);\r
+                       },\r
+\r
+                       FontSize : function(command, ui, value) {\r
+                               var fontClasses, fontSizes;\r
+\r
+                               // Convert font size 1-7 to styles\r
+                               if (value >= 1 && value <= 7) {\r
+                                       fontSizes = tinymce.explode(settings.font_size_style_values);\r
+                                       fontClasses = tinymce.explode(settings.font_size_classes);\r
+\r
+                                       if (fontClasses)\r
+                                               value = fontClasses[value - 1] || value;\r
+                                       else\r
+                                               value = fontSizes[value - 1] || value;\r
+                               }\r
+\r
+                               toggleFormat(command, value);\r
+                       },\r
+\r
+                       RemoveFormat : function(command) {\r
+                               formatter.remove(command);\r
+                       },\r
+\r
+                       mceBlockQuote : function(command) {\r
+                               toggleFormat('blockquote');\r
+                       },\r
+\r
+                       FormatBlock : function(command, ui, value) {\r
+                               return toggleFormat(value || 'p');\r
+                       },\r
+\r
+                       mceCleanup : function() {\r
+                               var bookmark = selection.getBookmark();\r
+\r
+                               editor.setContent(editor.getContent({cleanup : TRUE}), {cleanup : TRUE});\r
+\r
+                               selection.moveToBookmark(bookmark);\r
+                       },\r
+\r
+                       mceRemoveNode : function(command, ui, value) {\r
+                               var node = value || selection.getNode();\r
+\r
+                               // Make sure that the body node isn't removed\r
+                               if (node != editor.getBody()) {\r
+                                       storeSelection();\r
+                                       editor.dom.remove(node, TRUE);\r
+                                       restoreSelection();\r
+                               }\r
+                       },\r
+\r
+                       mceSelectNodeDepth : function(command, ui, value) {\r
+                               var counter = 0;\r
+\r
+                               dom.getParent(selection.getNode(), function(node) {\r
+                                       if (node.nodeType == 1 && counter++ == value) {\r
+                                               selection.select(node);\r
+                                               return FALSE;\r
+                                       }\r
+                               }, editor.getBody());\r
+                       },\r
+\r
+                       mceSelectNode : function(command, ui, value) {\r
+                               selection.select(value);\r
+                       },\r
+\r
+                       mceInsertContent : function(command, ui, value) {\r
+                               var parser, serializer, parentNode, rootNode, fragment, args,\r
+                                       marker, nodeRect, viewPortRect, rng, node, node2, bookmarkHtml, viewportBodyElement;\r
+\r
+                               // Setup parser and serializer\r
+                               parser = editor.parser;\r
+                               serializer = new tinymce.html.Serializer({}, editor.schema);\r
+                               bookmarkHtml = '<span id="mce_marker" data-mce-type="bookmark">\uFEFF</span>';\r
+\r
+                               // Run beforeSetContent handlers on the HTML to be inserted\r
+                               args = {content: value, format: 'html'};\r
+                               selection.onBeforeSetContent.dispatch(selection, args);\r
+                               value = args.content;\r
+\r
+                               // Add caret at end of contents if it's missing\r
+                               if (value.indexOf('{$caret}') == -1)\r
+                                       value += '{$caret}';\r
+\r
+                               // Replace the caret marker with a span bookmark element\r
+                               value = value.replace(/\{\$caret\}/, bookmarkHtml);\r
+\r
+                               // Insert node maker where we will insert the new HTML and get it's parent\r
+                               if (!selection.isCollapsed())\r
+                                       editor.getDoc().execCommand('Delete', false, null);\r
+\r
+                               parentNode = selection.getNode();\r
+\r
+                               // Parse the fragment within the context of the parent node\r
+                               args = {context : parentNode.nodeName.toLowerCase()};\r
+                               fragment = parser.parse(value, args);\r
+\r
+                               // Move the caret to a more suitable location\r
+                               node = fragment.lastChild;\r
+                               if (node.attr('id') == 'mce_marker') {\r
+                                       marker = node;\r
+\r
+                                       for (node = node.prev; node; node = node.walk(true)) {\r
+                                               if (node.type == 3 || !dom.isBlock(node.name)) {\r
+                                                       node.parent.insert(marker, node, node.name === 'br');\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // If parser says valid we can insert the contents into that parent\r
+                               if (!args.invalid) {\r
+                                       value = serializer.serialize(fragment);\r
+\r
+                                       // Check if parent is empty or only has one BR element then set the innerHTML of that parent\r
+                                       node = parentNode.firstChild;\r
+                                       node2 = parentNode.lastChild;\r
+                                       if (!node || (node === node2 && node.nodeName === 'BR'))\r
+                                               dom.setHTML(parentNode, value);\r
+                                       else\r
+                                               selection.setContent(value);\r
+                               } else {\r
+                                       // If the fragment was invalid within that context then we need\r
+                                       // to parse and process the parent it's inserted into\r
+\r
+                                       // Insert bookmark node and get the parent\r
+                                       selection.setContent(bookmarkHtml);\r
+                                       parentNode = editor.selection.getNode();\r
+                                       rootNode = editor.getBody();\r
+\r
+                                       // Opera will return the document node when selection is in root\r
+                                       if (parentNode.nodeType == 9)\r
+                                               parentNode = node = rootNode;\r
+                                       else\r
+                                               node = parentNode;\r
+\r
+                                       // Find the ancestor just before the root element\r
+                                       while (node !== rootNode) {\r
+                                               parentNode = node;\r
+                                               node = node.parentNode;\r
+                                       }\r
+\r
+                                       // Get the outer/inner HTML depending on if we are in the root and parser and serialize that\r
+                                       value = parentNode == rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode);\r
+                                       value = serializer.serialize(\r
+                                               parser.parse(\r
+                                                       // Need to replace by using a function since $ in the contents would otherwise be a problem\r
+                                                       value.replace(/<span (id="mce_marker"|id=mce_marker).+?<\/span>/i, function() {\r
+                                                               return serializer.serialize(fragment);\r
+                                                       })\r
+                                               )\r
+                                       );\r
+\r
+                                       // Set the inner/outer HTML depending on if we are in the root or not\r
+                                       if (parentNode == rootNode)\r
+                                               dom.setHTML(rootNode, value);\r
+                                       else\r
+                                               dom.setOuterHTML(parentNode, value);\r
+                               }\r
+\r
+                               marker = dom.get('mce_marker');\r
+\r
+                               // Scroll range into view scrollIntoView on element can't be used since it will scroll the main view port as well\r
+                               nodeRect = dom.getRect(marker);\r
+                               viewPortRect = dom.getViewPort(editor.getWin());\r
+\r
+                               // Check if node is out side the viewport if it is then scroll to it\r
+                               if ((nodeRect.y + nodeRect.h > viewPortRect.y + viewPortRect.h || nodeRect.y < viewPortRect.y) ||\r
+                                       (nodeRect.x > viewPortRect.x + viewPortRect.w || nodeRect.x < viewPortRect.x)) {\r
+                                       viewportBodyElement = tinymce.isIE ? editor.getDoc().documentElement : editor.getBody();\r
+                                       viewportBodyElement.scrollLeft = nodeRect.x;\r
+                                       viewportBodyElement.scrollTop = nodeRect.y - viewPortRect.h + 25;\r
+                               }\r
+\r
+                               // Move selection before marker and remove it\r
+                               rng = dom.createRng();\r
+\r
+                               // If previous sibling is a text node set the selection to the end of that node\r
+                               node = marker.previousSibling;\r
+                               if (node && node.nodeType == 3) {\r
+                                       rng.setStart(node, node.nodeValue.length);\r
+                               } else {\r
+                                       // If the previous sibling isn't a text node or doesn't exist set the selection before the marker node\r
+                                       rng.setStartBefore(marker);\r
+                                       rng.setEndBefore(marker);\r
+                               }\r
+\r
+                               // Remove the marker node and set the new range\r
+                               dom.remove(marker);\r
+                               selection.setRng(rng);\r
+\r
+                               // Dispatch after event and add any visual elements needed\r
+                               selection.onSetContent.dispatch(selection, args);\r
+                               editor.addVisual();\r
+                       },\r
+\r
+                       mceInsertRawHTML : function(command, ui, value) {\r
+                               selection.setContent('tiny_mce_marker');\r
+                               editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, function() { return value }));\r
+                       },\r
+\r
+                       mceSetContent : function(command, ui, value) {\r
+                               editor.setContent(value);\r
+                       },\r
+\r
+                       'Indent,Outdent' : function(command) {\r
+                               var intentValue, indentUnit, value;\r
+\r
+                               // Setup indent level\r
+                               intentValue = settings.indentation;\r
+                               indentUnit = /[a-z%]+$/i.exec(intentValue);\r
+                               intentValue = parseInt(intentValue);\r
+\r
+                               if (!queryCommandState('InsertUnorderedList') && !queryCommandState('InsertOrderedList')) {\r
+                                       each(selection.getSelectedBlocks(), function(element) {\r
+                                               if (command == 'outdent') {\r
+                                                       value = Math.max(0, parseInt(element.style.paddingLeft || 0) - intentValue);\r
+                                                       dom.setStyle(element, 'paddingLeft', value ? value + indentUnit : '');\r
+                                               } else\r
+                                                       dom.setStyle(element, 'paddingLeft', (parseInt(element.style.paddingLeft || 0) + intentValue) + indentUnit);\r
+                                       });\r
+                               } else\r
+                                       execNativeCommand(command);\r
+                       },\r
+\r
+                       mceRepaint : function() {\r
+                               var bookmark;\r
+\r
+                               if (tinymce.isGecko) {\r
+                                       try {\r
+                                               storeSelection(TRUE);\r
+\r
+                                               if (selection.getSel())\r
+                                                       selection.getSel().selectAllChildren(editor.getBody());\r
+\r
+                                               selection.collapse(TRUE);\r
+                                               restoreSelection();\r
+                                       } catch (ex) {\r
+                                               // Ignore\r
+                                       }\r
+                               }\r
+                       },\r
+\r
+                       mceToggleFormat : function(command, ui, value) {\r
+                               formatter.toggle(value);\r
+                       },\r
+\r
+                       InsertHorizontalRule : function() {\r
+                               editor.execCommand('mceInsertContent', false, '<hr />');\r
+                       },\r
+\r
+                       mceToggleVisualAid : function() {\r
+                               editor.hasVisual = !editor.hasVisual;\r
+                               editor.addVisual();\r
+                       },\r
+\r
+                       mceReplaceContent : function(command, ui, value) {\r
+                               editor.execCommand('mceInsertContent', false, value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'})));\r
+                       },\r
+\r
+                       mceInsertLink : function(command, ui, value) {\r
+                               var anchor;\r
+\r
+                               if (typeof(value) == 'string')\r
+                                       value = {href : value};\r
+\r
+                               anchor = dom.getParent(selection.getNode(), 'a');\r
+\r
+                               // Spaces are never valid in URLs and it's a very common mistake for people to make so we fix it here.\r
+                               value.href = value.href.replace(' ', '%20');\r
+\r
+                               // Remove existing links if there could be child links or that the href isn't specified\r
+                               if (!anchor || !value.href) {\r
+                                       formatter.remove('link');\r
+                               }               \r
+\r
+                               // Apply new link to selection\r
+                               if (value.href) {\r
+                                       formatter.apply('link', value, anchor);\r
+                               }\r
+                       },\r
+\r
+                       selectAll : function() {\r
+                               var root = dom.getRoot(), rng = dom.createRng();\r
+\r
+                               rng.setStart(root, 0);\r
+                               rng.setEnd(root, root.childNodes.length);\r
+\r
+                               editor.selection.setRng(rng);\r
+                       }\r
+               });\r
+\r
+               // Add queryCommandState overrides\r
+               addCommands({\r
+                       // Override justify commands\r
+                       'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) {\r
+                               return isFormatMatch('align' + command.substring(7));\r
+                       },\r
+\r
+                       'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) {\r
+                               return isFormatMatch(command);\r
+                       },\r
+\r
+                       mceBlockQuote : function() {\r
+                               return isFormatMatch('blockquote');\r
+                       },\r
+\r
+                       Outdent : function() {\r
+                               var node;\r
+\r
+                               if (settings.inline_styles) {\r
+                                       if ((node = dom.getParent(selection.getStart(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0)\r
+                                               return TRUE;\r
+\r
+                                       if ((node = dom.getParent(selection.getEnd(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0)\r
+                                               return TRUE;\r
+                               }\r
+\r
+                               return queryCommandState('InsertUnorderedList') || queryCommandState('InsertOrderedList') || (!settings.inline_styles && !!dom.getParent(selection.getNode(), 'BLOCKQUOTE'));\r
+                       },\r
+\r
+                       'InsertUnorderedList,InsertOrderedList' : function(command) {\r
+                               return dom.getParent(selection.getNode(), command == 'insertunorderedlist' ? 'UL' : 'OL');\r
+                       }\r
+               }, 'state');\r
+\r
+               // Add queryCommandValue overrides\r
+               addCommands({\r
+                       'FontSize,FontName' : function(command) {\r
+                               var value = 0, parent;\r
+\r
+                               if (parent = dom.getParent(selection.getNode(), 'span')) {\r
+                                       if (command == 'fontsize')\r
+                                               value = parent.style.fontSize;\r
+                                       else\r
+                                               value = parent.style.fontFamily.replace(/, /g, ',').replace(/[\'\"]/g, '').toLowerCase();\r
+                               }\r
+\r
+                               return value;\r
+                       }\r
+               }, 'value');\r
+\r
+               // Add undo manager logic\r
+               if (settings.custom_undo_redo) {\r
+                       addCommands({\r
+                               Undo : function() {\r
+                                       editor.undoManager.undo();\r
+                               },\r
+\r
+                               Redo : function() {\r
+                                       editor.undoManager.redo();\r
+                               }\r
+                       });\r
+               }\r
+       };\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var Dispatcher = tinymce.util.Dispatcher;\r
+\r
+       tinymce.UndoManager = function(editor) {\r
+               var self, index = 0, data = [], beforeBookmark;\r
+\r
+               function getContent() {\r
+                       return tinymce.trim(editor.getContent({format : 'raw', no_events : 1}));\r
+               };\r
+\r
+               return self = {\r
+                       typing : false,\r
+\r
+                       onAdd : new Dispatcher(self),\r
+\r
+                       onUndo : new Dispatcher(self),\r
+\r
+                       onRedo : new Dispatcher(self),\r
+\r
+                       beforeChange : function() {\r
+                               beforeBookmark = editor.selection.getBookmark(2, true);\r
+                       },\r
+\r
+                       add : function(level) {\r
+                               var i, settings = editor.settings, lastLevel;\r
+\r
+                               level = level || {};\r
+                               level.content = getContent();\r
+\r
+                               // Add undo level if needed\r
+                               lastLevel = data[index];\r
+                               if (lastLevel && lastLevel.content == level.content)\r
+                                       return null;\r
+\r
+                               // Set before bookmark on previous level\r
+                               if (data[index])\r
+                                       data[index].beforeBookmark = beforeBookmark;\r
+\r
+                               // Time to compress\r
+                               if (settings.custom_undo_redo_levels) {\r
+                                       if (data.length > settings.custom_undo_redo_levels) {\r
+                                               for (i = 0; i < data.length - 1; i++)\r
+                                                       data[i] = data[i + 1];\r
+\r
+                                               data.length--;\r
+                                               index = data.length;\r
+                                       }\r
+                               }\r
+\r
+                               // Get a non intrusive normalized bookmark\r
+                               level.bookmark = editor.selection.getBookmark(2, true);\r
+\r
+                               // Crop array if needed\r
+                               if (index < data.length - 1)\r
+                                       data.length = index + 1;\r
+\r
+                               data.push(level);\r
+                               index = data.length - 1;\r
+\r
+                               self.onAdd.dispatch(self, level);\r
+                               editor.isNotDirty = 0;\r
+\r
+                               return level;\r
+                       },\r
+\r
+                       undo : function() {\r
+                               var level, i;\r
+\r
+                               if (self.typing) {\r
+                                       self.add();\r
+                                       self.typing = false;\r
+                               }\r
+\r
+                               if (index > 0) {\r
+                                       level = data[--index];\r
+\r
+                                       editor.setContent(level.content, {format : 'raw'});\r
+                                       editor.selection.moveToBookmark(level.beforeBookmark);\r
+\r
+                                       self.onUndo.dispatch(self, level);\r
+                               }\r
+\r
+                               return level;\r
+                       },\r
+\r
+                       redo : function() {\r
+                               var level;\r
+\r
+                               if (index < data.length - 1) {\r
+                                       level = data[++index];\r
+\r
+                                       editor.setContent(level.content, {format : 'raw'});\r
+                                       editor.selection.moveToBookmark(level.bookmark);\r
+\r
+                                       self.onRedo.dispatch(self, level);\r
+                               }\r
+\r
+                               return level;\r
+                       },\r
+\r
+                       clear : function() {\r
+                               data = [];\r
+                               index = 0;\r
+                               self.typing = false;\r
+                       },\r
+\r
+                       hasUndo : function() {\r
+                               return index > 0 || this.typing;\r
+                       },\r
+\r
+                       hasRedo : function() {\r
+                               return index < data.length - 1 && !this.typing;\r
+                       }\r
+               };\r
+       };\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       // Shorten names\r
+       var Event = tinymce.dom.Event,\r
+               isIE = tinymce.isIE,\r
+               isGecko = tinymce.isGecko,\r
+               isOpera = tinymce.isOpera,\r
+               each = tinymce.each,\r
+               extend = tinymce.extend,\r
+               TRUE = true,\r
+               FALSE = false;\r
+\r
+       function cloneFormats(node) {\r
+               var clone, temp, inner;\r
+\r
+               do {\r
+                       if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(node.nodeName)) {\r
+                               if (clone) {\r
+                                       temp = node.cloneNode(false);\r
+                                       temp.appendChild(clone);\r
+                                       clone = temp;\r
+                               } else {\r
+                                       clone = inner = node.cloneNode(false);\r
+                               }\r
+\r
+                               clone.removeAttribute('id');\r
+                       }\r
+               } while (node = node.parentNode);\r
+\r
+               if (clone)\r
+                       return {wrapper : clone, inner : inner};\r
+       };\r
+\r
+       // Checks if the selection/caret is at the end of the specified block element\r
+       function isAtEnd(rng, par) {\r
+               var rng2 = par.ownerDocument.createRange();\r
+\r
+               rng2.setStart(rng.endContainer, rng.endOffset);\r
+               rng2.setEndAfter(par);\r
+\r
+               // Get number of characters to the right of the cursor if it's zero then we are at the end and need to merge the next block element\r
+               return rng2.cloneContents().textContent.length == 0;\r
+       };\r
+\r
+       function splitList(selection, dom, li) {\r
+               var listBlock, block;\r
+\r
+               if (dom.isEmpty(li)) {\r
+                       listBlock = dom.getParent(li, 'ul,ol');\r
+\r
+                       if (!dom.getParent(listBlock.parentNode, 'ul,ol')) {\r
+                               dom.split(listBlock, li);\r
+                               block = dom.create('p', 0, '<br data-mce-bogus="1" />');\r
+                               dom.replace(block, li);\r
+                               selection.select(block, 1);\r
+                       }\r
+\r
+                       return FALSE;\r
+               }\r
+\r
+               return TRUE;\r
+       };\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
+\r
+               setup : function() {\r
+                       var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection, blockElements = ed.schema.getBlockElements();\r
+\r
+                       // Force root blocks\r
+                       if (s.forced_root_block) {\r
+                               function addRootBlocks() {\r
+                                       var node = selection.getStart(), rootNode = ed.getBody(), rng, startContainer, startOffset, endContainer, endOffset, rootBlockNode, tempNode, offset = -0xFFFFFF;\r
+\r
+                                       if (!node || node.nodeType !== 1)\r
+                                               return;\r
+\r
+                                       // Check if node is wrapped in block\r
+                                       while (node != rootNode) {\r
+                                               if (blockElements[node.nodeName])\r
+                                                       return;\r
+\r
+                                               node = node.parentNode;\r
+                                       }\r
+\r
+                                       // Get current selection\r
+                                       rng = selection.getRng();\r
+                                       if (rng.setStart) {\r
+                                               startContainer = rng.startContainer;\r
+                                               startOffset = rng.startOffset;\r
+                                               endContainer = rng.endContainer;\r
+                                               endOffset = rng.endOffset;\r
+                                       } else {\r
+                                               // Force control range into text range\r
+                                               if (rng.item) {\r
+                                                       rng = ed.getDoc().body.createTextRange();\r
+                                                       rng.moveToElementText(rng.item(0));\r
+                                               }\r
+\r
+                                               tmpRng = rng.duplicate();\r
+                                               tmpRng.collapse(true);\r
+                                               startOffset = tmpRng.move('character', offset) * -1;\r
+\r
+                                               if (!tmpRng.collapsed) {\r
+                                                       tmpRng = rng.duplicate();\r
+                                                       tmpRng.collapse(false);\r
+                                                       endOffset = (tmpRng.move('character', offset) * -1) - startOffset;\r
+                                               }\r
+                                       }\r
+\r
+                                       // Wrap non block elements and text nodes\r
+                                       for (node = rootNode.firstChild; node; node) {\r
+                                               if (node.nodeType === 3 || (node.nodeType == 1 && !blockElements[node.nodeName])) {\r
+                                                       if (!rootBlockNode) {\r
+                                                               rootBlockNode = dom.create(s.forced_root_block);\r
+                                                               node.parentNode.insertBefore(rootBlockNode, node);\r
+                                                       }\r
+\r
+                                                       tempNode = node;\r
+                                                       node = node.nextSibling;\r
+                                                       rootBlockNode.appendChild(tempNode);\r
+                                               } else {\r
+                                                       rootBlockNode = null;\r
+                                                       node = node.nextSibling;\r
+                                               }\r
+                                       }\r
+\r
+                                       if (rng.setStart) {\r
+                                               rng.setStart(startContainer, startOffset);\r
+                                               rng.setEnd(endContainer, endOffset);\r
+                                               selection.setRng(rng);\r
+                                       } else {\r
+                                               try {\r
+                                                       rng = ed.getDoc().body.createTextRange();\r
+                                                       rng.moveToElementText(rootNode);\r
+                                                       rng.collapse(true);\r
+                                                       rng.moveStart('character', startOffset);\r
+\r
+                                                       if (endOffset > 0)\r
+                                                               rng.moveEnd('character', endOffset);\r
+\r
+                                                       rng.select();\r
+                                               } catch (ex) {\r
+                                                       // Ignore\r
+                                               }\r
+                                       }\r
+\r
+                                       ed.nodeChanged();\r
+                               };\r
+\r
+                               ed.onKeyUp.add(addRootBlocks);\r
+                               ed.onClick.add(addRootBlocks);\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;\r
+\r
+                                               if (e.keyCode == 13 && selection.getNode().nodeName != 'LI') {\r
+                                                       selection.setContent('<br id="__" /> ', {format : 'raw'});\r
+                                                       n = dom.get('__');\r
+                                                       n.removeAttribute('id');\r
+                                                       selection.select(n);\r
+                                                       selection.collapse();\r
+                                                       return Event.cancel(e);\r
+                                               }\r
+                                       });\r
+                               }\r
+                       }\r
+\r
+                       if (s.force_p_newlines) {\r
+                               if (!isIE) {\r
+                                       ed.onKeyPress.add(function(ed, e) {\r
+                                               if (e.keyCode == 13 && !e.shiftKey && !t.insertPara(e))\r
+                                                       Event.cancel(e);\r
+                                       });\r
+                               } else {\r
+                                       // Ungly hack to for IE to preserve the formatting when you press\r
+                                       // enter at the end of a block element with formatted contents\r
+                                       // This logic overrides the browsers default logic with\r
+                                       // custom logic that enables us to control the output\r
+                                       tinymce.addUnload(function() {\r
+                                               t._previousFormats = 0; // Fix IE leak\r
+                                       });\r
+\r
+                                       ed.onKeyPress.add(function(ed, e) {\r
+                                               t._previousFormats = 0;\r
+\r
+                                               // Clone the current formats, this will later be applied to the new block contents\r
+                                               if (e.keyCode == 13 && !e.shiftKey && ed.selection.isCollapsed() && s.keep_styles)\r
+                                                       t._previousFormats = cloneFormats(ed.selection.getStart());\r
+                                       });\r
+\r
+                                       ed.onKeyUp.add(function(ed, e) {\r
+                                               // Let IE break the element and the wrap the new caret location in the previous formats\r
+                                               if (e.keyCode == 13 && !e.shiftKey) {\r
+                                                       var parent = ed.selection.getStart(), fmt = t._previousFormats;\r
+\r
+                                                       // Parent is an empty block\r
+                                                       if (!parent.hasChildNodes() && fmt) {\r
+                                                               parent = dom.getParent(parent, dom.isBlock);\r
+\r
+                                                               if (parent && parent.nodeName != 'LI') {\r
+                                                                       parent.innerHTML = '';\r
+\r
+                                                                       if (t._previousFormats) {\r
+                                                                               parent.appendChild(fmt.wrapper);\r
+                                                                               fmt.inner.innerHTML = '\uFEFF';\r
+                                                                       } else\r
+                                                                               parent.innerHTML = '\uFEFF';\r
+\r
+                                                                       selection.select(parent, 1);\r
+                                                                       selection.collapse(true);\r
+                                                                       ed.getDoc().execCommand('Delete', false, null);\r
+                                                                       t._previousFormats = 0;\r
+                                                               }\r
+                                                       }\r
+                                               }\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
+                       // Workaround for missing shift+enter support, http://bugs.webkit.org/show_bug.cgi?id=16973\r
+                       if (tinymce.isWebKit) {\r
+                               function insertBr(ed) {\r
+                                       var rng = selection.getRng(), br, div = dom.create('div', null, ' '), divYPos, vpHeight = dom.getViewPort(ed.getWin()).h;\r
+\r
+                                       // Insert BR element\r
+                                       rng.insertNode(br = dom.create('br'));\r
+\r
+                                       // Place caret after BR\r
+                                       rng.setStartAfter(br);\r
+                                       rng.setEndAfter(br);\r
+                                       selection.setRng(rng);\r
+\r
+                                       // Could not place caret after BR then insert an nbsp entity and move the caret\r
+                                       if (selection.getSel().focusNode == br.previousSibling) {\r
+                                               selection.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'), br));\r
+                                               selection.collapse(TRUE);\r
+                                       }\r
+\r
+                                       // Create a temporary DIV after the BR and get the position as it\r
+                                       // seems like getPos() returns 0 for text nodes and BR elements.\r
+                                       dom.insertAfter(div, br);\r
+                                       divYPos = dom.getPos(div).y;\r
+                                       dom.remove(div);\r
+\r
+                                       // Scroll to new position, scrollIntoView can't be used due to bug: http://bugs.webkit.org/show_bug.cgi?id=16117\r
+                                       if (divYPos > vpHeight) // It is not necessary to scroll if the DIV is inside the view port.\r
+                                               ed.getWin().scrollTo(0, divYPos);\r
+                               };\r
+\r
+                               ed.onKeyPress.add(function(ed, e) {\r
+                                       if (e.keyCode == 13 && (e.shiftKey || (s.force_br_newlines && !dom.getParent(selection.getNode(), 'h1,h2,h3,h4,h5,h6,ol,ul')))) {\r
+                                               insertBr(ed);\r
+                                               Event.cancel(e);\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       // IE specific fixes\r
+                       if (isIE) {\r
+                               // Replaces IE:s auto generated paragraphs with the specified element name\r
+                               if (s.element != 'P') {\r
+                                       ed.onKeyPress.add(function(ed, e) {\r
+                                               t.lastElm = selection.getNode().nodeName;\r
+                                       });\r
+\r
+                                       ed.onKeyUp.add(function(ed, e) {\r
+                                               var bl, n = selection.getNode(), b = ed.getBody();\r
+\r
+                                               if (b.childNodes.length === 1 && n.nodeName == 'P') {\r
+                                                       n = dom.rename(n, s.element);\r
+                                                       selection.select(n);\r
+                                                       selection.collapse();\r
+                                                       ed.nodeChanged();\r
+                                               } else if (e.keyCode == 13 && !e.shiftKey && t.lastElm != 'P') {\r
+                                                       bl = dom.getParent(n, 'p');\r
+\r
+                                                       if (bl) {\r
+                                                               dom.rename(bl, s.element);\r
+                                                               ed.nodeChanged();\r
+                                                       }\r
+                                               }\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, dom = ed.dom, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body;\r
+                       var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = dom.getViewPort(ed.getWin()), y, ch, car;\r
+\r
+                       ed.undoManager.beforeChange();\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 selection is in empty table cell\r
+                       if (sn === en && /^(TD|TH)$/.test(sn.nodeName)) {\r
+                               if (sn.firstChild.nodeName == 'BR')\r
+                                       dom.remove(sn.firstChild); // Remove BR\r
+\r
+                               // Create two new block elements\r
+                               if (sn.childNodes.length == 0) {\r
+                                       ed.dom.add(sn, se.element, null, '<br />');\r
+                                       aft = ed.dom.add(sn, se.element, null, '<br />');\r
+                               } else {\r
+                                       n = sn.innerHTML;\r
+                                       sn.innerHTML = '';\r
+                                       ed.dom.add(sn, se.element, null, n);\r
+                                       aft = ed.dom.add(sn, se.element, null, '<br />');\r
+                               }\r
+\r
+                               // Move caret into the last one\r
+                               r = d.createRange();\r
+                               r.selectNodeContents(aft);\r
+                               r.collapse(1);\r
+                               ed.selection.setRng(r);\r
+\r
+                               return FALSE;\r
+                       }\r
+\r
+                       // If the caret is in an invalid location in FF we need to move it into the first block\r
+                       if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) {\r
+                               sn = en = sn.firstChild;\r
+                               so = eo = 0;\r
+                               rb = d.createRange();\r
+                               rb.setStart(sn, 0);\r
+                               ra = d.createRange();\r
+                               ra.setStart(en, 0);\r
+                       }\r
+\r
+                       // If the body is totally empty add a BR element this might happen on webkit\r
+                       if (!d.body.hasChildNodes()) {\r
+                               d.body.appendChild(dom.create('br'));\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 (n = t.dom.getParent(sb, 'li,pre')) {\r
+                               if (n.nodeName == 'LI')\r
+                                       return splitList(ed.selection, t.dom, n);\r
+\r
+                               return TRUE;\r
+                       }\r
+\r
+                       // If caption or absolute layers then always generate new blocks within\r
+                       if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) {\r
+                               bn = se.element;\r
+                               sb = null;\r
+                       }\r
+\r
+                       // If caption or absolute layers then always generate new blocks within\r
+                       if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) {\r
+                               bn = se.element;\r
+                               eb = null;\r
+                       }\r
+\r
+                       // Use P instead\r
+                       if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(dom.getStyle(sb, 'float', 1)))) {\r
+                               bn = se.element;\r
+                               sb = eb = null;\r
+                       }\r
+\r
+                       // 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) && isAtEnd(r, sb))\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
+                       function appendStyles(e, en) {\r
+                               var nl = [], nn, n, i;\r
+\r
+                               e.innerHTML = '';\r
+\r
+                               // Make clones of style elements\r
+                               if (se.keep_styles) {\r
+                                       n = en;\r
+                                       do {\r
+                                               // We only want style specific elements\r
+                                               if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(n.nodeName)) {\r
+                                                       nn = n.cloneNode(FALSE);\r
+                                                       dom.setAttrib(nn, 'id', ''); // Remove ID since it needs to be unique\r
+                                                       nl.push(nn);\r
+                                               }\r
+                                       } while (n = n.parentNode);\r
+                               }\r
+\r
+                               // Append style elements to aft\r
+                               if (nl.length > 0) {\r
+                                       for (i = nl.length - 1, nn = e; i >= 0; i--)\r
+                                               nn = nn.appendChild(nl[i]);\r
+\r
+                                       // Padd most inner style element\r
+                                       nl[0].innerHTML = isOpera ? '\u00a0' : '<br />'; // Extra space for Opera so that the caret can move there\r
+                                       return nl[0]; // Move caret to most inner element\r
+                               } else\r
+                                       e.innerHTML = isOpera ? '\u00a0' : '<br />'; // Extra space for Opera so that the caret can move there\r
+                       };\r
+                               \r
+                       // Padd empty blocks\r
+                       if (dom.isEmpty(bef))\r
+                               appendStyles(bef, sn);\r
+\r
+                       // Fill empty afterblook with current style\r
+                       if (dom.isEmpty(aft))\r
+                               car = appendStyles(aft, en);\r
+\r
+                       // Opera needs this one backwards for older versions\r
+                       if (isOpera && parseFloat(opera.version()) < 9.5) {\r
+                               r.insertNode(bef);\r
+                               r.insertNode(aft);\r
+                       } else {\r
+                               r.insertNode(aft);\r
+                               r.insertNode(bef);\r
+                       }\r
+\r
+                       // Normalize\r
+                       aft.normalize();\r
+                       bef.normalize();\r
+\r
+                       // Move cursor and scroll into view\r
+                       ed.selection.select(aft, true);\r
+                       ed.selection.collapse(true);\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 + 25 > vp.y + vp.h) {\r
+                               ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + 25); // Needs to be hardcoded to roughly one line of text if a huge text block is broken into two blocks\r
+\r
+                               /*console.debug(\r
+                                       'Element: y=' + y + ', h=' + ch + ', ' +\r
+                                       'Viewport: y=' + vp.y + ", h=" + vp.h + ', bottom=' + (vp.y + vp.h)\r
+                               );*/\r
+                       }\r
+\r
+                       ed.undoManager.add();\r
+\r
+                       return FALSE;\r
+               },\r
+\r
+               backspaceDelete : function(e, bs) {\r
+                       var t = this, ed = t.editor, b = ed.getBody(), dom = ed.dom, n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n, w, tn, walker;\r
+\r
+                       // Delete when caret is behind a element doesn't work correctly on Gecko see #3011651\r
+                       if (!bs && r.collapsed && sc.nodeType == 1 && r.startOffset == sc.childNodes.length) {\r
+                               walker = new tinymce.dom.TreeWalker(sc.lastChild, sc);\r
+\r
+                               // Walk the dom backwards until we find a text node\r
+                               for (n = sc.lastChild; n; n = walker.prev()) {\r
+                                       if (n.nodeType == 3) {\r
+                                               r.setStart(n, n.nodeValue.length);\r
+                                               r.collapse(true);\r
+                                               se.setRng(r);\r
+                                               return;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // 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
+       });\r
+})(tinymce);\r
+\r
+(function(tinymce) {\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
+                                               if (s.cmd)\r
+                                                       ed.execCommand(s.cmd, s.ui || false, s.value);\r
+                                       };\r
+                               }\r
+                       });\r
+\r
+                       ed.onRemove.add(function() {\r
+                               c.destroy();\r
+                       });\r
+\r
+                       // Fix for bug #1897785, #1898007\r
+                       if (tinymce.isIE) {\r
+                               c.onShowMenu.add(function() {\r
+                                       // IE 8 needs focus in order to store away a range with the current collapsed caret location\r
+                                       ed.focus();\r
+\r
+                                       bm = ed.selection.getBookmark(1);\r
+                               });\r
+\r
+                               c.onHideMenu.add(function() {\r
+                                       if (bm) {\r
+                                               ed.selection.moveToBookmark(bm);\r
+                                               bm = 0;\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               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, ed);\r
+                       }\r
+\r
+                       t.controls[id] = c;\r
+\r
+                       // Fix focus problem in Safari\r
+                       if (tinymce.isWebKit) {\r
+                               c.onPostRender.add(function(c, n) {\r
+                                       // Store bookmark on mousedown\r
+                                       Event.add(n, 'mousedown', function() {\r
+                                               ed.bookmark = ed.selection.getBookmark(1);\r
+                                       });\r
+\r
+                                       // 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.label = ed.translate(s.label);\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, ed);\r
+                               ed.onMouseDown.add(c.hideMenu, c);\r
+                       } else {\r
+                               cls = t._cls.button || tinymce.ui.Button;\r
+                               c = new cls(id, s, ed);\r
+                       }\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createMenuButton : function(id, s, cc) {\r
+                       s = s || {};\r
+                       s.menu_button = 1;\r
+\r
+                       return this.createButton(id, s, cc);\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, ed));\r
+                       ed.onMouseDown.add(c.hideMenu, c);\r
+\r
+                       return c;\r
+               },\r
+\r
+               createColorSplitButton : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, cmd, c, cls, bm;\r
+\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       s.title = ed.translate(s.title);\r
+                       s.scope = s.scope || ed;\r
+\r
+                       if (!s.onclick) {\r
+                               s.onclick = function(v) {\r
+                                       if (tinymce.isIE)\r
+                                               bm = ed.selection.getBookmark(1);\r
+\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       if (!s.onselect) {\r
+                               s.onselect = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       s = extend({\r
+                               title : s.title,\r
+                               'class' : 'mce_' + id,\r
+                               'menu_class' : ed.getParam('skin') + 'Skin',\r
+                               scope : s.scope,\r
+                               more_colors_title : ed.getLang('more_colors')\r
+                       }, s);\r
+\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton;\r
+                       c = new cls(id, s, ed);\r
+                       ed.onMouseDown.add(c.hideMenu, c);\r
+\r
+                       // Remove the menu element when the editor is removed\r
+                       ed.onRemove.add(function() {\r
+                               c.destroy();\r
+                       });\r
+\r
+                       // Fix for bug #1897785, #1898007\r
+                       if (tinymce.isIE) {\r
+                               c.onShowMenu.add(function() {\r
+                                       // IE 8 needs focus in order to store away a range with the current collapsed caret location\r
+                                       ed.focus();\r
+                                       bm = ed.selection.getBookmark(1);\r
+                               });\r
+\r
+                               c.onHideMenu.add(function() {\r
+                                       if (bm) {\r
+                                               ed.selection.moveToBookmark(bm);\r
+                                               bm = 0;\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createToolbar : function(id, s, cc) {\r
+                       var c, t = this, cls;\r
+\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.toolbar || tinymce.ui.Toolbar;\r
+                       c = new cls(id, s, t.editor);\r
+\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       return t.add(c);\r
+               },\r
+               \r
+               createToolbarGroup : function(id, s, cc) {\r
+                       var c, t = this, cls;\r
+                       id = t.prefix + id;\r
+                       cls = cc || this._cls.toolbarGroup || tinymce.ui.ToolbarGroup;\r
+                       c = new cls(id, s, t.editor);\r
+                       \r
+                       if (t.get(id))\r
+                               return null;\r
+                       \r
+                       return t.add(c);\r
+               },\r
+\r
+               createSeparator : function(cc) {\r
+                       var cls = cc || this._cls.separator || tinymce.ui.Separator;\r
+\r
+                       return new cls();\r
+               },\r
+\r
+               setControlType : function(n, c) {\r
+                       return this._cls[n.toLowerCase()] = c;\r
+               },\r
+       \r
+               destroy : function() {\r
+                       each(this.controls, function(c) {\r
+                               c.destroy();\r
+                       });\r
+\r
+                       this.controls = null;\r
+               }\r
+       });\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera;\r
+\r
+       tinymce.create('tinymce.WindowManager', {\r
+               WindowManager : function(ed) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+                       t.onOpen = new Dispatcher(t);\r
+                       t.onClose = new Dispatcher(t);\r
+                       t.params = {};\r
+                       t.features = {};\r
+               },\r
+\r
+               open : function(s, p) {\r
+                       var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u;\r
+\r
+                       // Default some options\r
+                       s = s || {};\r
+                       p = p || {};\r
+                       sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window\r
+                       sh = isOpera ? vp.h : screen.height;\r
+                       s.name = s.name || 'mc_' + new Date().getTime();\r
+                       s.width = parseInt(s.width || 320);\r
+                       s.height = parseInt(s.height || 240);\r
+                       s.resizable = true;\r
+                       s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0);\r
+                       s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0);\r
+                       p.inline = false;\r
+                       p.mce_width = s.width;\r
+                       p.mce_height = s.height;\r
+                       p.mce_auto_focus = s.auto_focus;\r
+\r
+                       if (mo) {\r
+                               if (isIE) {\r
+                                       s.center = true;\r
+                                       s.help = false;\r
+                                       s.dialogWidth = s.width + 'px';\r
+                                       s.dialogHeight = s.height + 'px';\r
+                                       s.scroll = s.scrollbars || false;\r
+                               }\r
+                       }\r
+\r
+                       // Build features string\r
+                       each(s, function(v, k) {\r
+                               if (tinymce.is(v, 'boolean'))\r
+                                       v = v ? 'yes' : 'no';\r
+\r
+                               if (!/^(name|url)$/.test(k)) {\r
+                                       if (isIE && mo)\r
+                                               f += (f ? ';' : '') + k + ':' + v;\r
+                                       else\r
+                                               f += (f ? ',' : '') + k + '=' + v;\r
+                               }\r
+                       });\r
+\r
+                       t.features = s;\r
+                       t.params = p;\r
+                       t.onOpen.dispatch(t, s, p);\r
+\r
+                       u = s.url || s.file;\r
+                       u = tinymce._addVer(u);\r
+\r
+                       try {\r
+                               if (isIE && mo) {\r
+                                       w = 1;\r
+                                       window.showModalDialog(u, window, f);\r
+                               } else\r
+                                       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, w) {\r
+                       w = w || window;\r
+\r
+                       cb.call(s || this, w.confirm(this._decode(this.editor.getLang(t, t))));\r
+               },\r
+\r
+               alert : function(tx, cb, s, w) {\r
+                       var t = this;\r
+\r
+                       w = w || window;\r
+                       w.alert(t._decode(t.editor.getLang(tx, tx)));\r
+\r
+                       if (cb)\r
+                               cb.call(s || t);\r
+               },\r
+\r
+               resizeBy : function(dw, dh, win) {\r
+                       win.resizeBy(dw, dh);\r
+               },\r
+\r
+               // Internal functions\r
+\r
+               _decode : function(s) {\r
+                       return tinymce.DOM.decode(s).replace(/\\n/g, '\n');\r
+               }\r
+       });\r
+}(tinymce));\r
+(function(tinymce) {\r
+       tinymce.Formatter = function(ed) {\r
+               var formats = {},\r
+                       each = tinymce.each,\r
+                       dom = ed.dom,\r
+                       selection = ed.selection,\r
+                       TreeWalker = tinymce.dom.TreeWalker,\r
+                       rangeUtils = new tinymce.dom.RangeUtils(dom),\r
+                       isValid = ed.schema.isValidChild,\r
+                       isBlock = dom.isBlock,\r
+                       forcedRootBlock = ed.settings.forced_root_block,\r
+                       nodeIndex = dom.nodeIndex,\r
+                       INVISIBLE_CHAR = '\uFEFF',\r
+                       MCE_ATTR_RE = /^(src|href|style)$/,\r
+                       FALSE = false,\r
+                       TRUE = true,\r
+                       undefined,\r
+                       pendingFormats = {apply : [], remove : []};\r
+\r
+               function isArray(obj) {\r
+                       return obj instanceof Array;\r
+               };\r
+\r
+               function getParents(node, selector) {\r
+                       return dom.getParents(node, selector, dom.getRoot());\r
+               };\r
+\r
+               function isCaretNode(node) {\r
+                       return node.nodeType === 1 && (node.face === 'mceinline' || node.style.fontFamily === 'mceinline');\r
+               };\r
+\r
+               // Public functions\r
+\r
+               function get(name) {\r
+                       return name ? formats[name] : formats;\r
+               };\r
+\r
+               function register(name, format) {\r
+                       if (name) {\r
+                               if (typeof(name) !== 'string') {\r
+                                       each(name, function(format, name) {\r
+                                               register(name, format);\r
+                                       });\r
+                               } else {\r
+                                       // Force format into array and add it to internal collection\r
+                                       format = format.length ? format : [format];\r
+\r
+                                       each(format, function(format) {\r
+                                               // Set deep to false by default on selector formats this to avoid removing\r
+                                               // alignment on images inside paragraphs when alignment is changed on paragraphs\r
+                                               if (format.deep === undefined)\r
+                                                       format.deep = !format.selector;\r
+\r
+                                               // Default to true\r
+                                               if (format.split === undefined)\r
+                                                       format.split = !format.selector || format.inline;\r
+\r
+                                               // Default to true\r
+                                               if (format.remove === undefined && format.selector && !format.inline)\r
+                                                       format.remove = 'none';\r
+\r
+                                               // Mark format as a mixed format inline + block level\r
+                                               if (format.selector && format.inline) {\r
+                                                       format.mixed = true;\r
+                                                       format.block_expand = true;\r
+                                               }\r
+\r
+                                               // Split classes if needed\r
+                                               if (typeof(format.classes) === 'string')\r
+                                                       format.classes = format.classes.split(/\s+/);\r
+                                       });\r
+\r
+                                       formats[name] = format;\r
+                               }\r
+                       }\r
+               };\r
+\r
+               var getTextDecoration = function(node) {\r
+                       var decoration;\r
+\r
+                       ed.dom.getParent(node, function(n) {\r
+                               decoration = ed.dom.getStyle(n, 'text-decoration');\r
+                               return decoration && decoration !== 'none';\r
+                       });\r
+\r
+                       return decoration;\r
+               };\r
+\r
+               var processUnderlineAndColor = function(node) {\r
+                       var textDecoration;\r
+                       if (node.nodeType === 1 && node.parentNode && node.parentNode.nodeType === 1) {\r
+                               textDecoration = getTextDecoration(node.parentNode);\r
+                               if (ed.dom.getStyle(node, 'color') && textDecoration) {\r
+                                       ed.dom.setStyle(node, 'text-decoration', textDecoration);\r
+                               } else if (ed.dom.getStyle(node, 'textdecoration') === textDecoration) {\r
+                                       ed.dom.setStyle(node, 'text-decoration', null);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               function apply(name, vars, node) {\r
+                       var formatList = get(name), format = formatList[0], bookmark, rng, i, isCollapsed = selection.isCollapsed();\r
+\r
+                       function moveStart(rng) {\r
+                               var container = rng.startContainer,\r
+                                       offset = rng.startOffset,\r
+                                       walker, node;\r
+\r
+                               // Move startContainer/startOffset in to a suitable node\r
+                               if (container.nodeType == 1 || container.nodeValue === "") {\r
+                                       container = container.nodeType == 1 ? container.childNodes[offset] : container;\r
+\r
+                                       // Might fail if the offset is behind the last element in it's container\r
+                                       if (container) {\r
+                                               walker = new TreeWalker(container, container.parentNode);\r
+                                               for (node = walker.current(); node; node = walker.next()) {\r
+                                                       if (node.nodeType == 3 && !isWhiteSpaceNode(node)) {\r
+                                                               rng.setStart(node, 0);\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               return rng;\r
+                       };\r
+\r
+                       function setElementFormat(elm, fmt) {\r
+                               fmt = fmt || format;\r
+\r
+                               if (elm) {\r
+                                       if (fmt.onformat) {\r
+                                               fmt.onformat(elm, fmt, vars, node);\r
+                                       }\r
+\r
+                                       each(fmt.styles, function(value, name) {\r
+                                               dom.setStyle(elm, name, replaceVars(value, vars));\r
+                                       });\r
+\r
+                                       each(fmt.attributes, function(value, name) {\r
+                                               dom.setAttrib(elm, name, replaceVars(value, vars));\r
+                                       });\r
+\r
+                                       each(fmt.classes, function(value) {\r
+                                               value = replaceVars(value, vars);\r
+\r
+                                               if (!dom.hasClass(elm, value))\r
+                                                       dom.addClass(elm, value);\r
+                                       });\r
+                               }\r
+                       };\r
+                       function adjustSelectionToVisibleSelection() {\r
+                               function findSelectionEnd(start, end) {\r
+                                       var walker = new TreeWalker(end);\r
+                                       for (node = walker.current(); node; node = walker.prev()) {\r
+                                               if (node.childNodes.length > 1 || node == start) {\r
+                                                       return node;\r
+                                               }\r
+                                       }\r
+                               };\r
+\r
+                               // Adjust selection so that a end container with a end offset of zero is not included in the selection\r
+                               // as this isn't visible to the user.\r
+                               var rng = ed.selection.getRng();\r
+                               var start = rng.startContainer;\r
+                               var end = rng.endContainer;\r
+\r
+                               if (start != end && rng.endOffset == 0) {\r
+                                       var newEnd = findSelectionEnd(start, end);\r
+                                       var endOffset = newEnd.nodeType == 3 ? newEnd.length : newEnd.childNodes.length;\r
+\r
+                                       rng.setEnd(newEnd, endOffset);\r
+                               }\r
+\r
+                               return rng;\r
+                       }\r
+                       \r
+                       function applyStyleToList(node, bookmark, wrapElm, newWrappers, process){\r
+                               var nodes = [], listIndex = -1, list, startIndex = -1, endIndex = -1, currentWrapElm;\r
+                               \r
+                               // find the index of the first child list.\r
+                               each(node.childNodes, function(n, index) {\r
+                                       if (n.nodeName === "UL" || n.nodeName === "OL") {\r
+                                               listIndex = index;\r
+                                               list = n;\r
+                                               return false;\r
+                                       }\r
+                               });\r
+                               \r
+                               // get the index of the bookmarks\r
+                               each(node.childNodes, function(n, index) {\r
+                                       if (n.nodeName === "SPAN" && dom.getAttrib(n, "data-mce-type") == "bookmark") {\r
+                                               if (n.id == bookmark.id + "_start") {\r
+                                                       startIndex = index;\r
+                                               } else if (n.id == bookmark.id + "_end") {\r
+                                                       endIndex = index;\r
+                                               }\r
+                                       }\r
+                               });\r
+                               \r
+                               // if the selection spans across an embedded list, or there isn't an embedded list - handle processing normally\r
+                               if (listIndex <= 0 || (startIndex < listIndex && endIndex > listIndex)) {\r
+                                       each(tinymce.grep(node.childNodes), process);\r
+                                       return 0;\r
+                               } else {\r
+                                       currentWrapElm = wrapElm.cloneNode(FALSE);\r
+                                       \r
+                                       // create a list of the nodes on the same side of the list as the selection\r
+                                       each(tinymce.grep(node.childNodes), function(n, index) {\r
+                                               if ((startIndex < listIndex && index < listIndex) || (startIndex > listIndex && index > listIndex)) {\r
+                                                       nodes.push(n); \r
+                                                       n.parentNode.removeChild(n);\r
+                                               }\r
+                                       });\r
+                                       \r
+                                       // insert the wrapping element either before or after the list.\r
+                                       if (startIndex < listIndex) {\r
+                                               node.insertBefore(currentWrapElm, list);\r
+                                       } else if (startIndex > listIndex) {\r
+                                               node.insertBefore(currentWrapElm, list.nextSibling);\r
+                                       }\r
+                                       \r
+                                       // add the new nodes to the list.\r
+                                       newWrappers.push(currentWrapElm);\r
+\r
+                                       each(nodes, function(node) {\r
+                                               currentWrapElm.appendChild(node);\r
+                                       });\r
+\r
+                                       return currentWrapElm;\r
+                               }\r
+                       };\r
+                       \r
+                       function applyRngStyle(rng, bookmark) {\r
+                               var newWrappers = [], wrapName, wrapElm;\r
+\r
+                               // Setup wrapper element\r
+                               wrapName = format.inline || format.block;\r
+                               wrapElm = dom.create(wrapName);\r
+                               setElementFormat(wrapElm);\r
+\r
+                               rangeUtils.walk(rng, function(nodes) {\r
+                                       var currentWrapElm;\r
+\r
+                                       function process(node) {\r
+                                               var nodeName = node.nodeName.toLowerCase(), parentName = node.parentNode.nodeName.toLowerCase(), found;\r
+\r
+                                               // Stop wrapping on br elements\r
+                                               if (isEq(nodeName, 'br')) {\r
+                                                       currentWrapElm = 0;\r
+\r
+                                                       // Remove any br elements when we wrap things\r
+                                                       if (format.block)\r
+                                                               dom.remove(node);\r
+\r
+                                                       return;\r
+                                               }\r
+\r
+                                               // If node is wrapper type\r
+                                               if (format.wrapper && matchNode(node, name, vars)) {\r
+                                                       currentWrapElm = 0;\r
+                                                       return;\r
+                                               }\r
+\r
+                                               // Can we rename the block\r
+                                               if (format.block && !format.wrapper && isTextBlock(nodeName)) {\r
+                                                       node = dom.rename(node, wrapName);\r
+                                                       setElementFormat(node);\r
+                                                       newWrappers.push(node);\r
+                                                       currentWrapElm = 0;\r
+                                                       return;\r
+                                               }\r
+\r
+                                               // Handle selector patterns\r
+                                               if (format.selector) {\r
+                                                       // Look for matching formats\r
+                                                       each(formatList, function(format) {\r
+                                                               // Check collapsed state if it exists\r
+                                                               if ('collapsed' in format && format.collapsed !== isCollapsed) {\r
+                                                                       return;\r
+                                                               }\r
+\r
+                                                               if (dom.is(node, format.selector) && !isCaretNode(node)) {\r
+                                                                       setElementFormat(node, format);\r
+                                                                       found = true;\r
+                                                               }\r
+                                                       });\r
+\r
+                                                       // Continue processing if a selector match wasn't found and a inline element is defined\r
+                                                       if (!format.inline || found) {\r
+                                                               currentWrapElm = 0;\r
+                                                               return;\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Is it valid to wrap this item\r
+                                               if (isValid(wrapName, nodeName) && isValid(parentName, wrapName) &&\r
+                                                               !(node.nodeType === 3 && node.nodeValue.length === 1 && node.nodeValue.charCodeAt(0) === 65279)) {\r
+                                                       // Start wrapping\r
+                                                       if (!currentWrapElm) {\r
+                                                               // Wrap the node\r
+                                                               currentWrapElm = wrapElm.cloneNode(FALSE);\r
+                                                               node.parentNode.insertBefore(currentWrapElm, node);\r
+                                                               newWrappers.push(currentWrapElm);\r
+                                                       }\r
+\r
+                                                       currentWrapElm.appendChild(node);\r
+                                               } else if (nodeName == 'li' && bookmark) {\r
+                                                       // Start wrapping - if we are in a list node and have a bookmark, then we will always begin by wrapping in a new element.\r
+                                                       currentWrapElm = applyStyleToList(node, bookmark, wrapElm, newWrappers, process);\r
+                                               } else {\r
+                                                       // Start a new wrapper for possible children\r
+                                                       currentWrapElm = 0;\r
+\r
+                                                       each(tinymce.grep(node.childNodes), process);\r
+\r
+                                                       // End the last wrapper\r
+                                                       currentWrapElm = 0;\r
+                                               }\r
+                                       };\r
+\r
+                                       // Process siblings from range\r
+                                       each(nodes, process);\r
+                               });\r
+\r
+                               // Wrap links inside as well, for example color inside a link when the wrapper is around the link\r
+                               if (format.wrap_links === false) {\r
+                                       each(newWrappers, function(node) {\r
+                                               function process(node) {\r
+                                                       var i, currentWrapElm, children;\r
+\r
+                                                       if (node.nodeName === 'A') {\r
+                                                               currentWrapElm = wrapElm.cloneNode(FALSE);\r
+                                                               newWrappers.push(currentWrapElm);\r
+\r
+                                                               children = tinymce.grep(node.childNodes);\r
+                                                               for (i = 0; i < children.length; i++)\r
+                                                                       currentWrapElm.appendChild(children[i]);\r
+\r
+                                                               node.appendChild(currentWrapElm);\r
+                                                       }\r
+\r
+                                                       each(tinymce.grep(node.childNodes), process);\r
+                                               };\r
+\r
+                                               process(node);\r
+                                       });\r
+                               }\r
+\r
+                               // Cleanup\r
+                               each(newWrappers, function(node) {\r
+                                       var childCount;\r
+\r
+                                       function getChildCount(node) {\r
+                                               var count = 0;\r
+\r
+                                               each(node.childNodes, function(node) {\r
+                                                       if (!isWhiteSpaceNode(node) && !isBookmarkNode(node))\r
+                                                               count++;\r
+                                               });\r
+\r
+                                               return count;\r
+                                       };\r
+\r
+                                       function mergeStyles(node) {\r
+                                               var child, clone;\r
+\r
+                                               each(node.childNodes, function(node) {\r
+                                                       if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) {\r
+                                                               child = node;\r
+                                                               return FALSE; // break loop\r
+                                                       }\r
+                                               });\r
+\r
+                                               // If child was found and of the same type as the current node\r
+                                               if (child && matchName(child, format)) {\r
+                                                       clone = child.cloneNode(FALSE);\r
+                                                       setElementFormat(clone);\r
+\r
+                                                       dom.replace(clone, node, TRUE);\r
+                                                       dom.remove(child, 1);\r
+                                               }\r
+\r
+                                               return clone || node;\r
+                                       };\r
+\r
+                                       childCount = getChildCount(node);\r
+\r
+                                       // Remove empty nodes but only if there is multiple wrappers and they are not block\r
+                                       // elements so never remove single <h1></h1> since that would remove the currrent empty block element where the caret is at\r
+                                       if ((newWrappers.length > 1 || !isBlock(node)) && childCount === 0) {\r
+                                               dom.remove(node, 1);\r
+                                               return;\r
+                                       }\r
+\r
+                                       if (format.inline || format.wrapper) {\r
+                                               // Merges the current node with it's children of similar type to reduce the number of elements\r
+                                               if (!format.exact && childCount === 1)\r
+                                                       node = mergeStyles(node);\r
+\r
+                                               // Remove/merge children\r
+                                               each(formatList, function(format) {\r
+                                                       // Merge all children of similar type will move styles from child to parent\r
+                                                       // this: <span style="color:red"><b><span style="color:red; font-size:10px">text</span></b></span>\r
+                                                       // will become: <span style="color:red"><b><span style="font-size:10px">text</span></b></span>\r
+                                                       each(dom.select(format.inline, node), function(child) {\r
+                                                               var parent;\r
+\r
+                                                               // When wrap_links is set to false we don't want\r
+                                                               // to remove the format on children within links\r
+                                                               if (format.wrap_links === false) {\r
+                                                                       parent = child.parentNode;\r
+\r
+                                                                       do {\r
+                                                                               if (parent.nodeName === 'A')\r
+                                                                                       return;\r
+                                                                       } while (parent = parent.parentNode);\r
+                                                               }\r
+\r
+                                                               removeFormat(format, vars, child, format.exact ? child : null);\r
+                                                       });\r
+                                               });\r
+\r
+                                               // Remove child if direct parent is of same type\r
+                                               if (matchNode(node.parentNode, name, vars)) {\r
+                                                       dom.remove(node, 1);\r
+                                                       node = 0;\r
+                                                       return TRUE;\r
+                                               }\r
+\r
+                                               // Look for parent with similar style format\r
+                                               if (format.merge_with_parents) {\r
+                                                       dom.getParent(node.parentNode, function(parent) {\r
+                                                               if (matchNode(parent, name, vars)) {\r
+                                                                       dom.remove(node, 1);\r
+                                                                       node = 0;\r
+                                                                       return TRUE;\r
+                                                               }\r
+                                                       });\r
+                                               }\r
+\r
+                                               // Merge next and previous siblings if they are similar <b>text</b><b>text</b> becomes <b>texttext</b>\r
+                                               if (node && format.merge_siblings !== false) {\r
+                                                       node = mergeSiblings(getNonWhiteSpaceSibling(node), node);\r
+                                                       node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE));\r
+                                               }\r
+                                       }\r
+                               });\r
+                       };\r
+\r
+                       if (format) {\r
+                               if (node) {\r
+                                       rng = dom.createRng();\r
+\r
+                                       rng.setStartBefore(node);\r
+                                       rng.setEndAfter(node);\r
+\r
+                                       applyRngStyle(expandRng(rng, formatList));\r
+                               } else {\r
+                                       if (!isCollapsed || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) {\r
+                                               // Obtain selection node before selection is unselected by applyRngStyle()\r
+                                               var curSelNode = ed.selection.getNode();\r
+\r
+                                               // Apply formatting to selection\r
+                                               ed.selection.setRng(adjustSelectionToVisibleSelection());\r
+                                               bookmark = selection.getBookmark();\r
+                                               applyRngStyle(expandRng(selection.getRng(TRUE), formatList), bookmark);\r
+\r
+                                               // Colored nodes should be underlined so that the color of the underline matches the text color.\r
+                                               if (format.styles && (format.styles.color || format.styles.textDecoration)) {\r
+                                                       tinymce.walk(curSelNode, processUnderlineAndColor, 'childNodes');\r
+                                                       processUnderlineAndColor(curSelNode);\r
+                                               }\r
+\r
+                                               selection.moveToBookmark(bookmark);\r
+                                               selection.setRng(moveStart(selection.getRng(TRUE)));\r
+                                               ed.nodeChanged();\r
+                                       } else\r
+                                               performCaretAction('apply', name, vars);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               function remove(name, vars, node) {\r
+                       var formatList = get(name), format = formatList[0], bookmark, i, rng;\r
+                       function moveStart(rng) {\r
+                               var container = rng.startContainer,\r
+                                       offset = rng.startOffset,\r
+                                       walker, node, nodes, tmpNode;\r
+\r
+                               // Convert text node into index if possible\r
+                               if (container.nodeType == 3 && offset >= container.nodeValue.length - 1) {\r
+                                       container = container.parentNode;\r
+                                       offset = nodeIndex(container) + 1;\r
+                               }\r
+\r
+                               // Move startContainer/startOffset in to a suitable node\r
+                               if (container.nodeType == 1) {\r
+                                       nodes = container.childNodes;\r
+                                       container = nodes[Math.min(offset, nodes.length - 1)];\r
+                                       walker = new TreeWalker(container);\r
+\r
+                                       // If offset is at end of the parent node walk to the next one\r
+                                       if (offset > nodes.length - 1)\r
+                                               walker.next();\r
+\r
+                                       for (node = walker.current(); node; node = walker.next()) {\r
+                                               if (node.nodeType == 3 && !isWhiteSpaceNode(node)) {\r
+                                                       // IE has a "neat" feature where it moves the start node into the closest element\r
+                                                       // we can avoid this by inserting an element before it and then remove it after we set the selection\r
+                                                       tmpNode = dom.create('a', null, INVISIBLE_CHAR);\r
+                                                       node.parentNode.insertBefore(tmpNode, node);\r
+\r
+                                                       // Set selection and remove tmpNode\r
+                                                       rng.setStart(node, 0);\r
+                                                       selection.setRng(rng);\r
+                                                       dom.remove(tmpNode);\r
+\r
+                                                       return;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       // Merges the styles for each node\r
+                       function process(node) {\r
+                               var children, i, l;\r
+\r
+                               // Grab the children first since the nodelist might be changed\r
+                               children = tinymce.grep(node.childNodes);\r
+\r
+                               // Process current node\r
+                               for (i = 0, l = formatList.length; i < l; i++) {\r
+                                       if (removeFormat(formatList[i], vars, node, node))\r
+                                               break;\r
+                               }\r
+\r
+                               // Process the children\r
+                               if (format.deep) {\r
+                                       for (i = 0, l = children.length; i < l; i++)\r
+                                               process(children[i]);\r
+                               }\r
+                       };\r
+\r
+                       function findFormatRoot(container) {\r
+                               var formatRoot;\r
+\r
+                               // Find format root\r
+                               each(getParents(container.parentNode).reverse(), function(parent) {\r
+                                       var format;\r
+\r
+                                       // Find format root element\r
+                                       if (!formatRoot && parent.id != '_start' && parent.id != '_end') {\r
+                                               // Is the node matching the format we are looking for\r
+                                               format = matchNode(parent, name, vars);\r
+                                               if (format && format.split !== false)\r
+                                                       formatRoot = parent;\r
+                                       }\r
+                               });\r
+\r
+                               return formatRoot;\r
+                       };\r
+\r
+                       function wrapAndSplit(format_root, container, target, split) {\r
+                               var parent, clone, lastClone, firstClone, i, formatRootParent;\r
+\r
+                               // Format root found then clone formats and split it\r
+                               if (format_root) {\r
+                                       formatRootParent = format_root.parentNode;\r
+\r
+                                       for (parent = container.parentNode; parent && parent != formatRootParent; parent = parent.parentNode) {\r
+                                               clone = parent.cloneNode(FALSE);\r
+\r
+                                               for (i = 0; i < formatList.length; i++) {\r
+                                                       if (removeFormat(formatList[i], vars, clone, clone)) {\r
+                                                               clone = 0;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Build wrapper node\r
+                                               if (clone) {\r
+                                                       if (lastClone)\r
+                                                               clone.appendChild(lastClone);\r
+\r
+                                                       if (!firstClone)\r
+                                                               firstClone = clone;\r
+\r
+                                                       lastClone = clone;\r
+                                               }\r
+                                       }\r
+\r
+                                       // Never split block elements if the format is mixed\r
+                                       if (split && (!format.mixed || !isBlock(format_root)))\r
+                                               container = dom.split(format_root, container);\r
+\r
+                                       // Wrap container in cloned formats\r
+                                       if (lastClone) {\r
+                                               target.parentNode.insertBefore(lastClone, target);\r
+                                               firstClone.appendChild(target);\r
+                                       }\r
+                               }\r
+\r
+                               return container;\r
+                       };\r
+\r
+                       function splitToFormatRoot(container) {\r
+                               return wrapAndSplit(findFormatRoot(container), container, container, true);\r
+                       };\r
+\r
+                       function unwrap(start) {\r
+                               var node = dom.get(start ? '_start' : '_end'),\r
+                                       out = node[start ? 'firstChild' : 'lastChild'];\r
+\r
+                               // If the end is placed within the start the result will be removed\r
+                               // So this checks if the out node is a bookmark node if it is it\r
+                               // checks for another more suitable node\r
+                               if (isBookmarkNode(out))\r
+                                       out = out[start ? 'firstChild' : 'lastChild'];\r
+\r
+                               dom.remove(node, true);\r
+\r
+                               return out;\r
+                       };\r
+\r
+                       function removeRngStyle(rng) {\r
+                               var startContainer, endContainer;\r
+\r
+                               rng = expandRng(rng, formatList, TRUE);\r
+\r
+                               if (format.split) {\r
+                                       startContainer = getContainer(rng, TRUE);\r
+                                       endContainer = getContainer(rng);\r
+\r
+                                       if (startContainer != endContainer) {\r
+                                               // Wrap start/end nodes in span element since these might be cloned/moved\r
+                                               startContainer = wrap(startContainer, 'span', {id : '_start', 'data-mce-type' : 'bookmark'});\r
+                                               endContainer = wrap(endContainer, 'span', {id : '_end', 'data-mce-type' : 'bookmark'});\r
+\r
+                                               // Split start/end\r
+                                               splitToFormatRoot(startContainer);\r
+                                               splitToFormatRoot(endContainer);\r
+\r
+                                               // Unwrap start/end to get real elements again\r
+                                               startContainer = unwrap(TRUE);\r
+                                               endContainer = unwrap();\r
+                                       } else\r
+                                               startContainer = endContainer = splitToFormatRoot(startContainer);\r
+\r
+                                       // Update range positions since they might have changed after the split operations\r
+                                       rng.startContainer = startContainer.parentNode;\r
+                                       rng.startOffset = nodeIndex(startContainer);\r
+                                       rng.endContainer = endContainer.parentNode;\r
+                                       rng.endOffset = nodeIndex(endContainer) + 1;\r
+                               }\r
+\r
+                               // Remove items between start/end\r
+                               rangeUtils.walk(rng, function(nodes) {\r
+                                       each(nodes, function(node) {\r
+                                               process(node);\r
+\r
+                                               // Remove parent span if it only contains text-decoration: underline, yet a parent node is also underlined.\r
+                                               if (node.nodeType === 1 && ed.dom.getStyle(node, 'text-decoration') === 'underline' && node.parentNode && getTextDecoration(node.parentNode) === 'underline') {\r
+                                                       removeFormat({'deep': false, 'exact': true, 'inline': 'span', 'styles': {'textDecoration' : 'underline'}}, null, node);\r
+                                               }\r
+                                       });\r
+                               });\r
+                       };\r
+\r
+                       // Handle node\r
+                       if (node) {\r
+                               rng = dom.createRng();\r
+                               rng.setStartBefore(node);\r
+                               rng.setEndAfter(node);\r
+                               removeRngStyle(rng);\r
+                               return;\r
+                       }\r
+\r
+                       if (!selection.isCollapsed() || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) {\r
+                               bookmark = selection.getBookmark();\r
+                               removeRngStyle(selection.getRng(TRUE));\r
+                               selection.moveToBookmark(bookmark);\r
+\r
+                               // Check if start element still has formatting then we are at: "<b>text|</b>text" and need to move the start into the next text node\r
+                               if (match(name, vars, selection.getStart())) {\r
+                                       moveStart(selection.getRng(true));\r
+                               }\r
+\r
+                               ed.nodeChanged();\r
+                       } else\r
+                               performCaretAction('remove', name, vars);\r
+               };\r
+\r
+               function toggle(name, vars, node) {\r
+                       var fmt = get(name);\r
+\r
+                       if (match(name, vars, node) && (!('toggle' in fmt[0]) || fmt[0]['toggle']))\r
+                               remove(name, vars, node);\r
+                       else\r
+                               apply(name, vars, node);\r
+               };\r
+\r
+               function matchNode(node, name, vars, similar) {\r
+                       var formatList = get(name), format, i, classes;\r
+\r
+                       function matchItems(node, format, item_name) {\r
+                               var key, value, items = format[item_name], i;\r
+\r
+                               // Custom match\r
+                               if (format.onmatch) {\r
+                                       return format.onmatch(node, format, item_name);\r
+                               }\r
+\r
+                               // Check all items\r
+                               if (items) {\r
+                                       // Non indexed object\r
+                                       if (items.length === undefined) {\r
+                                               for (key in items) {\r
+                                                       if (items.hasOwnProperty(key)) {\r
+                                                               if (item_name === 'attributes')\r
+                                                                       value = dom.getAttrib(node, key);\r
+                                                               else\r
+                                                                       value = getStyle(node, key);\r
+\r
+                                                               if (similar && !value && !format.exact)\r
+                                                                       return;\r
+\r
+                                                               if ((!similar || format.exact) && !isEq(value, replaceVars(items[key], vars)))\r
+                                                                       return;\r
+                                                       }\r
+                                               }\r
+                                       } else {\r
+                                               // Only one match needed for indexed arrays\r
+                                               for (i = 0; i < items.length; i++) {\r
+                                                       if (item_name === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(node, items[i]))\r
+                                                               return format;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               return format;\r
+                       };\r
+\r
+                       if (formatList && node) {\r
+                               // Check each format in list\r
+                               for (i = 0; i < formatList.length; i++) {\r
+                                       format = formatList[i];\r
+\r
+                                       // Name name, attributes, styles and classes\r
+                                       if (matchName(node, format) && matchItems(node, format, 'attributes') && matchItems(node, format, 'styles')) {\r
+                                               // Match classes\r
+                                               if (classes = format.classes) {\r
+                                                       for (i = 0; i < classes.length; i++) {\r
+                                                               if (!dom.hasClass(node, classes[i]))\r
+                                                                       return;\r
+                                                       }\r
+                                               }\r
+\r
+                                               return format;\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+\r
+               function match(name, vars, node) {\r
+                       var startNode, i;\r
+\r
+                       function matchParents(node) {\r
+                               // Find first node with similar format settings\r
+                               node = dom.getParent(node, function(node) {\r
+                                       return !!matchNode(node, name, vars, true);\r
+                               });\r
+\r
+                               // Do an exact check on the similar format element\r
+                               return matchNode(node, name, vars);\r
+                       };\r
+\r
+                       // Check specified node\r
+                       if (node)\r
+                               return matchParents(node);\r
+\r
+                       // Check pending formats\r
+                       if (selection.isCollapsed()) {\r
+                               for (i = pendingFormats.apply.length - 1; i >= 0; i--) {\r
+                                       if (pendingFormats.apply[i].name == name)\r
+                                               return true;\r
+                               }\r
+\r
+                               for (i = pendingFormats.remove.length - 1; i >= 0; i--) {\r
+                                       if (pendingFormats.remove[i].name == name)\r
+                                               return false;\r
+                               }\r
+\r
+                               return matchParents(selection.getNode());\r
+                       }\r
+\r
+                       // Check selected node\r
+                       node = selection.getNode();\r
+                       if (matchParents(node))\r
+                               return TRUE;\r
+\r
+                       // Check start node if it's different\r
+                       startNode = selection.getStart();\r
+                       if (startNode != node) {\r
+                               if (matchParents(startNode))\r
+                                       return TRUE;\r
+                       }\r
+\r
+                       return FALSE;\r
+               };\r
+\r
+               function matchAll(names, vars) {\r
+                       var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name;\r
+\r
+                       // If the selection is collapsed then check pending formats\r
+                       if (selection.isCollapsed()) {\r
+                               for (ni = 0; ni < names.length; ni++) {\r
+                                       // If the name is to be removed, then stop it from being added\r
+                                       for (i = pendingFormats.remove.length - 1; i >= 0; i--) {\r
+                                               name = names[ni];\r
+\r
+                                               if (pendingFormats.remove[i].name == name) {\r
+                                                       checkedMap[name] = true;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // If the format is to be applied\r
+                               for (i = pendingFormats.apply.length - 1; i >= 0; i--) {\r
+                                       for (ni = 0; ni < names.length; ni++) {\r
+                                               name = names[ni];\r
+\r
+                                               if (!checkedMap[name] && pendingFormats.apply[i].name == name) {\r
+                                                       checkedMap[name] = true;\r
+                                                       matchedFormatNames.push(name);\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Check start of selection for formats\r
+                       startElement = selection.getStart();\r
+                       dom.getParent(startElement, function(node) {\r
+                               var i, name;\r
+\r
+                               for (i = 0; i < names.length; i++) {\r
+                                       name = names[i];\r
+\r
+                                       if (!checkedMap[name] && matchNode(node, name, vars)) {\r
+                                               checkedMap[name] = true;\r
+                                               matchedFormatNames.push(name);\r
+                                       }\r
+                               }\r
+                       });\r
+\r
+                       return matchedFormatNames;\r
+               };\r
+\r
+               function canApply(name) {\r
+                       var formatList = get(name), startNode, parents, i, x, selector;\r
+\r
+                       if (formatList) {\r
+                               startNode = selection.getStart();\r
+                               parents = getParents(startNode);\r
+\r
+                               for (x = formatList.length - 1; x >= 0; x--) {\r
+                                       selector = formatList[x].selector;\r
+\r
+                                       // Format is not selector based, then always return TRUE\r
+                                       if (!selector)\r
+                                               return TRUE;\r
+\r
+                                       for (i = parents.length - 1; i >= 0; i--) {\r
+                                               if (dom.is(parents[i], selector))\r
+                                                       return TRUE;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return FALSE;\r
+               };\r
+\r
+               // Expose to public\r
+               tinymce.extend(this, {\r
+                       get : get,\r
+                       register : register,\r
+                       apply : apply,\r
+                       remove : remove,\r
+                       toggle : toggle,\r
+                       match : match,\r
+                       matchAll : matchAll,\r
+                       matchNode : matchNode,\r
+                       canApply : canApply\r
+               });\r
+\r
+               // Private functions\r
+\r
+               function matchName(node, format) {\r
+                       // Check for inline match\r
+                       if (isEq(node, format.inline))\r
+                               return TRUE;\r
+\r
+                       // Check for block match\r
+                       if (isEq(node, format.block))\r
+                               return TRUE;\r
+\r
+                       // Check for selector match\r
+                       if (format.selector)\r
+                               return dom.is(node, format.selector);\r
+               };\r
+\r
+               function isEq(str1, str2) {\r
+                       str1 = str1 || '';\r
+                       str2 = str2 || '';\r
+\r
+                       str1 = '' + (str1.nodeName || str1);\r
+                       str2 = '' + (str2.nodeName || str2);\r
+\r
+                       return str1.toLowerCase() == str2.toLowerCase();\r
+               };\r
+\r
+               function getStyle(node, name) {\r
+                       var styleVal = dom.getStyle(node, name);\r
+\r
+                       // Force the format to hex\r
+                       if (name == 'color' || name == 'backgroundColor')\r
+                               styleVal = dom.toHex(styleVal);\r
+\r
+                       // Opera will return bold as 700\r
+                       if (name == 'fontWeight' && styleVal == 700)\r
+                               styleVal = 'bold';\r
+\r
+                       return '' + styleVal;\r
+               };\r
+\r
+               function replaceVars(value, vars) {\r
+                       if (typeof(value) != "string")\r
+                               value = value(vars);\r
+                       else if (vars) {\r
+                               value = value.replace(/%(\w+)/g, function(str, name) {\r
+                                       return vars[name] || str;\r
+                               });\r
+                       }\r
+\r
+                       return value;\r
+               };\r
+\r
+               function isWhiteSpaceNode(node) {\r
+                       return node && node.nodeType === 3 && /^([\s\r\n]+|)$/.test(node.nodeValue);\r
+               };\r
+\r
+               function wrap(node, name, attrs) {\r
+                       var wrapper = dom.create(name, attrs);\r
+\r
+                       node.parentNode.insertBefore(wrapper, node);\r
+                       wrapper.appendChild(node);\r
+\r
+                       return wrapper;\r
+               };\r
+\r
+               function expandRng(rng, format, remove) {\r
+                       var startContainer = rng.startContainer,\r
+                               startOffset = rng.startOffset,\r
+                               endContainer = rng.endContainer,\r
+                               endOffset = rng.endOffset, sibling, lastIdx, leaf;\r
+\r
+                       // This function walks up the tree if there is no siblings before/after the node\r
+                       function findParentContainer(container, child_name, sibling_name, root) {\r
+                               var parent, child;\r
+\r
+                               root = root || dom.getRoot();\r
+\r
+                               for (;;) {\r
+                                       // Check if we can move up are we at root level or body level\r
+                                       parent = container.parentNode;\r
+\r
+                                       // Stop expanding on block elements or root depending on format\r
+                                       if (parent == root || (!format[0].block_expand && isBlock(parent)))\r
+                                               return container;\r
+\r
+                                       for (sibling = parent[child_name]; sibling && sibling != container; sibling = sibling[sibling_name]) {\r
+                                               if (sibling.nodeType == 1 && !isBookmarkNode(sibling))\r
+                                                       return container;\r
+\r
+                                               if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling))\r
+                                                       return container;\r
+                                       }\r
+\r
+                                       container = container.parentNode;\r
+                               }\r
+\r
+                               return container;\r
+                       };\r
+\r
+                       // This function walks down the tree to find the leaf at the selection.\r
+                       // The offset is also returned as if node initially a leaf, the offset may be in the middle of the text node.\r
+                       function findLeaf(node, offset) {\r
+                               if (offset === undefined)\r
+                                       offset = node.nodeType === 3 ? node.length : node.childNodes.length;\r
+                               while (node && node.hasChildNodes()) {\r
+                                       node = node.childNodes[offset];\r
+                                       if (node)\r
+                                               offset = node.nodeType === 3 ? node.length : node.childNodes.length;\r
+                               }\r
+                               return { node: node, offset: offset };\r
+                       }\r
+\r
+                       // If index based start position then resolve it\r
+                       if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) {\r
+                               lastIdx = startContainer.childNodes.length - 1;\r
+                               startContainer = startContainer.childNodes[startOffset > lastIdx ? lastIdx : startOffset];\r
+\r
+                               if (startContainer.nodeType == 3)\r
+                                       startOffset = 0;\r
+                       }\r
+\r
+                       // If index based end position then resolve it\r
+                       if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) {\r
+                               lastIdx = endContainer.childNodes.length - 1;\r
+                               endContainer = endContainer.childNodes[endOffset > lastIdx ? lastIdx : endOffset - 1];\r
+\r
+                               if (endContainer.nodeType == 3)\r
+                                       endOffset = endContainer.nodeValue.length;\r
+                       }\r
+\r
+                       // Exclude bookmark nodes if possible\r
+                       if (isBookmarkNode(startContainer.parentNode))\r
+                               startContainer = startContainer.parentNode;\r
+\r
+                       if (isBookmarkNode(startContainer))\r
+                               startContainer = startContainer.nextSibling || startContainer;\r
+\r
+                       if (isBookmarkNode(endContainer.parentNode)) {\r
+                               endOffset = dom.nodeIndex(endContainer);\r
+                               endContainer = endContainer.parentNode;\r
+                       }\r
+\r
+                       if (isBookmarkNode(endContainer) && endContainer.previousSibling) {\r
+                               endContainer = endContainer.previousSibling;\r
+                               endOffset = endContainer.length;\r
+                       }\r
+\r
+                       if (format[0].inline) {\r
+                               // Avoid applying formatting to a trailing space.\r
+                               leaf = findLeaf(endContainer, endOffset);\r
+                               if (leaf.node) {\r
+                                       while (leaf.node && leaf.offset === 0 && leaf.node.previousSibling)\r
+                                               leaf = findLeaf(leaf.node.previousSibling);\r
+\r
+                                       if (leaf.node && leaf.offset > 0 && leaf.node.nodeType === 3 &&\r
+                                                       leaf.node.nodeValue.charAt(leaf.offset - 1) === ' ') {\r
+\r
+                                               if (leaf.offset > 1) {\r
+                                                       endContainer = leaf.node;\r
+                                                       endContainer.splitText(leaf.offset - 1);\r
+                                               } else if (leaf.node.previousSibling) {\r
+                                                       endContainer = leaf.node.previousSibling;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       // Move start/end point up the tree if the leaves are sharp and if we are in different containers\r
+                       // Example * becomes !: !<p><b><i>*text</i><i>text*</i></b></p>!\r
+                       // This will reduce the number of wrapper elements that needs to be created\r
+                       // Move start point up the tree\r
+                       if (format[0].inline || format[0].block_expand) {\r
+                               startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling');\r
+                               endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling');\r
+                       }\r
+\r
+                       // Expand start/end container to matching selector\r
+                       if (format[0].selector && format[0].expand !== FALSE && !format[0].inline) {\r
+                               function findSelectorEndPoint(container, sibling_name) {\r
+                                       var parents, i, y, curFormat;\r
+\r
+                                       if (container.nodeType == 3 && container.nodeValue.length == 0 && container[sibling_name])\r
+                                               container = container[sibling_name];\r
+\r
+                                       parents = getParents(container);\r
+                                       for (i = 0; i < parents.length; i++) {\r
+                                               for (y = 0; y < format.length; y++) {\r
+                                                       curFormat = format[y];\r
+\r
+                                                       // If collapsed state is set then skip formats that doesn't match that\r
+                                                       if ("collapsed" in curFormat && curFormat.collapsed !== rng.collapsed)\r
+                                                               continue;\r
+\r
+                                                       if (dom.is(parents[i], curFormat.selector))\r
+                                                               return parents[i];\r
+                                               }\r
+                                       }\r
+\r
+                                       return container;\r
+                               };\r
+\r
+                               // Find new startContainer/endContainer if there is better one\r
+                               startContainer = findSelectorEndPoint(startContainer, 'previousSibling');\r
+                               endContainer = findSelectorEndPoint(endContainer, 'nextSibling');\r
+                       }\r
+\r
+                       // Expand start/end container to matching block element or text node\r
+                       if (format[0].block || format[0].selector) {\r
+                               function findBlockEndPoint(container, sibling_name, sibling_name2) {\r
+                                       var node;\r
+\r
+                                       // Expand to block of similar type\r
+                                       if (!format[0].wrapper)\r
+                                               node = dom.getParent(container, format[0].block);\r
+\r
+                                       // Expand to first wrappable block element or any block element\r
+                                       if (!node)\r
+                                               node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, isBlock);\r
+\r
+                                       // Exclude inner lists from wrapping\r
+                                       if (node && format[0].wrapper)\r
+                                               node = getParents(node, 'ul,ol').reverse()[0] || node;\r
+\r
+                                       // Didn't find a block element look for first/last wrappable element\r
+                                       if (!node) {\r
+                                               node = container;\r
+\r
+                                               while (node[sibling_name] && !isBlock(node[sibling_name])) {\r
+                                                       node = node[sibling_name];\r
+\r
+                                                       // Break on BR but include it will be removed later on\r
+                                                       // we can't remove it now since we need to check if it can be wrapped\r
+                                                       if (isEq(node, 'br'))\r
+                                                               break;\r
+                                               }\r
+                                       }\r
+\r
+                                       return node || container;\r
+                               };\r
+\r
+                               // Find new startContainer/endContainer if there is better one\r
+                               startContainer = findBlockEndPoint(startContainer, 'previousSibling');\r
+                               endContainer = findBlockEndPoint(endContainer, 'nextSibling');\r
+\r
+                               // Non block element then try to expand up the leaf\r
+                               if (format[0].block) {\r
+                                       if (!isBlock(startContainer))\r
+                                               startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling');\r
+\r
+                                       if (!isBlock(endContainer))\r
+                                               endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling');\r
+                               }\r
+                       }\r
+\r
+                       // Setup index for startContainer\r
+                       if (startContainer.nodeType == 1) {\r
+                               startOffset = nodeIndex(startContainer);\r
+                               startContainer = startContainer.parentNode;\r
+                       }\r
+\r
+                       // Setup index for endContainer\r
+                       if (endContainer.nodeType == 1) {\r
+                               endOffset = nodeIndex(endContainer) + 1;\r
+                               endContainer = endContainer.parentNode;\r
+                       }\r
+\r
+                       // Return new range like object\r
+                       return {\r
+                               startContainer : startContainer,\r
+                               startOffset : startOffset,\r
+                               endContainer : endContainer,\r
+                               endOffset : endOffset\r
+                       };\r
+               }\r
+\r
+               function removeFormat(format, vars, node, compare_node) {\r
+                       var i, attrs, stylesModified;\r
+\r
+                       // Check if node matches format\r
+                       if (!matchName(node, format))\r
+                               return FALSE;\r
+\r
+                       // Should we compare with format attribs and styles\r
+                       if (format.remove != 'all') {\r
+                               // Remove styles\r
+                               each(format.styles, function(value, name) {\r
+                                       value = replaceVars(value, vars);\r
+\r
+                                       // Indexed array\r
+                                       if (typeof(name) === 'number') {\r
+                                               name = value;\r
+                                               compare_node = 0;\r
+                                       }\r
+\r
+                                       if (!compare_node || isEq(getStyle(compare_node, name), value))\r
+                                               dom.setStyle(node, name, '');\r
+\r
+                                       stylesModified = 1;\r
+                               });\r
+\r
+                               // Remove style attribute if it's empty\r
+                               if (stylesModified && dom.getAttrib(node, 'style') == '') {\r
+                                       node.removeAttribute('style');\r
+                                       node.removeAttribute('data-mce-style');\r
+                               }\r
+\r
+                               // Remove attributes\r
+                               each(format.attributes, function(value, name) {\r
+                                       var valueOut;\r
+\r
+                                       value = replaceVars(value, vars);\r
+\r
+                                       // Indexed array\r
+                                       if (typeof(name) === 'number') {\r
+                                               name = value;\r
+                                               compare_node = 0;\r
+                                       }\r
+\r
+                                       if (!compare_node || isEq(dom.getAttrib(compare_node, name), value)) {\r
+                                               // Keep internal classes\r
+                                               if (name == 'class') {\r
+                                                       value = dom.getAttrib(node, name);\r
+                                                       if (value) {\r
+                                                               // Build new class value where everything is removed except the internal prefixed classes\r
+                                                               valueOut = '';\r
+                                                               each(value.split(/\s+/), function(cls) {\r
+                                                                       if (/mce\w+/.test(cls))\r
+                                                                               valueOut += (valueOut ? ' ' : '') + cls;\r
+                                                               });\r
+\r
+                                                               // We got some internal classes left\r
+                                                               if (valueOut) {\r
+                                                                       dom.setAttrib(node, name, valueOut);\r
+                                                                       return;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               // IE6 has a bug where the attribute doesn't get removed correctly\r
+                                               if (name == "class")\r
+                                                       node.removeAttribute('className');\r
+\r
+                                               // Remove mce prefixed attributes\r
+                                               if (MCE_ATTR_RE.test(name))\r
+                                                       node.removeAttribute('data-mce-' + name);\r
+\r
+                                               node.removeAttribute(name);\r
+                                       }\r
+                               });\r
+\r
+                               // Remove classes\r
+                               each(format.classes, function(value) {\r
+                                       value = replaceVars(value, vars);\r
+\r
+                                       if (!compare_node || dom.hasClass(compare_node, value))\r
+                                               dom.removeClass(node, value);\r
+                               });\r
+\r
+                               // Check for non internal attributes\r
+                               attrs = dom.getAttribs(node);\r
+                               for (i = 0; i < attrs.length; i++) {\r
+                                       if (attrs[i].nodeName.indexOf('_') !== 0)\r
+                                               return FALSE;\r
+                               }\r
+                       }\r
+\r
+                       // Remove the inline child if it's empty for example <b> or <span>\r
+                       if (format.remove != 'none') {\r
+                               removeNode(node, format);\r
+                               return TRUE;\r
+                       }\r
+               };\r
+\r
+               function removeNode(node, format) {\r
+                       var parentNode = node.parentNode, rootBlockElm;\r
+\r
+                       if (format.block) {\r
+                               if (!forcedRootBlock) {\r
+                                       function find(node, next, inc) {\r
+                                               node = getNonWhiteSpaceSibling(node, next, inc);\r
+\r
+                                               return !node || (node.nodeName == 'BR' || isBlock(node));\r
+                                       };\r
+\r
+                                       // Append BR elements if needed before we remove the block\r
+                                       if (isBlock(node) && !isBlock(parentNode)) {\r
+                                               if (!find(node, FALSE) && !find(node.firstChild, TRUE, 1))\r
+                                                       node.insertBefore(dom.create('br'), node.firstChild);\r
+\r
+                                               if (!find(node, TRUE) && !find(node.lastChild, FALSE, 1))\r
+                                                       node.appendChild(dom.create('br'));\r
+                                       }\r
+                               } else {\r
+                                       // Wrap the block in a forcedRootBlock if we are at the root of document\r
+                                       if (parentNode == dom.getRoot()) {\r
+                                               if (!format.list_block || !isEq(node, format.list_block)) {\r
+                                                       each(tinymce.grep(node.childNodes), function(node) {\r
+                                                               if (isValid(forcedRootBlock, node.nodeName.toLowerCase())) {\r
+                                                                       if (!rootBlockElm)\r
+                                                                               rootBlockElm = wrap(node, forcedRootBlock);\r
+                                                                       else\r
+                                                                               rootBlockElm.appendChild(node);\r
+                                                               } else\r
+                                                                       rootBlockElm = 0;\r
+                                                       });\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Never remove nodes that isn't the specified inline element if a selector is specified too\r
+                       if (format.selector && format.inline && !isEq(format.inline, node))\r
+                               return;\r
+\r
+                       dom.remove(node, 1);\r
+               };\r
+\r
+               function getNonWhiteSpaceSibling(node, next, inc) {\r
+                       if (node) {\r
+                               next = next ? 'nextSibling' : 'previousSibling';\r
+\r
+                               for (node = inc ? node : node[next]; node; node = node[next]) {\r
+                                       if (node.nodeType == 1 || !isWhiteSpaceNode(node))\r
+                                               return node;\r
+                               }\r
+                       }\r
+               };\r
+\r
+               function isBookmarkNode(node) {\r
+                       return node && node.nodeType == 1 && node.getAttribute('data-mce-type') == 'bookmark';\r
+               };\r
+\r
+               function mergeSiblings(prev, next) {\r
+                       var marker, sibling, tmpSibling;\r
+\r
+                       function compareElements(node1, node2) {\r
+                               // Not the same name\r
+                               if (node1.nodeName != node2.nodeName)\r
+                                       return FALSE;\r
+\r
+                               function getAttribs(node) {\r
+                                       var attribs = {};\r
+\r
+                                       each(dom.getAttribs(node), function(attr) {\r
+                                               var name = attr.nodeName.toLowerCase();\r
+\r
+                                               // Don't compare internal attributes or style\r
+                                               if (name.indexOf('_') !== 0 && name !== 'style')\r
+                                                       attribs[name] = dom.getAttrib(node, name);\r
+                                       });\r
+\r
+                                       return attribs;\r
+                               };\r
+\r
+                               function compareObjects(obj1, obj2) {\r
+                                       var value, name;\r
+\r
+                                       for (name in obj1) {\r
+                                               // Obj1 has item obj2 doesn't have\r
+                                               if (obj1.hasOwnProperty(name)) {\r
+                                                       value = obj2[name];\r
+\r
+                                                       // Obj2 doesn't have obj1 item\r
+                                                       if (value === undefined)\r
+                                                               return FALSE;\r
+\r
+                                                       // Obj2 item has a different value\r
+                                                       if (obj1[name] != value)\r
+                                                               return FALSE;\r
+\r
+                                                       // Delete similar value\r
+                                                       delete obj2[name];\r
+                                               }\r
+                                       }\r
+\r
+                                       // Check if obj 2 has something obj 1 doesn't have\r
+                                       for (name in obj2) {\r
+                                               // Obj2 has item obj1 doesn't have\r
+                                               if (obj2.hasOwnProperty(name))\r
+                                                       return FALSE;\r
+                                       }\r
+\r
+                                       return TRUE;\r
+                               };\r
+\r
+                               // Attribs are not the same\r
+                               if (!compareObjects(getAttribs(node1), getAttribs(node2)))\r
+                                       return FALSE;\r
+\r
+                               // Styles are not the same\r
+                               if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style'))))\r
+                                       return FALSE;\r
+\r
+                               return TRUE;\r
+                       };\r
+\r
+                       // Check if next/prev exists and that they are elements\r
+                       if (prev && next) {\r
+                               function findElementSibling(node, sibling_name) {\r
+                                       for (sibling = node; sibling; sibling = sibling[sibling_name]) {\r
+                                               if (sibling.nodeType == 3 && sibling.nodeValue.length !== 0)\r
+                                                       return node;\r
+\r
+                                               if (sibling.nodeType == 1 && !isBookmarkNode(sibling))\r
+                                                       return sibling;\r
+                                       }\r
+\r
+                                       return node;\r
+                               };\r
+\r
+                               // If previous sibling is empty then jump over it\r
+                               prev = findElementSibling(prev, 'previousSibling');\r
+                               next = findElementSibling(next, 'nextSibling');\r
+\r
+                               // Compare next and previous nodes\r
+                               if (compareElements(prev, next)) {\r
+                                       // Append nodes between\r
+                                       for (sibling = prev.nextSibling; sibling && sibling != next;) {\r
+                                               tmpSibling = sibling;\r
+                                               sibling = sibling.nextSibling;\r
+                                               prev.appendChild(tmpSibling);\r
+                                       }\r
+\r
+                                       // Remove next node\r
+                                       dom.remove(next);\r
+\r
+                                       // Move children into prev node\r
+                                       each(tinymce.grep(next.childNodes), function(node) {\r
+                                               prev.appendChild(node);\r
+                                       });\r
+\r
+                                       return prev;\r
+                               }\r
+                       }\r
+\r
+                       return next;\r
+               };\r
+\r
+               function isTextBlock(name) {\r
+                       return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name);\r
+               };\r
+\r
+               function getContainer(rng, start) {\r
+                       var container, offset, lastIdx;\r
+\r
+                       container = rng[start ? 'startContainer' : 'endContainer'];\r
+                       offset = rng[start ? 'startOffset' : 'endOffset'];\r
+\r
+                       if (container.nodeType == 1) {\r
+                               lastIdx = container.childNodes.length - 1;\r
+\r
+                               if (!start && offset)\r
+                                       offset--;\r
+\r
+                               container = container.childNodes[offset > lastIdx ? lastIdx : offset];\r
+                       }\r
+\r
+                       return container;\r
+               };\r
+\r
+               function performCaretAction(type, name, vars) {\r
+                       var i, currentPendingFormats = pendingFormats[type],\r
+                               otherPendingFormats = pendingFormats[type == 'apply' ? 'remove' : 'apply'];\r
+\r
+                       function hasPending() {\r
+                               return pendingFormats.apply.length || pendingFormats.remove.length;\r
+                       };\r
+\r
+                       function resetPending() {\r
+                               pendingFormats.apply = [];\r
+                               pendingFormats.remove = [];\r
+                       };\r
+\r
+                       function perform(caret_node) {\r
+                               // Apply pending formats\r
+                               each(pendingFormats.apply.reverse(), function(item) {\r
+                                       apply(item.name, item.vars, caret_node);\r
+\r
+                                       // Colored nodes should be underlined so that the color of the underline matches the text color.\r
+                                       if (item.name === 'forecolor' && item.vars.value)\r
+                                               processUnderlineAndColor(caret_node.parentNode);\r
+                               });\r
+\r
+                               // Remove pending formats\r
+                               each(pendingFormats.remove.reverse(), function(item) {\r
+                                       remove(item.name, item.vars, caret_node);\r
+                               });\r
+\r
+                               dom.remove(caret_node, 1);\r
+                               resetPending();\r
+                       };\r
+\r
+                       // Check if it already exists then ignore it\r
+                       for (i = currentPendingFormats.length - 1; i >= 0; i--) {\r
+                               if (currentPendingFormats[i].name == name)\r
+                                       return;\r
+                       }\r
+\r
+                       currentPendingFormats.push({name : name, vars : vars});\r
+\r
+                       // Check if it's in the other type, then remove it\r
+                       for (i = otherPendingFormats.length - 1; i >= 0; i--) {\r
+                               if (otherPendingFormats[i].name == name)\r
+                                       otherPendingFormats.splice(i, 1);\r
+                       }\r
+\r
+                       // Pending apply or remove formats\r
+                       if (hasPending()) {\r
+                               ed.getDoc().execCommand('FontName', false, 'mceinline');\r
+                               pendingFormats.lastRng = selection.getRng();\r
+\r
+                               // IE will convert the current word\r
+                               each(dom.select('font,span'), function(node) {\r
+                                       var bookmark;\r
+\r
+                                       if (isCaretNode(node)) {\r
+                                               bookmark = selection.getBookmark();\r
+                                               perform(node);\r
+                                               selection.moveToBookmark(bookmark);\r
+                                               ed.nodeChanged();\r
+                                       }\r
+                               });\r
+\r
+                               // Only register listeners once if we need to\r
+                               if (!pendingFormats.isListening && hasPending()) {\r
+                                       pendingFormats.isListening = true;\r
+                                       function performPendingFormat(node, textNode) {\r
+                                               var rng = dom.createRng();\r
+                                               perform(node);\r
+\r
+                                               rng.setStart(textNode, textNode.nodeValue.length);\r
+                                               rng.setEnd(textNode, textNode.nodeValue.length);\r
+                                               selection.setRng(rng);\r
+                                               ed.nodeChanged();\r
+                                       }\r
+                                       var enterKeyPressed = false;\r
+\r
+                                       each('onKeyDown,onKeyUp,onKeyPress,onMouseUp'.split(','), function(event) {\r
+                                               ed[event].addToTop(function(ed, e) {\r
+                                                       if (e.keyCode==13 && !e.shiftKey) {\r
+                                                               enterKeyPressed = true;\r
+                                                               return;\r
+                                                       }\r
+                                                       // Do we have pending formats and is the selection moved has moved\r
+                                                       if (hasPending() && !tinymce.dom.RangeUtils.compareRanges(pendingFormats.lastRng, selection.getRng())) {\r
+                                                               var foundCaret = false;\r
+                                                               each(dom.select('font,span'), function(node) {\r
+                                                                       var textNode, rng;\r
+\r
+                                                                       // Look for marker\r
+                                                                       if (isCaretNode(node)) {\r
+                                                                               foundCaret = true;\r
+                                                                               textNode = node.firstChild;\r
+\r
+                                                                               // Find the first text node within node\r
+                                                                               while (textNode && textNode.nodeType != 3)\r
+                                                                                       textNode = textNode.firstChild;\r
+\r
+                                                                               if (textNode) \r
+                                                                                       performPendingFormat(node, textNode);\r
+                                                                               else\r
+                                                                                       dom.remove(node);\r
+                                                                       }\r
+                                                               });\r
+                                                               \r
+                                                               // no caret - so we are \r
+                                                               if (enterKeyPressed && !foundCaret) {\r
+                                                                       var node = selection.getNode();\r
+                                                                       var textNode = node;\r
+\r
+                                                                       // Find the first text node within node\r
+                                                                       while (textNode && textNode.nodeType != 3)\r
+                                                                               textNode = textNode.firstChild;\r
+                                                                       if (textNode) {\r
+                                                                               node=textNode.parentNode;\r
+                                                                               while (!isBlock(node)){\r
+                                                                                       node=node.parentNode;\r
+                                                                               }\r
+                                                                               performPendingFormat(node, textNode);\r
+                                                                       }\r
+                                                               }\r
+\r
+                                                               // Always unbind and clear pending styles on keyup\r
+                                                               if (e.type == 'keyup' || e.type == 'mouseup') {\r
+                                                                       resetPending();\r
+                                                                       enterKeyPressed=false;\r
+                                                               }\r
+                                                       }\r
+                                               });\r
+                                       });\r
+                               }\r
+                       }\r
+               };\r
+       };\r
+})(tinymce);\r
+\r
+tinymce.onAddEditor.add(function(tinymce, ed) {\r
+       var filters, fontSizes, dom, settings = ed.settings;\r
+\r
+       if (settings.inline_styles) {\r
+               fontSizes = tinymce.explode(settings.font_size_style_values);\r
+\r
+               function replaceWithSpan(node, styles) {\r
+                       tinymce.each(styles, function(value, name) {\r
+                               if (value)\r
+                                       dom.setStyle(node, name, value);\r
+                       });\r
+\r
+                       dom.rename(node, 'span');\r
+               };\r
+\r
+               filters = {\r
+                       font : function(dom, node) {\r
+                               replaceWithSpan(node, {\r
+                                       backgroundColor : node.style.backgroundColor,\r
+                                       color : node.color,\r
+                                       fontFamily : node.face,\r
+                                       fontSize : fontSizes[parseInt(node.size) - 1]\r
+                               });\r
+                       },\r
+\r
+                       u : function(dom, node) {\r
+                               replaceWithSpan(node, {\r
+                                       textDecoration : 'underline'\r
+                               });\r
+                       },\r
+\r
+                       strike : function(dom, node) {\r
+                               replaceWithSpan(node, {\r
+                                       textDecoration : 'line-through'\r
+                               });\r
+                       }\r
+               };\r
+\r
+               function convert(editor, params) {\r
+                       dom = editor.dom;\r
+\r
+                       if (settings.convert_fonts_to_spans) {\r
+                               tinymce.each(dom.select('font,u,strike', params.node), function(node) {\r
+                                       filters[node.nodeName.toLowerCase()](ed.dom, node);\r
+                               });\r
+                       }\r
+               };\r
+\r
+               ed.onPreProcess.add(convert);\r
+               ed.onSetContent.add(convert);\r
+\r
+               ed.onInit.add(function() {\r
+                       ed.selection.onSetContent.add(convert);\r
+               });\r
+       }\r
+});\r
+\r
diff --git a/webcit/tiny_mce/utils/editable_selects.js b/webcit/tiny_mce/utils/editable_selects.js
new file mode 100644 (file)
index 0000000..4b920f3
--- /dev/null
@@ -0,0 +1,70 @@
+/**\r
+ * editable_selects.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+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(tinyMCEPopup.editor.translate('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
+                       ne.onkeydown = TinyMCE_EditableSelects.onKeyDown;\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
+       onKeyDown : function(e) {\r
+               e = e || window.event;\r
+\r
+               if (e.keyCode == 13)\r
+                       TinyMCE_EditableSelects.onBlurEditableSelectInput();\r
+       }\r
+};\r
diff --git a/webcit/tiny_mce/utils/form_utils.js b/webcit/tiny_mce/utils/form_utils.js
new file mode 100644 (file)
index 0000000..59da013
--- /dev/null
@@ -0,0 +1,210 @@
+/**\r
+ * form_utils.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme"));\r
+\r
+function getColorPickerHTML(id, target_form_element) {\r
+       var h = "", dom = tinyMCEPopup.dom;\r
+\r
+       if (label = dom.select('label[for=' + target_form_element + ']')[0]) {\r
+               label.id = label.id || dom.uniqueId();\r
+       }\r
+\r
+       h += '<a role="button" aria-labelledby="' + id + '_label" 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') + '">&nbsp;<span id="' + id + '_label" class="mceVoiceLabel mceIconOnly" style="display:none;">' + tinyMCEPopup.getLang('browse') + '</span></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') + '">&nbsp;</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
+       if (!value)\r
+               value = "";\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 || elm.selectedIndex === -1)\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)/i, '$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
+       // Sanity check, IE doesn't like broken values\r
+       else if (!(/^[0-9\.]+(px|%|in|cm|mm|em|ex|pt|pc)$/i.test(size)))\r
+               return "";\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/webcit/tiny_mce/utils/mctabs.js b/webcit/tiny_mce/utils/mctabs.js
new file mode 100644 (file)
index 0000000..458ec86
--- /dev/null
@@ -0,0 +1,162 @@
+/**\r
+ * mctabs.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+function MCTabs() {\r
+       this.settings = [];\r
+       this.onChange = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.Dispatcher');\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.showTab =function(tab){\r
+       tab.className = 'current';\r
+       tab.setAttribute("aria-selected", true);\r
+       tab.setAttribute("aria-expanded", true);\r
+       tab.tabIndex = 0;\r
+};\r
+\r
+MCTabs.prototype.hideTab =function(tab){\r
+       var t=this;\r
+\r
+       tab.className = '';\r
+       tab.setAttribute("aria-selected", false);\r
+       tab.setAttribute("aria-expanded", false);\r
+       tab.tabIndex = -1;\r
+};\r
+\r
+MCTabs.prototype.showPanel = function(panel) {\r
+       panel.className = 'current'; \r
+       panel.setAttribute("aria-hidden", false);\r
+};\r
+\r
+MCTabs.prototype.hidePanel = function(panel) {\r
+       panel.className = 'panel';\r
+       panel.setAttribute("aria-hidden", true);\r
+}; \r
+\r
+MCTabs.prototype.getPanelForTab = function(tabElm) {\r
+       return tinyMCEPopup.dom.getAttrib(tabElm, "aria-controls");\r
+};\r
+\r
+MCTabs.prototype.displayTab = function(tab_id, panel_id, avoid_focus) {\r
+       var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i, t = this;\r
+\r
+       tabElm = document.getElementById(tab_id);\r
+\r
+       if (panel_id === undefined) {\r
+               panel_id = t.getPanelForTab(tabElm);\r
+       }\r
+\r
+       panelElm= document.getElementById(panel_id);\r
+       panelContainerElm = panelElm ? panelElm.parentNode : null;\r
+       tabContainerElm = tabElm ? tabElm.parentNode : null;\r
+       selectionClass = t.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
+                               t.hideTab(nodes[i]);\r
+                       }\r
+               }\r
+\r
+               // Show selected tab\r
+               t.showTab(tabElm);\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
+                               t.hidePanel(nodes[i]);\r
+               }\r
+\r
+               if (!avoid_focus) { \r
+                       tabElm.focus();\r
+               }\r
+\r
+               // Show selected panel\r
+               t.showPanel(panelElm);\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
+\r
+//Global instance\r
+var mcTabs = new MCTabs();\r
+\r
+tinyMCEPopup.onInit.add(function() {\r
+       var tinymce = tinyMCEPopup.getWin().tinymce, dom = tinyMCEPopup.dom, each = tinymce.each;\r
+\r
+       each(dom.select('div.tabs'), function(tabContainerElm) {\r
+               var keyNav;\r
+\r
+               dom.setAttrib(tabContainerElm, "role", "tablist"); \r
+\r
+               var items = tinyMCEPopup.dom.select('li', tabContainerElm);\r
+               var action = function(id) {\r
+                       mcTabs.displayTab(id, mcTabs.getPanelForTab(id));\r
+                       mcTabs.onChange.dispatch(id);\r
+               };\r
+\r
+               each(items, function(item) {\r
+                       dom.setAttrib(item, 'role', 'tab');\r
+                       dom.bind(item, 'click', function(evt) {\r
+                               action(item.id);\r
+                       });\r
+               });\r
+\r
+               dom.bind(dom.getRoot(), 'keydown', function(evt) {\r
+                       if (evt.keyCode === 9 && evt.ctrlKey && !evt.altKey) { // Tab\r
+                               keyNav.moveFocus(evt.shiftKey ? -1 : 1);\r
+                               tinymce.dom.Event.cancel(evt);\r
+                       }\r
+               });\r
+\r
+               each(dom.select('a', tabContainerElm), function(a) {\r
+                       dom.setAttrib(a, 'tabindex', '-1');\r
+               });\r
+\r
+               keyNav = tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', {\r
+                       root: tabContainerElm,\r
+                       items: items,\r
+                       onAction: action,\r
+                       actOnFocus: true,\r
+                       enableLeftRight: true,\r
+                       enableUpDown: true\r
+               }, tinyMCEPopup.dom);\r
+       });\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/utils/validate.js b/webcit/tiny_mce/utils/validate.js
new file mode 100644 (file)
index 0000000..27cbfab
--- /dev/null
@@ -0,0 +1,252 @@
+/**\r
+ * validate.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+/**\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
+                       nl[i].setAttribute('aria-invalid', false);\r
+               }\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
+       getErrorMessages : function(f) {\r
+               var nl, i, s = this.settings, field, msg, values, messages = [], ed = tinyMCEPopup.editor;\r
+               nl = this.tags(f, "label");\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (this.hasClass(nl[i], s.invalid_cls)) {\r
+                               field = document.getElementById(nl[i].getAttribute("for"));\r
+                               values = { field: nl[i].textContent };\r
+                               if (this.hasClass(field, s.min_cls, true)) {\r
+                                       message = ed.getLang('invalid_data_min');\r
+                                       values.min = this.getNum(field, s.min_cls);\r
+                               } else if (this.hasClass(field, s.number_cls)) {\r
+                                       message = ed.getLang('invalid_data_number');\r
+                               } else if (this.hasClass(field, s.size_cls)) {\r
+                                       message = ed.getLang('invalid_data_size');\r
+                               } else {\r
+                                       message = ed.getLang('invalid_data');\r
+                               }\r
+                               \r
+                               message = message.replace(/{\#([^}]+)\}/g, function(a, b) {\r
+                                       return values[b] || '{#' + b + '}';\r
+                               });\r
+                               messages.push(message);\r
+                       }\r
+               }\r
+               return messages;\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
+                               nl[j].setAttribute('aria-invalid', false);\r
+                       }\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
+               n.setAttribute('aria-invalid', 'true');\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/webcit/useredit.c b/webcit/useredit.c
new file mode 100644 (file)
index 0000000..05cab0d
--- /dev/null
@@ -0,0 +1,986 @@
+/*
+ * Copyright (c) 1996-2021 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+CtxType CTX_USERLIST = CTX_NONE;
+/*
+ *  show a list of available users to edit them
+ *  message the header message???
+ *  preselect = which user should be selected in the browser
+ */
+void select_user_to_edit(const char *preselect)
+{
+       output_headers(1, 0, 0, 0, 1, 0);
+       do_template("aide_edituser_select");
+        end_burst();
+}
+
+
+typedef struct _UserListEntry {
+       int UID;
+       int AccessLevel;
+       int nLogons;
+       int nPosts;
+
+       StrBuf *UserName;
+       StrBuf *Passvoid;
+       time_t LastLogonT;
+       /* Just available for Single users to view: */
+       unsigned int Flags;
+       int DaysTillPurge;
+       int HasBio;
+
+       StrBuf *PrimaryEmail;
+       StrBuf *OtherEmails;
+
+} UserListEntry;
+
+
+UserListEntry* NewUserListOneEntry(StrBuf *SerializedUser, const char *Pos)
+{
+       UserListEntry *ul;
+
+       if (StrLength(SerializedUser) < 8) 
+               return NULL;
+
+       ul = (UserListEntry*) malloc(sizeof(UserListEntry));
+       ul->UserName = NewStrBuf();
+       ul->Passvoid = NewStrBuf();
+       ul->PrimaryEmail = NewStrBuf();
+       ul->OtherEmails = NewStrBuf();
+
+       StrBufExtract_NextToken(ul->UserName,               SerializedUser, &Pos, '|');
+       StrBufExtract_NextToken(ul->Passvoid,               SerializedUser, &Pos, '|');
+       ul->Flags         = StrBufExtractNext_unsigned_long(SerializedUser, &Pos, '|');
+       ul->nLogons       = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
+       ul->nPosts        = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
+       ul->AccessLevel   = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
+       ul->UID           = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
+       ul->LastLogonT    = StrBufExtractNext_long(         SerializedUser, &Pos, '|');
+       ul->DaysTillPurge = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
+       return ul;
+}
+
+void DeleteUserListEntry(void *vUserList)
+{
+       UserListEntry *ul = (UserListEntry*) vUserList;
+       if (!ul) return;
+       FreeStrBuf(&ul->UserName);
+       FreeStrBuf(&ul->Passvoid);
+       FreeStrBuf(&ul->PrimaryEmail);
+       FreeStrBuf(&ul->OtherEmails);
+       free(ul);
+}
+
+UserListEntry* NewUserListEntry(StrBuf *SerializedUserList)
+{
+       const char *Pos = NULL;
+       UserListEntry *ul;
+
+       if (StrLength(SerializedUserList) < 8) 
+               return NULL;
+
+       ul = (UserListEntry*) malloc(sizeof(UserListEntry));
+       ul->UserName = NewStrBuf();
+       ul->Passvoid = NewStrBuf();
+       ul->PrimaryEmail = NewStrBuf();
+       ul->OtherEmails = NewStrBuf();
+
+       StrBufExtract_NextToken(ul->UserName,    SerializedUserList, &Pos, '|');
+       ul->AccessLevel = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+       ul->UID         = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+       ul->LastLogonT  = StrBufExtractNext_long(SerializedUserList, &Pos, '|');
+       ul->nLogons     = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+       ul->nPosts      = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+       StrBufExtract_NextToken(ul->Passvoid,    SerializedUserList, &Pos, '|');
+       ul->Flags = 0;
+       ul->HasBio = 0;
+       ul->DaysTillPurge = -1;
+       return ul;
+}
+
+/*
+ * Sort by Username
+ */
+int CompareUserListName(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return strcmp(ChrPtr(u1->UserName), ChrPtr(u2->UserName));
+}
+
+int CompareUserListNameRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+       return strcmp(ChrPtr(u2->UserName), ChrPtr(u1->UserName));
+}
+
+int GroupchangeUserListName(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+       return ChrPtr(u2->UserName)[0] != ChrPtr(u1->UserName)[0];
+}
+
+/*
+ * Sort by access level
+ */
+int CompareAccessLevel(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u1->AccessLevel > u2->AccessLevel);
+}
+
+int CompareAccessLevelRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->AccessLevel > u1->AccessLevel);
+}
+
+int GroupchangeAccessLevel(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return u2->AccessLevel != u1->AccessLevel;
+}
+
+/*
+ * Sort by UID
+ */
+int CompareUID(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u1->UID > u2->UID);
+}
+
+int CompareUIDRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->UID > u1->UID);
+}
+
+int GroupchangeUID(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u2->UID / 10) != (u1->UID / 10);
+}
+
+/*
+ * Sort By Date /// TODO!
+ */
+int CompareLastLogon(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u1->LastLogonT > u2->LastLogonT);
+}
+
+int CompareLastLogonRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->LastLogonT > u1->LastLogonT);
+}
+
+int GroupchangeLastLogon(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u2->LastLogonT != u1->LastLogonT);
+}
+
+/*
+ * Sort By Number of Logons
+ */
+int ComparenLogons(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u1->nLogons > u2->nLogons);
+}
+
+int ComparenLogonsRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->nLogons > u1->nLogons);
+}
+
+int GroupchangenLogons(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u2->nLogons / 100) != (u1->nLogons / 100);
+}
+
+/*
+ * Sort By Number of Posts
+ */
+int ComparenPosts(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u1->nPosts > u2->nPosts);
+}
+
+int ComparenPostsRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->nPosts > u1->nPosts);
+}
+
+int GroupchangenPosts(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u2->nPosts / 100) != (u1->nPosts / 100);
+}
+
+
+HashList *iterate_load_userlist(StrBuf *Target, WCTemplputParams *TP)
+{
+       int Done = 0;
+       CompareFunc SortIt;
+       HashList *Hash = NULL;
+       StrBuf *Buf;
+       UserListEntry* ul;
+       int len;
+       int UID;
+       void *vData;
+       WCTemplputParams SubTP;
+
+       memset(&SubTP, 0, sizeof(WCTemplputParams));    
+        serv_puts("LIST");
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 1) {
+               Hash = NewHash(1, Flathash);
+               Done = 0;
+               while (!Done) {
+                       len = StrBuf_ServGetln(Buf);
+                       if ((len <0) || 
+                           ((len == 3) &&
+                            !strcmp(ChrPtr(Buf), "000")))
+                       {
+                               Done = 1;
+                               break;
+                       }
+                       ul = NewUserListEntry(Buf);
+                       if (ul == NULL)
+                               continue;
+
+                       Put(Hash, IKEY(ul->UID), ul, DeleteUserListEntry); 
+               }
+
+               serv_puts("LBIO 1");
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatus(Buf, NULL) == 1) {
+                       Done = 0;
+                       while (!Done) {
+                               len = StrBuf_ServGetln(Buf);
+                               if ((len <0) || ((len == 3) && !strcmp(ChrPtr(Buf), "000")))
+                               {
+                                       Done = 1;
+                                       break;
+                               }
+                       }
+                       UID = atoi(ChrPtr(Buf));
+                       if (GetHash(Hash, IKEY(UID), &vData) && vData != 0)
+                       {
+                               ul = (UserListEntry*)vData;
+                               ul->HasBio = 1;
+                       }
+               }
+               SubTP.Filter.ContextType = CTX_USERLIST;
+               SortIt = RetrieveSort(&SubTP, HKEY("USER"), HKEY("user:uid"), 0);
+               if (SortIt != NULL)
+                       SortByPayload(Hash, SortIt);
+               else 
+                       SortByPayload(Hash, CompareUID);
+        }
+       FreeStrBuf(&Buf);
+       return Hash;
+}
+
+
+void tmplput_USERLIST_UserName(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       StrBufAppendTemplate(Target, TP, ul->UserName, 0);
+}
+
+void tmplput_USERLIST_Password(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       StrBufAppendTemplate(Target, TP, ul->Passvoid, 0);
+}
+
+void tmplput_USERLIST_PrimaryEmail(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       StrBufAppendTemplate(Target, TP, ul->PrimaryEmail, 0);
+}
+
+void tmplput_USERLIST_OtherEmails(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       StrBufAppendTemplate(Target, TP, ul->OtherEmails, 0);
+}
+
+void tmplput_USERLIST_AccessLevelNo(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+
+       StrBufAppendPrintf(Target, "%d", ul->AccessLevel, 0);
+}
+
+void tmplput_USERLIST_AccessLevelStr(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       
+       StrBufAppendBufPlain(Target, _(axdefs[ul->AccessLevel]), -1, 0);
+}
+
+void tmplput_USERLIST_UID(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+
+       StrBufAppendPrintf(Target, "%d", ul->UID, 0);
+}
+
+
+void tmplput_USERLIST_LastLogonNo(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+
+       StrBufAppendPrintf(Target,"%ld", ul->LastLogonT, 0);
+}
+
+
+void tmplput_USERLIST_LastLogonStr(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       StrEscAppend(Target, NULL, asctime(localtime(&ul->LastLogonT)), 0, 0);
+}
+
+
+void tmplput_USERLIST_nLogons(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+
+       StrBufAppendPrintf(Target, "%d", ul->nLogons, 0);
+}
+
+
+void tmplput_USERLIST_nPosts(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+
+       StrBufAppendPrintf(Target, "%d", ul->nPosts, 0);
+}
+
+
+void tmplput_USERLIST_Flags(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+
+       StrBufAppendPrintf(Target, "%d", ul->Flags, 0);
+}
+
+
+void tmplput_USERLIST_DaysTillPurge(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+
+       StrBufAppendPrintf(Target, "%d", ul->DaysTillPurge, 0);
+}
+
+
+int ConditionalUser(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       if (havebstr("usernum")) {
+               return ibstr("usernum") == ul->UID;
+       }
+       else if (havebstr("username")) {
+               return strcmp(bstr("username"), ChrPtr(ul->UserName)) == 0;
+       }
+       else 
+               return 0;
+}
+
+
+int ConditionalFlagINetEmail(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       return (ul->Flags & US_INTERNET) != 0;
+}
+
+
+int ConditionalUserAccess(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       
+       if (ul == NULL)
+               return 0;
+
+       return GetTemplateTokenNumber(Target, 
+                                     TP, 
+                                     3, 
+                                     AxNewU)
+               ==
+               ul->AccessLevel;
+}
+
+
+int ConditionalHaveBIO(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST);
+       
+       if (ul == NULL)
+               return 0;
+       return ul->HasBio;
+}
+
+
+int ConditionalSuppressEmailFields(StrBuf *Target, WCTemplputParams *TP)
+{
+       return 0;               // FIXME this makes all email fields display
+}
+
+
+void tmplput_USER_BIO(StrBuf *Target, WCTemplputParams *TP)
+{
+       int Done = 0;
+       StrBuf *Buf;
+       const char *who;
+       long len;
+
+       GetTemplateTokenString(Target, TP, 0, &who, &len);
+       if (len == 0) {
+               who = ChrPtr(WC->wc_fullname);
+       }
+
+       Buf = NewStrBuf();
+       serv_printf("RBIO %s", who);
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 1) {
+               StrBuf *BioBuf = NewStrBufPlain(NULL, SIZ);
+               while (!Done && StrBuf_ServGetln(Buf)>=0) {
+                       if ( (StrLength(Buf)==3) && 
+                            !strcmp(ChrPtr(Buf), "000")) 
+                               Done = 1;
+                       else {
+                               StrBufAppendBuf(BioBuf, Buf, 0);
+                               StrBufAppendBufPlain(BioBuf, HKEY("\n"), 0);
+                       }
+               }
+               StrBufAppendTemplate(Target, TP, BioBuf, 1);
+               FreeStrBuf(&BioBuf);
+       }
+       FreeStrBuf(&Buf);
+}
+
+
+int Conditional_USER_HAS_PIC(StrBuf *Target, WCTemplputParams *TP)
+{
+       // ajc 2016apr10 this needs to be re-evaluated with the new protocol
+       return(0);
+}
+
+
+/*
+ *  Locate the message number of a user's vCard in the current room
+ *  Returns the message id of his vcard
+ */
+long locate_user_vcard_in_this_room(message_summary **VCMsg, wc_mime_attachment **VCAtt)
+{
+       HashPos *at;
+       HashPos *att;
+       const char *HashKey;
+       long HKLen;
+       void *vMsg;
+       message_summary *Msg;
+       wc_mime_attachment *Att;
+       StrBuf *Buf;
+       long vcard_msgnum = (-1L);
+       int already_tried_creating_one = 0;
+       StrBuf *FoundCharset = NewStrBuf();
+       StrBuf *Error = NULL;
+       SharedMessageStatus Stat;
+
+
+       Buf = NewStrBuf();
+TRYAGAIN:
+       memset(&Stat, 0, sizeof(SharedMessageStatus));
+       Stat.maxload = 10000;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       /* Search for the user's vCard */
+       if (load_msg_ptrs("MSGS ALL||||1", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0) > 0) {
+               at = GetNewHashPos(WC->summ, 0);
+               while (GetNextHashPos(WC->summ, at, &HKLen, &HashKey, &vMsg)) {
+                       Msg = (message_summary*) vMsg;          
+                       Msg->MsgBody =  (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment));
+                       memset(Msg->MsgBody, 0, sizeof(wc_mime_attachment));
+                       Msg->MsgBody->msgnum = Msg->msgnum;
+
+                       load_message(Msg, FoundCharset, &Error);
+                       
+                       if (Msg->AllAttach != NULL) {
+                               att = GetNewHashPos(Msg->AllAttach, 0);
+                               while (GetNextHashPos(Msg->AllAttach, att, &HKLen, &HashKey, &vMsg) && 
+                                      (vcard_msgnum == -1)) {
+                                       Att = (wc_mime_attachment*) vMsg;
+                                       if (
+                                               (strcasecmp(ChrPtr(Att->ContentType), "text/x-vcard") == 0)
+                                               || (strcasecmp(ChrPtr(Att->ContentType), "text/vcard") == 0)
+                                       ) {
+                                               *VCAtt = Att;
+                                               *VCMsg = Msg;
+                                               vcard_msgnum = Msg->msgnum;
+                                               if (Att->Data == NULL) {
+                                                       MimeLoadData(Att);
+                                               }
+                                       }
+                               }
+                               DeleteHashPos(&att);
+                       }
+                       FreeStrBuf(&Error);     /* don't care... */
+                       
+               }
+               DeleteHashPos(&at);             
+       }
+
+       /* If there's no vcard, create one */
+       if ((*VCMsg == NULL) && (already_tried_creating_one == 0)) {
+               FlushStrBuf(Buf);
+               already_tried_creating_one = 1;
+               serv_puts("ENT0 1|||4");
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatus(Buf, NULL) == 4) {
+                       serv_puts("Content-type: text/x-vcard");
+                       serv_puts("");
+                       serv_puts("begin:vcard");
+                       serv_puts("end:vcard");
+                       serv_puts("000");
+               }
+               else 
+                       syslog(LOG_WARNING, "Error while creating user vcard: %s\n", ChrPtr(Buf));
+               goto TRYAGAIN;
+       }
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&FoundCharset);
+
+       return(vcard_msgnum);
+}
+
+
+/*
+ *  Display the form for editing a user's address book entry
+ *  username the name of the user
+ *  usernum the citadel-uid of the user
+ */
+void display_edit_address_book_entry(const char *username, long usernum) {
+       message_summary *VCMsg = NULL;
+       wc_mime_attachment *VCAtt = NULL;
+       StrBuf *roomname;
+       StrBuf *Buf;
+       long vcard_msgnum = (-1L);
+
+       /* Locate the user's config room, creating it if necessary */
+       Buf = NewStrBuf();
+       roomname = NewStrBuf();
+       StrBufPrintf(roomname, "%010ld.%s", usernum, USERCONFIGROOM);
+       serv_printf("GOTO %s||1", ChrPtr(roomname));
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) != 2) {
+               serv_printf("CRE8 1|%s|5|||1|", ChrPtr(roomname));
+               StrBuf_ServGetln(Buf);
+               GetServerStatus(Buf, NULL);
+               serv_printf("GOTO %s||1", ChrPtr(roomname));
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatusMsg(Buf, NULL, 1, 2) != 2) {
+                       select_user_to_edit(username);
+                       FreeStrBuf(&Buf);
+                       FreeStrBuf(&roomname);
+                       return;
+               }
+       }
+       FreeStrBuf(&Buf);
+
+       locate_user_vcard_in_this_room(&VCMsg, &VCAtt);
+
+       if (VCMsg == NULL) {
+               AppendImportantMessage(_("An error occurred while trying to create or edit this address book entry."), -1);
+               select_user_to_edit(username);
+               FreeStrBuf(&roomname);
+               return;
+       }
+
+       do_edit_vcard(vcard_msgnum, "1", 
+                     VCMsg,
+                     VCAtt,
+                     "select_user_to_edit", 
+                     ChrPtr(roomname));
+       FreeStrBuf(&roomname);
+}
+
+/*
+ *  purge a user 
+ *  username the name of the user to remove
+ */
+void delete_user(char *username) {
+       StrBuf *Buf;
+       
+       Buf = NewStrBuf();
+       serv_printf("ASUP %s|0|0|0|0|0|", username);
+       StrBuf_ServGetln(Buf);
+       GetServerStatusMsg(Buf, NULL, 1, 2);
+
+       select_user_to_edit( bstr("username"));
+       FreeStrBuf(&Buf);
+}
+               
+
+void display_edituser(const char *supplied_username, int is_new) {
+       const char *Pos;
+       UserListEntry* UL;
+       StrBuf *Buf;
+       char username[256];
+       int i = 0;
+
+       if (supplied_username != NULL) {
+               safestrncpy(username, supplied_username, sizeof username);
+       }
+       else {
+               safestrncpy(username, bstr("username"), sizeof username);
+       }
+
+       Buf = NewStrBuf();
+       serv_printf("AGUP %s", username);
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatusMsg(Buf, NULL, 1, 2) != 2) {
+               select_user_to_edit(username);
+               FreeStrBuf(&Buf);
+               return;
+       }
+       else {
+               Pos = ChrPtr(Buf) + 4;
+               UL = NewUserListOneEntry(Buf, Pos);
+               if ((UL != NULL) && havebstr("edit_abe_button")) {
+                       display_edit_address_book_entry(username, UL->UID);
+               }
+               else if ((UL != NULL) && havebstr("delete_button")) {
+                       delete_user(username);
+               }
+               else if (UL != NULL) {
+
+                       serv_printf("AGEA %s", username);
+                       StrBuf_ServGetln(Buf);
+                       if (GetServerStatusMsg(Buf, NULL, 1, 2) == 1) {
+                               while(StrBuf_ServGetln(Buf) , strcmp(ChrPtr(Buf), "000")) {
+                                       if (i == 0) {
+                                               StrBufAppendPrintf(UL->PrimaryEmail, "%s", ChrPtr(Buf));
+                                       }
+                                       if (i > 1) {
+                                               StrBufAppendPrintf(UL->OtherEmails, ",");
+                                       }
+                                       if (i > 0) {
+                                               StrBufAppendPrintf(UL->OtherEmails, "%s", ChrPtr(Buf));
+                                       }
+                                       ++i;
+                               }
+                       }
+
+                       WCTemplputParams SubTP;
+                       memset(&SubTP, 0, sizeof(WCTemplputParams));
+                       SubTP.Filter.ContextType = CTX_USERLIST;
+                       SubTP.Context = UL;
+                       output_headers(1, 0, 0, 0, 1, 0);
+                       DoTemplate(HKEY("aide_edituser_detailview"), NULL, &SubTP);
+                       end_burst();
+               }
+               DeleteUserListEntry(UL);
+               
+       }
+       FreeStrBuf(&Buf);
+}
+
+/*
+ *  do the backend operation of the user edit on the server
+ */
+void edituser(void) {
+       int is_new = 0;
+       unsigned int flags = 0;
+       const char *username;
+
+       is_new = ibstr("is_new");
+       username = bstr("username");
+
+       if (!havebstr("ok_button")) {
+               AppendImportantMessage(_("Changes were not saved."), -1);
+       }       
+       else {
+               StrBuf *Buf = NewStrBuf();
+
+               flags = ibstr("flags");
+               if (yesbstr("inetmail")) {
+                       flags |= US_INTERNET;
+               }
+               else {
+                       flags &= ~US_INTERNET ;
+               }
+
+               if ((havebstr("newname")) && (strcasecmp(bstr("username"), bstr("newname")))) {
+                       serv_printf("RENU %s|%s", bstr("username"), bstr("newname"));
+                       StrBuf_ServGetln(Buf);
+                       if (GetServerStatusMsg(Buf, NULL, 1, 2) != 2) {
+                               username = bstr("newname");
+                       }
+               }
+
+               /* Send the new account parameters */
+               serv_printf("ASUP %s|%s|%d|%s|%s|%s|%s|%s|%s|",
+                       username,
+                       bstr("password"),
+                       flags,
+                       bstr("timescalled"),
+                       bstr("msgsposted"),
+                       bstr("axlevel"),
+                       bstr("usernum"),
+                       bstr("lastcall"),
+                       bstr("purgedays")
+               );
+               StrBuf_ServGetln(Buf);
+               GetServerStatusMsg(Buf, NULL, 1, 2);
+
+               /* Send the new email addresses.  First make up a delimited list... */
+               char all_the_emails[512];
+               snprintf(all_the_emails, sizeof all_the_emails, "%s,%s", bstr("primaryemail"), bstr("otheremails"));
+
+               /* Replace any commas, semicolons, or spaces with newlines */
+               char *pos;
+               for (pos=all_the_emails; *pos!=0; ++pos) {
+                       if ((*pos == ',') || (*pos == ';') || (*pos == ' ')) *pos = '\n' ;
+               }
+
+               /* Remove any naughty inappropriate whitespace */
+               string_trim(all_the_emails);
+               while (pos = strstr(all_the_emails, "\n,"), (pos != NULL)) {
+                       strcpy(pos, pos+1);
+               }
+               while (pos = strstr(all_the_emails, ",\n"), (pos != NULL)) {
+                       strcpy(pos+1, pos+2);
+               }
+               while (pos = strstr(all_the_emails, "\n\n"), (pos != NULL)) {
+                       strcpy(pos+1, pos+2);
+               }
+
+               /* Now send it to the server. */
+               serv_printf("ASEA %s", username);
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatusMsg(Buf, NULL, 1, 2) == 4) {
+                       serv_printf("%s\n000", all_the_emails);
+               }
+
+               FreeStrBuf(&Buf);
+       }
+
+       /*
+        * If we are in the middle of creating a new user, move on to
+        * the vCard edit screen.
+        */
+       if (is_new) {
+               display_edit_address_book_entry(username, lbstr("usernum") );
+       }
+       else {
+               select_user_to_edit(username);
+       }
+}
+
+
+/*
+ * create a new user
+ * (take the web environment username and create it on the citadel server)
+ */
+void create_user(void) {
+       long FullState;
+       StrBuf *Buf;
+       const char *username;
+
+       Buf = NewStrBuf();
+       username = bstr("username");
+       serv_printf("CREU %s", username);
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, &FullState) == 2) {
+               AppendImportantMessage(_("A new user has been created."), -1);
+               display_edituser(username, 1);
+       }
+       else if (FullState == 570) {
+               AppendImportantMessage(_("You are attempting to create a new user from within Citadel "
+                                        "while running in host based authentication mode.  In this mode, "
+                                        "you must create new users on the host system, not within Citadel."), 
+                                      -1);
+               select_user_to_edit(NULL);
+       }
+       else {
+               AppendImportantMessage(ChrPtr(Buf) + 4, StrLength(Buf) - 4);
+               select_user_to_edit(NULL);
+       }
+       FreeStrBuf(&Buf);
+}
+
+
+void display_userpic(void) {
+       off_t bytes;
+       StrBuf *Buf = NewStrBuf();
+       const char *username = bstr("user");
+       serv_printf("DLUI %s", username);
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 6) {
+               StrBufCutLeft(Buf, 4);
+               bytes = StrBufExtract_long(Buf, 0, '|');
+               StrBuf *content_type = NewStrBuf();
+               StrBufExtract_token(content_type, Buf, 3, '|');
+               WC->WBuf = NewStrBuf();
+               StrBuf_ServGetBLOBBuffered(WC->WBuf, bytes);
+               http_transmit_thing(ChrPtr(content_type), 0);
+               FreeStrBuf(&content_type);
+       }
+       else {
+               output_error_pic("", "");
+       }
+       FreeStrBuf(&Buf);
+}
+
+
+void _select_user_to_edit(void) {
+       select_user_to_edit(NULL);
+}
+
+
+void _display_edituser(void) {
+       display_edituser(NULL, 0);
+}
+
+
+void 
+InitModule_USEREDIT
+(void)
+{
+       RegisterCTX(CTX_USERLIST);
+       WebcitAddUrlHandler(HKEY("select_user_to_edit"), "", 0, _select_user_to_edit, 0);
+       WebcitAddUrlHandler(HKEY("display_edituser"), "", 0, _display_edituser, 0);
+       WebcitAddUrlHandler(HKEY("edituser"), "", 0, edituser, 0);
+       WebcitAddUrlHandler(HKEY("create_user"), "", 0, create_user, 0);
+       WebcitAddUrlHandler(HKEY("userpic"), "", 0, display_userpic, 0);
+
+       RegisterNamespace("USERLIST:USERNAME",      0, 1, tmplput_USERLIST_UserName, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:PASSWD",        0, 1, tmplput_USERLIST_Password, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:ACCLVLNO",      0, 0, tmplput_USERLIST_AccessLevelNo, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:ACCLVLSTR",     0, 0, tmplput_USERLIST_AccessLevelStr, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:UID",           0, 0, tmplput_USERLIST_UID, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:LASTLOGON:STR", 0, 0, tmplput_USERLIST_LastLogonStr, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:LASTLOGON:NO",  0, 0, tmplput_USERLIST_LastLogonNo, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:NLOGONS",       0, 0, tmplput_USERLIST_nLogons, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:NPOSTS",        0, 0, tmplput_USERLIST_nPosts, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:PRIMARYEMAIL",  0, 1, tmplput_USERLIST_PrimaryEmail, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:OTHEREMAILS",   0, 1, tmplput_USERLIST_OtherEmails, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:FLAGS",         0, 0, tmplput_USERLIST_Flags, NULL, CTX_USERLIST);
+       RegisterNamespace("USERLIST:DAYSTILLPURGE", 0, 0, tmplput_USERLIST_DaysTillPurge, NULL, CTX_USERLIST);
+
+       RegisterNamespace("USER:BIO", 1, 2, tmplput_USER_BIO,  NULL, CTX_NONE);
+
+       RegisterConditional("COND:USERNAME",                    0,      ConditionalUser,                CTX_USERLIST);
+       RegisterConditional("COND:USERACCESS",                  0,      ConditionalUserAccess,          CTX_USERLIST);
+       RegisterConditional("COND:USERLIST:FLAG:USE_INTERNET",  0,      ConditionalFlagINetEmail,       CTX_USERLIST);
+       RegisterConditional("COND:USERLIST:HAVEBIO",            0,      ConditionalHaveBIO,             CTX_USERLIST);
+       RegisterConditional("COND:USER:PIC",                    1,      Conditional_USER_HAS_PIC,       CTX_NONE);
+
+       RegisterIterator("USERLIST", 0, NULL, iterate_load_userlist, NULL, DeleteHash, CTX_USERLIST, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
+
+       RegisterSortFunc(HKEY("user:name"),
+                        HKEY("userlist"),
+                        CompareUserListName,
+                        CompareUserListNameRev,
+                        GroupchangeUserListName,
+                        CTX_USERLIST);
+       RegisterSortFunc(HKEY("user:accslvl"),
+                        HKEY("userlist"),
+                        CompareAccessLevel,
+                        CompareAccessLevelRev,
+                        GroupchangeAccessLevel,
+                        CTX_USERLIST);
+
+       RegisterSortFunc(HKEY("user:nlogons"),
+                        HKEY("userlist"),
+                        ComparenLogons,
+                        ComparenLogonsRev,
+                        GroupchangenLogons,
+                        CTX_USERLIST);
+
+       RegisterSortFunc(HKEY("user:uid"),
+                        HKEY("userlist"),
+                        CompareUID,
+                        CompareUIDRev,
+                        GroupchangeUID,
+                        CTX_USERLIST);
+
+       RegisterSortFunc(HKEY("user:lastlogon"),
+                        HKEY("userlist"),
+                        CompareLastLogon,
+                        CompareLastLogonRev,
+                        GroupchangeLastLogon,
+                        CTX_USERLIST);
+
+       RegisterSortFunc(HKEY("user:nmsgposts"),
+                        HKEY("userlist"),
+                        ComparenPosts,
+                        ComparenPostsRev,
+                        GroupchangenPosts,
+                        CTX_USERLIST);
+
+       REGISTERTokenParamDefine(AxDeleted);
+       REGISTERTokenParamDefine(AxNewU);
+       REGISTERTokenParamDefine(AxProbU);
+       REGISTERTokenParamDefine(AxLocU);
+       REGISTERTokenParamDefine(AxNetU);
+       REGISTERTokenParamDefine(AxPrefU);
+       REGISTERTokenParamDefine(AxAideU);
+}
+
diff --git a/webcit/utils.c b/webcit/utils.c
new file mode 100644 (file)
index 0000000..e08dcb7
--- /dev/null
@@ -0,0 +1,157 @@
+// de/encoding stuff. hopefully mostly to be depricated in favour of subst.c + strbuf
+
+#define SHOW_ME_VAPPEND_PRINTF
+#include <stdio.h>
+#include <stdarg.h>
+#include "webcit.h"
+
+
+// remove escaped strings from i.e. the url string (like %20 for blanks)
+long unescape_input(char *buf) {
+       unsigned int a, b;
+       char hex[3];
+       long buflen;
+       long len;
+
+       buflen = strlen(buf);
+
+       while ((buflen > 0) && (isspace(buf[buflen - 1]))){
+               buf[buflen - 1] = 0;
+               buflen --;
+       }
+
+       a = 0; 
+       while (a < buflen) {
+               if (buf[a] == '+')
+                       buf[a] = ' ';
+               if (buf[a] == '%') {
+                       // don't let % chars through, rather truncate the input.
+                       if (a + 2 > buflen) {
+                               buf[a] = '\0';
+                               buflen = a;
+                       }
+                       else {                  
+                               hex[0] = buf[a + 1];
+                               hex[1] = buf[a + 2];
+                               hex[2] = 0;
+                               b = 0;
+                               b = decode_hex(hex);
+                               buf[a] = (char) b;
+                               len = buflen - a - 2;
+                               if (len > 0)
+                                       memmove(&buf[a + 1], &buf[a + 3], len);
+                       
+                               buflen -=2;
+                       }
+               }
+               a++;
+       }
+       return a;
+}
+
+// Copy a string, escaping characters which have meaning in HTML.  
+//
+// target              target buffer
+// strbuf              source buffer
+// nbsp                        If nonzero, spaces are converted to non-breaking spaces.
+// nolinebreaks                if set, linebreaks are removed from the string.
+long stresc(char *target, long tSize, char *strbuf, int nbsp, int nolinebreaks) {
+        char *aptr, *bptr, *eptr;
+        *target = '\0';
+        aptr = strbuf;
+        bptr = target;
+        eptr = target + tSize - 6; // our biggest unit to put in...
+        while ((bptr < eptr) && !IsEmptyStr(aptr) ){
+                if (*aptr == '<') {
+                        memcpy(bptr, "&lt;", 4);
+                        bptr += 4;
+                }
+                else if (*aptr == '>') {
+                        memcpy(bptr, "&gt;", 4);
+                        bptr += 4;
+                }
+                else if (*aptr == '&') {
+                        memcpy(bptr, "&amp;", 5);
+                        bptr += 5;
+                }
+                else if (*aptr == '\"') {
+                        memcpy(bptr, "&quot;", 6);
+                        bptr += 6;
+                }
+                else if (*aptr == '\'') {
+                        memcpy(bptr, "&#39;", 5);
+                        bptr += 5;
+                }
+                else if (*aptr == LB) {
+                        *bptr = '<';
+                        bptr ++;
+                }
+                else if (*aptr == RB) {
+                        *bptr = '>';
+                        bptr ++;
+                }
+                else if (*aptr == QU) {
+                        *bptr ='"';
+                        bptr ++;
+                }
+                else if ((*aptr == 32) && (nbsp == 1)) {
+                        memcpy(bptr, "&nbsp;", 6);
+                        bptr += 6;
+                }
+                else if ((*aptr == '\n') && (nolinebreaks)) {
+                        *bptr='\0';     /* nothing */
+                }
+                else if ((*aptr == '\r') && (nolinebreaks)) {
+                        *bptr='\0';     /* nothing */
+                }
+                else{
+                        *bptr = *aptr;
+                        bptr++;
+                }
+                aptr ++;
+        }
+        *bptr = '\0';
+        if ((bptr = eptr - 1 ) && !IsEmptyStr(aptr) )
+                return -1;
+        return (bptr - target);
+}
+
+// static wrapper for escputs1
+void escputs(const char *strbuf) {
+       StrEscAppend(WC->WBuf, NULL, strbuf, 0, 0);
+}
+
+// urlescape buffer and print it to the client
+void urlescputs(const char *strbuf) {
+       StrBufUrlescAppend(WC->WBuf, NULL, strbuf);
+}
+
+
+// urlescape buffer and print it as header 
+void hurlescputs(const char *strbuf) {
+       StrBufUrlescAppend(WC->HBuf, NULL, strbuf);
+}
+
+
+// Output a string to the client as a CDATA block
+void cdataout(char *rawdata) {
+       char *ptr = rawdata;
+       wc_printf("<![CDATA[");
+
+       while ((ptr != NULL) && (ptr[0] != 0))
+       {
+               if (!strncmp(ptr, "]]>", 3)) {
+                       wc_printf("]]]]><![CDATA[>");
+                       ++ptr; ++ptr; ++ptr;
+               }
+               else {
+                       wc_printf("%c", ptr[0]);
+                       ++ptr;
+               }
+       }
+
+       wc_printf("]]>");
+}
\ No newline at end of file
diff --git a/webcit/utils.h b/webcit/utils.h
new file mode 100644 (file)
index 0000000..7c32249
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+void StrEscPuts(const StrBuf *strbuf);
+void StrEscputs1(const StrBuf *strbuf, int nbsp, int nolinebreaks);
+
+void urlescputs(const char *);
+void hurlescputs(const char *);
+long stresc(char *target, long tSize, char *strbuf, int nbsp, int nolinebreaks);
+void escputs(const char *strbuf);
diff --git a/webcit/vcard_edit.c b/webcit/vcard_edit.c
new file mode 100644 (file)
index 0000000..d1a16d3
--- /dev/null
@@ -0,0 +1,1196 @@
+/*
+ * Copyright (c) 1996-2021 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "calendar.h"
+
+CtxType CTX_VCARD = CTX_NONE;
+CtxType CTX_VCARD_LIST = CTX_NONE;
+CtxType CTX_VCARD_TYPE = CTX_NONE;
+long VCEnumCounter = 0;
+
+typedef enum _VCStrEnum {
+       FlatString,
+       StringCluster,
+       PhoneNumber,
+       EmailAddr,
+       Address,
+       Street,
+       Number,
+       AliasFor,
+       Base64BinaryAttachment,
+       UnKnown,
+       TerminateList
+}VCStrEnum;
+typedef struct vcField vcField;
+struct vcField {
+       ConstStr STR;
+       VCStrEnum Type;
+       vcField *Sub;
+       long cval;
+       long parentCVal;
+       ConstStr Name;
+};
+
+vcField VCStr_Ns [] = {
+       {{HKEY("last")},   FlatString,    NULL, 0, 0, {HKEY("Last Name")}},
+       {{HKEY("first")},  FlatString,    NULL, 0, 0, {HKEY("First Name")}},
+       {{HKEY("middle")}, FlatString,    NULL, 0, 0, {HKEY("Middle Name")}},
+       {{HKEY("prefix")}, FlatString,    NULL, 0, 0, {HKEY("Prefix")}},
+       {{HKEY("suffix")}, FlatString,    NULL, 0, 0, {HKEY("Suffix")}},
+       {{HKEY("")},       TerminateList, NULL, 0, 0, {HKEY("")}}
+};
+
+vcField VCStr_Addrs [] = {
+       {{HKEY("POBox")},    Address,       NULL, 0, 0, {HKEY("PO box")}},
+       {{HKEY("extadr")},   Address,       NULL, 0, 0, {HKEY("Address")}},
+       {{HKEY("street")},   Address,       NULL, 0, 0, {HKEY("")}},
+       {{HKEY("city")},     Address,       NULL, 0, 0, {HKEY("City")}},
+       {{HKEY("state")},    Address,       NULL, 0, 0, {HKEY("State")}},
+       {{HKEY("zip")},      Address,       NULL, 0, 0, {HKEY("ZIP code")}},
+       {{HKEY("country")},  Address,       NULL, 0, 0, {HKEY("Country")}},
+       {{HKEY("")},         TerminateList, NULL, 0, 0, {HKEY("")}}
+};
+
+vcField VCStrE [] = {
+       {{HKEY("version")},         Number,                 NULL,        0, 0, {HKEY("")}},
+       {{HKEY("rev")},             Number,                 NULL,        0, 0, {HKEY("")}},
+       {{HKEY("label")},           FlatString,             NULL,        0, 0, {HKEY("")}},
+       {{HKEY("uid")},             FlatString,             NULL,        0, 0, {HKEY("")}},
+       {{HKEY("n")},               StringCluster,          VCStr_Ns,    0, 0, {HKEY("")}}, /* N is name, but only if there's no FN already there */
+       {{HKEY("fn")},              FlatString,             NULL,        0, 0, {HKEY("")}}, /* FN (full name) is a true 'display name' field */
+       {{HKEY("title")},           FlatString,             NULL,        0, 0, {HKEY("Title:")}},
+       {{HKEY("org")},             FlatString,             NULL,        0, 0, {HKEY("Organization:")}},/* organization */
+       {{HKEY("email")},           EmailAddr,              NULL,        0, 0, {HKEY("E-mail:")}},
+       {{HKEY("tel")},             PhoneNumber,            NULL,        0, 0, {HKEY("Telephone:")}},
+       {{HKEY("adr")},             StringCluster,          VCStr_Addrs, 0, 0, {HKEY("Address:")}},
+       {{HKEY("photo")},           Base64BinaryAttachment, NULL,        0, 0, {HKEY("Photo:")}},
+       {{HKEY("tel;home")},        PhoneNumber,            NULL,        0, 0, {HKEY(" (home)")}},
+       {{HKEY("tel;work")},        PhoneNumber,            NULL,        0, 0, {HKEY(" (work)")}},
+       {{HKEY("tel;fax")},         PhoneNumber,            NULL,        0, 0, {HKEY(" (fax)")}},
+       {{HKEY("tel;cell")},        PhoneNumber,            NULL,        0, 0, {HKEY(" (cell)")}},
+       {{HKEY("email;internet")},  EmailAddr,              NULL,        0, 0, {HKEY("E-mail:")}},
+       {{HKEY("UNKNOWN")},         UnKnown,                NULL,        0, 0, {HKEY("")}},
+       {{HKEY("")},                TerminateList,          NULL,        0, 0, {HKEY("")}}
+};
+
+ConstStr VCStr [] = {
+       {HKEY("")},
+       {HKEY("n")}, /* N is name, but only if there's no FN already there */
+       {HKEY("fn")}, /* FN (full name) is a true 'display name' field */
+       {HKEY("title")},   /* title */
+       {HKEY("org")},    /* organization */
+       {HKEY("email")},
+       {HKEY("tel")},
+       {HKEY("work")},
+       {HKEY("home")},
+       {HKEY("cell")},
+       {HKEY("adr")},
+       {HKEY("photo")},
+       {HKEY("version")},
+       {HKEY("rev")},
+       {HKEY("label")},
+       {HKEY("uid")}
+};
+
+/*
+ * Address book entry (keep it short and sweet, it's just a quickie lookup
+ * which we can use to get to the real meat and bones later)
+ */
+typedef struct _addrbookent {
+       StrBuf *name;
+       HashList *VC;
+       long ab_msgnum;         /* message number of address book entry */
+       StrBuf *msgNoStr;
+} addrbookent;
+
+void deleteAbEnt(void *v) {
+       addrbookent *vc = (addrbookent*)v;
+       DeleteHash(&vc->VC);
+       FreeStrBuf(&vc->name);
+       FreeStrBuf(&vc->msgNoStr);
+       free(vc);
+}
+
+HashList *DefineToToken = NULL;
+HashList *VCTokenToDefine = NULL;
+HashList *vcNames = NULL; /* todo: fill with the name strings */
+vcField* vcfUnknown = NULL;
+
+/******************************************************************************
+ *                   initialize vcard structure                               *
+ ******************************************************************************/
+
+void RegisterVCardToken(vcField* vf, StrBuf *name, int inTokenCount)
+{
+       if (vf->Type == UnKnown) {
+               vcfUnknown = vf;
+       }
+       RegisterTokenParamDefine(SKEY(name), vf->cval);
+       Put(DefineToToken, LKEY(vf->cval), vf, reference_free_handler);
+       Put(vcNames, LKEY(vf->cval), NewStrBufPlain(CKEY(vf->Name)), HFreeStrBuf);
+
+       syslog(LOG_DEBUG, "Token: %s -> %ld, %d", 
+              ChrPtr(name),
+              vf->cval, 
+              inTokenCount);
+
+}
+
+void autoRegisterTokens(long *enumCounter, vcField* vf, StrBuf *BaseStr, int layer, long parentCVal)
+{
+       int i = 0;
+       StrBuf *subStr = NewStrBuf();
+       while (vf[i].STR.len > 0) {
+               FlushStrBuf(subStr);
+               vf[i].cval = (*enumCounter) ++;
+               vf[i].parentCVal = parentCVal;
+               StrBufAppendBuf(subStr, BaseStr, 0);
+               if (StrLength(subStr) > 0) {
+                       StrBufAppendBufPlain(subStr, HKEY("."), 0);
+               }
+               StrBufAppendBufPlain(subStr, CKEY(vf[i].STR), 0);
+               if (layer == 0) {
+                       Put(VCTokenToDefine, CKEY(vf[i].STR), &vf[i], reference_free_handler);
+               }
+               switch (vf[i].Type) {
+               case FlatString:
+                       break;
+               case StringCluster:
+               {
+                       autoRegisterTokens(enumCounter, vf[i].Sub, subStr, 1, vf[i].cval);
+               }
+               break;
+               case PhoneNumber:
+                       break;
+               case EmailAddr:
+                       break;
+               case Street:
+                       break;
+               case Number:
+                       break;
+               case AliasFor:
+                       break;
+               case Base64BinaryAttachment:
+                       break;
+               case TerminateList:
+                       break;
+               case Address:
+                       break;
+               case UnKnown:
+                       break;
+               }
+               RegisterVCardToken(&vf[i], subStr, i);
+               i++;
+       }
+       FreeStrBuf(&subStr);
+}
+
+/******************************************************************************
+ *               VCard template functions                                     *
+ ******************************************************************************/
+
+int preeval_vcard_item(WCTemplateToken *Token)
+{
+       WCTemplputParams TPP;
+       WCTemplputParams *TP;
+       int searchFieldNo;
+       StrBuf *Target = NULL;
+
+       memset(&TPP, 0, sizeof(WCTemplputParams));
+       TP = &TPP;
+       TP->Tokens = Token;
+       searchFieldNo = GetTemplateTokenNumber(Target, TP, 0, 0);
+       if (searchFieldNo >= VCEnumCounter) {
+               LogTemplateError(NULL, "VCardItem", ERR_PARM1, TP, "Invalid define");
+               return 0;
+       }
+       return 1;
+}
+
+void tmpl_vcard_item(StrBuf *Target, WCTemplputParams *TP)
+{
+       void *vItem;
+       long searchFieldNo = GetTemplateTokenNumber(Target, TP, 0, 0);
+       addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
+       if (GetHash(ab->VC, LKEY(searchFieldNo), &vItem) && (vItem != NULL)) {
+               StrBufAppendTemplate(Target, TP, (StrBuf*) vItem, 1);
+       }
+}
+
+void tmpl_vcard_context_item(StrBuf *Target, WCTemplputParams *TP)
+{
+       void *vItem;
+       vcField *t = (vcField*) CTX(CTX_VCARD_TYPE);
+       addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
+
+       if (t == NULL) {
+               LogTemplateError(NULL, "VCard item", ERR_NAME, TP, "Missing context");
+               return;
+       }
+
+       if (GetHash(ab->VC, LKEY(t->cval), &vItem) && (vItem != NULL)) {
+               StrBufAppendTemplate(Target, TP, (StrBuf*) vItem, 0);
+       }
+       else {
+               LogTemplateError(NULL, "VCard item", ERR_NAME, TP,
+                                "Doesn't have that key - did you miss to filter in advance?");
+       }
+}
+int preeval_vcard_name_str(WCTemplateToken *Token)
+{
+       WCTemplputParams TPP;
+       WCTemplputParams *TP;
+       int searchFieldNo;
+       StrBuf *Target = NULL;
+
+       memset(&TPP, 0, sizeof(WCTemplputParams));
+       TP = &TPP;
+       TP->Tokens = Token;
+       searchFieldNo = GetTemplateTokenNumber(Target, TP, 0, 0);
+       if (searchFieldNo >= VCEnumCounter) {
+               LogTemplateError(NULL, "VCardName", ERR_PARM1, TP,
+                                "Invalid define");
+               return 0;
+       }
+       return 1;
+}
+
+void tmpl_vcard_name_str(StrBuf *Target, WCTemplputParams *TP)
+{
+       void *vItem;
+       long searchFieldNo = GetTemplateTokenNumber(Target, TP, 0, 0);
+       /* todo: get descriptive string for this vcard type */
+       if (GetHash(vcNames, LKEY(searchFieldNo), &vItem) && (vItem != NULL)) {
+               StrBufAppendTemplate(Target, TP, (StrBuf*) vItem, 1);
+       }
+       else {
+               LogTemplateError(NULL, "VCard item type", ERR_NAME, TP,
+                                "No i18n string for this.");
+               return;
+       }
+}
+
+void tmpl_vcard_msgno(StrBuf *Target, WCTemplputParams *TP)
+{
+       addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
+       if (ab->msgNoStr == NULL) {
+               ab->msgNoStr = NewStrBufPlain(NULL, 64);
+       }
+       StrBufPrintf(ab->msgNoStr, "%ld", ab->ab_msgnum);
+       StrBufAppendTemplate(Target, TP, ab->msgNoStr, 0);
+}
+void tmpl_vcard_context_name_str(StrBuf *Target, WCTemplputParams *TP)
+{
+       void *vItem;
+       vcField *t = (vcField*) CTX(CTX_VCARD_TYPE);
+
+       if (t == NULL) {
+               LogTemplateError(NULL, "VCard item type", ERR_NAME, TP,
+                                "Missing context");
+               return;
+       }
+       
+       if (GetHash(vcNames, LKEY(t->cval), &vItem) && (vItem != NULL)) {
+               StrBufAppendTemplate(Target, TP, (StrBuf*) vItem, 1);
+       }
+       else {
+               LogTemplateError(NULL, "VCard item type", ERR_NAME, TP,
+                                "No i18n string for this.");
+               return;
+       }
+}
+
+int filter_VC_ByType(const char* key, long len, void *Context, StrBuf *Target, WCTemplputParams *TP)
+{
+       long searchType;
+       long type = 0;
+       void *v;
+       vcField *vf = (vcField*) Context;
+       int rc = 0;
+
+       memcpy(&type, key, sizeof(long));
+       searchType = GetTemplateTokenNumber(Target, TP, IT_ADDT_PARAM(0), 0);
+       
+       if (vf->Type == searchType) {
+               addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
+               if (GetHash(ab->VC, LKEY(vf->cval), &v) && v != NULL) {
+                       return 1;
+               }
+       }
+       return rc;
+}
+
+HashList *getContextVcard(StrBuf *Target, WCTemplputParams *TP)
+{
+       vcField *vf = (vcField*) CTX(CTX_VCARD_TYPE);
+       addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
+
+       if ((vf == NULL) || (ab == NULL)) {
+               LogTemplateError(NULL, "VCard item type", ERR_NAME, TP,
+                                "Need VCard and Vcard type in context");
+               
+               return NULL;
+       }
+       return ab->VC;
+}
+
+int filter_VC_ByContextType(const char* key, long len, void *Context, StrBuf *Target, WCTemplputParams *TP)
+{
+       long searchType;
+       vcField *vf = (vcField*) CTX(CTX_VCARD_TYPE);
+
+       memcpy(&searchType, key, sizeof(long));
+       
+       if (vf->cval == searchType) {
+               return 1;
+       }
+       else {
+               return 0;
+       }
+}
+
+int conditional_VC_Havetype(StrBuf *Target, WCTemplputParams *TP)
+{
+       addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
+       long HaveFieldType = GetTemplateTokenNumber(Target, TP, 2, 0);
+       int rc = 0;     
+       void *vVCitem;
+       const char *Key;
+       long len;
+       HashPos *it = GetNewHashPos(ab->VC, 0);
+       while (GetNextHashPos(ab->VC, it, &len, &Key, &vVCitem) && 
+              (vVCitem != NULL)) 
+       {
+               void *vvcField;
+               long type = 0;
+               memcpy(&type, Key, sizeof(long));
+               if (GetHash(DefineToToken, LKEY(type), &vvcField) &&
+                   (vvcField != NULL))
+               {
+                       vcField *t = (vcField*) vvcField;
+                       if (t && t->Type == HaveFieldType) {
+                               rc = 1;
+                               break;
+                       }
+               }
+       }
+       DeleteHashPos(&it);
+       return rc;
+}
+
+
+/* Returns 1 to suppress the "email" fields in the vCard editor, if we're editing a user's contact info.
+ * Returns 0 to present those fields, if we're editing a vCard in an address book.
+ */
+int conditional_VC_SuppressEmailFields(StrBuf *Target, WCTemplputParams *TP)
+{      
+       return(atoi(bstr("suppress_email")));
+}
+
+
+/******************************************************************************
+ *              parse one VCard                                               *
+ ******************************************************************************/
+
+void PutVcardItem(HashList *thisVC, vcField *thisField, StrBuf *ThisFieldStr, int is_qp, StrBuf *Swap)
+{
+       /* if we have some untagged QP, detect it here. */
+       if (is_qp || (strstr(ChrPtr(ThisFieldStr), "=?")!=NULL)){
+               FlushStrBuf(Swap);
+               StrBuf_RFC822_to_Utf8(Swap, ThisFieldStr, NULL, NULL); /* default charset, current charset */
+               SwapBuffers(Swap, ThisFieldStr);
+               FlushStrBuf(Swap);
+       }
+       Put(thisVC, LKEY(thisField->cval), ThisFieldStr, HFreeStrBuf);
+}
+
+void parse_vcard(StrBuf *Target, struct vCard *v, HashList *VC, wc_mime_attachment *Mime)
+{
+       StrBuf *Swap = NULL;
+       int i, j, k;
+       char buf[SIZ];
+       int is_qp = 0;
+       int is_b64 = 0;
+       int ntokens, len;
+       StrBuf *thisname = NULL;
+       char firsttoken[SIZ];
+       StrBuf *thisVCToken;
+       void *vField = NULL;
+
+       Swap = NewStrBuf ();
+       thisname = NewStrBuf();
+       thisVCToken = NewStrBufPlain(NULL, 63);
+       for (i=0; i<(v->numprops); ++i) {
+               FlushStrBuf(thisVCToken);
+               is_qp = 0;
+               is_b64 = 0;
+               // syslog(LOG_DEBUG, "i: %d oneprop: %s - value: %s", i, v->prop[i].name, v->prop[i].value);
+               StrBufPlain(thisname, v->prop[i].name, -1);
+               StrBufLowerCase(thisname);
+               
+               extract_token(firsttoken, ChrPtr(thisname), 0, ';', sizeof firsttoken);
+               ntokens = num_tokens(ChrPtr(thisname), ';');
+               for (j=0, k=0; j < ntokens && k < 10; ++j) {
+                       len = extract_token(buf, ChrPtr(thisname), j, ';', sizeof buf);
+                       if (!strcasecmp(buf, "encoding=quoted-printable")) {
+                               is_qp = 1;
+                       }
+                       else if (!strcasecmp(buf, "encoding=base64")) {
+                               is_b64 = 1;
+                       }
+                       else {
+                               if (StrLength(thisVCToken) > 0) {
+                                       StrBufAppendBufPlain(thisVCToken, HKEY(";"), 0);
+                               }
+                               StrBufAppendBufPlain(thisVCToken, buf, len, 0);
+                       }
+               }
+
+               vField = NULL;  
+               if ((StrLength(thisVCToken) > 0) &&
+                   GetHash(VCTokenToDefine, SKEY(thisVCToken), &vField) && 
+                   (vField != NULL)) {
+                       vcField *thisField = (vcField *)vField;
+                       StrBuf *ThisFieldStr = NULL;
+                       // syslog(LOG_DEBUG, "got this token: %s, found: %s", ChrPtr(thisVCToken), thisField->STR.Key);
+                       switch (thisField->Type) {
+                       case StringCluster: {
+                               int j = 0;
+                               const char *Pos = NULL;
+                               StrBuf *thisArray = NewStrBufPlain(v->prop[i].value, -1);
+                               StrBuf *Buf = NewStrBufPlain(NULL, StrLength(thisArray));
+                               while (thisField->Sub[j].STR.len > 0) {
+                                       StrBufExtract_NextToken(Buf, thisArray, &Pos, ';');
+                                       ThisFieldStr = NewStrBufDup(Buf);
+                                       PutVcardItem(VC, &thisField->Sub[j], ThisFieldStr, is_qp, Swap);
+                                       j++;
+                               }
+                               FreeStrBuf(&thisArray);
+                               FreeStrBuf(&Buf);
+                       }
+                               break;
+                       case Address:
+                       case FlatString:
+                       case PhoneNumber:
+                       case EmailAddr:
+                       case Street:
+                       case Number:
+                       case AliasFor:
+                               /* copy over the payload into a StrBuf */
+                               ThisFieldStr = NewStrBufPlain(v->prop[i].value, -1);
+                               PutVcardItem(VC, thisField, ThisFieldStr, is_qp, Swap);
+
+                               break;
+                       case Base64BinaryAttachment:
+                               ThisFieldStr = NewStrBufPlain(v->prop[i].value, -1);
+                               StrBufDecodeBase64(ThisFieldStr);
+                               PutVcardItem(VC, thisField, ThisFieldStr, is_qp, Swap);
+                               break;
+                       case TerminateList:
+                       case UnKnown:
+                               break;
+                       }
+
+               }
+               else if (StrLength(thisVCToken) > 0) {
+                       /* Add it to the UNKNOWN field... */
+                       void *pv = NULL;
+                       StrBuf *oldVal;
+                       GetHash(VC, IKEY(vcfUnknown->cval), &pv);
+                       oldVal = (StrBuf*) pv;
+                       if (oldVal == NULL) {
+                               oldVal = NewStrBuf();
+                               Put(VC, IKEY(vcfUnknown->cval), oldVal, HFreeStrBuf);
+                       }
+                       else {
+                               StrBufAppendBufPlain(oldVal, HKEY("\n"), 0);
+                       }
+
+                       StrBufAppendBuf(oldVal, thisVCToken, 0);
+                       StrBufAppendBufPlain(oldVal, HKEY(":"), 0);
+                       StrBufAppendBufPlain(oldVal, v->prop[i].value, -1, 0);
+                       continue;
+               }
+       }
+       FreeStrBuf(&thisname);
+       FreeStrBuf(&Swap);
+       FreeStrBuf(&thisVCToken);
+}
+
+HashList *CtxGetVcardList(StrBuf *Target, WCTemplputParams *TP)
+{
+       HashList *pb = CTX(CTX_VCARD_LIST);
+       return pb;
+}
+
+/******************************************************************************
+ * Extract an embedded photo from a vCard for display on the client           *
+ ******************************************************************************/
+
+void display_vcard_photo_img(void)
+{
+       long msgnum = 0L;
+       StrBuf *vcard;
+       struct vCard *v;
+       char *photosrc;
+       const char *contentType;
+
+       msgnum = StrBufExtract_long(WC->Hdr->HR.ReqLine, 0, '/');
+       
+       vcard = load_mimepart(msgnum,"1");
+       v = VCardLoad(vcard);
+       
+       photosrc = vcard_get_prop(v, "PHOTO", 1,0,0);
+       FlushStrBuf(WC->WBuf);
+       StrBufAppendBufPlain(WC->WBuf, photosrc, -1, 0);
+       if (StrBufDecodeBase64(WC->WBuf) <= 0) {
+               FlushStrBuf(WC->WBuf);
+               
+               hprintf("HTTP/1.1 500 %s\n","Unable to get photo");
+               output_headers(0, 0, 0, 0, 0, 0);
+               hprintf("Content-Type: text/plain\r\n");
+               begin_burst();
+               wc_printf(_("Could Not decode vcard photo\n"));
+               end_burst();
+               return;
+       }
+       contentType = GuessMimeType(ChrPtr(WC->WBuf), StrLength(WC->WBuf));
+       http_transmit_thing(contentType, 0);
+       free(v);
+       free(photosrc);
+}
+
+wc_mime_attachment *load_vcard(message_summary *Msg) 
+{
+       HashPos  *it;
+       StrBuf *FoundCharset = NewStrBuf();
+       StrBuf *Error;
+       void *vMime;
+       const char *Key;
+       long len;
+       wc_mime_attachment *Mime;
+       wc_mime_attachment *VCMime = NULL;
+
+       Msg->MsgBody =  (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment));
+       memset(Msg->MsgBody, 0, sizeof(wc_mime_attachment));
+       Msg->MsgBody->msgnum = Msg->msgnum;
+
+       load_message(Msg, FoundCharset, &Error);
+
+       FreeStrBuf(&FoundCharset);
+       /* look up the vcard... */
+       it = GetNewHashPos(Msg->AllAttach, 0);
+       while (GetNextHashPos(Msg->AllAttach, it, &len, &Key, &vMime) && 
+              (vMime != NULL)) 
+       {
+               Mime = (wc_mime_attachment*) vMime;
+               if ((strcmp(ChrPtr(Mime->ContentType),
+                          "text/x-vcard") == 0) ||
+                   (strcmp(ChrPtr(Mime->ContentType),
+                           "text/vcard") == 0))
+               {
+                       VCMime = Mime;
+                       break;
+               }
+       }
+       DeleteHashPos(&it);
+       if (VCMime == NULL)
+               return NULL;
+
+       if (VCMime->Data == NULL)
+               MimeLoadData(VCMime);
+       return VCMime;
+}
+
+/*
+ * Edit the vCard component of a MIME message.  
+ * Supply the message number
+ * and MIME part number to fetch.  Or, specify -1 for the message number
+ * to start with a blank card.
+ */
+void do_edit_vcard(long msgnum, char *partnum, 
+                  message_summary *VCMsg,
+                  wc_mime_attachment *VCAtt,
+                  const char *return_to, 
+                  const char *force_room) {
+       WCTemplputParams SubTP;
+       message_summary *Msg = NULL;
+       wc_mime_attachment *VCMime = NULL;
+       struct vCard *v;
+       char whatuser[256];
+       addrbookent ab;
+
+       memset(&ab, 0, sizeof(addrbookent));
+       ab.VC = NewHash(0, lFlathash);
+       /* Display the form */
+       output_headers(1, 1, 1, 0, 0, 0);
+
+       safestrncpy(whatuser, "", sizeof whatuser);
+
+       if ((msgnum >= 0) || 
+           ((VCMsg != NULL) && (VCAtt != NULL)))
+       {
+               if ((VCMsg == NULL) && (VCAtt == NULL)) {
+
+                       Msg = (message_summary *) malloc(sizeof(message_summary));
+                       memset(Msg, 0, sizeof(message_summary));
+                       Msg->msgnum = msgnum;
+                       VCMime = load_vcard(Msg);
+                       if (VCMime == NULL) {
+                               convenience_page("770000", _("Error"), "");/*TODO: important message*/
+                               DestroyMessageSummary(Msg);
+                               return;
+                               DeleteHash(&ab.VC);
+                       }
+               
+                       v = VCardLoad(VCMime->Data);
+               }
+               else {
+                       v = VCardLoad(VCAtt->Data);
+               }
+
+               parse_vcard(WC->WBuf, v, ab.VC, NULL);
+       
+       
+               vcard_free(v);
+       }
+
+        memset(&SubTP, 0, sizeof(WCTemplputParams));    
+       {
+               WCTemplputParams *TP = NULL;
+               WCTemplputParams SubTP;
+
+               StackContext(TP, &SubTP, &ab, CTX_VCARD, 0, NULL);
+
+               DoTemplate(HKEY("vcard_edit"), WC->WBuf, &SubTP);
+               UnStackContext(&SubTP);
+       }
+       DeleteHash(&ab.VC);
+
+
+       wDumpContent(1);
+       if (Msg != NULL) {
+               DestroyMessageSummary(Msg);
+       }
+}
+
+
+/*
+ *  commit the edits to the citadel server
+ */
+void edit_vcard(void) {
+       long msgnum;
+       char *partnum;
+
+       msgnum = lbstr("msgnum");
+       partnum = bstr("partnum");
+       do_edit_vcard(msgnum, partnum, NULL, NULL, "", NULL);
+}
+
+/*
+ *  parse edited vcard from the browser
+ */
+void submit_vcard(void) {
+       struct vCard *v;
+       char *serialized_vcard;
+       StrBuf *Buf;
+       const StrBuf *ForceRoom;
+       HashList* postVcard;
+       HashPos *it, *itSub;
+       const char *Key;
+       long len;
+       void *pv;
+       StrBuf *SubStr;
+       const StrBuf *s;
+       const char *Pos = NULL;
+
+       if (!havebstr("ok_button")) { 
+               readloop(readnew, eUseDefault);
+               return;
+       }
+
+       if (havebstr("force_room")) {
+               ForceRoom = sbstr("force_room");
+               if (gotoroom(ForceRoom) != 200) {
+                       AppendImportantMessage(_("Unable to enter the room to save your message"), -1);
+                       AppendImportantMessage(HKEY(": "));
+                       AppendImportantMessage(SKEY(ForceRoom));
+                       AppendImportantMessage(HKEY("; "));
+                       AppendImportantMessage(_("Aborting."), -1);
+
+                       if (!strcmp(bstr("return_to"), "select_user_to_edit")) {
+                               select_user_to_edit(NULL);
+                       }
+                       else if (!strcmp(bstr("return_to"), "do_welcome")) {
+                               do_welcome();
+                       }
+                       else if (!IsEmptyStr(bstr("return_to"))) {
+                               http_redirect(bstr("return_to"));
+                       }
+                       else {
+                               readloop(readnew, eUseDefault);
+                       }
+                       return;
+               }
+       }
+
+       postVcard = getSubStruct(HKEY("VC"));
+       if (postVcard == NULL) {
+               AppendImportantMessage(_("An error has occurred."), -1);
+               edit_vcard();
+               return;/*/// more details*/
+       }
+       
+       Buf = NewStrBuf();
+       serv_write(HKEY("ENT0 1|||4\n"));
+       if (!StrBuf_ServGetln(Buf) && (GetServerStatus(Buf, NULL) != 4))
+       {
+               edit_vcard();
+               return;
+       }
+       
+       /* Make a vCard structure out of the data supplied in the form */
+       StrBufPrintf(Buf, "begin:vcard\r\n%s\r\nend:vcard\r\n",
+                    bstr("extrafields")
+       );
+       v = VCardLoad(Buf);     /* Start with the extra fields */
+       if (v == NULL) {
+               AppendImportantMessage(_("An error has occurred."), -1);
+               edit_vcard();
+               FreeStrBuf(&Buf);
+               return;
+       }
+
+       SubStr = NewStrBuf();
+       it = GetNewHashPos(DefineToToken, 0);
+       while (GetNextHashPos(DefineToToken, it, &len, &Key, &pv) && 
+              (pv != NULL)) 
+       {
+               char buf[32];
+               long blen;
+               vcField *t = (vcField*) pv;
+
+               if (t->Sub != NULL){
+                       vcField *Sub;
+                       FlushStrBuf(SubStr);
+                       itSub = GetNewHashPos(DefineToToken, 0);
+                       while (GetNextHashPos(DefineToToken, itSub, &len, &Key, &pv) && 
+                              (pv != NULL)) 
+                       {
+                               Sub = (vcField*) pv;
+                               if (Sub->parentCVal == t->cval) {
+                                       if (StrLength(SubStr) > 0)
+                                               StrBufAppendBufPlain(SubStr, HKEY(";"), 0);
+
+
+
+                                       blen = snprintf(buf, sizeof(buf), "%ld", Sub->cval);
+                                       s = SSubBstr(postVcard, buf, blen);
+                       
+                                       if ((s != NULL) && (StrLength(s) > 0)) {
+                                               /// todo: utf8 qp
+                                               StrBufAppendBuf(SubStr, s, 0);
+                                       }
+                               }
+                       }
+                       if (StrLength(SubStr) > 0) {
+                               vcard_add_prop(v, t->STR.Key, ChrPtr(SubStr));
+                       }
+                       DeleteHashPos(&itSub);
+               }
+               else if (t->parentCVal == 0) {
+                       blen = snprintf(buf, sizeof(buf), "%ld", t->cval);
+                       s = SSubBstr(postVcard, buf, blen);
+                       
+                       if ((s != NULL) && (StrLength(s) > 0)) {
+                               vcard_add_prop(v, t->STR.Key, ChrPtr(s));
+                       }
+               }
+       }
+       DeleteHashPos(&it);
+
+       s = sbstr("other_inetemail");
+       if (StrLength(s) > 0) {
+               FlushStrBuf(SubStr);
+               while (StrBufSipLine(SubStr, s, &Pos), ((Pos!=StrBufNOTNULL) && (Pos!=NULL)) ) {
+                       if (StrLength(SubStr) > 0) {
+                               vcard_add_prop(v, "email;internet", ChrPtr(SubStr));
+                       }
+               }
+       }
+
+       FreeStrBuf(&SubStr);
+
+
+       serialized_vcard = vcard_serialize(v);
+       vcard_free(v);
+       if (serialized_vcard == NULL) {
+               AppendImportantMessage(_("An error has occurred."), -1);
+               edit_vcard();
+               FreeStrBuf(&Buf);
+               return;
+       }
+
+       printf("%s", serialized_vcard);
+       serv_write(HKEY("Content-type: text/x-vcard; charset=UTF-8\n"));
+       serv_write(HKEY("\n"));
+       serv_printf("%s\r\n", serialized_vcard);
+       serv_write(HKEY("000\n"));
+       free(serialized_vcard);
+
+       if (!strcmp(bstr("return_to"), "select_user_to_edit")) {
+               select_user_to_edit(NULL);
+       }
+       else if (!strcmp(bstr("return_to"), "do_welcome")) {
+               do_welcome();
+       }
+       else if (!IsEmptyStr(bstr("return_to"))) {
+               http_redirect(bstr("return_to"));
+       }
+       else {
+               readloop(readnew, eUseDefault);
+       }
+       FreeStrBuf(&Buf);
+}
+
+/******************************************************************************
+ *              Render Addressbooks                                           *
+ ******************************************************************************/
+
+typedef struct _vcardview_struct {
+       long is_singlecard;
+       HashList *addrbook;
+
+} vcardview_struct;
+
+int vcard_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                                void **ViewSpecific, 
+                                long oper, 
+                                char *cmd, 
+                                long len,
+                                char *filter,
+                                long flen)
+{
+       vcardview_struct *VS;
+
+       VS = (vcardview_struct*) malloc (sizeof(vcardview_struct));
+       memset(VS, 0, sizeof(vcardview_struct));
+       *ViewSpecific = (void*)VS;
+
+       VS->is_singlecard = ibstr("is_singlecard");
+       if (VS->is_singlecard != 1) {
+               VS->addrbook = NewHash(0, NULL);
+               if (oper == do_search) {
+                       snprintf(cmd, len, "MSGS SEARCH|%s", bstr("query"));
+               }
+               else {
+                       strcpy(cmd, "MSGS ALL");
+               }
+               Stat->maxmsgs = 9999999;
+       }
+       return 200;
+}
+
+int vcard_LoadMsgFromServer(SharedMessageStatus *Stat, 
+                           void **ViewSpecific, 
+                           message_summary* Msg, 
+                           int is_new, 
+                           int i)
+{
+       WCTemplputParams *TP = NULL;
+       WCTemplputParams SubTP;
+       vcardview_struct *VS;
+       wc_mime_attachment *VCMime = NULL;
+       struct vCard *v;
+       addrbookent* abEntry;
+
+       VS = (vcardview_struct*) *ViewSpecific;
+
+       VCMime = load_vcard(Msg);
+       if (VCMime == NULL)
+               return 0;
+
+       v = VCardLoad(VCMime->Data);
+
+       if (v == NULL) return 0;
+
+       abEntry = (addrbookent*) malloc(sizeof(addrbookent));
+       memset(abEntry, 0, sizeof(addrbookent));
+       abEntry->name = NewStrBuf();
+       abEntry->VC = NewHash(0, lFlathash);
+       abEntry->ab_msgnum = Msg->msgnum;
+
+       parse_vcard(WC->WBuf, v, abEntry->VC, VCMime);
+
+        memset(&SubTP, 0, sizeof(WCTemplputParams));    
+       StackContext(TP, &SubTP, abEntry, CTX_VCARD, 0, NULL);
+
+       // No, don't display the name, it just shits all over the screen
+       // DoTemplate(HKEY("vcard_list_name"), WC->WBuf, &SubTP);
+
+       UnStackContext(&SubTP);
+
+       if (StrLength(abEntry->name) == 0) {
+               StrBufPlain(abEntry->name, _("(no name)"), -1);
+       }
+
+       syslog(LOG_DEBUG, "abEntry->name : %s", ChrPtr(abEntry->name));
+
+       vcard_free(v);
+       
+       Put(VS->addrbook, SKEY(abEntry->name), abEntry, deleteAbEnt);
+       return 0;
+}
+
+
+/*
+ * Render the address book using info we gathered during the scan
+ *
+ * addrbook    the addressbook to render
+ * num_ab      the number of the addressbook
+ */
+static int NAMESPERPAGE = 60;
+void do_addrbook_view(vcardview_struct* VS) {
+       long i = 0;
+       int num_pages = 0;
+       int tabfirst = 0;
+       int tablast = 0;
+       StrBuf **tablabels;
+       int num_ab = GetCount(VS->addrbook);
+       HashList *headlines;
+
+       WCTemplputParams *TP = NULL;
+       WCTemplputParams SubTP;
+
+        memset(&SubTP, 0, sizeof(WCTemplputParams));    
+       
+       if (num_ab == 0) {
+               do_template("vcard_list_empty");
+               return;
+       }
+
+       if (num_ab > 1) {
+               SortByHashKey(VS->addrbook, 1);
+       }
+
+       num_pages = (GetCount(VS->addrbook) / NAMESPERPAGE) + 1;
+
+       tablabels = malloc(num_pages * sizeof (StrBuf *));
+       if (tablabels == NULL) {
+               return;
+       }
+
+       headlines = NewHash(0, lFlathash);
+       for (i=0; i<num_pages; ++i) {
+               void *v1 = NULL;
+               void *v2 = NULL;
+               long hklen1, hklen2;
+               const char *c1, *c2;
+               StrBuf *headline;
+               addrbookent *a1, *a2;
+
+               tabfirst = i * NAMESPERPAGE;
+               tablast = tabfirst + NAMESPERPAGE - 1;
+               if (tablast > (num_ab - 1)) tablast = (num_ab - 1);
+
+               headline = NewStrBufPlain(NULL, StrLength(v1) + StrLength(v2) + 10);
+               if (GetHashAt(VS->addrbook, tabfirst, &hklen1, &c1, &v1)) {
+                       a1 = (addrbookent*) v1;
+                       StrBufAppendBuf(headline, a1->name, 0);
+                       StrBuf_Utf8StrCut(headline, 3);
+                       if (GetHashAt(VS->addrbook, tablast, &hklen2, &c2, &v2)) {
+
+                               a2 = (addrbookent*) v2;
+                               StrBufAppendBufPlain(headline, HKEY(" - "), 0);
+                               StrBufAppendBuf(headline, a2->name, 0);
+                               StrBuf_Utf8StrCut(headline, 9);
+                       }
+               }
+               tablabels[i] = headline;
+               Put(headlines, LKEY(i), headline, HFreeStrBuf);
+       }
+       StrTabbedDialog(WC->WBuf, num_pages, tablabels);
+       StackContext(TP, &SubTP, VS->addrbook, CTX_VCARD_LIST, 0, NULL);
+
+       DoTemplate(HKEY("vcard_list"), WC->WBuf, &SubTP);
+       UnStackContext(&SubTP);
+       DeleteHash(&headlines);
+       free(tablabels);
+       StrBufAppendBufPlain(WC->WBuf, HKEY("</div>"), 0);/* closes: id=global */
+}
+
+
+
+int vcard_RenderView_or_Tail(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
+{
+       const StrBuf *Mime;
+       vcardview_struct *VS;
+
+       VS = (vcardview_struct*) *ViewSpecific;
+       if (VS->is_singlecard) {
+               read_message(WC->WBuf, HKEY("view_message"), lbstr("startmsg"), NULL, &Mime, NULL);
+       }
+       else {
+               do_addrbook_view(VS);   /* Render the address book */
+       }
+       return 0;
+}
+
+int vcard_Cleanup(void **ViewSpecific)
+{
+       vcardview_struct *VS;
+
+       VS = (vcardview_struct*) *ViewSpecific;
+       wDumpContent(1);
+       if ((VS != NULL) && (VS->addrbook != NULL)) {
+               DeleteHash(&VS->addrbook);
+       }
+       if (VS != NULL)  {
+               free(VS);
+       }
+
+       return 0;
+}
+
+void render_MIME_VCard(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+       wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+       if (StrLength(Mime->Data) == 0) {
+               MimeLoadData(Mime);
+       }
+       if (StrLength(Mime->Data) > 0) {
+               struct vCard *v;
+               StrBuf *Buf;
+
+               Buf = NewStrBuf();
+               /** If it's my vCard I can edit it */
+               if (    (!strcasecmp(ChrPtr(WC->CurRoom.name), USERCONFIGROOM))
+                       || ((StrLength(WC->CurRoom.name) > 11) &&
+                           (!strcasecmp(&(ChrPtr(WC->CurRoom.name)[11]), USERCONFIGROOM)))
+                       || (WC->CurRoom.view == VIEW_ADDRESSBOOK)
+                       ) {
+                       StrBufAppendPrintf(Buf, "<a href=\"edit_vcard?msgnum=%ld?partnum=%s\">",
+                               Mime->msgnum, ChrPtr(Mime->PartNum));
+                       StrBufAppendPrintf(Buf, "[%s]</a>", _("edit"));
+               }
+
+               /* In all cases, display the full card */
+
+               v = VCardLoad(Mime->Data);
+
+               if (v != NULL) {
+                       WCTemplputParams *TP = NULL;
+                       WCTemplputParams SubTP;
+                       addrbookent ab;
+                       memset(&ab, 0, sizeof(addrbookent));
+
+                       ab.VC = NewHash(0, lFlathash);
+                       ab.ab_msgnum = Mime->msgnum;
+
+                       parse_vcard(Target, v, ab.VC, Mime);
+
+                       memset(&SubTP, 0, sizeof(WCTemplputParams));    
+                       StackContext(TP, &SubTP, &ab, CTX_VCARD, 0, NULL);
+
+                       DoTemplate(HKEY("vcard_msg_display"), Target, &SubTP);
+                       UnStackContext(&SubTP);
+                       DeleteHash(&ab.VC);
+                       vcard_free(v);
+
+               }
+               else {
+                       StrBufPlain(Buf, _("failed to load vcard"), -1);
+               }
+               FreeStrBuf(&Mime->Data);
+               Mime->Data = Buf;
+       }
+
+}
+
+void 
+ServerStartModule_VCARD
+(void)
+{
+}
+
+void 
+ServerShutdownModule_VCARD
+(void)
+{
+       DeleteHash(&DefineToToken);
+       DeleteHash(&vcNames);
+       DeleteHash(&VCTokenToDefine);
+}
+
+void 
+InitModule_VCARD
+(void)
+{
+       StrBuf *Prefix  = NewStrBufPlain(HKEY("VC:"));
+       DefineToToken   = NewHash(1, lFlathash);
+       vcNames         = NewHash(1, lFlathash);
+       VCTokenToDefine = NewHash(1, NULL);
+       autoRegisterTokens(&VCEnumCounter, VCStrE, Prefix, 0, 0);
+       FreeStrBuf(&Prefix);
+
+       REGISTERTokenParamDefine(NAMESPERPAGE);
+
+
+       RegisterCTX(CTX_VCARD);
+       RegisterCTX(CTX_VCARD_LIST);
+       RegisterCTX(CTX_VCARD_TYPE);
+
+       RegisterReadLoopHandlerset(
+               VIEW_ADDRESSBOOK,
+               vcard_GetParamsGetServerCall,
+               NULL,
+               NULL,
+               NULL, 
+               vcard_LoadMsgFromServer,
+               vcard_RenderView_or_Tail,
+               vcard_Cleanup,
+               NULL);
+
+       RegisterIterator("MAIL:VCARDS", 0, NULL, CtxGetVcardList, NULL, NULL, CTX_VCARD, CTX_VCARD_LIST, IT_NOFLAG);
+
+
+       WebcitAddUrlHandler(HKEY("edit_vcard"), "", 0, edit_vcard, 0);
+       WebcitAddUrlHandler(HKEY("submit_vcard"), "", 0, submit_vcard, 0);
+       WebcitAddUrlHandler(HKEY("vcardphoto"), "", 0, display_vcard_photo_img, NEED_URL);
+
+       RegisterNamespace("VC:ITEM", 2, 2, tmpl_vcard_item, preeval_vcard_item, CTX_VCARD);
+       RegisterNamespace("VC:CTXITEM", 1, 1, tmpl_vcard_context_item, NULL, CTX_VCARD_TYPE);
+       RegisterNamespace("VC:NAME", 1, 1, tmpl_vcard_name_str, preeval_vcard_name_str, CTX_VCARD);
+       RegisterNamespace("VC:MSGNO", 0, 1, tmpl_vcard_msgno, NULL, CTX_VCARD);
+       RegisterNamespace("VC:CTXNAME", 1, 1, tmpl_vcard_context_name_str, NULL, CTX_VCARD_TYPE);
+       REGISTERTokenParamDefine(FlatString);
+       REGISTERTokenParamDefine(StringCluster);
+       REGISTERTokenParamDefine(PhoneNumber);
+       REGISTERTokenParamDefine(EmailAddr);
+       REGISTERTokenParamDefine(Street);
+       REGISTERTokenParamDefine(Number);
+       REGISTERTokenParamDefine(AliasFor);
+       REGISTERTokenParamDefine(Base64BinaryAttachment);
+       REGISTERTokenParamDefine(TerminateList);
+       REGISTERTokenParamDefine(Address);
+
+       RegisterConditional("VC:HAVE:TYPE",                     1,      conditional_VC_Havetype, CTX_VCARD);
+       RegisterConditional("COND:VC:SUPPRESS_EMAIL_FIELDS",    1,      conditional_VC_SuppressEmailFields, CTX_VCARD);
+
+       RegisterFilteredIterator("VC:TYPE", 1, DefineToToken, NULL, NULL, NULL, filter_VC_ByType, CTX_VCARD_TYPE, CTX_VCARD, IT_NOFLAG);
+       RegisterFilteredIterator("VC:TYPE:ITEMS", 0, NULL, getContextVcard, NULL, NULL, filter_VC_ByContextType, CTX_STRBUF, CTX_VCARD_TYPE, IT_NOFLAG);
+
+       RegisterMimeRenderer(HKEY("text/x-vcard"), render_MIME_VCard, 1, 201);
+       RegisterMimeRenderer(HKEY("text/vcard"), render_MIME_VCard, 1, 200);
+}
diff --git a/webcit/webcit.c b/webcit/webcit.c
new file mode 100644 (file)
index 0000000..7cc9768
--- /dev/null
@@ -0,0 +1,1012 @@
+// This is the main transaction loop of the web service.  It maintains a
+// persistent session to the Citadel server, handling HTTP WebCit requests as
+// they arrive and presenting a user interface.
+//
+// Copyright (c) 1996-2021 by the citadel.org team
+//
+// This program is open source software.  You can redistribute it and/or
+// modify it under the terms of the GNU General Public License, version 3.
+
+
+#define SHOW_ME_VAPPEND_PRINTF
+#include <stdio.h>
+#include <stdarg.h>
+#include "webcit.h"
+#include "dav.h"
+#include "webserver.h"
+
+StrBuf *csslocal = NULL;
+HashList *HandlerHash = NULL;
+
+void stuff_to_cookie(int unset_cookie);
+extern int GetConnected(void);
+extern int verbose;
+
+void PutRequestLocalMem(void *Data, DeleteHashDataFunc DeleteIt)
+{
+       int n;
+       
+       n = GetCount(WC->Hdr->HTTPHeaders);
+       Put(WC->Hdr->HTTPHeaders, IKEY(n), Data, DeleteIt);
+}
+
+void DeleteWebcitHandler(void *vHandler)
+{
+       WebcitHandler *Handler = (WebcitHandler*) vHandler;
+       FreeStrBuf(&Handler->Name);
+       FreeStrBuf(&Handler->DisplayName);
+       free (Handler);
+}
+
+void WebcitAddUrlHandler(const char * UrlString, long UrlSLen, 
+                        const char *DisplayName, long dslen,
+                        WebcitHandlerFunc F, 
+                        long Flags)
+{
+       WebcitHandler *NewHandler;      
+       NewHandler = (WebcitHandler*) malloc(sizeof(WebcitHandler));
+       NewHandler->F = F;
+       NewHandler->Flags = Flags;
+       NewHandler->Name = NewStrBufPlain(UrlString, UrlSLen);
+       StrBufShrinkToFit(NewHandler->Name, 1);
+       NewHandler->DisplayName = NewStrBufPlain(DisplayName, dslen);
+       StrBufShrinkToFit(NewHandler->DisplayName, 1);
+       Put(HandlerHash, UrlString, UrlSLen, NewHandler, DeleteWebcitHandler);
+}
+
+void tmplput_HANDLER_DISPLAYNAME(StrBuf *Target, WCTemplputParams *TP) 
+{
+       if (WC->Hdr->HR.Handler != NULL)
+               StrBufAppendTemplate(Target, TP, WC->Hdr->HR.Handler->DisplayName, 0);
+}
+
+
+/*
+ * web-printing funcion. uses our vsnprintf wrapper
+ */
+#ifdef UBER_VERBOSE_DEBUGGING
+void wcc_printf(const char *FILE, const char *FUNCTION, long LINE, const char *format,...)
+#else
+void wc_printf(const char *format,...)
+#endif
+{
+       va_list arg_ptr;
+
+       if (WC->WBuf == NULL)
+               WC->WBuf = NewStrBuf();
+#ifdef UBER_VERBOSE_DEBUGGING
+       StrBufAppendPrintf(WC->WBuf, "\n%s:%s:%d[", FILE, FUNCTION, LINE);
+#endif
+
+       va_start(arg_ptr, format);
+       StrBufVAppendPrintf(WC->WBuf, format, arg_ptr);
+       va_end(arg_ptr);
+#ifdef UBER_VERBOSE_DEBUGGING
+       StrBufAppendPrintf(WC->WBuf, "]\n");
+#endif
+}
+
+/*
+ * http-header-printing funcion. uses our vsnprintf wrapper
+ */
+void hprintf(const char *format,...)
+{
+       va_list arg_ptr;
+
+       va_start(arg_ptr, format);
+       StrBufVAppendPrintf(WC->HBuf, format, arg_ptr);
+       va_end(arg_ptr);
+}
+
+
+
+/*
+ * wrap up an HTTP session, closes tags, etc.
+ *
+ * print_standard_html_footer should be set to:
+ * 0           - to transmit only,
+ * nonzero     - to append the closing tags
+ */
+void wDumpContent(int print_standard_html_footer)
+{
+       if (print_standard_html_footer) {
+               wc_printf("</div> <!-- end of 'content' div -->\n");
+               do_template("trailing");
+       }
+
+       /* If we've been saving it all up for one big output burst,
+        * go ahead and do that now.
+        */
+       end_burst();
+}
+
+
+
+/*
+ * Output HTTP headers and leading HTML for a page
+ */
+void output_headers(   int do_httpheaders,     /* 1 = output HTTP headers                        */
+                       int do_htmlhead,        /* 1 = output HTML <head> section and <body> opener */
+                       int do_room_banner,     /* 1 = include the room banner and <div id="content"></div> */
+                       int unset_cookies,      /* 1 = session is terminating, so unset the cookies */
+                       int suppress_check,     /* 1 = suppress check for instant messages        */
+                       int cache               /* 1 = allow browser to cache this page      */
+) {
+       char httpnow[128];
+
+       if (WC->isFailure) 
+               hprintf("HTTP/2.2 500 Internal Server Error");
+       else if (WC->Hdr->HaveRange > 1)
+               hprintf("HTTP/1.1 206 Partial Content\r\n");
+       else
+               hprintf("HTTP/1.1 200 OK\r\n");
+
+       http_datestring(httpnow, sizeof httpnow, time(NULL));
+
+       if (do_httpheaders) {
+               if (WC->serv_info != NULL)
+                       hprintf("Content-type: text/html; charset=utf-8\r\n"
+                               "Server: %s / %s\n"
+                               "Connection: close\r\n",
+                               PACKAGE_STRING, 
+                               ChrPtr(WC->serv_info->serv_software));
+               else
+                       hprintf("Content-type: text/html; charset=utf-8\r\n"
+                               "Server: %s / [n/a]\n"
+                               "Connection: close\r\n",
+                               PACKAGE_STRING);
+       }
+
+       if (cache > 0) {
+               char httpTomorow[128];
+
+               http_datestring(httpTomorow, sizeof httpTomorow, 
+                               time(NULL) + 60 * 60 * 24 * 2);
+
+               hprintf("Pragma: public\r\n"
+                       "Cache-Control: max-age=3600, must-revalidate\r\n"
+                       "Last-modified: %s\r\n"
+                       "Expires: %s\r\n",
+                       httpnow,
+                       httpTomorow
+               );
+       }
+       else {
+               hprintf("Pragma: no-cache\r\n"
+                       "Cache-Control: no-store\r\n"
+                       "Expires: -1\r\n"
+               );
+       }
+
+       if (cache < 2) stuff_to_cookie(unset_cookies);
+
+       if (do_htmlhead) {
+               begin_burst();
+               do_template("head");
+               if ( (WC->logged_in) && (!unset_cookies) ) {
+                       DoTemplate(HKEY("paging"), NULL, &NoCtx);
+               }
+               if (do_room_banner) {
+                       tmplput_roombanner(NULL, NULL);
+               }
+       }
+
+       if (do_room_banner) {
+               wc_printf("<div id=\"content\">\n");
+       }
+}
+
+void output_custom_content_header(const char *ctype) {
+       hprintf("HTTP/1.1 200 OK\r\n");
+       hprintf("Content-type: %s; charset=utf-8\r\n",ctype);
+       hprintf("Server: %s / %s\r\n", PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software));
+       hprintf("Connection: close\r\n");
+}
+
+
+/*
+ * Generic function to do an HTTP redirect.  Easy and fun.
+ */
+void http_redirect(const char *whichpage) {
+       hprintf("HTTP/1.1 302 Moved Temporarily\n");
+       hprintf("Location: %s\r\n", whichpage);
+       hprintf("URI: %s\r\n", whichpage);
+       hprintf("Content-type: text/html; charset=utf-8\r\n");
+       stuff_to_cookie(0);
+       begin_burst();
+       wc_printf("<html><body>");
+       wc_printf("Go <a href=\"%s\">here</A>.", whichpage);
+       wc_printf("</body></html>\n");
+       end_burst();
+}
+
+
+
+/*
+ * Output a piece of content to the web browser using conformant HTTP and MIME semantics.
+ *
+ * If this function is called, it is expected that begin_burst() has already been called
+ * and some sort of content has been fed into the buffer.  This function will transmit a
+ * bunch of headers to the client.  end_burst() will add some headers of its own, and then
+ * transmit the buffered content to the client.
+ */
+void http_transmit_thing(const char *content_type, int is_static)
+{
+       if (verbose)
+               syslog(LOG_DEBUG, "http_transmit_thing(%s)%s", content_type, ((is_static > 0) ? " (static)" : ""));
+       output_headers(0, 0, 0, 0, 0, is_static);
+
+       hprintf("Content-type: %s\r\n"
+               "Server: %s\r\n"
+               "Connection: close\r\n",
+               content_type,
+               PACKAGE_STRING);
+
+       end_burst();
+}
+
+void http_transmit_headers(const char *content_type, int is_static, long is_chunked, int is_gzip)
+{
+       if (verbose)
+               syslog(LOG_DEBUG, "http_transmit_thing(%s)%s", content_type, ((is_static > 0) ? " (static)" : ""));
+       output_headers(0, 0, 0, 0, 0, is_static);
+
+       if (is_gzip)
+               hprintf("Content-encoding: gzip\r\n");
+
+       if (WC->Hdr->HaveRange)
+               hprintf("Accept-Ranges: bytes\r\n"
+                       "Content-Range: bytes %ld-%ld/%ld\r\n",
+                       WC->Hdr->RangeStart,
+                       WC->Hdr->RangeTil,
+                       WC->Hdr->TotalBytes);
+
+       hprintf("Content-type: %s\r\n"
+               "Server: "PACKAGE_STRING"\r\n"
+               "%s"
+               "Connection: close\r\n\r\n",
+               content_type,
+               (is_chunked)?"Transfer-Encoding: chunked\r\n":"");
+}
+
+
+/*
+ * Convenience functions to display a page containing only a string
+ *
+ * titlebarcolor       color of the titlebar of the frame
+ * titlebarmsg         text to display in the title bar
+ * messagetext         body of the box
+ */
+void convenience_page(const char *titlebarcolor, const char *titlebarmsg, const char *messagetext)
+{
+       hprintf("HTTP/1.1 200 OK\n");
+       output_headers(1, 1, 1, 0, 0, 0);
+       wc_printf("<div id=\"room_banner_override\">\n");
+       wc_printf("<table width=100%% border=0 bgcolor=\"#%s\"><tr><td>", titlebarcolor);
+       wc_printf("<span class=\"titlebar\">%s</span>\n", titlebarmsg);
+       wc_printf("</td></tr></table>\n");
+       wc_printf("</div>\n<div id=\"content\">\n");
+       escputs(messagetext);
+       wc_printf("<hr />\n");
+       wDumpContent(1);
+}
+
+
+/*
+ * Display a blank page.
+ */
+void blank_page(void) {
+       output_headers(1, 1, 0, 0, 0, 0);
+       wDumpContent(2);
+}
+
+
+/*
+ * A template has been requested
+ */
+void url_do_template(void) {
+       const StrBuf *MimeType;
+       const StrBuf *Tmpl = sbstr("template");
+       begin_burst();
+       MimeType = DoTemplate(SKEY(Tmpl), NULL, &NoCtx);
+       http_transmit_thing(ChrPtr(MimeType), 0);
+}
+
+
+
+/*
+ * convenience function to indicate success
+ */
+void display_success(const char *successmessage)
+{
+       convenience_page("007700", "OK", successmessage);
+}
+
+
+/*
+ * Authorization required page (sends a 401, causing the browser to request login credentials)
+ */
+void authorization_required(void)
+{
+       const char *message = "";
+
+       hprintf("HTTP/1.1 401 Authorization Required\r\n");
+       hprintf(
+               "Server: %s / %s\r\n"
+               "Connection: close\r\n",
+               PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software)
+       );
+       hprintf("WWW-Authenticate: Basic realm=\"%s\"\r\n", ChrPtr(WC->serv_info->serv_humannode));
+
+       /* if this is a false cookie authentication, remove it to avoid endless loops. */
+       if (StrLength(WC->Hdr->HR.RawCookie) > 0)
+               stuff_to_cookie(1);
+
+       hprintf("Content-Type: text/html\r\n");
+       begin_burst();
+       wc_printf("<h1>");
+       wc_printf(_("Authorization Required"));
+       wc_printf("</h1>\r\n");
+
+       if (WC->ImportantMsg != NULL) {
+               message = ChrPtr(WC->ImportantMsg);
+       }
+
+       wc_printf(
+               _("The resource you requested requires a valid username and password. "
+               "You could not be logged in: %s\n"),
+               message
+       );
+       wDumpContent(0);
+}
+
+
+/*
+ * Convenience functions to wrap around asynchronous ajax responses
+ */
+void begin_ajax_response(void) {
+
+       FlushStrBuf(WC->HBuf);
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       hprintf("Content-type: text/html; charset=UTF-8\r\n"
+               "Server: %s\r\n"
+               "Connection: close\r\n"
+               ,
+               PACKAGE_STRING);
+       begin_burst();
+}
+
+
+/*
+ * print ajax response footer 
+ */
+void end_ajax_response(void) {
+       wDumpContent(0);
+}
+
+
+/*
+ * Wraps a Citadel server command in an AJAX transaction.
+ */
+void ajax_servcmd(void) {
+       int Done = 0;
+       StrBuf *Buf;
+       char *junk;
+       size_t len;
+
+       if (verbose) {
+               syslog(LOG_DEBUG, "ajax_servcmd() g_cmd=\"%s\"", bstr("g_cmd") );
+       }
+       begin_ajax_response();
+       Buf = NewStrBuf();
+       serv_puts(bstr("g_cmd"));
+       StrBuf_ServGetln(Buf);
+       StrBufAppendBuf(WC->WBuf, Buf, 0);
+       StrBufAppendBufPlain(WC->WBuf, HKEY("\n"), 0);
+       
+       switch (GetServerStatus(Buf, NULL)) {
+       case 8:
+               serv_puts("\n\n000");
+               if ( (StrLength(Buf)==3) && 
+                    !strcmp(ChrPtr(Buf), "000")) {
+                       StrBufAppendBufPlain(WC->WBuf, HKEY("\000"), 0);
+                       break;
+               }
+       case 1:
+               while (!Done) {
+                       if (StrBuf_ServGetln(Buf) < 0)
+                               break;
+                       if ( (StrLength(Buf)==3) && 
+                            !strcmp(ChrPtr(Buf), "000")) {
+                               Done = 1;
+                       }
+                       StrBufAppendBuf(WC->WBuf, Buf, 0);
+                       StrBufAppendBufPlain(WC->WBuf, HKEY("\n"), 0);
+               }
+               break;
+       case 4:
+               text_to_server(bstr("g_input"));
+               serv_puts("000");
+               break;
+       case 6:
+               len = atol(&ChrPtr(Buf)[4]);
+               StrBuf_ServGetBLOBBuffered(Buf, len);
+               break;
+       case 7:
+               len = atol(&ChrPtr(Buf)[4]);
+               junk = malloc(len);
+               memset(junk, 0, len);
+               serv_write(junk, len);
+               free(junk);
+       }
+       
+       end_ajax_response();
+       
+       /*
+        * This is kind of an ugly hack, but this is the only place it can go.
+        * If the command was GEXP, then the instant messenger window must be
+        * running, so reset the "last_pager_check" watchdog timer so
+        * that page_popup() doesn't try to open it a second time. TODO: page_popup isn't with us anymore.
+        */
+       if (!strncasecmp(bstr("g_cmd"), "GEXP", 4)) {
+               WC->last_pager_check = time(NULL);
+       }
+       FreeStrBuf(&Buf);
+}
+
+
+/*
+ * Helper function for the asynchronous check to see if we need
+ * to open the instant messenger window.
+ */
+void seconds_since_last_gexp(void)
+{
+       char buf[256];
+
+       if ( (time(NULL) - WC->last_pager_check) < 30) {
+               wc_printf("NO\n");
+       }
+       else {
+               memset(buf, 0, 5);
+               serv_puts("NOOP");
+               serv_getln(buf, sizeof buf);
+               if (buf[3] == '*') {
+                       wc_printf("YES");
+               }
+               else {
+                       wc_printf("NO");
+               }
+       }
+}
+
+
+/*
+ * Save a URL destination so we can go to it later
+ */
+void push_destination(void) {
+
+       if (!WC) {
+               wc_printf("no session");
+               return;
+       }
+
+       FreeStrBuf(&WC->PushedDestination);
+       WC->PushedDestination = NewStrBufDup(sbstr("url"));
+       if (verbose)
+               syslog(LOG_DEBUG, "Push: %s", ChrPtr(WC->PushedDestination));
+       wc_printf("OK");
+}
+
+
+/*
+ * Go to the URL saved by push_destination()
+ */
+void pop_destination(void) {
+       /*
+        * If we are in the middle of a new user signup, the server may request that
+        * we first pass through a registration screen.
+        */
+       if ((WC) && (WC->need_regi)) {
+               if ((WC->PushedDestination != NULL) && (StrLength(WC->PushedDestination) > 0)) {
+                       /* Registering will take us to the My Citadel Config room, so save our place */
+                       StrBufAppendBufPlain(WC->PushedDestination, HKEY("?go="), 0);
+                       StrBufUrlescAppend(WC->PushedDestination, WC->CurRoom.name, NULL);
+               }
+               WC->need_regi = 0;
+               display_reg(1);
+               return;
+       }
+
+       /*
+        * Do something reasonable if we somehow ended up requesting a pop without
+        * having first done a push.
+        */
+       if ( (!WC) || (WC->PushedDestination == NULL) || (StrLength(WC->PushedDestination) == 0) ) {
+               do_welcome();
+               return;
+       }
+
+       /*
+        * All righty then!  We have a destination saved, so go there now.
+        */
+       if (verbose) {
+               syslog(LOG_DEBUG, "Pop: %s", ChrPtr(WC->PushedDestination));
+       }
+       http_redirect(ChrPtr(WC->PushedDestination));
+}
+
+
+int ReadPostData(void) {
+       int rc;
+       int urlencoded_post = 0;
+       StrBuf *content = NULL;
+       
+       urlencoded_post = (strncasecmp(ChrPtr(WC->Hdr->HR.ContentType), "application/x-www-form-urlencoded", 33) == 0) ;
+
+       content = NewStrBufPlain(NULL, WC->Hdr->HR.ContentLength + 256);
+
+       if (!urlencoded_post) {
+               StrBufPrintf(content, 
+                       "Content-type: %s\n"
+                       "Content-length: %ld\n\n",
+                       ChrPtr(WC->Hdr->HR.ContentType), 
+                       WC->Hdr->HR.ContentLength
+               );
+       }
+
+       /* Read the entire input data at once. */
+       rc = client_read_to(WC->Hdr, content, WC->Hdr->HR.ContentLength, SLEEPING);
+       if (rc < 0) {
+               return rc;
+       }
+       
+       if (urlencoded_post) {
+               ParseURLParams(content);
+       }
+       else if (!strncasecmp(ChrPtr(WC->Hdr->HR.ContentType), "multipart", 9)) {
+               char *Buf;
+               char *BufEnd;
+               long len;
+
+               len = StrLength(content);
+               Buf = SmashStrBuf(&content);
+               BufEnd = Buf + len;
+               mime_parser(Buf, BufEnd, *upload_handler, NULL, NULL, NULL, 0);
+               free(Buf);
+       }
+       else if (WC->Hdr->HR.ContentLength > 0) {
+               WC->upload = content;
+               WC->upload_length = StrLength(WC->upload);
+               content = NULL;
+       }
+       FreeStrBuf(&content);
+       return 1;
+}
+
+
+int Conditional_REST_DEPTH(StrBuf *Target, WCTemplputParams *TP)
+{
+       long Depth, IsDepth;
+       long offset = 0;
+
+       if (WC->Hdr->HR.Handler != NULL)
+               offset ++;
+       Depth = GetTemplateTokenNumber(Target, TP, 2, 0);
+       IsDepth = GetCount(WC->Directory) + offset;
+
+//     LogTemplateError(Target, "bla", 1, TP, "REST_DEPTH: %ld : %ld\n", Depth, IsDepth);
+       if (Depth < 0) {
+               Depth = -Depth;
+               return IsDepth > Depth;
+       }
+       else 
+               return Depth == IsDepth;
+}
+
+
+
+/*
+ * Entry point for WebCit transaction
+ */
+void session_loop(void)
+{
+       int xhttp;
+       StrBuf *Buf;
+       
+       /*
+        * We stuff these with the values coming from the client cookies,
+        * so we can use them to reconnect a timed out session if we have to.
+        */
+       WC->upload_length = 0;
+       WC->upload = NULL;
+       WC->Hdr->nWildfireHeaders = 0;
+
+       if (WC->Hdr->HR.ContentLength > 0) {
+               if (ReadPostData() < 0) {
+                       return;
+               }
+       }
+
+       Buf = NewStrBuf();
+       WC->trailing_javascript = NewStrBuf();
+
+       /* Convert base64-encoded URL's back to plain text */
+       if (!strncmp(ChrPtr(WC->Hdr->this_page), "/B64", 4)) {
+               StrBufCutLeft(WC->Hdr->this_page, 4);
+               StrBufDecodeBase64(WC->Hdr->this_page);
+               http_redirect(ChrPtr(WC->Hdr->this_page));
+               goto SKIP_ALL_THIS_CRAP;
+       }
+
+       /* If there are variables in the URL, we must grab them now */
+       if (WC->Hdr->PlainArgs != NULL) {
+               ParseURLParams(WC->Hdr->PlainArgs);
+       }
+
+       /* If the client sent a nonce that is incorrect, kill the request. */
+       if (havebstr("nonce")) {
+               if (verbose) {
+                       syslog(LOG_DEBUG, "Comparing supplied nonce %s to session nonce %d", bstr("nonce"), WC->nonce);
+               }
+               if (ibstr("nonce") != WC->nonce) {
+                       syslog(LOG_INFO, "Ignoring request with mismatched nonce.");
+                       hprintf("HTTP/1.1 404 Security check failed\r\n");
+                       hprintf("Content-Type: text/plain\r\n");
+                       begin_burst();
+                       wc_printf("Security check failed.\r\n");
+                       end_burst();
+                       goto SKIP_ALL_THIS_CRAP;
+               }
+       }
+
+       /*
+        * If we're not connected to a Citadel server, try to hook up the connection now.
+        */
+       if (!WC->connected) {
+               if (GetConnected()) {
+                       hprintf("HTTP/1.1 503 Service Unavailable\r\n");
+                       hprintf("Content-Type: text/html\r\n");
+                       begin_burst();
+                       wc_printf("<html><head><title>503 Service Unavailable</title></head><body>\n");
+                       wc_printf(_("This program was unable to connect or stay "
+                               "connected to the Citadel server.  Please report "
+                               "this problem to your system administrator.")
+                       );
+                       wc_printf("<br>");
+                       wc_printf("<a href=\"http://www.citadel.org/doku.php/"
+                               "faq:generalquestions:webcit_unable_to_connect\">%s</a>",
+                               _("Read More...")
+                       );
+                       wc_printf("</body></html>\n");
+                       end_burst();
+                       goto SKIP_ALL_THIS_CRAP;
+               }
+       }
+
+       /*
+        * If we're not logged in, but we have authentication data (either from
+        * a cookie or from http-auth), try logging in to Citadel using that.
+        */
+       if (    (!WC->logged_in)
+               && (StrLength(WC->Hdr->c_username) > 0)
+               && (StrLength(WC->Hdr->c_password) > 0)
+       ) {
+               long Status;
+
+               FlushStrBuf(Buf);
+               serv_printf("USER %s", ChrPtr(WC->Hdr->c_username));
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatus(Buf, &Status) == 3) {
+                       serv_printf("PASS %s", ChrPtr(WC->Hdr->c_password));
+                       StrBuf_ServGetln(Buf);
+                       if (GetServerStatus(Buf, NULL) == 2) {
+                               become_logged_in(WC->Hdr->c_username, WC->Hdr->c_password, Buf);
+                       }
+                       else {
+                               /* Should only display when password is wrong */
+                               WC->ImportantMsg = NewStrBufPlain(ChrPtr(Buf) + 4, StrLength(Buf) - 4);
+                               authorization_required();
+                               FreeStrBuf(&Buf);
+                               goto SKIP_ALL_THIS_CRAP;
+                       }
+               }
+               else if (Status == 541) {
+                       WC->logged_in = 1;
+               }
+       }
+
+       xhttp = (WC->Hdr->HR.eReqType != eGET) &&
+               (WC->Hdr->HR.eReqType != ePOST) &&
+               (WC->Hdr->HR.eReqType != eHEAD);
+
+       /*
+        * If a 'go' (or 'gotofirst') parameter has been specified, attempt to goto that room
+        * prior to doing anything else.
+        */
+       if (havebstr("go")) {
+               int ret;
+               if (verbose)
+                       syslog(LOG_DEBUG, "Explicit room selection: %s", bstr("go"));
+               ret = gotoroom(sbstr("go"));    /* do quietly to avoid session output! */
+               if ((ret/100) != 2) {
+                       if (verbose)
+                               syslog(LOG_DEBUG, "Unable to change to [%s]; Reason: %d", bstr("go"), ret);
+               }
+       }
+       else if (havebstr("gotofirst")) {
+               int ret;
+               if (verbose)
+                       syslog(LOG_DEBUG, "Explicit room selection: %s", bstr("gotofirst"));
+               ret = gotoroom(sbstr("gotofirst"));     /* do quietly to avoid session output! */
+               if ((ret/100) != 2) {
+                       syslog(LOG_INFO, "Unable to change to [%s]; Reason: %d", bstr("gotofirst"), ret);
+               }
+       }
+
+       /*
+        * If we aren't in any room yet, but we have cookie data telling us where we're
+        * supposed to be, and 'go' was not specified, then go there.
+        */
+       else if ( (StrLength(WC->CurRoom.name) == 0) && ( (StrLength(WC->Hdr->c_roomname) > 0) )) {
+               int ret;
+
+               if (verbose)
+                       syslog(LOG_DEBUG, "We are in '%s' but cookie indicates '%s', going there...",
+                              ChrPtr(WC->CurRoom.name),
+                              ChrPtr(WC->Hdr->c_roomname)
+               );
+               ret = gotoroom(WC->Hdr->c_roomname);    /* do quietly to avoid session output! */
+               if ((ret/100) != 2) {
+                       if (verbose)
+                               syslog(LOG_DEBUG, "COOKIEGOTO: Unable to change to [%s]; Reason: %d",
+                                      ChrPtr(WC->Hdr->c_roomname), ret);
+               }
+       }
+
+       if (WC->Hdr->HR.Handler != NULL) {
+               if (    (!WC->logged_in)
+                       && ((WC->Hdr->HR.Handler->Flags & ANONYMOUS) == 0)
+                       && (WC->serv_info != NULL)
+                       && (WC->serv_info->serv_supports_guest == 0)
+               ) {
+                       display_login();
+               }
+               else {
+                       if ((WC->Hdr->HR.Handler->Flags & AJAX) != 0) {
+                               begin_ajax_response();
+                       }
+                       WC->Hdr->HR.Handler->F();
+                       if ((WC->Hdr->HR.Handler->Flags & AJAX) != 0) {
+                               end_ajax_response();
+                       }
+               }
+       }
+       /* When all else fails, display the default landing page or a main menu. */
+       else {
+               /* 
+                * ordinary browser users get a nice login screen, DAV etc. requsets
+                * are given a 401 so they can handle it appropriate.
+                */
+               if (!WC->logged_in)  {
+                       if (xhttp) {
+                               authorization_required();
+                       }
+                       else {
+                               display_default_landing_page();
+                       }
+               }
+               /*
+                * Toplevel dav requests? or just a flat browser request? 
+                */
+               else {
+                       if (xhttp) {
+                               dav_main();
+                       }
+                       else {
+                               display_main_menu();
+                       }
+               }
+       }
+
+SKIP_ALL_THIS_CRAP:
+       FreeStrBuf(&Buf);
+       fflush(stdout);
+}
+
+
+
+/*
+ * Display the appropriate landing page for this site.
+ */
+void display_default_landing_page(void) {
+       if (WC && WC->serv_info && WC->serv_info->serv_supports_guest) {
+               /* default action */
+
+               if (havebstr("go")) {
+                       if (verbose)
+                               syslog(LOG_DEBUG, "Explicit room selection: %s", bstr("go"));
+                       smart_goto(sbstr("go"));
+               }
+               else if (default_landing_page) {
+                       http_redirect(default_landing_page);
+               }
+               else {
+                       StrBuf *teh_lobby = NewStrBufPlain(HKEY("_BASEROOM_"));
+                       smart_goto(teh_lobby);
+                       FreeStrBuf(&teh_lobby);
+               }
+       }
+       else {
+               display_login();
+       }
+}
+
+
+/*
+ * Replacement for sleep() that uses select() in order to avoid SIGALRM
+ */
+void sleeeeeeeeeep(int seconds)
+{
+       struct timeval tv;
+
+       tv.tv_sec = seconds;
+       tv.tv_usec = 0;
+       select(0, NULL, NULL, NULL, &tv);
+}
+
+int Conditional_IS_HTTPS(StrBuf *Target, WCTemplputParams *TP)
+{
+       return is_https != 0;
+}
+
+void AppendImportantMessage(const char *pch, long len)
+{
+
+       if (StrLength(WC->ImportantMsg) > 0) {
+               StrBufAppendBufPlain(WC->ImportantMsg, HKEY("\n"), 0);
+       }
+               
+       StrBufAppendBufPlain(WC->ImportantMsg, pch, len, 0);
+}
+
+int ConditionalImportantMesage(StrBuf *Target, WCTemplputParams *TP)
+{
+       if (WC != NULL) {
+               return (StrLength(WC->ImportantMsg) > 0);
+       }
+       else {
+               return 0;
+       }
+}
+
+void tmplput_importantmessage(StrBuf *Target, WCTemplputParams *TP)
+{
+       
+       if (WC != NULL) {
+               if (StrLength(WC->ImportantMsg) > 0) {
+                       StrBufAppendTemplate(Target, TP, WC->ImportantMsg, 0);
+               }
+       }
+}
+
+void tmplput_trailing_javascript(StrBuf *Target, WCTemplputParams *TP)
+{
+
+       if (WC != NULL) {
+               StrBufAppendTemplate(Target, TP, WC->trailing_javascript, 0);
+       }
+}
+
+void tmplput_csslocal(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBufAppendBuf(Target, 
+                       csslocal, 0);
+}
+
+void tmplput_packagestring(StrBuf *Target, WCTemplputParams *TP) {
+       StrBufAppendBufPlain(Target, HKEY(PACKAGE_STRING), 0);
+}
+
+extern char static_local_dir[PATH_MAX];
+
+
+void 
+InitModule_WEBCIT
+(void)
+{
+       char dir[SIZ];
+       WebcitAddUrlHandler(HKEY("blank"), "", 0, blank_page, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC);
+       WebcitAddUrlHandler(HKEY("landing"), "", 0, display_default_landing_page, ANONYMOUS|COOKIEUNNEEDED);
+       WebcitAddUrlHandler(HKEY("do_template"), "", 0, url_do_template, ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("sslg"), "", 0, seconds_since_last_gexp, AJAX|LOGCHATTY);
+       WebcitAddUrlHandler(HKEY("ajax_servcmd"), "", 0, ajax_servcmd, 0);
+       WebcitAddUrlHandler(HKEY("webcit"), "", 0, blank_page, URLNAMESPACE);
+       WebcitAddUrlHandler(HKEY("push"), "", 0, push_destination, AJAX);
+       WebcitAddUrlHandler(HKEY("pop"), "", 0, pop_destination, 0);
+
+       WebcitAddUrlHandler(HKEY("401"), "", 0, authorization_required, ANONYMOUS|COOKIEUNNEEDED);
+       RegisterConditional("COND:IMPMSG", 0, ConditionalImportantMesage, CTX_NONE);
+       RegisterConditional("COND:REST:DEPTH", 0, Conditional_REST_DEPTH, CTX_NONE);
+       RegisterConditional("COND:IS_HTTPS", 0, Conditional_IS_HTTPS, CTX_NONE);
+
+       RegisterNamespace("CSSLOCAL", 0, 0, tmplput_csslocal, NULL, CTX_NONE);
+       RegisterNamespace("IMPORTANTMESSAGE", 0, 1, tmplput_importantmessage, NULL, CTX_NONE);
+       RegisterNamespace("TRAILING_JAVASCRIPT", 0, 0, tmplput_trailing_javascript, NULL, CTX_NONE);
+       RegisterNamespace("URL:DISPLAYNAME", 0, 1, tmplput_HANDLER_DISPLAYNAME, NULL, CTX_NONE);
+       RegisterNamespace("PACKAGESTRING", 0, 1, tmplput_packagestring, NULL, CTX_NONE);
+
+       
+       snprintf(dir, SIZ, "%s/webcit.css", static_local_dir);
+       if (!access(dir, R_OK)) {
+               syslog(LOG_INFO, "Using local Stylesheet [%s]", dir);
+               csslocal = NewStrBufPlain(HKEY("<link href=\"static.local/webcit.css\" rel=\"stylesheet\" type=\"text/css\" />"));
+       }
+       else
+               syslog(LOG_INFO, "No Site-local Stylesheet [%s] installed.", dir);
+
+}
+
+void
+ServerStartModule_WEBCIT
+(void)
+{
+       HandlerHash = NewHash(1, NULL);
+}
+
+
+void 
+ServerShutdownModule_WEBCIT
+(void)
+{
+       FreeStrBuf(&csslocal);
+       DeleteHash(&HandlerHash);
+}
+
+
+
+void
+SessionNewModule_WEBCIT
+(wcsession *sess)
+{
+       sess->ImportantMsg = NewStrBuf();
+       sess->WBuf = NewStrBufPlain(NULL, SIZ * 4);
+       sess->HBuf = NewStrBufPlain(NULL, SIZ / 4);
+}
+
+void
+SessionDetachModule_WEBCIT
+(wcsession *sess)
+{
+       DeleteHash(&sess->Directory);
+
+       FreeStrBuf(&sess->upload);
+       sess->upload_length = 0;
+       
+       FreeStrBuf(&sess->trailing_javascript);
+
+       if (StrLength(sess->WBuf) > SIZ * 30) /* Bigger than 120K? release. */
+       {
+               FreeStrBuf(&sess->WBuf);
+               sess->WBuf = NewStrBuf();
+       }
+       else
+               FlushStrBuf(sess->WBuf);
+       FlushStrBuf(sess->HBuf);
+       if (StrLength(sess->ImportantMsg) > 0) {
+               FlushStrBuf(sess->ImportantMsg);
+       }
+
+}
+
+void 
+SessionDestroyModule_WEBCIT
+(wcsession *sess)
+{
+       FreeStrBuf(&sess->WBuf);
+       FreeStrBuf(&sess->HBuf);
+       FreeStrBuf(&sess->ImportantMsg);
+       FreeStrBuf(&sess->PushedDestination);
+}
+
diff --git a/webcit/webcit.h b/webcit/webcit.h
new file mode 100644 (file)
index 0000000..47a9a1f
--- /dev/null
@@ -0,0 +1,652 @@
+/*
+ * Copyright (c) 1987-2021 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 3.
+ *
+ * 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.
+ */
+
+#include "sysdep.h"
+#include <sys/select.h>
+#include <ctype.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdio.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <sys/un.h>
+#include <sys/poll.h>
+#include <string.h>
+#include <pwd.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <pthread.h>
+#include <signal.h>
+#include <syslog.h>
+#include <sys/utsname.h>
+#include <expat.h>
+#include <libcitadel.h>
+
+#ifdef HAVE_ICONV
+#include <iconv.h>
+#endif
+
+#ifdef ENABLE_NLS
+#ifdef HAVE_XLOCALE_H
+#include <xlocale.h>
+#endif
+#include <libintl.h>
+#include <locale.h>
+#define _(string)      gettext(string)
+#else
+#define _(string)      (string)
+#endif
+
+#define DO_DBG_QR 0
+#define DBG_QR(x) if(DO_DBG_QR) _DBG_QR(x)
+#define DBG_QR2(x) if(DO_DBG_QR) _DBG_QR2(x)
+
+#include <zlib.h>
+
+#include <libical/ical.h>
+
+#undef PACKAGE
+#undef VERSION
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef PACKAGE_BUGREPORT
+
+typedef struct wcsession wcsession;
+
+#include "sysdep.h"
+
+#include "subst.h"
+#include "messages.h"
+#include "paramhandling.h"
+#include "roomops.h"
+#include "preferences.h"
+
+#include "sockets.h"
+#include "utils.h"
+#ifdef HAVE_OPENSSL
+/* Work around RedHat's b0rken OpenSSL includes */
+#define OPENSSL_NO_KRB5
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#include <openssl/rand.h>
+extern char *ssl_cipher_list;
+#define        DEFAULT_SSL_CIPHER_LIST "DEFAULT"       /* See http://openssl.org/docs/apps/ciphers.html */
+#endif
+
+#if SIZEOF_SIZE_T == SIZEOF_INT 
+#define SIZE_T_FMT "%d"
+#else
+#define SIZE_T_FMT "%ld"
+#endif
+
+#if SIZEOF_LONG_UNSIGNED_INT == SIZEOF_INT
+#define ULONG_FMT "%d"
+#else
+#define ULONG_FMT "%ld"
+#endif
+
+#define CALENDAR_ROOM_NAME     "Calendar"
+#define PRODID "-//Citadel//NONSGML Citadel Calendar//EN"
+
+#define SIZ                    4096            /* generic buffer size */
+
+#define TRACE syslog(LOG_DEBUG, "\033[3%dmCHECKPOINT: %s:%d\033[0m", ((__LINE__%6)+1), __FILE__, __LINE__)
+
+#ifdef UNDEF_MEMCPY
+#undef memcpy
+#endif
+
+#define SLEEPING               180                     /* TCP connection timeout */
+#define WEBCIT_TIMEOUT         900                     /* WebCit session timeout */
+#define PORT_NUM               80                      /* port number to listen on */
+#define DEVELOPER_ID           0
+#define CLIENT_ID              4
+#define CLIENT_VERSION 972             /* This version of WebCit */
+#define MINIMUM_CIT_VERSION    931                     /* Minimum required version of Citadel server */
+#define        LIBCITADEL_MIN          931                     /* Minimum required version of libcitadel */
+#define DEFAULT_CTDLDIR                "/usr/local/citadel"    /* Default Citadel server directory */
+#define TARGET                 "webcit01"              /* Window target for inline URL's */
+#define HOUSEKEEPING           15                      /* Housekeeping frequency */
+#define MAX_WORKER_THREADS     250
+#define LISTEN_QUEUE_LENGTH    100                     /* listen() backlog queue */
+
+#define USERCONFIGROOM         "My Citadel Config"
+#define DEFAULT_MAXMSGS                20
+
+#ifdef LIBCITADEL_VERSION_NUMBER
+#if LIBCITADEL_VERSION_NUMBER < LIBCITADEL_MIN
+#error libcitadel is too old.  Please upgrade it before continuing.
+#endif
+#endif
+
+#define SRV_STATUS_MSG(ServerLineBuf) (ChrPtr(ServerLineBuf) + 4), (StrLength(ServerLineBuf) - 4)
+#define MAJORCODE(a) (((int)(a / 100) ) * 100)
+
+#define LISTING_FOLLOWS        100
+#define CIT_OK                 200     
+#define MORE_DATA      300
+#define SEND_LISTING   400
+#define ERROR          500
+#define BINARY_FOLLOWS         600
+#define SEND_BINARY    700
+#define START_CHAT_MODE        800
+#define ASYNC_MSG      900
+
+#define MINORCODE(a) (a % 100)
+#define ASYNC_GEXP                     02      
+#define INTERNAL_ERROR                         10      
+#define TOO_BIG                        11      
+#define ILLEGAL_VALUE                  12      
+#define NOT_LOGGED_IN                  20      
+#define CMD_NOT_SUPPORTED              30      
+#define SERVER_SHUTTING_DOWN           31      
+#define PASSWORD_REQUIRED              40      
+#define ALREADY_LOGGED_IN              41      
+#define USERNAME_REQUIRED              42      
+#define HIGHER_ACCESS_REQUIRED                 50      
+#define MAX_SESSIONS_EXCEEDED          51      
+#define RESOURCE_BUSY                  52      
+#define RESOURCE_NOT_OPEN              53      
+#define NOT_HERE                       60      
+#define INVALID_FLOOR_OPERATION        61      
+#define NO_SUCH_USER                   70      
+#define FILE_NOT_FOUND                         71      
+#define ROOM_NOT_FOUND                         72      
+#define NO_SUCH_SYSTEM                         73      
+#define ALREADY_EXISTS                         74      
+#define MESSAGE_NOT_FOUND              75
+
+/*
+ * NLI is the string that shows up in a who's online listing for sessions
+ * that are active but do not (yet) have a user logged in.
+ */
+#define NLI    "(not logged in)"
+
+/*
+ * Expiry policy for the autopurger
+ */
+
+typedef struct __ExpirePolicy {
+        int expire_mode;
+        int expire_value;
+} ExpirePolicy;
+
+/*
+ * Linked list of session variables encoded in an x-www-urlencoded content type
+ */
+typedef struct urlcontent urlcontent;
+struct urlcontent {
+       char url_key[32];               /* key */
+       long klen;
+       StrBuf *url_data;               /* value */
+       HashList *sub;
+};
+
+/*
+ * Information about the Citadel server to which we are connected
+ */ 
+typedef struct _serv_info {
+       int serv_pid;                   /* Process ID of the Citadel server */
+       StrBuf *serv_nodename;          /* Node name of the Citadel server */
+       StrBuf *serv_humannode;         /* Juman readable node name of the Citadel server */
+       StrBuf *serv_fqdn;              /* Fully qualified Domain Name (such as uncensored.citadel.org) */
+       StrBuf *serv_software;          /* Free form text description of the server software in use */
+       int serv_rev_level;             /* Server version number (times 100) */
+       StrBuf *serv_bbs_city;          /* Geographic location of the Citadel server */
+       StrBuf *serv_sysadm;            /* Name of system administrator */
+       int serv_supports_ldap;         /* is the server linked against an ldap tree for adresses? */
+       int serv_newuser_disabled;      /* Has the server disabled self-service new user creation? */
+       StrBuf *serv_default_cal_zone;  /* Default timezone for unspecified calendar items */
+       int serv_supports_sieve;        /* Server supports Sieve mail filtering */
+       int serv_fulltext_enabled;      /* Full text index is enabled */
+       StrBuf *serv_svn_revision;      /* svn or git revision of the server */
+       int serv_supports_openid;       /* Server supports authentication via OpenID */
+       int serv_supports_guest;        /* Server supports unauthenticated guest logins */
+} ServInfo;
+
+
+typedef struct _disp_cal {                                     
+       icalcomponent *cal;             /* cal items for display */
+       long cal_msgnum;                /* cal msgids for display */
+       char *from;                     /* owner of this component */
+       int unread;                     /* already seen by the user? */
+
+       time_t event_start;
+       time_t event_end;
+
+       int multi_day_event;
+       int is_repeat;
+       icalcomponent *SortBy;          /* cal items for display */
+       icalproperty_status Status;
+} disp_cal;                                            
+
+typedef struct _IcalKindEnumMap {
+       const char *Name;
+       long NameLen;
+       icalproperty_kind map;
+} IcalKindEnumMap;
+typedef struct _IcalMethodEnumMap {
+       const char *Name;
+       long NameLen;
+        icalproperty_method map;
+} IcalMethodEnumMap;
+
+
+#define AJAX (1<<0)
+#define ANONYMOUS (1<<1)
+#define NEED_URL (1<<2)
+#define XHTTP_COMMANDS (1<<3)
+#define BOGUS (1<<4)
+#define URLNAMESPACE (1<<4)
+#define LOGCHATTY (1<<5)
+#define COOKIEUNNEEDED (1<<6)
+#define ISSTATIC (1<<7)
+#define FORCE_SESSIONCLOSE (1<<8)
+#define PARSE_REST_URL (1<<9)
+#define PROHIBIT_STARTPAGE (1<<10)
+
+
+#define DATEFMT_FULL 0
+#define DATEFMT_BRIEF 1
+#define DATEFMT_RAWDATE 2
+#define DATEFMT_LOCALEDATE 3
+long webcit_fmt_date(char *buf, size_t siz, time_t thetime, int Format);
+
+
+typedef enum _RESTDispatchID {
+       ExistsID,
+       PutID,
+       DeleteID
+} RESTDispatchID;
+
+typedef int (*WebcitRESTDispatchID)(RESTDispatchID WhichAction, int IgnoreFloor);
+typedef void (*WebcitHandlerFunc)(void);
+typedef struct  _WebcitHandler{
+       WebcitHandlerFunc F;
+       WebcitRESTDispatchID RID;
+       long Flags;
+       StrBuf *Name;
+       StrBuf *DisplayName;
+} WebcitHandler;
+
+void WebcitAddUrlHandler(const char * UrlString, long UrlSLen, const char *DisplayName, long dslen, WebcitHandlerFunc F, long Flags);
+
+typedef struct _headereval {
+       ExamineMsgHeaderFunc evaluator;
+       int Type;
+} headereval;
+
+struct attach_link {
+       char partnum[32];
+       char html[1024];
+};
+
+enum {
+       eUp,
+       eDown,
+       eNone
+};
+
+enum {
+       eGET,
+       ePOST,
+       eOPTIONS,
+       ePROPFIND,
+       ePUT,
+       eDELETE,
+       eHEAD,
+       eMOVE,
+       eCOPY,
+       eREPORT,
+       eNONE
+};
+extern const char *ReqStrs[eNONE];
+
+#define NO_AUTH 0
+#define AUTH_COOKIE 1
+#define AUTH_BASIC 2
+
+typedef struct _HdrRefs {
+       long eReqType;                          /* HTTP method */
+       int desired_session;
+       int SessionKey;
+
+       int got_auth;
+       int DontNeedAuth;
+       long ContentLength;
+       time_t if_modified_since;
+       int gzip_ok;                            /* Nonzero if Accept-encoding: gzip */
+       int prohibit_caching;
+       int dav_depth;
+       int Static;
+
+       /* these are references into Hdr->HTTPHeaders, so we don't need to free them. */
+       StrBuf *ContentType;
+       StrBuf *RawCookie;
+       StrBuf *ReqLine;
+       StrBuf *browser_host;
+       StrBuf *browser_language;
+       StrBuf *user_agent;
+       StrBuf *plainauth;
+       StrBuf *dav_ifmatch;
+
+       const WebcitHandler *Handler;
+} HdrRefs;
+
+typedef struct _ParsedHttpHdrs {
+       int http_sock;                          /* HTTP server socket */
+       long HaveRange;
+       long RangeStart;
+       long RangeTil;
+       long TotalBytes;
+       const char *Pos;
+       StrBuf *ReadBuf;
+
+       StrBuf *c_username;
+       StrBuf *c_password;
+       StrBuf *c_roomname;
+       StrBuf *c_language;
+       StrBuf *this_page;                      /* URL of current page */
+       StrBuf *PlainArgs; 
+       StrBuf *HostHeader;
+
+       HashList *urlstrings;                   /* variables passed to webcit in a URL */
+       HashList *HTTPHeaders;                  /* the headers the client sent us */
+       int nWildfireHeaders;                   /* how many wildfire headers did we already send? */
+
+       HdrRefs HR;
+} ParsedHttpHdrs;
+
+/*
+ * One of these is kept for each active Citadel session.
+ * HTTP transactions are bound to one at a time.
+ */
+struct wcsession {
+/* infrastructural members */
+       wcsession *next;                        /* Linked list */
+       pthread_mutex_t SessionMutex;           /* mutex for exclusive access */
+       int wc_session;                         /* WebCit session ID */
+       int killthis;                           /* Nonzero == purge this session */
+       int ctdl_pid;                           /* Session ID on the Citadel server */
+       int nonce;                              /* session nonce (to prevent session riding) */
+       int inuse;                              /* set to nonzero if bound to a running thread */
+       int isFailure;                          /* Http 2xx or 5xx? */
+
+/* Session local Members */
+       int serv_sock;                          /* Client socket to Citadel server */
+       StrBuf *ReadBuf;                        /* linebuffered reads from the server */
+       StrBuf *MigrateReadLineBuf;             /* here we buffer legacy server read stuff */
+       const char *ReadPos;                    /* whats our read position in ReadBuf? */
+       int last_chat_seq;                      /* When in chat - last message seq# we saw */
+       time_t lastreq;                         /* Timestamp of most recent HTTP */
+       time_t last_pager_check;                /* last time we polled for instant msgs */
+       ServInfo *serv_info;                    /* Information about the citserver we're connected to */
+       StrBuf *PushedDestination;              /* Where to go after login, registration, etc. */
+
+/* Request local Members */
+       StrBuf *CLineBuf;                       /* linebuffering client stuff */
+       ParsedHttpHdrs *Hdr;
+       StrBuf *WBuf;                           /* Our output buffer */
+       StrBuf *HBuf;                           /* Our HeaderBuffer */
+       StrBuf *WFBuf;                          /* Wildfire error logging buffer */
+       StrBuf *trailing_javascript;            /* extra javascript to be appended to page */
+       StrBuf *ImportantMsg;
+       HashList *Directory;                    /* Parts of the directory URL in snippets */
+       const Floor *CurrentFloor;              /* when Parsing REST, which floor are we on? */
+
+/* accounting */
+       StrBuf *wc_username;                    /* login name of current user */
+       StrBuf *wc_fullname;                    /* Screen name of current user */
+       StrBuf *wc_password;                    /* Password of current user */
+       StrBuf *httpauth_pass;                  /* only for GroupDAV sessions */
+       int axlevel;                            /* this user's access level */
+       int is_aide;                            /* nonzero == this user is an Admin */
+       int connected;                          /* nonzero == we are connected to Citadel */
+       int logged_in;                          /* nonzero == we are logged in  */
+       int need_regi;                          /* This user needs to register. */
+       int need_vali;                          /* New users require validation. */
+
+/* Preferences */
+       StrBuf *cs_inet_email;                  /* User's preferred Internet addr. */
+       HashList *hash_prefs;                   /* WebCit preferences for this user */
+       StrBuf *DefaultCharset;                 /* Charset the user preferes */
+       int downloaded_prefs;                   /* Has the client download its prefs yet? */
+       int SavePrefsToServer;                  /* Should we save our preferences to the server at the end of the request? */
+       int selected_language;                  /* Language selected by user */
+       int time_format_cache;                  /* which timeformat does our user like? */
+
+       folder CurRoom;                         /* information about our current room */
+       const folder *ThisRoom;                 /* if REST found a room, remember it here. */
+/* next/previous room thingabob */
+       struct march *march;                    /* march mode room list */
+       char ugname[128];                       /* where does 'ungoto' take us */
+       long uglsn;                             /* last seen message number for ungoto */
+
+/* Uploading; mime attachments for composing messages */
+       HashList *attachments;                  /* list of attachments for 'enter message' */
+       int upload_length;                      /* content length of http-uploaded data */
+       StrBuf *upload;                         /* pointer to http-uploaded data */
+       StrBuf *upload_filename;                /* filename of http-uploaded data */
+       char upload_content_type[256];          /* content type of http-uploaded data */
+
+       int remember_new_mail;                  /* last count of new mail messages */
+
+/* Roomiew control */
+       HashList *Floors;                       /* floors our citserver has hashed numeric for quicker access*/
+       HashList *FloorsByName;                 /* same but hashed by its name */
+       HashList *Rooms;                        /* our directory structure as loaded by LKRA */
+       HashList *summ;                         /* list of messages for mailbox summary view */
+  /** Perhaps these should be within a struct instead */
+       long startmsg;                          /* message number to start at */
+       long maxmsgs;                           /* maximum messages to display */
+        long num_displayed;                     /* number of messages actually displayed */
+       HashList *disp_cal_items;               /* sorted list of calendar items; startdate is the sort criteria. */
+
+
+       char last_chat_user[256];
+
+       StrBuf *IconTheme;                      /* Icontheme setting */
+
+/* Iconbar controls */
+       int cache_max_folders;
+       int cache_num_floors;
+       long *IBSettingsVec;                    /* which icons should be shown / not shown? */
+       const StrBuf *floordiv_expanded;        /* which floordiv currently expanded */
+       int ib_wholist_expanded;
+       int ib_roomlist_expanded;
+
+/* our known Sieve scripts; loaded by SIEVE:SCRIPTS iterator. */
+       HashList *KnownSieveScripts;
+
+/* Transcoding cache buffers; used to avoid to frequent realloc */
+       StrBuf *ConvertBuf1;
+       StrBuf *ConvertBuf2;
+
+/* cache stuff for templates. TODO: find a smarter way */
+       HashList *ServCfg;                      /* cache our server config for editing */
+       HashList *InetCfg;                      /* Our inet server config for editing */
+       ExpirePolicy Policy[maxpolicy];
+
+};
+
+
+typedef void (*Header_Evaluator)(StrBuf *Line, ParsedHttpHdrs *hdr);
+
+typedef struct _HttpHeader {
+       Header_Evaluator H;
+       StrBuf *Val;
+       int HaveEvaluator;
+} OneHttpHeader;
+
+void RegisterHeaderHandler(const char *Name, long Len, Header_Evaluator F);
+
+
+enum {
+       S_SHUTDOWN,
+       S_SPAWNER,
+       MAX_SEMAPHORES
+};
+
+#ifndef num_parms
+#define num_parms(source)              num_tokens(source, '|') 
+#endif
+
+#define site_prefix    (WC ? (WC->Hdr->HostHeader) : NULL)
+
+/* Per-session data */
+#define WC ((struct wcsession *)pthread_getspecific(MyConKey))
+extern pthread_key_t MyConKey;
+
+/* Per-thread SSL context */
+#ifdef HAVE_OPENSSL
+#define THREADSSL ((SSL *)pthread_getspecific(ThreadSSL))
+extern pthread_key_t ThreadSSL;
+
+void init_ssl(void);
+void endtls(void);
+int starttls(int sock);
+extern SSL_CTX *ssl_ctx;  
+int client_read_sslbuffer(StrBuf *buf, int timeout);
+int client_write_ssl(const StrBuf *Buf);
+#endif
+
+extern int is_https;
+extern int follow_xff;
+extern char *server_cookie;
+extern char *axdefs[];
+extern int num_threads_existing;
+extern int num_threads_executing;
+
+void InitialiseSemaphores(void);
+void begin_critical_section(int which_one);
+void end_critical_section(int which_one);
+
+void CheckGZipCompressionAllowed(const char *MimeType, long MLen);
+
+extern void do_404(void);
+void http_redirect(const char *);
+
+
+#ifdef UBER_VERBOSE_DEBUGGING
+#define wc_printf(...) wcc_printf(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
+void wcc_printf(const char *FILE, const char *FUNCTION, long LINE, const char *format, ...);
+#else 
+void wc_printf(const char *format,...)__attribute__((__format__(__printf__,1,2)));
+#endif
+void hprintf(const char *format,...)__attribute__((__format__(__printf__,1,2)));
+void CheckAuthBasic(ParsedHttpHdrs *hdr);
+void GetAuthBasic(ParsedHttpHdrs *hdr);
+void sleeeeeeeeeep(int);
+size_t wc_strftime(char *s, size_t max, const char *format, const struct tm *tm);
+void fmt_time(char *buf, size_t siz, time_t thetime);
+void httpdate(char *buf, time_t thetime);
+time_t httpdate_to_timestamp(StrBuf *buf);
+void end_webcit_session(void);
+void cookie_to_stuff(StrBuf *cookie, int *session, StrBuf *user, StrBuf *pass, StrBuf *room, StrBuf *language);
+void locate_host(StrBuf *TBuf, int);
+void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_response);
+void display_login(void);
+void display_openids(void);
+void display_default_landing_page(void);
+void do_welcome(void);
+void display_reg(int during_login);
+void display_main_menu(void);
+void display_aide_menu(void);
+void RegisterEmbeddableMimeType(const char *MimeType, long MTLen, int Priority);
+void CreateMimeStr(void);
+void pop_destination(void);
+void FmOut(StrBuf *Target, const char *align, const StrBuf *Source);
+void wDumpContent(int);
+void PutRequestLocalMem(void *Data, DeleteHashDataFunc DeleteIt);
+void output_headers(int do_httpheaders, int do_htmlhead, int do_room_banner, int unset_cookies, int suppress_check, int cache);
+void cdataout(char *rawdata);
+void url(char *buf, size_t bufsize);
+void UrlizeText(StrBuf* Target, StrBuf *Source, StrBuf *WrkBuf);
+void display_success(const char *successmessage);
+void shutdown_sessions(void);
+StrBuf *load_mimepart(long msgnum, char *partnum);
+void MimeLoadData(wc_mime_attachment *Mime);
+void do_edit_vcard(long msgnum, char *partnum, message_summary *VCMsg, wc_mime_attachment *VCAtt, const char *return_to, const char *force_room);
+void select_user_to_edit(const char *preselect);
+void convenience_page(const char *titlebarcolor, const char *titlebarmsg, const char *messagetext);
+void output_html(const char *, int, int, StrBuf *, StrBuf *);
+ssize_t write(int fd, const void *buf, size_t count);
+void cal_process_attachment(wc_mime_attachment *Mime);
+void begin_ajax_response(void);
+void end_ajax_response(void);
+extern char *months[];
+extern char *days[];
+long locate_user_vcard_in_this_room(message_summary **VCMsg, wc_mime_attachment **VCAtt);
+void http_transmit_thing(const char *content_type, int is_static);
+void http_transmit_headers(const char *content_type, int is_static, long is_chunked, int is_gzip);
+long unescape_input(char *buf);
+void check_thread_pool_size(void);
+void StrEndTab(StrBuf *Target, int tabnum, int num_tabs);
+void StrBeginTab(StrBuf *Target, int tabnum, int num_tabs, StrBuf **Names);
+void StrTabbedDialog(StrBuf *Target, int num_tabs, StrBuf *tabnames[]);
+void tabbed_dialog(int num_tabs, const char *tabnames[]);
+void begin_tab(int tabnum, int num_tabs);
+void end_tab(int tabnum, int num_tabs);
+int get_time_format_cached (void);
+void display_wiki_pagelist(void);
+void str_wiki_index(StrBuf *);
+HashList *GetRoomListHashLKRA(StrBuf *Target, WCTemplputParams *TP);
+void TmplGettext(StrBuf *Target, WCTemplputParams *TP); /* actual supported locales */
+void set_selected_language(const char *);
+void go_selected_language(void);
+const char *get_selected_language(void);
+// void utf8ify_rfc822_string(char **buf); this is in libcitadel now
+void begin_burst(void);
+long end_burst(void);
+void AppendImportantMessage(const char *pch, long len);
+void http_datestring(char *buf, size_t n, time_t xtime);
+void display_enter(void);
+
+/* These should be empty, but we have them for testing */
+#define DEFAULT_HTTPAUTH_USER  ""
+#define DEFAULT_HTTPAUTH_PASS  ""
+
+/* Exit codes 101 through 109 are initialization failures so we don't want to
+ * just keep respawning indefinitely.
+ */
+#define WC_EXIT_BIND           101     /* Can't bind to the port */
+#define WC_EXIT_SSL            102     /* Can't initialize SSL */
+
+#define WC_TIMEFORMAT_NONE 0
+#define WC_TIMEFORMAT_AMPM 1
+#define WC_TIMEFORMAT_24 2
+
+extern int time_to_die;                        /* Nonzero if server is shutting down */
+extern int DisableGzip;
+
+void display_summary_page(void);
+HashList *GetValidDomainNames(StrBuf *Target, WCTemplputParams *TP);
+void output_error_pic(const char *ErrMsg1, const char *ErrMsg2);
+void jsonMessageListHdr(void);
+extern char *ctdl_dir;                         /* Directory where Citadel Server is running */
diff --git a/webcit/webserver.c b/webcit/webserver.c
new file mode 100644 (file)
index 0000000..d8892af
--- /dev/null
@@ -0,0 +1,345 @@
+// Copyright (c) 1996-2023 by the citadel.org team
+//
+// This program is open source software.  You can redistribute it and/or
+// modify it under the terms of the GNU General Public License version 3.
+//
+// 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.
+
+#include "webcit.h"
+#include "webserver.h"
+#include "modules_init.h"
+
+extern int msock;                              /* master listening socket */
+extern char static_icon_dir[PATH_MAX];          /* where should we find our mime icons */
+int is_https = 0;                              /* Nonzero if I am an HTTPS service */
+int follow_xff = 0;                            /* Follow X-Forwarded-For: header? */
+int DisableGzip = 0;
+char *default_landing_page = NULL;
+extern pthread_mutex_t SessionListMutex;
+
+extern void *housekeeping_loop(void);
+extern int webcit_tcp_server(char *ip_addr, int port_number, int queue_len);
+extern int webcit_uds_server(char *sockpath, int queue_len);
+extern void graceful_shutdown_watcher(int signum);
+extern void graceful_shutdown(int signum);
+extern void start_daemon(char *pid_file);
+extern void webcit_calc_dirs_n_files(int relh, const char *basedir, int home, char *webcitdir, char *relhome);
+extern void worker_entry(void);
+extern void drop_root(uid_t UID);
+
+char socket_dir[PATH_MAX];             /* where to talk to our citadel server */
+char *server_cookie = NULL;            /* our Cookie connection to the client */
+int http_port = PORT_NUM;              /* Port to listen on */
+int running_as_daemon = 0;             /* should we deamonize on startup? */
+char *ctdl_dir = DEFAULT_CTDLDIR;      /* Directory where Citadel Server is running */
+
+/* #define DBG_PRINNT_HOOKS_AT_START */
+#ifdef DBG_PRINNT_HOOKS_AT_START
+extern HashList *HandlerHash;
+const char foobuf[32];
+const char *nix(void *vptr) {snprintf(foobuf, 32, "%0x", (long) vptr); return foobuf;}
+#endif 
+extern int verbose;
+extern int dbg_analyze_msg;
+extern int dbg_backtrace_template_errors;
+extern int DumpTemplateI18NStrings;
+extern StrBuf *I18nDump;
+void InitTemplateCache(void);
+extern int LoadTemplates;
+
+void LoadMimeBlacklist(void);
+
+/*
+ * Here's where it all begins.
+ */
+int main(int argc, char **argv) {
+       uid_t UID = -1;
+       pthread_t SessThread;           /* Thread descriptor */
+       pthread_attr_t attr;            /* Thread attributes */
+       int a;                          /* General-purpose variable */
+       char ip_addr[256]="*";
+       int relh=0;
+       int home=0;
+       char relhome[PATH_MAX]="";
+       char webcitdir[PATH_MAX] = DATADIR;
+       char *pidfile = NULL;
+       char *hdir;
+       const char *basedir = NULL;
+       char uds_listen_path[PATH_MAX]; /* listen on a unix domain socket? */
+       const char *I18nDumpFile = NULL;
+       int max_log_level = LOG_INFO;
+
+       WildFireInitBacktrace(argv[0], 2);
+
+       start_modules();
+
+#ifdef DBG_PRINNT_HOOKS_AT_START
+/*     dbg_PrintHash(HandlerHash, nix, NULL);*/
+#endif
+
+       /* Ensure that we are linked to the correct version of libcitadel */
+       if (libcitadel_version_number() < LIBCITADEL_VERSION_NUMBER) {
+               fprintf(stderr, " You are running libcitadel version %d\n", libcitadel_version_number() );
+               fprintf(stderr, "WebCit was compiled against version %d\n", LIBCITADEL_VERSION_NUMBER );
+               return(1);
+       }
+
+       strcpy(uds_listen_path, "");
+
+       /* Parse command line */
+#ifdef HAVE_OPENSSL
+       while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:g:dD:G:cfsS:Z:v:")) != EOF)
+#else
+       while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:g:dD:G:cfZ:v:")) != EOF)
+#endif
+               switch (a) {
+               case 'u':
+                       UID = atol(optarg);
+                       break;
+               case 'h':
+                       hdir = strdup(optarg);
+                       relh=hdir[0]!='/';
+                       if (!relh) {
+                               safestrncpy(webcitdir, hdir, sizeof webcitdir);
+                       }
+                       else {
+                               safestrncpy(relhome, relhome, sizeof relhome);
+                       }
+                       home=1;
+                       break;
+               case 'd':
+                       running_as_daemon = 1;
+                       break;
+               case 'D':
+                       pidfile = strdup(optarg);
+                       running_as_daemon = 1;
+                       break;
+               case 'g':
+                       default_landing_page = strdup(optarg);
+                       break;
+               case 'B': /* deprecated */
+                       break;
+               case 'i':
+                       safestrncpy(ip_addr, optarg, sizeof ip_addr);
+                       break;
+               case 'p':
+                       http_port = atoi(optarg);
+                       if (http_port == 0) {
+                               safestrncpy(uds_listen_path, optarg, sizeof uds_listen_path);
+                       }
+                       break;
+               case 't':
+                       /* no longer used, but ignored so old scripts don't break */
+                       break;
+               case 'T':
+                       LoadTemplates = atoi(optarg);
+                       dbg_analyze_msg = (LoadTemplates & (1<<1)) != 0;
+                       dbg_backtrace_template_errors = (LoadTemplates & (1<<2)) != 0;
+                       break;
+               case 'Z':
+                       DisableGzip = 1;
+                       break;
+               case 'x':
+                       max_log_level = atoi(optarg);
+                       break;
+               case 'f':
+                       follow_xff = 1;
+                       break;
+               case 'c':
+                       server_cookie = malloc(256);
+                       if (server_cookie != NULL) {
+                               safestrncpy(server_cookie, "Set-cookie: wcserver=", 256);
+                               if (gethostname (&server_cookie[strlen(server_cookie)], 200) != 0) {
+                                       syslog(LOG_INFO, "gethostname: %s", strerror(errno));
+                                       free(server_cookie);
+                               }
+                       }
+                       break;
+#ifdef HAVE_OPENSSL
+               case 's':
+                       is_https = 1;
+                       break;
+               case 'S':
+                       is_https = 1;
+                       ssl_cipher_list = strdup(optarg);
+                       break;
+#endif
+               case 'G':
+                       DumpTemplateI18NStrings = 1;
+                       I18nDump = NewStrBufPlain(HKEY("int templatestrings(void)\n{\n"));
+                       I18nDumpFile = optarg;
+                       break;
+               case 'v':
+                       verbose=1;
+                       break;
+               default:
+                       fprintf(stderr, "usage:\nwebcit "
+                               "[-i ip_addr] [-p http_port] "
+                               "[-c] [-f] "
+                               "[-T Templatedebuglevel] "
+                               "[-d] [-Z] [-G i18ndumpfile] "
+                               "[-u uid] [-h homedirectory] "
+                               "[-D daemonizepid] [-v] "
+                               "[-g defaultlandingpage] "
+#ifdef HAVE_OPENSSL
+                               "[-s] [-S cipher_suites]"
+#endif
+                               "[citadel_server_directory]\n");
+                       return 1;
+               }
+
+       /* Start the logger */
+       setlogmask(LOG_UPTO(max_log_level));
+       openlog("webcit",
+               ( running_as_daemon ? (LOG_PID) : (LOG_PID | LOG_PERROR) ),
+               LOG_DAEMON
+       );
+
+       while (optind < argc) {
+               ctdl_dir = strdup(argv[optind]);
+               ++optind;
+       }
+
+       /* daemonize, if we were asked to */
+       if (!DumpTemplateI18NStrings && running_as_daemon) {
+               start_daemon(pidfile);
+       }
+       else {
+               signal(SIGINT, graceful_shutdown);
+               signal(SIGHUP, graceful_shutdown);
+       }
+
+       webcit_calc_dirs_n_files(relh, basedir, home, webcitdir, relhome);
+       LoadMimeBlacklist();
+       LoadIconDir(static_icon_dir);
+
+       /* Tell 'em who's in da house */
+       syslog(LOG_NOTICE, "%s", PACKAGE_STRING);
+       syslog(LOG_NOTICE, "Copyright (C) 1996-2023 by the citadel.org team");
+       syslog(LOG_NOTICE, " ");
+       syslog(LOG_NOTICE, "This program is open source software: you can redistribute it and/or");
+       syslog(LOG_NOTICE, "modify it under the terms of the GNU General Public License, version 3.");
+       syslog(LOG_NOTICE, " ");
+       syslog(LOG_NOTICE, "This program is distributed in the hope that it will be useful,");
+       syslog(LOG_NOTICE, "but WITHOUT ANY WARRANTY; without even the implied warranty of");
+       syslog(LOG_NOTICE, "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the");
+       syslog(LOG_NOTICE, "GNU General Public License for more details.");
+       syslog(LOG_NOTICE, " ");
+
+       /* run from the webcit home directory */
+       if (chdir(webcitdir) != 0) {
+               syslog(LOG_ERR, "webcit: %s: %m", webcitdir);
+               exit(errno);
+       }
+
+       /* initialize various subsystems */
+       initialise_modules();
+       initialise2_modules();
+       InitTemplateCache();
+       if (DumpTemplateI18NStrings) {
+               FILE *fd;
+               StrBufAppendBufPlain(I18nDump, HKEY("}\n"), 0);
+               if (StrLength(I18nDump) < 50) {
+                       syslog(LOG_INFO, "*******************************************************************\n");
+                       syslog(LOG_INFO, "*   No strings found in templates!  Are you sure they're there?   *\n");
+                       syslog(LOG_INFO, "*******************************************************************\n");
+                       return -1;
+               }
+               fd = fopen(I18nDumpFile, "w");
+               if (fd == NULL) {
+                       syslog(LOG_INFO, "***********************************************\n");
+                       syslog(LOG_INFO, "*   unable to open I18N dumpfile [%s]         *\n", I18nDumpFile);
+                       syslog(LOG_INFO, "***********************************************\n");
+                       return -1;
+               }
+               fwrite(ChrPtr(I18nDump), 1, StrLength(I18nDump), fd);
+               fclose(fd);
+               return 0;
+       }
+
+       /* Tell libical to return an error instead of aborting if it sees badly formed iCalendar data. */
+
+#ifdef LIBICAL_ICAL_EXPORT     // cheap and sleazy way to detect libical >=2.0
+               icalerror_set_errors_are_fatal(0);
+#else
+               icalerror_errors_are_fatal = 0;
+#endif
+
+       /* Use our own prefix on tzid's generated from system tzdata */
+       icaltimezone_set_tzid_prefix("/citadel.org/");
+
+       /*
+        * Set up a place to put thread-specific data.
+        * We only need a single pointer per thread - it points to the
+        * wcsession struct to which the thread is currently bound.
+        */
+       if (pthread_key_create(&MyConKey, NULL) != 0) {
+               syslog(LOG_ERR, "Can't create TSD key: %s", strerror(errno));
+       }
+       InitialiseSemaphores();
+
+       /*
+        * Set up a place to put thread-specific SSL data.
+        * We don't stick this in the wcsession struct because SSL starts
+        * up before the session is bound, and it gets torn down between
+        * transactions.
+        */
+#ifdef HAVE_OPENSSL
+       if (pthread_key_create(&ThreadSSL, NULL) != 0) {
+               syslog(LOG_ERR, "Can't create TSD key: %s", strerror(errno));
+       }
+#endif
+
+       /*
+        * Bind the server to our favorite port.
+        * There is no need to check for errors, because webcit_tcp_server()
+        * exits if it doesn't succeed.
+        */
+
+       if (!IsEmptyStr(uds_listen_path)) {
+               syslog(LOG_DEBUG, "Attempting to create listener socket at %s...", uds_listen_path);
+               msock = webcit_uds_server(uds_listen_path, LISTEN_QUEUE_LENGTH);
+       }
+       else {
+               syslog(LOG_DEBUG, "Attempting to bind to port %d...", http_port);
+               msock = webcit_tcp_server(ip_addr, http_port, LISTEN_QUEUE_LENGTH);
+       }
+       if (msock < 0)
+       {
+               ShutDownWebcit();
+               return -msock;
+       }
+
+       syslog(LOG_INFO, "Listening on socket %d", msock);
+       signal(SIGPIPE, SIG_IGN);
+
+       pthread_mutex_init(&SessionListMutex, NULL);
+
+       // Start up the housekeeping thread
+       pthread_attr_init(&attr);
+       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+       pthread_create(&SessThread, &attr, (void *(*)(void *)) housekeeping_loop, NULL);
+
+       // If this is an HTTPS server, fire up SSL
+#ifdef HAVE_OPENSSL
+       if (is_https) {
+               init_ssl();
+       }
+#endif
+       drop_root(UID);
+
+       // Become a worker thread.  More worker threads will be spawned as they are needed.
+       worker_entry();
+       ShutDownLibCitadel();
+       return 0;
+}
+
+
+
+
+
+
+
diff --git a/webcit/webserver.h b/webcit/webserver.h
new file mode 100644 (file)
index 0000000..dc142d0
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+
+extern char *static_dirs[PATH_MAX];          /**< Web representation */
+extern int ndirs;
+extern char socket_dir[PATH_MAX];
+
+extern char *default_landing_page;
+
+int ClientGetLine(ParsedHttpHdrs *Hdr, StrBuf *Target);
+int client_read_to(ParsedHttpHdrs *Hdr, StrBuf *Target, int bytes, int timeout);
+void wc_backtrace(long LogLevel);
+void ShutDownWebcit(void);
+void shutdown_ssl(void);
+
+
diff --git a/webcit/who.c b/webcit/who.c
new file mode 100644 (file)
index 0000000..dee492c
--- /dev/null
@@ -0,0 +1,306 @@
+
+#include "webcit.h"
+
+CtxType CTX_WHO = CTX_NONE;
+
+typedef struct UserStateStruct {
+       StrBuf *UserName;
+       StrBuf *Room;
+       StrBuf *Host;
+       StrBuf *UserAgent;
+       StrBuf *RealRoom;
+       StrBuf *RealHost;
+       long LastActive;
+       int Session;
+       int Idle;
+       int IdleSince;
+       int SessionCount;
+} UserStateStruct;
+
+void DestroyUserStruct(void *vUser)
+{
+       UserStateStruct *User = (UserStateStruct*) vUser;
+       FreeStrBuf(&User->UserName);
+       FreeStrBuf(&User->Room);
+       FreeStrBuf(&User->Host);
+       FreeStrBuf(&User->RealRoom);
+       FreeStrBuf(&User->RealHost);
+       FreeStrBuf(&User->UserAgent);
+       free(User);
+}
+
+int CompareUserStruct(const void *VUser1, const void *VUser2)
+{
+       const UserStateStruct *User1 = (UserStateStruct*) GetSearchPayload(VUser1);
+       const UserStateStruct *User2 = (UserStateStruct*) GetSearchPayload(VUser2);
+       
+       if (User1->Idle != User2->Idle)
+               return User1->Idle > User2->Idle;
+       return strcasecmp(ChrPtr(User1->UserName), 
+                         ChrPtr(User2->UserName));
+}
+
+
+int GetWholistSection(HashList *List, time_t now, StrBuf *Buf, const char *FilterName, long FNLen)
+{
+       UserStateStruct *User, *OldUser;
+       void *VOldUser;
+       size_t BufLen;
+       const char *Pos;
+
+       serv_puts("RWHO");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 1) {
+               while (BufLen = StrBuf_ServGetln(Buf), 
+                      ((BufLen >= 0) && 
+                       ((BufLen != 3) || strcmp(ChrPtr(Buf), "000"))))
+               {
+                       if (BufLen <= 0)
+                           continue;
+                       Pos = NULL;
+                       User = (UserStateStruct*) malloc(sizeof(UserStateStruct));
+                       User->Session = StrBufExtractNext_int(Buf, &Pos, '|');
+
+                       User->UserName = NewStrBufPlain(NULL, BufLen);
+                       StrBufExtract_NextToken(User->UserName, Buf, &Pos, '|');
+                       
+                       User->Room = NewStrBufPlain(NULL, BufLen);
+                       StrBufExtract_NextToken(User->Room, Buf, &Pos, '|');
+
+                       User->Host = NewStrBufPlain(NULL, BufLen);
+                       StrBufExtract_NextToken(User->Host, Buf, &Pos, '|');
+
+                       User->UserAgent = NewStrBufPlain(NULL, BufLen);
+                       StrBufExtract_NextToken(User->UserAgent, Buf, &Pos, '|');
+
+                       User->LastActive = StrBufExtractNext_long(Buf, &Pos, '|');
+                       StrBufSkip_NTokenS(Buf, &Pos, '|', 3);
+
+                       User->RealRoom = NewStrBufPlain(NULL, BufLen);
+                       StrBufExtract_NextToken(User->RealRoom, Buf, &Pos, '|');
+
+                       User->RealHost = NewStrBufPlain(NULL, BufLen);
+                       StrBufExtract_NextToken(User->RealHost, Buf, &Pos, '|');
+                       
+                       User->Idle = (now - User->LastActive) > 900L;
+                       User->IdleSince = (now - User->LastActive) / 60;
+                       User->SessionCount = 1;
+
+                       if (FilterName == NULL) {
+                               if (GetHash(List, 
+                                           SKEY(User->UserName), 
+                                           &VOldUser)) {
+                                       OldUser = VOldUser;
+                                       OldUser->SessionCount++;
+                                       if (!User->Idle) {
+                                               if (User->Session == WC->ctdl_pid) 
+                                                       OldUser->Session = User->Session;
+                                               
+                                               OldUser->Idle = User->Idle;
+                                               OldUser->LastActive = User->LastActive;
+                                       }
+                                       DestroyUserStruct(User);
+                               }
+                               else
+                                       Put(List, 
+                                           SKEY(User->UserName), 
+                                           User, DestroyUserStruct);
+                       }
+                       else {
+                               if (strcmp(FilterName, ChrPtr(User->UserName)) == 0)
+                               {
+                                       Put(List, 
+                                           SKEY(User->UserName), 
+                                           User, DestroyUserStruct);
+                               }
+                               else 
+                               {
+                                       DestroyUserStruct(User);
+                               }
+                       }
+               }
+               if (FilterName == NULL)
+                       SortByPayload(List, CompareUserStruct);
+               return 1;
+       }
+       else {
+               return 0;
+       }
+}
+
+/*
+ * end session
+ */
+void terminate_session(void)
+{
+       char buf[SIZ];
+
+       serv_printf("TERM %s", bstr("which_session"));
+       serv_getln(buf, sizeof buf);
+       url_do_template();
+}
+
+
+void _terminate_session(void) {
+       slrp_highest();
+       terminate_session();
+}
+
+HashList *GetWholistHash(StrBuf *Target, WCTemplputParams *TP)
+
+{
+       const char *ch = NULL;
+       int HashUniq = 1;
+       long len;
+       StrBuf *FilterNameStr = NULL;
+       StrBuf *Buf;
+       HashList *List;
+        time_t now;
+
+       Buf = NewStrBuf();
+
+       serv_puts("TIME");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL)  == 2) {
+               const char *pos = ChrPtr(Buf) + 4;
+               now = StrBufExtractNext_long(Buf, &pos, '|');
+       }
+       else {
+               now = time(NULL);
+       }
+       if (HaveTemplateTokenString(NULL, TP, 2, &ch, &len))
+       {
+               FilterNameStr = NewStrBuf();
+               GetTemplateTokenString(FilterNameStr, TP, 2, &ch, &len);
+               HashUniq = 0;
+       }
+
+       List = NewHash(HashUniq, NULL);
+       GetWholistSection(List, now, Buf, ch, len);
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&FilterNameStr);
+       return List;
+}
+
+
+void DeleteWholistHash(HashList **KillMe)
+{
+       DeleteHash(KillMe);
+}
+
+void tmplput_who_username(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendTemplate(Target, TP, User->UserName, 0);
+}
+
+void tmplput_who_UserAgent(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendTemplate(Target, TP, User->UserAgent, 0);
+}
+
+void tmplput_who_room(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendTemplate(Target, TP, User->Room, 0);
+}
+
+void tmplput_who_host(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendTemplate(Target, TP, User->Host, 0);
+}
+
+void tmplput_who_realroom(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendTemplate(Target, TP, User->RealRoom, 0);
+}
+int conditional_who_realroom(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       return StrLength(User->RealRoom) > 0;
+}
+
+void tmplput_who_realhost(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendTemplate(Target, TP, User->RealHost, 0);
+}
+int conditional_who_realhost(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       return StrLength(User->RealHost) > 0;
+}
+
+void tmplput_who_lastactive(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendPrintf(Target, "%d", User->LastActive);
+}
+
+void tmplput_who_idlesince(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendPrintf(Target, "%d", User->IdleSince);
+}
+
+void tmplput_who_session(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendPrintf(Target, "%d", User->Session);
+}
+
+int conditional_who_idle(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       return User->Idle;
+}
+
+int conditional_who_nsessions(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       return User->SessionCount;
+}
+
+void tmplput_who_nsessions(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       StrBufAppendPrintf(Target, "%d", User->SessionCount);
+}
+
+int conditional_who_isme(StrBuf *Target, WCTemplputParams *TP)
+{
+       UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO);
+       return (User->Session == WC->ctdl_pid);
+}
+
+void 
+InitModule_WHO
+(void)
+{
+       RegisterCTX(CTX_WHO);
+
+       WebcitAddUrlHandler(HKEY("terminate_session"), "", 0, _terminate_session, 0);
+
+       RegisterIterator("WHOLIST", 1, NULL, GetWholistHash, NULL, DeleteWholistHash, CTX_WHO, CTX_NONE, IT_NOFLAG);
+
+       RegisterNamespace("WHO:NAME",        0, 1, tmplput_who_username, NULL, CTX_WHO);
+       RegisterNamespace("WHO:USERAGENT",   0, 1, tmplput_who_UserAgent, NULL, CTX_WHO);
+       RegisterNamespace("WHO:ROOM",        0, 1, tmplput_who_room, NULL, CTX_WHO);
+       RegisterNamespace("WHO:HOST",        0, 1, tmplput_who_host, NULL, CTX_WHO);
+       RegisterNamespace("WHO:REALROOM",    0, 1, tmplput_who_realroom, NULL, CTX_WHO);
+       RegisterNamespace("WHO:REALHOST",    0, 1, tmplput_who_realhost, NULL, CTX_WHO);
+       RegisterNamespace("WHO:LASTACTIVE",  0, 1, tmplput_who_lastactive, NULL, CTX_WHO);
+       RegisterNamespace("WHO:IDLESINCE",   0, 1, tmplput_who_idlesince, NULL, CTX_WHO);
+       RegisterNamespace("WHO:SESSION",     0, 1, tmplput_who_session, NULL, CTX_WHO);
+       RegisterNamespace("WHO:NSESSIONS",   0, 1, tmplput_who_nsessions, NULL, CTX_WHO);
+       RegisterNamespace("WHO:NSESSIONS",   0, 1, tmplput_who_nsessions, NULL, CTX_WHO);
+
+       RegisterConditional("WHO:IDLE",      1, conditional_who_idle, CTX_WHO);
+       RegisterConditional("WHO:NSESSIONS", 1, conditional_who_nsessions, CTX_WHO);
+       RegisterConditional("WHO:ISME",      1, conditional_who_isme, CTX_WHO);
+       RegisterConditional("WHO:REALROOM",  1, conditional_who_realroom, CTX_WHO);
+       RegisterConditional("WHO:REALHOST",  1, conditional_who_realhost, CTX_WHO);
+}
diff --git a/webcit/wiki.c b/webcit/wiki.c
new file mode 100644 (file)
index 0000000..390bf3c
--- /dev/null
@@ -0,0 +1,325 @@
+/*
+ * Functions pertaining to rooms with a wiki view
+ *
+ * Copyright (c) 2009-2021 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
+ */
+
+#include "webcit.h"
+#include "dav.h"
+
+/* 
+ * Convert a string to something suitable as a wiki index
+ */
+void str_wiki_index(StrBuf *s)
+{
+       StrBufSanitizeAscii(s, '_');
+       StrBufLowerCase(s);
+}
+
+/*
+ * Display a specific page from a wiki room
+ *
+ * "rev" may be set to an empty string to display the current version.
+ * "do_revert" may be set to nonzero to perform a reversion to the specified version.
+ */
+void display_wiki_page_backend(StrBuf *pagename, char *rev, int do_revert)
+{
+       const StrBuf *Mime;
+       long msgnum = (-1L);
+       char buf[256];
+
+       if (WC->CurRoom.view != VIEW_WIKI) {
+               wc_printf(_("'%s' is not a Wiki room."), ChrPtr(WC->CurRoom.name) );
+               return;
+       }
+
+       if (StrLength(pagename) == 0) {
+               StrBufPlain(pagename, HKEY("home"));
+       }
+
+       str_wiki_index(pagename);       /* convert index name to lowercase and numeric only */
+
+       if ((rev != NULL) && (strlen(rev) > 0)) {
+               /* read an older revision */
+               serv_printf("WIKI rev|%s|%s|%s", ChrPtr(pagename), rev, (do_revert ? "revert" : "fetch") );
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       msgnum = extract_long(&buf[4], 0);
+               }
+       }
+       else {
+               /* read the current revision */
+               msgnum = locate_message_by_uid(ChrPtr(pagename));
+       }
+
+       if (msgnum >= 0L) {
+               read_message(WC->WBuf, HKEY("view_message"), msgnum, NULL, &Mime, NULL);
+               return;
+       }
+       putbstr("pagename", pagename);
+       do_template("wiki_empty");
+}
+
+
+/*
+ * Display a specific page from a wiki room
+ */
+void display_wiki_page(void)
+{
+       StrBuf *pagename;
+       char rev[128];
+       int do_revert = 0;
+
+       output_headers(1, 1, 1, 0, 0, 0);
+       pagename = NewStrBufDup(sbstr("page"));
+       str_wiki_index(pagename);
+       safestrncpy(rev, bstr("rev"), sizeof rev);
+       do_revert = atoi(bstr("revert"));
+       display_wiki_page_backend(pagename, rev, do_revert);
+       wDumpContent(1);
+}
+
+
+/*
+ * Display the revision history for a wiki page (template callback)
+ */
+void tmplput_display_wiki_history(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *pagename;
+       StrBuf *Buf;
+       int row = 0;
+
+       pagename = NewStrBufDup(sbstr("page"));
+       str_wiki_index(pagename);
+
+       serv_printf("WIKI history|%s", ChrPtr(pagename));
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 1) {
+
+               time_t rev_date;
+               char rev_date_displayed[64];
+               StrBuf *rev_uuid = NewStrBuf();
+               StrBuf *author = NewStrBuf();
+               StrBuf *node = NewStrBuf();
+
+               wc_printf("<table class=\"wiki_history_background\">");
+
+               wc_printf("<th>%s</th>", _("Date"));
+               wc_printf("<th>%s</th>", _("Author"));
+
+               while((StrBuf_ServGetln(Buf) >= 0) &&  strcmp(ChrPtr(Buf), "000")) {
+
+                       rev_date = extract_long(ChrPtr(Buf), 1);
+                       webcit_fmt_date(rev_date_displayed, sizeof rev_date_displayed, rev_date, DATEFMT_FULL);
+                       StrBufExtract_token(author, Buf, 2, '|');
+
+                       wc_printf("<tr bgcolor=\"%s\">", ((row%2) ? "#FFFFFF" : "#DDDDDD"));
+                       wc_printf("<td>%s</td><td>", rev_date_displayed);
+                       wc_printf("<a href=\"showuser?who=");
+                       urlescputs(ChrPtr(author));
+                       wc_printf("\">");
+                       escputs(ChrPtr(author));
+                       wc_printf("</a></td>");
+
+                       if (row == 0) {
+                               wc_printf("<td><a href=\"wiki?page=%s", bstr("page"));
+                               wc_printf("?go="); urlescputs(ChrPtr(WC->CurRoom.name));
+                               wc_printf("\">%s</a></td>", _("(show)"));
+                               wc_printf("<td>(%s)</td>", _("Current version"));
+                       }
+
+                       else {
+                               wc_printf("<td><a href=\"wiki?page=%s?rev=%s",
+                                       bstr("page"),
+                                       ChrPtr(rev_uuid)
+                               );
+                               wc_printf("?go="); urlescputs(ChrPtr(WC->CurRoom.name));
+                               wc_printf("\">%s</a></td>", _("(show)"));
+                               wc_printf("<td><a href=\"javascript:GetLoggedInFirst(encodeURIComponent('wiki?page=%s?rev=%s?revert=1'))\">%s</a></td>",
+                                       bstr("page"),
+                                       ChrPtr(rev_uuid),
+                                       _("(revert)")
+                               );
+                       }
+                       wc_printf("</tr>\n");
+
+                       /* Extract all fields except the author and date after displaying the row.  This
+                        * is deliberate, because the timestamp reflects when the diff was written, not
+                        * when the version which it reflects was written.  Similarly, the name associated
+                        * with each diff is the author who created the newer version of the page that
+                        * made the diff happen.
+                        */
+                       StrBufExtract_token(rev_uuid, Buf, 0, '|');
+                       StrBufExtract_token(node, Buf, 3, '|');
+                       ++row;
+               }
+
+               wc_printf("</table>\n");
+               FreeStrBuf(&author);
+               FreeStrBuf(&node);
+               FreeStrBuf(&rev_uuid);
+       }
+       else {
+               wc_printf("%s", ChrPtr(Buf));
+       }
+
+       FreeStrBuf(&Buf);
+}
+
+
+
+/*
+ * Display the revision history for a wiki page
+ */
+void display_wiki_history(void)
+{
+       output_headers(1, 1, 1, 0, 0, 0);
+       do_template("wiki_history");
+       wDumpContent(1);
+}
+
+
+/*
+ * Display a list of all pages in a Wiki room (template callback)
+ */
+void tmplput_display_wiki_pagelist(StrBuf *Target, WCTemplputParams *TP)
+{
+       StrBuf *Buf;
+       int row = 0;
+
+       if (!IsEmptyStr(bstr("query"))) {
+               serv_printf("MSGS SEARCH|%s||4", bstr("query"));        /* search-reduced list */
+       }
+       else {
+               serv_printf("MSGS ALL|||4");                            /* full list */
+       }
+
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 1) {
+               StrBuf *pagetitle = NewStrBuf();
+
+               wc_printf("<table class=\"wiki_pagelist_background\">");
+               wc_printf("<th>%s</th>", _("Page title"));
+
+               while((StrBuf_ServGetln(Buf) >= 0) && strcmp(ChrPtr(Buf), "000")) {
+                       StrBufExtract_token(pagetitle, Buf, 1, '|');
+
+                       if (!bmstrcasestr((char *)ChrPtr(pagetitle), "_HISTORY_")) {    /* no history pages */
+                               wc_printf("<tr bgcolor=\"%s\">", ((row%2) ? "#FFFFFF" : "#DDDDDD"));
+                               wc_printf("<td><a href=\"wiki?page=");
+                               urlescputs(ChrPtr(pagetitle));
+                               wc_printf("\">");
+                               escputs(ChrPtr(pagetitle));
+                               wc_printf("</a></td>");
+                               wc_printf("</tr>\n");
+                               ++row;
+                       }
+               }
+               wc_printf("</table>\n");
+               FreeStrBuf(&pagetitle);
+       }
+
+       FreeStrBuf(&Buf);
+}
+
+
+/*
+ * Display a list of all pages in a Wiki room.  Search requests in a Wiki room also go here.
+ */
+void display_wiki_pagelist(void)
+{
+       output_headers(1, 1, 1, 0, 0, 0);
+       do_template("wiki_pagelist");
+       wDumpContent(1);
+}
+
+
+int wiki_Cleanup(void **ViewSpecific)
+{
+       StrBuf *pagename;
+       pagename = NewStrBufDup(sbstr("page"));
+       display_wiki_page_backend(pagename, "", 0);
+       wDumpContent(1);
+       return 0;
+}
+
+
+int ConditionalHaveWikiPage(StrBuf *Target, WCTemplputParams *TP)
+{
+       const char *page;
+       const char *pch;
+       long len;
+
+       page = BSTR("page");
+       GetTemplateTokenString(Target, TP, 2, &pch, &len);
+       return strcasecmp(page, pch) == 0;
+}
+
+
+int ConditionalHavewikiType(StrBuf *Target, WCTemplputParams *TP)
+{
+       const char *pch;
+       long len;
+
+       GetTemplateTokenString(Target, TP, 2, &pch, &len);
+       return bmstrcasestr((char *)ChrPtr(WC->Hdr->HR.ReqLine), pch) != NULL;
+}
+
+
+int wiki_PrintHeaderPage(SharedMessageStatus *Stat, void **ViewSpecific)
+{
+       /* this function was intentionaly left empty. */
+       return 0;
+}
+
+int wiki_GetParamsGetServerCall(SharedMessageStatus *Stat, 
+                               void **ViewSpecific, 
+                               long oper, 
+                               char *cmd, 
+                               long len,
+                               char *filter,
+                               long flen)
+{
+       if (oper == do_search)
+               display_wiki_pagelist();
+       else 
+               http_redirect("wiki?page=home");
+
+       return 300;
+}
+
+
+void 
+InitModule_WIKI
+(void)
+{
+       RegisterReadLoopHandlerset(
+               VIEW_WIKI,
+               wiki_GetParamsGetServerCall,
+               wiki_PrintHeaderPage,
+               NULL,
+               NULL,
+               NULL,
+               NULL,
+               wiki_Cleanup,
+               NULL
+       );
+
+       WebcitAddUrlHandler(HKEY("wiki"), "", 0, display_wiki_page, 0);
+       WebcitAddUrlHandler(HKEY("wiki_history"), "", 0, display_wiki_history, 0);
+       WebcitAddUrlHandler(HKEY("wiki_pagelist"), "", 0, display_wiki_pagelist, 0);
+       RegisterNamespace("WIKI:DISPLAYHISTORY", 0, 0, tmplput_display_wiki_history, NULL, CTX_NONE);
+       RegisterNamespace("WIKI:DISPLAYPAGELIST", 0, 0, tmplput_display_wiki_pagelist, NULL, CTX_NONE);
+       RegisterConditional("COND:WIKI:PAGE", 1, ConditionalHaveWikiPage, CTX_NONE);
+       RegisterConditional("COND:WIKI:TYPE", 1, ConditionalHavewikiType, CTX_NONE);
+}